From d41f57af07c7566595d88246f71b269b88701f10 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 4 Dec 2023 18:56:39 -0500 Subject: [PATCH 001/118] Dont zoom to location on refresh --- lib/app/layouts/findmy/findmy_page.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 26d970898..6ebc575b7 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -135,7 +135,9 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi buildLocationMarker(event); }); }); - mapController.move(LatLng(location!.latitude, location!.longitude), 10); + if (!refresh) { + mapController.move(LatLng(location!.latitude, location!.longitude), 10); + } } } setState(() { From 3222b1755278842af3e33efbf1e5e3fedbb60b17 Mon Sep 17 00:00:00 2001 From: Christopher Lang Date: Fri, 5 Jan 2024 10:30:12 -0800 Subject: [PATCH 002/118] Fix smart replies and contextual suggestions not showing in messages Update the messageStyle user to be the current user to fix #2634 --- .../handlers/NewMessageNotification.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/com/bluebubbles/messaging/method_call_handler/handlers/NewMessageNotification.java b/android/app/src/main/java/com/bluebubbles/messaging/method_call_handler/handlers/NewMessageNotification.java index a7ec4b01f..85a58f4b0 100644 --- a/android/app/src/main/java/com/bluebubbles/messaging/method_call_handler/handlers/NewMessageNotification.java +++ b/android/app/src/main/java/com/bluebubbles/messaging/method_call_handler/handlers/NewMessageNotification.java @@ -7,6 +7,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -153,7 +154,10 @@ public void Handle() { Log.d(TAG, "Notification already exists, appending..."); style = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(existingNotification); } else { - style = new NotificationCompat.MessagingStyle(group.build()); + // Build a person for "me" + SharedPreferences mPrefs = context.getSharedPreferences("FlutterSharedPreferences", 0); + Person.Builder me = new Person.Builder().setName(mPrefs.getString("flutter.userName", "You")); + style = new NotificationCompat.MessagingStyle(me.build()); } // Set whether the chat is a group conversation From 606e46b60a805e27c40b8f2b5f1604e93bd080f3 Mon Sep 17 00:00:00 2001 From: Christopher Lang Date: Fri, 5 Jan 2024 22:56:22 -0800 Subject: [PATCH 003/118] Use db last message date for sorting and adds experimental "turbo mode" Changed lookups from computing lastMessage date created to using a db store lastMessage date to speed up processing. Also implemented experimental "turbo mode" switch that completely bypasses creating listeners for all chat updates (and relies on add message events to keep things sorted). Have not tested all code paths to ensure correctness. --- .../layouts/settings/pages/misc/misc_panel.dart | 13 +++++++++++++ lib/models/global/settings.dart | 4 ++++ lib/models/io/chat.dart | 16 ++++++++++++---- lib/models/io/message.dart | 1 + lib/services/backend/sync/tasks/sync_tasks.dart | 3 ++- lib/services/ui/chat/chat_lifecycle_manager.dart | 10 ++++++++-- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/lib/app/layouts/settings/pages/misc/misc_panel.dart b/lib/app/layouts/settings/pages/misc/misc_panel.dart index 75a7beaa3..5dca28e14 100644 --- a/lib/app/layouts/settings/pages/misc/misc_panel.dart +++ b/lib/app/layouts/settings/pages/misc/misc_panel.dart @@ -245,6 +245,19 @@ class _MiscPanelState extends OptimizedState { return const SizedBox.shrink(); } }), + Obx(() => + SettingsSwitch( + onChanged: (bool val) { + ss.settings.turboMode.value = val; + chats.init(force: true); + saveSettings(); + }, + initialVal: ss.settings.turboMode.value, + title: "(Experimental) Turbo Mode", + subtitle: "Reduces processing to minimize CPU and battery life (might lead to random issues with sorting, chat list updates).", + isThreeLine: true, + backgroundColor: tileColor, + )), ], ), SettingsHeader( diff --git a/lib/models/global/settings.dart b/lib/models/global/settings.dart index 88cdab338..7f9711c2e 100644 --- a/lib/models/global/settings.dart +++ b/lib/models/global/settings.dart @@ -82,6 +82,7 @@ class Settings { final RxBool scrollToLastUnread = false.obs; final RxString userName = "You".obs; final RxnString userAvatarPath = RxnString(); + final RxBool turboMode = true.obs; // final RxString emojiFontFamily; // Private API features @@ -289,6 +290,7 @@ class Settings { 'windowEffectCustomOpacityLight': windowEffectCustomOpacityLight.value, 'windowEffectCustomOpacityDark': windowEffectCustomOpacityDark.value, 'useWindowsAccent': useWindowsAccent.value, + 'turboMode' : turboMode.value, }; if (includeAll) { map.addAll({ @@ -413,6 +415,7 @@ class Settings { ss.settings.windowEffectCustomOpacityLight.value = map['windowEffectCustomOpacityLight']?.toDouble() ?? 0.5; ss.settings.windowEffectCustomOpacityDark.value = map['windowEffectCustomOpacityDark']?.toDouble() ?? 0.5; ss.settings.useWindowsAccent.value = map['useWindowsAccent'] ?? false; + ss.settings.turboMode.value = map['turboMode'] ?? true; ss.settings.save(); eventDispatcher.emit("theme-update", null); @@ -537,6 +540,7 @@ class Settings { s.windowEffectCustomOpacityLight.value = map['windowEffectCustomOpacityLight']?.toDouble() ?? 0.5; s.windowEffectCustomOpacityDark.value = map['windowEffectCustomOpacityDark']?.toDouble() ?? 0.5; s.useWindowsAccent.value = map['useWindowsAccent'] ?? false; + s.turboMode.value = map['turboMode'] ?? true; return s; } } diff --git a/lib/models/io/chat.dart b/lib/models/io/chat.dart index 8e98d9d47..21317b7a7 100644 --- a/lib/models/io/chat.dart +++ b/lib/models/io/chat.dart @@ -312,6 +312,7 @@ class Chat { dateCreated: DateTime.fromMillisecondsSinceEpoch(0), guid: guid, ); + dbOnlyLatestMessageDate = _latestMessage?.dateCreated; return _latestMessage!; } Message get dbLatestMessage { @@ -319,9 +320,13 @@ class Chat { dateCreated: DateTime.fromMillisecondsSinceEpoch(0), guid: guid, ); + dbOnlyLatestMessageDate = _latestMessage?.dateCreated; return _latestMessage!; } - set latestMessage(Message m) => _latestMessage = m; + set latestMessage(Message m){ + _latestMessage = m; + dbOnlyLatestMessageDate = _latestMessage?.dateCreated; + } @Property(uid: 526293286661780207) DateTime? dbOnlyLatestMessageDate; DateTime? dateDeleted; @@ -372,6 +377,7 @@ class Chat { if (textFieldAttachments.isEmpty) textFieldAttachments = []; _participants = participants ?? []; _latestMessage = latestMessage; + dbOnlyLatestMessageDate = _latestMessage?.dateCreated; } factory Chat.fromMap(Map json) { @@ -703,6 +709,7 @@ class Chat { || (message.guid != latest.guid && message.dateCreated == latest.dateCreated); if (isNewer) { _latestMessage = message; + dbOnlyLatestMessageDate = message.dateCreated; if (dateDeleted != null) { dateDeleted = null; save(updateDateDeleted: true); @@ -742,7 +749,7 @@ class Chat { if (message.isParticipantEvent && checkForMessageText) { serverSyncParticipants(); } - + chats.updateChat(this, shouldSort: isNewer); // Return the current chat instance (with updated vals) return this; } @@ -999,9 +1006,10 @@ class Chat { // Compare when one is pinned and the other isn't if (!a.isPinned! && b.isPinned!) return 1; if (a.isPinned! && !b.isPinned!) return -1; - + if (a.dbOnlyLatestMessageDate == null) return 1; + if (b.dbOnlyLatestMessageDate == null) return -1; // Compare the last message dates - return -(a.latestMessage.dateCreated)!.compareTo(b.latestMessage.dateCreated!); + return -(a.dbOnlyLatestMessageDate)!.compareTo(b.dbOnlyLatestMessageDate!); } static Future getIcon(Chat c, {bool force = false}) async { diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 58c6822f9..3f3bf4dbd 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -215,6 +215,7 @@ class BulkSaveNewMessages extends AsyncTask, List> { isNewer = first.dateCreated!.isAfter(inputChat.latestMessage.dateCreated!); if (isNewer) { inputChat.latestMessage = first; + inputChat.dbOnlyLatestMessageDate = first.dateCreated; if (!first.isFromMe! && !cm.isChatActive(inputChat.guid)) { inputChat.toggleHasUnread(true); } diff --git a/lib/services/backend/sync/tasks/sync_tasks.dart b/lib/services/backend/sync/tasks/sync_tasks.dart index 7123ac744..2064a9b8e 100644 --- a/lib/services/backend/sync/tasks/sync_tasks.dart +++ b/lib/services/backend/sync/tasks/sync_tasks.dart @@ -46,6 +46,7 @@ class BulkSyncChats extends AsyncTask, List> { Map> chatHandles = {}; Map chatsToSave = {}; for (final chat in inputChats) { + chat.dbOnlyLatestMessageDate = chat.latestMessage.dateCreated; chatsToSave[chat.guid] = chat; for (final p in chat.participants) { if (!handlesToSave.containsKey(p.uniqueAddressAndService)) { @@ -258,7 +259,7 @@ class SyncLastMessages extends AsyncTask, List> { // If we still want to update the info, do so if (didUpdate) { chat.latestMessage = lastMessage; - + chat.dbOnlyLatestMessageDate = lastMessage.dateCreated; // Mark the chat as unread if we updated the last message & it's not from us if (toggleUnread && !(lastMessage.isFromMe ?? false)) { chat.toggleHasUnread(true); diff --git a/lib/services/ui/chat/chat_lifecycle_manager.dart b/lib/services/ui/chat/chat_lifecycle_manager.dart index 571ce8465..efd8a4f0f 100644 --- a/lib/services/ui/chat/chat_lifecycle_manager.dart +++ b/lib/services/ui/chat/chat_lifecycle_manager.dart @@ -16,14 +16,20 @@ class ChatLifecycleManager { ConversationViewController? controller; ChatLifecycleManager(this.chat) { - if (!kIsWeb) { + + if (!kIsWeb && !ss.settings.turboMode.value) { final chatQuery = chatBox.query(Chat_.guid.equals(chat.guid)).watch(); sub = chatQuery.listen((Query query) async{ + if (ss.settings.turboMode.value) return; final _chat = await runAsync(() { return chatBox.get(chat.id!); }); if (_chat != null) { - bool shouldSort = chat.latestMessage.dateCreated != _chat.latestMessage.dateCreated; + bool shouldSort = false; + if (_chat.dbOnlyLatestMessageDate != null && chat.dbOnlyLatestMessageDate != null) { + shouldSort = + chat.dbOnlyLatestMessageDate != _chat.dbOnlyLatestMessageDate; + } chats.updateChat(_chat, shouldSort: shouldSort); chat = _chat.merge(chat); } From 9a30b47890206474abf5892fafbcf199f32c8dcc Mon Sep 17 00:00:00 2001 From: Christopher Lang Date: Fri, 5 Jan 2024 23:29:30 -0800 Subject: [PATCH 004/118] Revert "Use db last message date for sorting and adds experimental "turbo mode"" This reverts commit 606e46b60a805e27c40b8f2b5f1604e93bd080f3. --- .../layouts/settings/pages/misc/misc_panel.dart | 13 ------------- lib/models/global/settings.dart | 4 ---- lib/models/io/chat.dart | 16 ++++------------ lib/models/io/message.dart | 1 - lib/services/backend/sync/tasks/sync_tasks.dart | 3 +-- lib/services/ui/chat/chat_lifecycle_manager.dart | 10 ++-------- 6 files changed, 7 insertions(+), 40 deletions(-) diff --git a/lib/app/layouts/settings/pages/misc/misc_panel.dart b/lib/app/layouts/settings/pages/misc/misc_panel.dart index 5dca28e14..75a7beaa3 100644 --- a/lib/app/layouts/settings/pages/misc/misc_panel.dart +++ b/lib/app/layouts/settings/pages/misc/misc_panel.dart @@ -245,19 +245,6 @@ class _MiscPanelState extends OptimizedState { return const SizedBox.shrink(); } }), - Obx(() => - SettingsSwitch( - onChanged: (bool val) { - ss.settings.turboMode.value = val; - chats.init(force: true); - saveSettings(); - }, - initialVal: ss.settings.turboMode.value, - title: "(Experimental) Turbo Mode", - subtitle: "Reduces processing to minimize CPU and battery life (might lead to random issues with sorting, chat list updates).", - isThreeLine: true, - backgroundColor: tileColor, - )), ], ), SettingsHeader( diff --git a/lib/models/global/settings.dart b/lib/models/global/settings.dart index 7f9711c2e..88cdab338 100644 --- a/lib/models/global/settings.dart +++ b/lib/models/global/settings.dart @@ -82,7 +82,6 @@ class Settings { final RxBool scrollToLastUnread = false.obs; final RxString userName = "You".obs; final RxnString userAvatarPath = RxnString(); - final RxBool turboMode = true.obs; // final RxString emojiFontFamily; // Private API features @@ -290,7 +289,6 @@ class Settings { 'windowEffectCustomOpacityLight': windowEffectCustomOpacityLight.value, 'windowEffectCustomOpacityDark': windowEffectCustomOpacityDark.value, 'useWindowsAccent': useWindowsAccent.value, - 'turboMode' : turboMode.value, }; if (includeAll) { map.addAll({ @@ -415,7 +413,6 @@ class Settings { ss.settings.windowEffectCustomOpacityLight.value = map['windowEffectCustomOpacityLight']?.toDouble() ?? 0.5; ss.settings.windowEffectCustomOpacityDark.value = map['windowEffectCustomOpacityDark']?.toDouble() ?? 0.5; ss.settings.useWindowsAccent.value = map['useWindowsAccent'] ?? false; - ss.settings.turboMode.value = map['turboMode'] ?? true; ss.settings.save(); eventDispatcher.emit("theme-update", null); @@ -540,7 +537,6 @@ class Settings { s.windowEffectCustomOpacityLight.value = map['windowEffectCustomOpacityLight']?.toDouble() ?? 0.5; s.windowEffectCustomOpacityDark.value = map['windowEffectCustomOpacityDark']?.toDouble() ?? 0.5; s.useWindowsAccent.value = map['useWindowsAccent'] ?? false; - s.turboMode.value = map['turboMode'] ?? true; return s; } } diff --git a/lib/models/io/chat.dart b/lib/models/io/chat.dart index 21317b7a7..8e98d9d47 100644 --- a/lib/models/io/chat.dart +++ b/lib/models/io/chat.dart @@ -312,7 +312,6 @@ class Chat { dateCreated: DateTime.fromMillisecondsSinceEpoch(0), guid: guid, ); - dbOnlyLatestMessageDate = _latestMessage?.dateCreated; return _latestMessage!; } Message get dbLatestMessage { @@ -320,13 +319,9 @@ class Chat { dateCreated: DateTime.fromMillisecondsSinceEpoch(0), guid: guid, ); - dbOnlyLatestMessageDate = _latestMessage?.dateCreated; return _latestMessage!; } - set latestMessage(Message m){ - _latestMessage = m; - dbOnlyLatestMessageDate = _latestMessage?.dateCreated; - } + set latestMessage(Message m) => _latestMessage = m; @Property(uid: 526293286661780207) DateTime? dbOnlyLatestMessageDate; DateTime? dateDeleted; @@ -377,7 +372,6 @@ class Chat { if (textFieldAttachments.isEmpty) textFieldAttachments = []; _participants = participants ?? []; _latestMessage = latestMessage; - dbOnlyLatestMessageDate = _latestMessage?.dateCreated; } factory Chat.fromMap(Map json) { @@ -709,7 +703,6 @@ class Chat { || (message.guid != latest.guid && message.dateCreated == latest.dateCreated); if (isNewer) { _latestMessage = message; - dbOnlyLatestMessageDate = message.dateCreated; if (dateDeleted != null) { dateDeleted = null; save(updateDateDeleted: true); @@ -749,7 +742,7 @@ class Chat { if (message.isParticipantEvent && checkForMessageText) { serverSyncParticipants(); } - chats.updateChat(this, shouldSort: isNewer); + // Return the current chat instance (with updated vals) return this; } @@ -1006,10 +999,9 @@ class Chat { // Compare when one is pinned and the other isn't if (!a.isPinned! && b.isPinned!) return 1; if (a.isPinned! && !b.isPinned!) return -1; - if (a.dbOnlyLatestMessageDate == null) return 1; - if (b.dbOnlyLatestMessageDate == null) return -1; + // Compare the last message dates - return -(a.dbOnlyLatestMessageDate)!.compareTo(b.dbOnlyLatestMessageDate!); + return -(a.latestMessage.dateCreated)!.compareTo(b.latestMessage.dateCreated!); } static Future getIcon(Chat c, {bool force = false}) async { diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 3f3bf4dbd..58c6822f9 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -215,7 +215,6 @@ class BulkSaveNewMessages extends AsyncTask, List> { isNewer = first.dateCreated!.isAfter(inputChat.latestMessage.dateCreated!); if (isNewer) { inputChat.latestMessage = first; - inputChat.dbOnlyLatestMessageDate = first.dateCreated; if (!first.isFromMe! && !cm.isChatActive(inputChat.guid)) { inputChat.toggleHasUnread(true); } diff --git a/lib/services/backend/sync/tasks/sync_tasks.dart b/lib/services/backend/sync/tasks/sync_tasks.dart index 2064a9b8e..7123ac744 100644 --- a/lib/services/backend/sync/tasks/sync_tasks.dart +++ b/lib/services/backend/sync/tasks/sync_tasks.dart @@ -46,7 +46,6 @@ class BulkSyncChats extends AsyncTask, List> { Map> chatHandles = {}; Map chatsToSave = {}; for (final chat in inputChats) { - chat.dbOnlyLatestMessageDate = chat.latestMessage.dateCreated; chatsToSave[chat.guid] = chat; for (final p in chat.participants) { if (!handlesToSave.containsKey(p.uniqueAddressAndService)) { @@ -259,7 +258,7 @@ class SyncLastMessages extends AsyncTask, List> { // If we still want to update the info, do so if (didUpdate) { chat.latestMessage = lastMessage; - chat.dbOnlyLatestMessageDate = lastMessage.dateCreated; + // Mark the chat as unread if we updated the last message & it's not from us if (toggleUnread && !(lastMessage.isFromMe ?? false)) { chat.toggleHasUnread(true); diff --git a/lib/services/ui/chat/chat_lifecycle_manager.dart b/lib/services/ui/chat/chat_lifecycle_manager.dart index efd8a4f0f..571ce8465 100644 --- a/lib/services/ui/chat/chat_lifecycle_manager.dart +++ b/lib/services/ui/chat/chat_lifecycle_manager.dart @@ -16,20 +16,14 @@ class ChatLifecycleManager { ConversationViewController? controller; ChatLifecycleManager(this.chat) { - - if (!kIsWeb && !ss.settings.turboMode.value) { + if (!kIsWeb) { final chatQuery = chatBox.query(Chat_.guid.equals(chat.guid)).watch(); sub = chatQuery.listen((Query query) async{ - if (ss.settings.turboMode.value) return; final _chat = await runAsync(() { return chatBox.get(chat.id!); }); if (_chat != null) { - bool shouldSort = false; - if (_chat.dbOnlyLatestMessageDate != null && chat.dbOnlyLatestMessageDate != null) { - shouldSort = - chat.dbOnlyLatestMessageDate != _chat.dbOnlyLatestMessageDate; - } + bool shouldSort = chat.latestMessage.dateCreated != _chat.latestMessage.dateCreated; chats.updateChat(_chat, shouldSort: shouldSort); chat = _chat.merge(chat); } From 407278631cb4561b8716e1aee9196c0f6252fa4a Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 17 Jan 2024 18:35:52 -0500 Subject: [PATCH 005/118] Add sort parameter to sort by lastmessage on web --- lib/services/backend/sync/full_sync_manager.dart | 2 +- lib/services/network/http_service.dart | 4 ++-- lib/services/ui/chat/chat_manager.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/services/backend/sync/full_sync_manager.dart b/lib/services/backend/sync/full_sync_manager.dart index efed36007..5ed64af8d 100644 --- a/lib/services/backend/sync/full_sync_manager.dart +++ b/lib/services/backend/sync/full_sync_manager.dart @@ -182,7 +182,7 @@ class FullSyncManager extends SyncManager { for (int i = 0; i < batches; i++) { // Fetch the chats and throw an error if we don't get back a good response. // Throwing an error should cancel the sync - Response chatPage = await http.chats(offset: i * countPerBatch, limit: countPerBatch); + Response chatPage = await http.chats(offset: i * countPerBatch, limit: countPerBatch, sort: kIsWeb ? "lastmessage" : null); dynamic data = chatPage.data; if (chatPage.statusCode != 200) { throw ChatRequestException( diff --git a/lib/services/network/http_service.dart b/lib/services/network/http_service.dart index 5b3fd2bdf..e43dc3294 100644 --- a/lib/services/network/http_service.dart +++ b/lib/services/network/http_service.dart @@ -305,12 +305,12 @@ class HttpService extends GetxService { /// response or how to query the DB. /// /// [withQuery] options: `"participants"`, `"lastmessage"`, `"sms"`, `"archived"` - Future chats({List withQuery = const [], int offset = 0, int limit = 100, CancelToken? cancelToken}) async { + Future chats({List withQuery = const [], int offset = 0, int limit = 100, String? sort, CancelToken? cancelToken}) async { return runApiGuarded(() async { final response = await dio.post( "$apiRoot/chat/query", queryParameters: buildQueryParams(), - data: {"with": withQuery, "offset": offset, "limit": limit}, + data: {"with": withQuery, "offset": offset, "limit": limit, "sort": sort}, cancelToken: cancelToken ); return returnSuccessOrError(response); diff --git a/lib/services/ui/chat/chat_manager.dart b/lib/services/ui/chat/chat_manager.dart index 34ada3699..1f139b62d 100644 --- a/lib/services/ui/chat/chat_manager.dart +++ b/lib/services/ui/chat/chat_manager.dart @@ -146,7 +146,7 @@ class ChatManager extends GetxService { if (withParticipants) withQuery.add("participants"); if (withLastMessage) withQuery.add("lastmessage"); - final response = await http.chats(withQuery: withQuery, offset: offset, limit: limit).catchError((err) { + final response = await http.chats(withQuery: withQuery, offset: offset, limit: limit, sort: withLastMessage ? "lastmessage" : null).catchError((err) { if (err is! Response) { Logger.error("Failed to fetch chat metadata! ${err.toString()}", tag: "Fetch-Chat"); return err; From e2796a35bc80759b148320a20adee0c11e6c4085 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 17 Jan 2024 18:53:13 -0500 Subject: [PATCH 006/118] Build on Flutter 3.16 --- android/app/build.gradle | 2 +- android/build.gradle | 2 +- pubspec.lock | 38 +++++++++++++++++----------------- pubspec.yaml | 4 ++-- windows/flutter/CMakeLists.txt | 7 ++++++- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3e0f2e483..0b03607d8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -33,7 +33,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { namespace "com.bluebubbles.messaging" - compileSdkVersion 33 + compileSdkVersion 34 lintOptions { checkReleaseBuilds false diff --git a/android/build.gradle b/android/build.gradle index 12ee42751..b0b51567d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.9.10' + ext.kotlin_version = '1.7.22' repositories { google() mavenCentral() diff --git a/pubspec.lock b/pubspec.lock index f239a0556..596380bda 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1727,10 +1727,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" metadata_fetch: dependency: "direct main" description: @@ -1767,10 +1767,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "2fbc3914fe625e196c64ea8ffc4084cd36781d2be276d4d5923b11af3b5d44ff" + sha256: c3e5bba1cb626b6ab4fc46610f72a136803f6854267967e19f4a4a6a31ff9b74 url: "https://pub.dev" source: hosted - version: "3.4.1" + version: "3.5.5" msix: dependency: "direct main" description: @@ -2080,10 +2080,10 @@ packages: dependency: "direct main" description: name: photo_manager - sha256: b2d81bd197323697d1b335e2e04cea2f67e11624ced77cfd02917a10afaeba73 + sha256: "8aca19e47804e99abec5dff8ea59c684181fb2b6ebbcdd3557a2b4fb8d5deae6" url: "https://pub.dev" source: hosted - version: "2.7.1" + version: "3.0.0-dev.2" photo_view: dependency: "direct main" description: @@ -2590,10 +2590,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" store_checker: dependency: "direct main" description: @@ -2606,10 +2606,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -2686,26 +2686,26 @@ packages: dependency: transitive description: name: test - sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46" + sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f url: "https://pub.dev" source: hosted - version: "1.24.3" + version: "1.24.9" test_api: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" test_core: dependency: transitive description: name: test_core - sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e" + sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a url: "https://pub.dev" source: hosted - version: "0.5.3" + version: "0.5.9" timezone: dependency: transitive description: @@ -2990,10 +2990,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" web_socket_channel: dependency: transitive description: @@ -3083,5 +3083,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index 781922652..5c10c744a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -116,7 +116,7 @@ dependencies: media_kit_libs_linux: ^1.1.2 # GNU/Linux dependency package. metadata_fetch: ^0.4.1 mime_type: ^1.0.0 - mobile_scanner: ^3.4.1 # no desktop support + mobile_scanner: ^3.5.5 # no desktop support msix: ^3.9.2 multi_value_listenable_builder: ^0.0.2 network_info_plus: ^4.0.2 @@ -134,7 +134,7 @@ dependencies: pdf: ^3.9.0 permission_handler: ^10.4.3 # mobile only phone_numbers_parser: ^8.0.0 - photo_manager: ^2.7.1 # only mobile + photo_manager: ^3.0.0-dev.2 # only mobile photo_view: ^0.14.0 printing: ^5.10.4 qr_flutter: diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index b2e4bd8d6..4f2af69bb 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -9,6 +9,11 @@ include(${EPHEMERAL_DIR}/generated_config.cmake) # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") @@ -91,7 +96,7 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ + ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS From a5bca4a4913add69852a32b34e6d3cf5594dadc0 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 17 Jan 2024 18:59:48 -0500 Subject: [PATCH 007/118] Update dev deps and regenerate splash screen --- .../res/drawable-hdpi/android12splash.png | Bin 21427 -> 22434 bytes .../app/src/main/res/drawable-hdpi/splash.png | Bin 20362 -> 21520 bytes .../res/drawable-mdpi/android12splash.png | Bin 11134 -> 12644 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 10648 -> 12062 bytes .../drawable-night-hdpi/android12splash.png | Bin 21427 -> 22434 bytes .../main/res/drawable-night-hdpi/splash.png | Bin 20362 -> 21520 bytes .../drawable-night-mdpi/android12splash.png | Bin 11134 -> 12644 bytes .../main/res/drawable-night-mdpi/splash.png | Bin 10648 -> 12062 bytes .../res/drawable-night-v21/background.png | Bin 70 -> 69 bytes .../drawable-night-xhdpi/android12splash.png | Bin 29826 -> 32466 bytes .../main/res/drawable-night-xhdpi/splash.png | Bin 28492 -> 30890 bytes .../drawable-night-xxhdpi/android12splash.png | Bin 57428 -> 57117 bytes .../main/res/drawable-night-xxhdpi/splash.png | Bin 54606 -> 53811 bytes .../main/res/drawable-night/background.png | Bin 70 -> 69 bytes .../src/main/res/drawable-v21/background.png | Bin 68 -> 69 bytes .../res/drawable-xhdpi/android12splash.png | Bin 29826 -> 32466 bytes .../src/main/res/drawable-xhdpi/splash.png | Bin 28492 -> 30890 bytes .../res/drawable-xxhdpi/android12splash.png | Bin 57428 -> 57117 bytes .../src/main/res/drawable-xxhdpi/splash.png | Bin 54606 -> 53811 bytes .../app/src/main/res/drawable/background.png | Bin 68 -> 69 bytes .../src/main/res/values-night-v31/styles.xml | 1 + .../app/src/main/res/values-night/styles.xml | 1 + .../app/src/main/res/values-v31/styles.xml | 1 + android/app/src/main/res/values/styles.xml | 1 + .../LaunchBackground.imageset/Contents.json | 34 +----- .../LaunchBackground.imageset/background.png | Bin 68 -> 69 bytes .../darkbackground.png | Bin 70 -> 69 bytes .../LaunchImage.imageset/LaunchImage.png | Bin 10648 -> 12062 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 28492 -> 30890 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 54606 -> 53811 bytes .../LaunchImage.imageset/LaunchImageDark.png | Bin 10648 -> 12062 bytes .../LaunchImageDark@2x.png | Bin 28492 -> 30890 bytes .../LaunchImageDark@3x.png | Bin 54606 -> 53811 bytes pubspec.lock | 46 +++++---- pubspec.yaml | 6 +- web/index.html | 97 +++++++++++++++--- web/splash/img/dark-1x.png | Bin 10648 -> 12062 bytes web/splash/img/dark-2x.png | Bin 28492 -> 30890 bytes web/splash/img/dark-3x.png | Bin 54606 -> 53811 bytes web/splash/img/light-1x.png | Bin 10648 -> 12062 bytes web/splash/img/light-2x.png | Bin 28492 -> 30890 bytes web/splash/img/light-3x.png | Bin 54606 -> 53811 bytes 42 files changed, 120 insertions(+), 67 deletions(-) diff --git a/android/app/src/main/res/drawable-hdpi/android12splash.png b/android/app/src/main/res/drawable-hdpi/android12splash.png index c8b804bfb503ab82fad9765449d8592566c17a1f..b6a2dc8a74b83a16dbd392f133e915384e074c1a 100644 GIT binary patch literal 22434 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 e$asnq4%c5!!<5Ym~DS$*v6KlIt>;_sh|W=|{q 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 Q_vbBLEh9*+rv2Oh180Cf82|tP literal 20362 zcmd2?Q zfd`RcLz4p^cSw+hkmJIlN%QWgiHS9kF~Eyx#f2k)cUa&_1sZXBXd=>a6xlAs!9irT zshxkWuWqgsxXs;ee!p~o=rvG!{x&x=pUFz+?&UT&(`G+P`l*0Xd?5oD_fw&g_n3H! zx)k;&;y{*D1=IhdiN9=)=$b@S*yTC5TACB`uNc1b)OXr5%iP`jI^94eQS8|LqJjtr z<=E-pZ$yg2rALB93#0;0J0__=bN@xtLrGu*aa|knm%#1bx$}KHTdk0D`<#db5gj=0 zh~cT4#oVofd+M1XnEiJ!ro{A?&*}Snkp$F)`P=xu7ElGhmGusELQctbq5Vbv?Z&@f zv3(Iz!~OP$7oVqGNtbn^vVw4uEsse8gc35%q|pXwqL;L~_!@R4DiPD^G^Ta9m)Xh~ z6NHHRW%LpNlspYcN9x|$c|4bAz2!Ugl>_AHd%Mf~$VT=P=;cmHS-RQ79Sv{vB3EUp+&C& z&e#0wZI&<4DEVM_E-37XEW6myV8fG>bE#^wsRZ`SD32wc0sQg6*%7W=16v^c>bX19 zUj72%Te0`Ps1R%FbJZ`Ph#^d99igIlYCQhmQArGJ1m|rY}Q_-ttfF^tLc!% z`I3M#d=euhQf*ztB1fZ@1dFqDJg0;py9kje1|LgH)sl2v`NIbu=h*YQH(cVDdi%9M z8{ng^y%=f#_s@l3*UM}4iwLaLe$NSTDi1$soovOmtJaEh&2>WknfrQ$wZi(M^@K9L z&LlxRaWEdjgaxy}1Ak>(N#VhB9U<9>Ovn|k3@mwA%EZwpXAcGIxht)ZaZ7c7SHxpR zHf{>lJ+H#>Y)0GnN$1<$x~?Yc<;Jf@;G^14?~js01)9pLT3a=@Wl|tAWqmm+i2X}# z%+~Frpa4OeY3?aydaf3)Ac&z=u|}2M04@s*G|QgKR=NT60Y}1?W-%9p4n=C>jAs{r zxhs02B={7-#jukUEnSCoekDywt@(RM)YrxR4yy=Dd-wNI$k)#2hw0xy^tb`jY3dUE zAe!+Tv+W-9Ew>wq-`plOIgzK`UM6UKWgAqZytozZ$8H5=Zp{AH5 zPS;=76T)eB4Pw9SQyFhL-$q|P35+5!1Ey1TCcs@#_Rwid!R8 zR@3Mm6j@m^il)j$TffF=TJL(~4@$OUhrM&6tu9zM-C7esZZE&>_kJ7ei9>oxwGvZF zfUPcxJh4}~dD^5svuSc$r~s3I8#IX%5CM~#h@~uC-kF7L%3Qu>S2nUaGP;~BKcoCB zZlbVRQRjK@>lB8Pb!+TC@2ohJ2fyeu7OC%S`q|@i&f5IrkABzR4E5X3d5F4<07q9a z!-k#B^R&pG-s>bH-K@5(dMApT5^%A7Gbg8d4+T4ma=_AorZ*KK2e8n|*z@s0T2T5a zsCBQ1<^GA(UHyw|sz8?@W^-UIyVnWx@5f!Zpw9F2E@L+x*CJvi3br~FGVJ6ih=%(T z!Yw|lO*TT!DeU0~^BQ1bTV4=Bl84N`>g)t*2!>kf=p5u6P`V{s0zow?{a|iIh?htG zW}-J6Ja?{r&5Ak(_T z`h#p~cHN&=hBwRn3b&}WWAtA&R8@JtmLyLM)AF;KlHsWZ&P&yPR}=M0+-}<$^F|Z0+cj* zH{$VZx}Vj3zXl@rFjioyGn>v2D1R~iLNP=r)MyEAq%yDvv1m18BT9n$@mgrQWsdN0&YC z^LW>F>nN#;*|<>#x(z+XK)bd*2FetQ+-7a@kRns9TC#9RGAnu8lq9auW9Npl5WZIv zl0PhimcD}AcSM5SKTDC@EB2!S_qYvnOg0n#>b>q~SEF`(kKLg)up=BU%8_|8d{mZd zAo*=ab4(gwT z0j1_OV66R7d5VdGTVwGI)^!CgoH1)-;REb=SAV-hC4CJ4n&opCA1AVL}CGN`A+-kjyUPgil?l*&WoH zu#G%2W-gOph=P)ywd(7XUFNFrwozrAQh7OwX7S2^%m{m@eek+x?|dM?s6OL!U4!NK z(ws=rku@LuGSpYn4?Ey++UQvQw8HzGvTo0G!tPWTe<=XLb&moTYx>&2s9wg`aEQ1k zjIN>Pi08oi`T{_184m!>){%b@1<@m-7UbdT|RR{yPd zrBN@nBTT@?wkAZyz`tbscUj-2d6089lVMlJ40NvT-4r>;3@R&U6cU|W3@~>Sa^cOk z{>U=MeJSpl2~Ym$&(CW19Jk>v0xJCGsKY*_mto7{*f0>@Ab0& zcI)qCudoRQ)O2xFKe$N!w>8(JdhB+`&B<>+HDC>NJzm9D0A^yowi|6&yDkT36257O zWCOrLOIQgE=U1c^m}PqzAHxa;1S^?YR6~r{^5Z)TY$R{$fJR46g) z;U~B63xXdUTl=|-em-OKaXarEd;VM+LR2e$(W76x1-;7%1oe!Hayj>4UmHZh$OLj` z8Re;L0OlUeUvqoW!zjhmOmp!*R`OP;l_aR-+Ojz@FvJ1cua+y8;+Gf7;>LM72`N{kGALT zvUE^0z344xE`jT60a6wvz=}t4 zTOwD1YuUrkyhgjbJhVg@GtAII%6ERxK?*O@K-wh*K`)PQT27)?#l}srOAv7T~S>}Ypr>i5`&=st1zv6E~ z5ckmBs+))bL%V#huLxl2$QffaLI<7RcrMz^{l0yYyk2hFn+7?~KqNz^V6Xu6rSD&r zfGNR~l$_%j45FiKQ`G@xR2iD>G9T8VA*2&z0IO40v#B6FN$Mq8&)+f^bpXmj3Z-{{ zi%fhZ5-dS~cbYw-KVQY!Ck9uVowNoWMV{g$7P0EwhQ^SwW(J zX>|~)-g&J!J}CuD9)PS0abhTpl$f%OqgeXAmmFdGo+=#-qJ<1$C59NiDovvf(YBrx zQPIkz3i0YkV1o7v8lzV*OmAZdgujS~a&CVPR`2t;Y^oyRX1&ur3pPLqADS2*1lwh) z?jQUlKAo87t1)At(fklY=kVTnwEb)eW) zdzc9BfDND?09u-i(#v{rTy|-u<}+c(!uQQRWbo;1OHB+EuqZWX^=CaSe+&ZMuf^?bHXIB&|Y4br^J8y)lZ)hm&4FN56J{DwPRcdb*2bT)}E8q z=JWy5Ksb!|#+q#E*0$!ZxQra*coM{dV$qOf)@@UQ4s7eW%=9n6LWR*&rE3NeZOZvr zO$S~Nu47`(ahV$eysNPV$>2M41rMVwPjBnE#TYEbZ`iBJpgsNAuDrL7PnVYv*0-=~ ziG$FA?{b-t^ag`2Ik;T$C8IDv5R6q%ZUE{}Oq*9-;ldN;W0nFAJvn*K*Mh_l3PF`$ zHM3eA#wvB8@x}|Q$}+E9st<$=m|=v7H|iDW(AD&+`Q^6t#E=Sa7K0+ z;s~x}SMC8lOpA7UBPz-`VH78id+Hlk1yiKp{>wbFZ=>^vqxHFT95&U z9~7^6UU!V&ZxMjJb~G!HOtCbK{>23kP@%w7J_nlED=w1S70iU#bt z<}Y^a{mh)7gIos3Jaa!FJj6<>ww1CO*Kb~DaPPB>x&*4W-p`@#9C)r$7)Ym0Fh5;OGz|{;i zI$?KMi^QiaoNWI z8=R!p`mBiP^Be^pxL>>CNNw0h)>i>kfhsRg_wnQoP_dEojS9WwL4I`Mm-81tG!4*1 zvc6_MQp!v|4hbNn7@6=PumH)Mp#>=-+CCy+K-aWD>d-Mb&L>HX81`_5e|+F@5y4? z2nel+tq7DZW)W79XHwN23rBsAPHdZH(;_NKW#F5w-1yEqy-D{x&-qCVYLwei{ACJr zxq{of{7PaS&CT78PXdslsYf5^GXttAiV7L>*FKEJEbcjOBV1SGRj3)ANGtrvLz6Dv z8MLfq6cwm~l4^hQt!vRfByWv9LrWKb9BvU})pVgm7&TS19qbtt=>0m8cQ)^V^|?xU zhJqgKG%EQt8-aU}faihh2tbHqBQW4$v`KM+%pxr9H(rtaBkW0>m!C|KO5&UdmAqN7 zr|Ls>R`yA)Uq}?!@a%TzqXi47FBW;!8itPhoZdz2bv;~U{A)GJjI22zut|SyjU0k? z{339@(g=#CpWBun_f38T&cPmVI00^uqDFR^|7z@r4iD{4xwr6Cu9==O3TYRGr8`v? zh(1Td2=TCRRA?gprqcE3{C@5+vL|$8Z)c2xYfXXgd0tJl<37WT++OVCgwo3>Ol3D? zw`G!R|E1c66WtVmjZ<2OSPGJSC&{aWc;R`MzEYI}S;YM(aNR5vCv)Poz?&hHuO!Qi zYg}?%))0XnE{{)3{Epd8G#*xozX2rs+_mER*iWyl^t?Edol;?g@f8Qu=hb$o2i(vC zBKGszy7Xhds{p`c)l`EW&;;VB&^VgN79i<{k7L0fLsd6{00riWh@kyI{BR~_pRq@* zzArN#ls8Ki`A7J8(S&`o`d(#5^L>bACC9_K6RTT_ZbO-l&CX}#N3Y*?1z0aaysVa+ z^_n^{d@W22cI)sM`>5SFD}`Sfgwi${8g|Y&@n)WpC$bL+ESIz<^>`0Mk-yED@fh$P zERjeYC&FUelZ=@zc^upWw+=*`UesSRRhqZsF>^rlb`jajQkuffGOG7*x^ge~)(+oM zEY2JEasKk@12qWYcaHZVHw!?Nlqa*CQl3RY6B6-Q5e&W(6{>s)F7oFe06T3Wp93(n zkrR|nOrTgHQ{{&%_7jP##c6P4h~;w7@Vm!nC?8tJ4vD@rDNy0lB-~^+hu5qASoNve@hbo&@jMcc1_n#` zBm~rjupdkU*Wm+cdcidAK40UlO4Ea_TCQfrRtwZVlRg&ZhIDA9x!TX7X zi8Ka#0ETUtSuQKvoZ-Ur)p>**kmF(N59=VMr;a$_+;PVtMyN(l*birX$PVS_I4ntX zP|s6tdrEo$FEL6AlLw*K1^FThK!<#K4L^^xI2j@T(QOHi;BkWBl;@tgcWD#ega=6P z7O|Yb7Ps#zHPpmc@m7We$lRF+s6k3hYkU4Lep9m{Pl7Oojj#if#@0z($V~4fKE$Uz z1BGK32*j0E3a&c``z@tPIZdB}CIaEQDaB7JBoN7a6f{Z#F3LGusa)=+iX_@(yr6w+ zxKX>8VcWr52>?|l^9fxB;q(cz!SDxD45=xd_q4zGMVzOxqbiK>f%GhZp)Zx>{&mHr)1oyFWI1HB;s<`%cv3E)sR%NKU z5^@Y_c-^6`kU_O!?vley;Z^FN1CrS(^^Z$bur`4}`~c;%+Jbb^vZm%#nJ#=_9V!t@ zMHhVs^00J%ven7QWdciqA*~1yjk3MxuB4w+93gIq$JA>f5^>=Gp+m1s`|bC8?ZrGf z#t<4x=)u{v=~0W*>fnF@4O5RZieay|b9J23+hf-9Q|;ZTv`Jl+ z0ht1iMVruVg*t!h06rWPK22`c@JQ6t$n{K$5~Ot0@-D3lMWBp|O{vPROde8|ut-5( z0ga0S&fGeVxGIO&#;3IyQ#SwG*VFs{+mmo z>o5>W9Ns2$>||3pCUTI?;@u=Ck4@=y79oOz7$PHUY#;Kp{taFtpRoh1zus6$`}w<0 z{!CjK+ZMaVel=01RNfiXXf_f*@A_p5_%ZW=iL+Xhk`k0F6S*bQN-i9Bbk@bjvtC z5&qL*DF4Vpw7}BjJa7^hostt>*$h99B390U)X7v!Rcu9Nn~z-%EUqO0d@Q`aaBytC zcsERdc_Zcti5j-1nO=J&{_UdR7hF$(&RM1Qa~)S^)bt` zt9o607k~bBJ?`xNy8siX$9jeGgc)=|uF!0)xb@`?sVrKcACyKogll^XZO$2PiQ+W( zBcs8T|B5}ICw(D^G;&mXAR};$mB_6htkzv)Gqv40bY=%<0&8xKy>fp`R00z4SjEC% zc@yIN-9q*Wi0J15<4Q{A7?4r%DqsL?O;g%HBQ&c;L>-JqGIqGSW9>(Eo(>FPWS@~` zt=mKACxYdalL^809I(F+P*z*wJ5q@ewH$MnKYFA#;itsGDNzEjQOzKj0V2OL^k!6- z7PjZul(3q7it7y*s_&GRw!vTx9ZYG9(qPwbzUfY~x5(P5m_j)MY%WoBUH*%KlthE;r zDj@S<_KfGm@cU{UhpbQ_I+n8M6OViuUf{n7cuW(#`ss!QV4wwpo!%PN^PmBCmjxB!XWKh|j}W^jLw zK6HRQmM&N^Gr~-eM22xv!C&DhgQ_^8I> zsU)$tF>;-WMx=QCxRpNd{?j8Q!(fR~(8c24#+B;Rc^t>$huGE3FflU$Q&hV<# zfV4;ipr?WhxK-l|-suxyK@CIuyFNbI4&9@xiU)z*UXkeSNnQn)jrhpkD|XPYI!Y^yGm~sEr z+QGg5&aAKa4w^Wo)vFP5#3h;@8nXokv01eqzF2)bTo@yJ2JvfQrGN!B|De3OOBRzc zonkVm2#hEtag0t=hGPk|bVN*Be8EShDn$}ER5KZlM;HGzI!$!$uO-r$H_8(_m9Igf zKY)_;z7$&It+vdejn(0GNCpE;*inuRW78MX>C+Wj+@feB1_M1MR>K-pXJ^3Mt>KSEE+zn0=r8^-sd@{v%hzNM>dI_cSiVL>#x6&Q0B^&Yi1Tx0Xyf1Q5*o@0ty-eJjXsEK7&?P` zsip>1+3N8z(}R@DNNu)(Mxv$x^R<$MD*rHK-Y6o_P8&8hK;9AQkHmC3sClC*%YA!w zCZ*4ZNzc$|e>lQVsp(MpHf+I(3+_aQ){WLZ;Rg>iF|G=ldeCAAdnz3?3d}fZP`th= zg+zs+e!95|zOvW$#2d zC7O%QU5u1fx=@EJ75<)+JjDvk#{&medZ2MjYbGP&DvzjT6^57a)Ex8&8fWgZ*q}@r zNOlDjtYjg@<>ND#eW)O9hINQKh52z;bRp&ZS?y}W30Cpwk+rrfgctom%7or`_j!uCJ+`pZKBCXpP1Aa z3R|m#;RtQjX$C2X2nCEb4GobSmm;Q8UHM`YFq7SBXFwXDw$`%D6Bj>evW~HBZ$DRlTRZ7+vnAR;BMmleB-~$Jfkmt#K>Y)W9a{W>z2G z?PRhounc|H!33z>xD*i2zzF!$zDHk&4s5e#AipjB*rkeRJWaAGcU>o-Xq+nor?^}C zS_wI{N5PX0%9;Y@0*x#7{B;gP_)yfe(L53hbTKY5xuA!J3$D135SNlNf#~Lx0(4BN z%w#8z^me#r=R;EqBBTvbgxa2P%t(8BRF~fTLRgi*Oz@Dgjj{A#QeIN^42dkIZ6&E( zK<{))#1wd4Hx1kX1a)}d#~1G_4_ak+!N^gpx)OI_hDyyBG#g?8O|R6}k^9aaC9?;l z81$FxAbaCGjfkrr;&G(nv(vH)*c$W8Fov*E`AoI^#4z}sC-K8wiOW@6oQ*J%d{+td z;yfY>H%KI}nS+ z*6bVi9X6Yay{J)5j>+Kr^t=*?hWM9)bM9`hN8}8rI1*nHA>?2(rMJwn_-de3bKc>9 zX+zXM?5z|hrSsC8<+hvZ(P=cTLh)~{R5xqmPF0UA9j3@6R#K*HSo|1Reeqc{vqAWD z_bnaLo*+8f^tgsRPGJpBomNY^Xt2dr#*=q?V~nx{I9H)D$QXILi_-7KELPyIZlIF# zdCUb8EaU_zss1X4E8`6K$Ix9TZs^$cbWM9%R4=A$aU3$MUYsmDAbi}ts z{%UZtmTPWV3(M7Y_rO>fwe;8;)9UC7>|Ea*k4h}fNfznoG5nGa0;%2HD+a?gSFhh( z;S=#<1xXKIXtc^`R9mV{oVY8FA=-(h3J>c@JI-xC=COhm(F#E{vxw$v#FM@wb}bq& zZkw2Aye-TJHEx)ZZg?nVuInMAXJ4M(FezyYw9tR2Z6!}e&^a&|Va{fLOgacYWsXXq zO}_3fOluxkm~x5%8rL}H>%@m*m>#z*C(j?Fi^ z=4~ZK;piPMZlnvuRwz2~tu5;YZDd@?0GVwrr2Om1@xy@{lp8wW^+Q8y1 zR@M}fnv9qd!)f4kP0?dq@SOi4L|4yd$Wpu&ARppn9&c!xhD4t|29(*K8vrMM#HXE7 zv7;mUx0=$7UTnva>?m$c83n8Ji_sT^fg)4~Yh^Z|(E8(X_og6rq6Cw|!%V9WJ{@0Z z9q)o2dQbtiHjl>fglZWf`RyFWOS0Kr_7{b0I|?WIPrH0oP1aT^TF56qOabNiF7JV} z*aCg<+1h{#5#fDtP2sPs1q*r1DVFok_NZE)rSudby3wYW%zfF-C6VM)>hF~41C>jm z)MCI1ORI~Exi){?L5PqC*(7X&mnfHN})$GHfFiz8xq z$T-?I1StmAR!;_bNxwir0hlH?HCh(x{XKI}YtAb6Djx4Lj7nK374Br-B<3{moZLkO zR9fSPJx--RAM%xCJuMwNtNvP|4mif@kAdRX61$p*#KW!xq=z(&(edMg=c5z;asE4` ziV6Bq8sSmb*~O#xGl#eSnts)GR7*=@r37EHGVRGUbP4G9 zx)96v8_5-sEld1AZ+Ffm)s?XnigBDb_KJ)+U;U$kMZEYkDkixk<;>)0B%=`& zk6C)yO0$y~ry~Ig<=kb`+rhacX<3y0qUTH6vS)se7ln$^>+e7xQEHP_w)m;0U+Z>M z+nQdqwycMZjX2)U9-OM`rPFk$Q`M=-e=s{c_iOECV$(=isgY*?MhUB{s{;o5a7Uar zfJL;elN5*&^J4P|w~RLpTEZwdS68rn5eB+t@)lmYR=Gt{Hz~#TYZYS!IRSC%XOez|tO_KssX5{RD(2>uuqDIEj~f*v z9v6t&77jbk>*Si$Ft79zIIrR`t^iw3NjBvCV=WlYv_rrYyI~% zdN|IPsmX-+88c|ufN9Q-?%x%%iN+-bx!_>!`E}!_IV^(TLq<#_SH;^K>6#7m0|f1KH#W8QJFw^;NML>b zEG0W!?C5bRJKP3rP|I7h%(g3-ZKkSgh^Rc z_iU|6p!Ht|-R;*6ZjBY66Gj>=D3EwnH|`q&O8Zh|d0%G$DZ#k?j`Syo4a91H4T!Sv zRkr5!^*OJBfUGaK1NFRQ2YCe>dK#g zsQw6_^R^hK3$<^8!nIj=;(Z?KP8Oq)F${3ZSqIW0(gzhzR=Z&|R9244Iwo@iczJmT z#;+16H<}AgO`-t}r>`~&Ce9G35i6c8Mp&5Aw)-ij@uP8 z{=T63Ba5;HVQXs{V4Zsjj4ANiIpI(4X%e33JVCL%=X$6AC!tef)CZveKsr>~4`SjT zOC&FaqS97i4BYS&r|Qdh;d9bB!8im6-2R&f+jb2(i55LhpY zT0N~F^3l?%Y0dq125s*arNyz=moY%=J32Vr6ywMH&V+xC)ZEkGPJXDx>7+7X* z)0ldRj#!3<;~y&etH_^X?`f2c;kAhp&-gyaSaYmht`U*F!u9X%vtmieMV`URO!-=& z$`Y26O+q|gjf(D17wg_dN2dnM=&A1_xB0T~d(CV3p-fDhU)=~ zal*z^6J8WJo~71*6obmD)5WssQ1}fH6EIwYLX&82cq>*k>nJ|?8gsYg1_)Z)g-+&h z^iYTej;zCyq7_ySv%U)x9M&Ae5e7g9Vd$c{(P#d-D7gPkAgaYDydU`t4Ky9S1~Uu` zxkE8cX;B|Uu#XDJUe$!zjIl!mY9P5byDI7aM6-+X2!1V35_9~#GgbZs<=ge%XFyZG zSxsFUXc8~<@3mfP5l|*)6)v5mJ6N5z0Lrgi1Tfk+fLnpRT?Duqx!T&cAs!||T5zg5 z@7+gZ*{Qv*`2HsT(QAFS<9?CfUI~0DB}?Rox5(Y$NbEhRM~K<20h53)M_6rO_pf62 zeo1;M#M1we1-_mHUaYZ*yk5Xy+9L+16gT3T(ZB5NHsa=2Qgw?`pjlu7E+naU z3;Ke4KGO|+G`1o2*9#yx2-PqY(AAdNmC9&>UWT1q_YyUa#9cx!&(7%? zi%%(P=D`o~v<;->v6@`e2dk11?q(+9-GZA@1`D8Zqb;;Xp=c}i1CP&RPU>)pS_rpc zjYHjpolBwMGOYKO$@{%#YZWx9E+s_lBC#i6Oq3qoS|KwWMk|9~<uBXF7!vOLYU-%~iq{&kXoBUMaU>`!ql=eExM zbs|O%^Mxv|c~3ch$p>cI)roYlujh#TyXS}e6S+wElx=>N!Llq^%q`&Jk|wa6sQ8xF zmD@KbB=?yctLyKRx%TYp!vgQSRhP zf`jbZ{kJh^R@ePeqCK(?iH-`z_UtvJkOLv~PxJ^z1l)+;^02Ay|8)AbJ=)x#`+>N%vVFTZY;1Bw8&KP%k{X6wAp|!(oWrbsp z947GnDPCU|)a(hx z=4A@bGDmb5Ekb(cLWPWmtr;86BoY$Nopj3%g?cu=+nB?efHT(hZ5&Xoa{QFJSP08M zojmI371pa^8F_kjtmZvc9&V?_>o_ZtY_U-|+OD~Do^?BY6U5hrK;yC4Aj|Z)ABB?_ zhFF!!>-H>)qxBrGro*!Pm948J(cr}!>U<-N3(m4@hn=Qe$%Ck{$St!uUaNu>SI(dH z`CU0{2*(WN@9&X>U`(R*$4fyvAkZorl0+$zjQ0Dc0XRzO%RdnCi@&Ip7MRplR_rqD zC3;Ct=UULdihtUJNNK57*~w<$#-e8K`kj>Th3=}4y7rEyQgS831$i582pqO7)@Iht zI*wMvuD!(JgOr=LA~9qfjW9OyjYO7nkN=4I-GLZ#-)~w>iCw`Eqzv;FvLZ?)YH9tw zP}bGu9gKwJ#*pnQD3(&E&Rdu@@iZYSfac(@<;BU z2QXOkRbrT^wlDQC`n}E0iWdFZwhCV;|0i2e9rieG{#hk(|Gp{R_7wNp7r4Q%4VrNV z6h$LV1Y&!@1Lb%3zo81LY{&AC|(@vL?tbdW}=7LU(DK}079qMf?dyqlFF0@j*k()cQo0g)u5lk*g?YdX8_z$kXvuh&_S zH31`Hm-03>HvpQ7-X=?qr^$3{(WGV>{fSmWAVaym#C4#tQjD-@jQjXuWC z{rFt*G$F}LR7j8}C#5~jkDyurGQglY=lFQ+~yc28lFQfh~>N0E~(g zWbI;w#&j)yeZmX~385s>J5GwyH@8V->$G=ELKBG>(TsH&o3L=O5m2x7xn?RU3@+63 zdC^QeQJzJ7l;DKy1ftEOoibZaz+&X>B*P~0J3RgmsBR6!kuZ}zq(gSMyf5a2(on*R z{YHF(T1=)#3y@FLPE-JVs)!EVo=i8DexkJ7(SI-ep+4-WDOV`DKMl9Ez<9D#@eV7q zS*Yl8J()|1TX;|o7Kib4%K1A#4#+?-55X&g8&DhJz5x% z4gxI^dhFehWrnT#CJR7ZoFtX3$Tq{Q*f#q;=9@Ts?t}tty2sYI6lzaF2lBODy=8u* zlCg<;rOIiRZ4n<0VO4sUSY&*E9L{b&Ep0L!g%^xpOy>1fvtk$wN#Z%g7ua2rXuVN2 zXwixx8-vzU!K%SRp|E%wc#l(<0U-C2sT-?p#RT&)=jy9ec0gq)^|am(Lj7EQ?-s#L zx8hKiu!xUX#oA=w?`i+OD-vG>j{`mEykQBt)^K^IqRKFY{-E%g6qwnQ#kyWg-isU+ z4M;4@A)2MSHs(zoS;s3{(k@V1{eB9Un@nPF(b67&fAp%8?kDYJM>u!x)(^t4$!7gB z3=`5wu?}Q;f`D%S{1=U3PwzvZqYQFJNAJtf zu4cV8gxIe-8$6bPchI1$Aa)zCr<~mF&VFCY95pKRf!3P{dMjf^G+Ru5xCv$T$gr6X z4Z?03I7YG5{sB-$A=8CHvJRz&7VXs7^0)a18E$#fVyd0dBJU;e1omf!Pqw!@wjgEi zuuJo*wxjwI94-CxwVX}$+4p43;?rhg`7-&<|IO*Kzovf{V0n-j z-iU+p%v_4RcDodr&11l0r6RWJO4Fo-G{ZZ~x)gnw%+4zh2P4w%obFK$yMQXXF3EBO zY;+-%vxwNi0dyB^0PudFLkRS4Y<>&%XV+LHx^OAmuud1E$a>RATewbwUc*h5v0WEo z+9~)r+ub7rrw9nG=xSQWK?$?NrZNK@Le_>q3A^AS*w}l2r2yb^^v&s$g@@ROODRC# z(&p_=ba@2%h{nOL(L@vqs;o06L!v(^-0uI}Z&MQBeO3jH!KNGwC`Y{`2a$xA(!R9QT^eCPpdf8crl70m$R(#`YxrQON%A2z5PJ#2SwyA{xS70 zLTh9vnX3J(Qu~jW5vUw5xx=z2PSiNrotcuZH(Wd$7u99wum^*QgQEo&vM4HO2z(Xp zdZxh%s|Is`yk#TdielSirpf>$A}+AzQiu+Y`y10C{=Y5_*NSh1=zrxBSR;?2tSJo`3xP9!lUDb$$|j9GqP@4i~yHR6+I zUnfpur@w;*Wet(T2{bPCI&E5-+qr)>t4ku7&sQ!ant81VkGZ5TO)Ve|{y96QrWK}+ zMO^_7BIk_J*@B8E$qzbpmsMF{|CeN4oav zHl}_*T89C~{=RShJ4Qz22Z=CQ%-reU-;A^Je4kgXcoJ2u>6AVH9v2d%-!7r44Lg1M zjQ)2Lko1eF8ZilVB~{R2RC#CKIxGHVRoH3CS2#W*K#1gNNGUvKmV|MZ!sSMW9G=VBahqw?k6m0?(s~v=GdI>ZFj_8%YD_6-C)G|ZMJ#6XpfbE z*D=^IvQTGIQ8PkrT7k19l}lDm(TRd5ls&RUeAWCSx6WsnvTJg2VO~4d%3MSVy>5!+PiHfM4_G^8<(wR?J9l&acEGaz3rKu#mz{*?%O^{o#%(V=iPohsCU9@py*58l-|=hAc?krU)&2D;FQ@}^eXuU#-`m;Kh&z3Aj;*@}U8WE=WIg@%#XKnsVn)P=|ugvT4v_Kz>lu?}}wZ z>&h8gXVRaCRD#-B;8}#NK)6X`=|vVPKooG?UN+NxGN~3EMwXH|mAGW{^*Dibe!y|x6B zn)GzBDQU{)AvP)$G8A}F6@*x+E5j;Qasz>kAaRw;pMQBndfB7>ex!Bgd&d^c-XKgD z$OObC0!VMczr$B6{IXfxY8myu`U8VI-cjrP3_j?SC!S9;nuHvE(EtQc^s>;Bde}34Ai@G3*;nMY? zkT%9~NSJcfpAZE=lL^_vVG5cFfS&tDKQ6z-%dGyFf2adc!A3t=9p&30x(?4oBc^kG z!Q=5Z7+Z@?=Y;?ylshn61bf*kXLh>Eue0ZPgf4f@&bhFy32&2uhs=NY7|#vb>u>>0 z+SLryKb;dK!OK>7(nK{Uiwx|M2F57RToElht9R&fidEh`hJk+$nG#D<_x@ht^|lGV z4wECd=X?LGtFo8Bq((qTc0#R{J<2|W*!%PS_2u|+^LswBmA$I|#)Eb(^S zMRxS8E^F2-p9);ruFQuZtUt4bOSA76IcXB^IT|~`;piNTPs4wSaC+96Q~f5jTXrx+ z)WWA{tIxFo4AAG>Lxq|x?jQ1XI`*=MekbxjMP|ot-X^HuR1t7E>9i?Me6Vd5-7m;u zzc0SAD6fe9#Kt>IOW38W4E3MNePF+6)Xai6sPwi4j^%jQwUPXDcMht%#mOiqjZFG$WF@!GgJ!e1Yl zPFw_3u0o3>=4&YRzZhyt|3E5^gc>}CVE0M9B{YVuBWbR{?x#Xz>~!Q8O{K}n{QkrS zmaARa={@xS!~HuiGDzHCM_pVcOr<#?2og#|6ixhR{hseN=l|*DEZ>@Nzdt^@OOTcj z1!+_oWQ2+cj&h_hI;2}kuQS6 zft|V}no%3nV&1*Run>*WUwC`i^lp?paxof}fAws7|8Q7-0R1eRE>C&E13ppqrGnPX z&XmgCoL8l|c3j)o3q9wS%ki)F>2!i(HvENcvC}hEKq*u9dWgW)?e&lJe&zuY<~3prpQw1}KnJ+XliR~cvwkgJoZQ1GPAm}dtebO2_bXQUs)Z=8}S zSrMef@yj8TiV9h2OLO;~EzE#&^N*rS_g@0eAHJF(aa7O<5DXw0ae#DeJlge(3#M)3 zO{=j=!nIMPf;QZNQ)d$pG@u*k$LBW5Z_%%0_iF=EzTHi)rVJk>r~hbPjiwZ`VTl-U zxjD?EyBm?98orq9^%@27@t3y*DwgD z5L%#!*A723S+XlEX8VJ6tr%_TV$UIJaSV8(nJmBI7l5eYExJTQ!$8d?c0@dPzW75W%bNi3MYJl)_?ubRzSWOG_hV zcX2SHTSmWQ2#}!9{`Hk_u=2~Lk|cEw6e=O9T01+d3p{h-cq@@CH#1h{p0fL~(_cD) zJ3?%~)BSS0Gmg5PmqDGu8lliNYZl`1xL7q(;PzrtNQW;=xr3qhzXWPYS{3{V=brdJ zw2cb$!)_L_&u}d;w?A+yz+yAX8Y^{e=PS%(AWP;#X_9|GTa!;v+@Ltcjh4z2pcBdV zyRbzb(6@GToms-enr0h1bmDrXpT>3F#h=MnZTZn>Du{+3kUl7G4b(V^?YWw8my0E} z8;4pC`gD@#qKido#&Lr4V!wWp4h<1jbh9`!diinyCVQ|`Z5ddrktR``C#aCjfnZEY zjNuu62NUT%90wy>p&PNRUP#{qx}DzMNTVi% zDpN2k{S7{aWjMtT+&J;kbyo&()@f`V+p=64RIhfa|Cd(>>D}II5&9`L_+ew4X_7<; zH9^Xm)Wea*&9)SEO(_YU+$=O{Vr<0%d0Yiq^Uz@jK!O-gpj1TUdJL*y0HQal)!Qx> zS>|c98{zV|f?OL^3trV+jqP$Bm}=O&?(c5L`kXc%tXX?(zpIx0?r?ByeLdF?`%*&0v-9K~9wEN~0ZK4^>;hPvIs{HSt= zMdL>CPA55Zo@uSRXw!s;+1u)q=Dm9hC}tWMMY{D9=AI?f(K&o>XOEXc#LoUa)cD0p zB9loso2-D@&<$S2%A0odi53)pK24K*eykR!p#wP;3poc+-5~?*I*l2=??x28biMO> zxHtLM3kJcq)v+ndQN!3i0v^b$alaro7^nNUf>s*@O*^wo!kD)CZfJUX=MdlSOdN%1 zv<083mV~JJ%!WIR%ZpRd`mXvGclvW1mCCv+alC9RjL+A!pD1_Ht`1TKn5e)G!4&0c z;w|rKJr7H%&#PSXF2A3Y>VGBTPbFwOxP=n~_ze z?(xfJ)Wz`!LsvYFcl_iE={^ny`^1d`4-oq6Dq@Y&xVttzz5sqflnL92LnZzA{g3q5 zcrKO;PJqM|{nfMqZx)ERrP99i+oHaOR1Ly(96aNRz8tE}bpF&Rr(#GcgLgAFc^a$| z8`*tQ7M~)}dWo(Iu!T~YEcRy^de&9dF0$7lqe#*h=2JXjSRtJf|6gv6_RVrESrnAm?4>1n(!-;D_W|P&y|QV z<5p04R)fXEu17s9$Ov}z>{kfJ#>Ua*EYV%36fwLXx9&dS=VIfSWxs+q?{HWdB zU(fPV2295>9j6%!x^9nlM&>8;Pyq z5p_Y$Ta~jrR<|_!6k15;#oDC>u}jf^VNM=tE%)>NDb`Ay*fj5XpZ9@4fslodgS}K!nNOQ+UI6bJ4@);)s27|oJe`08Rg|3I$Mm9~?$5i8H zwWtt)5vKG`12f2IoX0<@gKK!r%Ww0IGcTp z_ezOjf!j2v1>t(E|8%`W4-z~)Tjtn0mFAr@wi6V3sAlLTuyq=SW`^P9cC%{WY^PSI zbDj~txZPP5DjQzSCs__*H7M_^PO=EXPNw6v}mUM9Ah6ZjkeUi!mNCV@2rE(T@Q} z+^ST({_nfxN`OwnchuS@6AS9>sqj-LEh<{|st7#`y+HPFuO&M~Ofe%;4e|zC+pq9= zl&tzs_bK`7+WCVb_hN*zMQrza^v1oLNP^H?`11Il13{bkp;y#U!jz ztOZNjgR!kU?*(Ne_h;Zj$jRp|*f>dFu#`^K8P4iQ&H7Iz&ItLV)ZUY*Z^Uy5*iKqZ zyQtzjGGf?RtEJ}J9(Be>C(w&Ay4h&_rk^2XVYbP$y>{<}^ig||>-u5?&J;IzkK#GN zklLQ>PvKxRTF2^>7I#w-3c6R{#gw|AtYr%!ubp)K5wCAk$J$gr$FpI5vS$iw2|;I@ zYX<(XR9_MGmgfxF@KtGi@_p+1^)gDX&3}p^W!d+vs>j*q`l7ut?~Gk=DXo(`iE|6U zhA%!rS6$H+_HQ_yKA^G5b_Y`lo39e2VaUr&0-GZh)ilcj+fI-a0sxg14n z233wBbIIoqW#%p(C;sl0Ml^1)HKWrd>zIYeDkYw2S;b%W3uO%^DL+-+d~D(Qp)YEC zs-x{hY=FK^<(RB0S!k7hKziuUeKo;QV+XQ$zMS2JGQp3T(s?Zz+*Om8ly$cd;qogu zHBejG)p%2YQ20>7K6CP^waJb!4|mKe{L3~cbBg1JoWm>v!G?AoY@ZsftB5vwl_^N* z#*Pr~kPA@w`7OW~=B4)ERN$X+WsFMF5a;01Z%$EY{*LNcKl2Q0^;^(Kp&hyID1s#K zzkO7{J$;mFWLYrO_i#cI*DjGTN+!xrM?%zzb%BAWmqU0zSXRSdCA+5Jy>aBCIsYw2)zd3(s zoLgxM0WhLsgR+|+>W0Nz~^qokUSV=Jy!V$Y!^iQupUfolNRe$S=>3uI(WHX3Z#CVb>AwC?R` z@;ulgC4a^rwIt&THGXvFl|v+iSKAVYf!c&*=q@M{gBen?_TLWS9TM`K-bfC?;wc8v zCtEFC@YahVz5qny5(MKVId{3oybX#ZQ}rV{UVB=DZhmd2)%KG#$BhGL0#6r1lpo_* zA+N{wPvBZ&SmI|>5Q(ZFLQCbRnI!ulDNL{%bA9-t_mHBr>A&ppsFHSiZMHv$I?xPL0*k5gHDX-~pSk$`g~ fq}BiDgFvKK#t|^_ImIN#9zgF2=<#=LyO{q0*U%

WaChhO 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

WvzHTvk}M~Av^yk>W^RxX?TeyvJKK1HbTuZ2#f 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 diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png index dfb4a79e10f68ca0a524aa495f4dd59af37b9b60..4f18799e2c69cfdef6bab8a0871425bcb05fa593 100644 GIT binary patch literal 12062 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 literal 10648 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 jF5GDCyIl|kt2Kn1+up`pgWku`$>FyjhhFZ) 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 diff --git a/android/app/src/main/res/drawable-night-hdpi/android12splash.png b/android/app/src/main/res/drawable-night-hdpi/android12splash.png index c8b804bfb503ab82fad9765449d8592566c17a1f..b6a2dc8a74b83a16dbd392f133e915384e074c1a 100644 GIT binary patch literal 22434 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 e$asnq4%c5!!<5Ym~DS$*v6KlIt>;_sh|W=|{q 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 Q_vbBLEh9*+rv2Oh180Cf82|tP literal 20362 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 fq}BiDgFvKK#t|^_ImIN#9zgF2=<#=LyO{q0*U%

WaChhO ze0txXaPNoiUhDMgbyEDH&V zi$xv^`RtB-;Ej<&(OY}8n>s&FQKKF7<-KKWAVC~32@W8&RzPMR{!(zl!t@B)8t*53p zojB?{TJ-xU3&h04bVGY#rXdNTNzVo5<$(QZLt!vLI2a3yfCg? zIQ%Vl6vK8>;>bt(wf;VECe}#fgE^xi+n) zoFZ`(I-l5S-$}+sR??9dS>oG+k7^W+1m9jP*VpBqX|1ew(7EqKm|1Ns9eN_JY!*o@ z5sfX?Mpo6a!f3n>M7XHo;1JySS2sMSlPz?z6t(U?9+y3hbU(A5t&PksKbuDUR02u% zlhB%}AvY!{nZ8G8oZ@me-wU^@tCyfyxE{d*V=o9UH$#J4=<_iNdH`G zzwAr)8;4dy{P)lG7at@7XysP?N}-&(pY^$oI?;Ycr}(VT{*F$mtuP&!qf>Y-n^eK5 zHoy=Q4dDaUa4m*x3TCqi zBQx_3_b1?}d?_|++-h3pj6*BRRi)#4|W#j@@TqN)UMO-KxHGs%ARs`*@2RKj-n!u|b2>O)6PFD$3c>OecNk?S=Z~bY! zBI#t2eIuVZGR=1vr`tT!XD~_QxUtUXHln;6$*~z73v%L4`bYeEt9VQQV%Rg%XsqAU zgE@{O5ELgx=TeGv^Gu=YRpQSi#)*Pst$w8|%v}*!jgX<#Du$IXS<6(&RLU9KN=0Y5 zuG#5Ra32;h3OrmUrN>WPp&GK`TwA>Yz{u1$eho(W-0V;nGmHu$&zF4;*G;7*hzJZ8 z8tjQ+MYq3gc&pd*Gg*1v+dZBS<&-bS zTc>@;4KR(HK1cYR4CwJapZb>Zq4TFqhJ^{T{6X<2#pWwAOMS78>5QK|UW?z5E{`RZ zfs{v&aZJx!Ovlh+@M78OPSDDoR_~2Rf0_6CeR40|2+la3ozAWsfUCt%vZBIyocYCA zm8v|-;uy*;nT^3mbPdb?Bv@LS)?9vsDx&G_4KmEZ)>6bmdsr)w` zzomEofU*DVbtuH9BYp$Ao5+&)rIo92JW!n)YdEAX-%M7I8nmEgC-Ql3n95li>)#L@ z^ZuGp7(dmE6=q*AO1F;!%U`TrpR9z^-47~RjebPwjLT<#USg@`SpL5B^rc)J?a}mX z*#Kx9xA8}0*@H({SBs4ygqmjHIW%;;TMix|er$r1a>1I)tu;Af(FUoBdK;iQmzs~K z^RTzxBZy7aDVgJbcIzea`xapksXE{hcYy)Z+-x|{Y~LpSf?Kcq&estbq??n| zYZS~B=!*Uh(+cJ0qAlLO=&hmLQM?8ez5VPF6WCQ{R;+u&vg}_jbR6A(;{B{xtj{MG zw~$0Xi)jouxr^jEzS(}0LNTh_-HeurE(;77jJz`M;>9P+Lt+!uCx{)Vu_UkS(xn3F zY1rfB!U<Eygn=UG~t!`-oG6%ireIdpscNj@0Bm# zJg9lR4c6&h{20_}`8^yY85ql}K-f8q5oqtuWvr+$8#>D9G!p1BN2f&4A1+kKwrC#ubl2Ne=8_pENT^k9O3{G{jCA%#!T2J*#0LPsWDjC>}z_CP;6Sm}8Hk})F z`$1hwgt5#b(zD^TIo?7}O2*3)c<`4ZDE}LK%W;Qgh2WlJs=4giihlpONMMR=)bdnLx?8YDfyWwRt`K)4+xC?=Ed(>Se6)5QGIx( zGf7Ms#}1?(UBhq}wlI&A{8ZYs@92y>`6Yo9n7G{wPi#v-i_q`faQT1r7 z7a83Zqm~-qh63`sMg84jGz=`I>RKZo3gsEyX+KdUS)uuu#hSq?ls384utWT}1KpL@ zTeQvo<`vsU9B8$+6x%*>55(TevEvu4?wtGjm^e(Q$ZuwJD>pj^p3r*un{|bL_^2OD zj1m=LGBrhEf|mYEn>w5Anh{l!;T-smGTHACuX92cIdspaRZ=-XQXewkFy;HSTFBUT z?jlBI^N&0|Xn^>|DwMa09z3H@yR};)ym~P3SA|C)bQ&K{M{3~hIou>*5aGse6Ts?L>*x>mP*ZNb3qMm;+tM6! z)Z93cX;LSudz%?kB(m zK|rEtv5lk^YtJpjaHO49>+i%vK&M?Ev(R0a!Sd=Ns2}&0GH^>5S5#-2k#tyj;Pvj7 zZgIB{Lm*SSWqd}@vI{E|CV0&wdC5hwq2`-2!^fu0 ziV2h$C}XO74<-`Z%_@%g>!6#9yt7Fi6#X|-Xq{_^NddnUJeK@EFftFv^lbUYliQL9 zy3NJjO5-9zgI4Z)>wfw=x5fU7*xfCG@DtMKph>;uWAwcaSq>*IZ(ao9e(UMr4mjwY zMBROfKchfD0$P2YPiAJU?q{N*gDFK7sBX*e;@|0X2sD)g9>HpW&tiNhC81_wCxMhY zag&wjO6*iZ-s*0TcO|v7^9t~mUGv9Hk+pS*^n*re#~bG;p?)0h^z1^U^cZ4jP99np zGa)THcPHJ-XIj@%ufWVhvh97E!z4P0mL-C2ht%OsX@#W>FA>@I#UBC(-%kraM()^h zYt(^tF!Ru09y0ODPglfwkGL9Oz!Ecox)#|0#4L1Omc5R`fLm22w3fq@e&zG}R$`;N z^=$`stDIcXh3+HYYKcPH6=)ii(0@%QZp`vY++$+*HlSZAy7pjjDE)PHA~<)#N!dVC z*t(0z&R9uGfh1ZmbhIlt7EEnScuye1YJK7IR%$b!r5!XIe#meX>b3th^NKF1omO&@ zBFK_19#3MdY;8okJCRECyo7~(*>mS>g?ddD*8B(fgF}Co8z#$u`W&h(kQSM-LLr4p zvM1<%Py5tz5{Q3dIiQ5;6gdEU=zW5suD#UuRm=*K47>&y zmFjdi3tP+kL{Ii14YckAi&vP7VL~y=q1$PZ%Xt6G<#FAAqz9B4n!XfB60x5Mg!?4 zkitW|fWIUq1-a#eO zHyX`zcu6Jg{CiM~lfHe=={5&a04u&E3=Lo>fTgL);$Bh)?Z%`nS`p zP})#D6yp4!idZB>IBvFVMuQN-E|Fy0W#rG=@9I6DLWjVt6xkS4!5AX~sX8nc1JhNS zDKq@^Yu%I%bF*1-@v!Lx1+O{KXm5PP>J1&1Ayj6-r#>N{2=1X~pyx@DbQIbZSE?FN zAna>n7~REPx=~<+c5?ZenDaQ)SQ^>lYK%hDru*aYjTttJt6R6u{(_;2_uqCgC7suk zcZz*M-aQv0Ri$!+a~_PZ0k;%Y10zHHFBx1}PjH1oL?HYv2FFQ{{0e8@x@BI%rqxL{ z&$*&;f%AT*b`gCZLwmI3pAy`T1AMfKDt1hc@)!s&1c*-e$_L>-^9!ZnB87X(c=c?Z z**++d)k;ntX*BZ-3gawMr$LfiM_N-#3^DES*-%fvaeky-HYZVZwu)3e&JH)%*BEA4 z<3_k)A|ydJi5DXKxuQ`q*6%2^Z-mM4rYh?2{geA4?2NU|fY6jix^X8cF|#fGd3z9>Y+|8H)QwwZ6sf zl_-h^&@0J#j0^Dex2PA+?F&gJ{d{($zrL4Mf!gSzp=uhgli zP_GKz!xH=Isxa`}WC%u7x=?pDSSpFLDP;Dusb)cG#&bXfZ^PY<6w?5zT63IXtq@Dk z+y*m;r2VwR?a6q5D`?k@VMIwja5X~+H9o(G7M=00GtZ!)uE4|XUaSn9v*vk!zd4j! zbGLek+!Vf^#3KulQ3W|?GD#a2L2X#DtnAM%r|lP5T*k+hTCSt^)u^%G(PB+7Ui89U z2u<|YvL;kMY z^1uIe0O^&|G2U!96?fYsRC{@aptJSu)kk>Z^slPVFN=aIHVj|! z^Yx`xwb0G*&Sr=%(qhm88NvC4{dG9;?^aUApLYt3?Ds$3D@62*H%nnRt5H(tg(eVB zAJ4SI)?}3;j`SMSOSh7PtZ75lMctiUz(nlk>MH*9fThZoVA}4o3Sh5FA4tI3UB7f4KmwNb|KX2z+H(rg z{E}?CXGpmn&EofAYMKT?GqI&Fc2Laa@|)?e;b@B2jkN~H1ZVlu_GnSf;%|;$HU^pM z=yqi`JihoT8iG$Gs5=(Osun?kiUtjii>4|7d|EOr(xlTsaCc}N#+E5MV(89*hu)%0 zcURcPl6!h9&pA;BiEfzp*ZwNn_RXox5#Ei8<3|2S-mAkGc10;&qsWU?eS5p`NMrEnr1}EUz5B}9#Gpr9gTvBjA@S~q!y0kl_g>DoJ z1NJ)(zBXx@G45|LZ&}lLt~UjG#f~K@{Zm?QKdpP{Y;*RSImW3xr4EO~4H{Gr*T*At z@WC3Am))Z2(q_`doPjB-zsv>`h#7G^IVI7w&Ejz^4fUd_y1&mES=tY)sXApImDZ)i zmO|l2Ev^E>Ert_IszdgMJ_49JL)g0#oN@zo;yZ~wwN9`NqgI+AnaJN!w;x? z`vJaUtK+Tn3RDO8wn&$Qz)1i)i%TP1Mk^6S$#M|nOJdCKnf3$PkNo%mm%p>NPWSO% zK`|Zl@kR#Kqt10aWDDsof(}wBXJ=g@r6Zlu9~t5*YEzl9wd@EN7w52@`hye%hM$EU zZIot^v8`>?7MsO_L4T(`^X-=>9DpI`yZaZFHj)YH3Jj6_?&TASTKEzlqYthu_0hSj z<54a&-B1PW4QQ*v!Gl?HKd(oG21dAxD?K8*tSW@_6YlB+Ba65L)u;Sq3~CzbDnxYR z#u4eViMtfZhtb`U_`%~_+thXZ{ryl{+~I5b#beXvYd416x?JqSXk0ClIIGM8o6pql zrq&j_{)ZTZHGOV<9V25`&7`{*0qC#?s6?9V(u02{kw-5F;XD*1HZe87=gRs-H^bGl zMd^1J19HluRN$~3R05DDTu4G7xh`3R(C6?tSWrymGS!WRa)+B-J(WV|%;S>%<^UKF z0O@--S33+%f0O?6S}qz8CBsyIy4%;0sBkhZ8Tgg=8@G+NYnYN-y98w!~^r7lH z>{|h)2!}%4+lfYB3?^(^Kpi-9Q1il&Ntd^0k9znqw+2LuPLEoR`B5;;5Xxosq!$9M@>ut3Q6Ekz=Hl6;zhA=_8niLAX zSfFS-J1$0ZW};@xe?K-)jo zMnV!zBKB9NbItly)t1zz6WE(CPSnS^+-B~rH(g*7Ecj}5krnC5SGal#J@9 z0pgC=l}ahRHAq-k*ik}Z^%CnpN7RalE};1pmcFl+5mDL4ImxbJT}4*b!bm5{iLLg_ zHG-cLlF1AHoDZE%Y!xPk_ve<

WvzHTvk}M~Av^yk>W^RxX?TeyvJKK1HbTuZ2#f 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 diff --git a/android/app/src/main/res/drawable-night-mdpi/splash.png b/android/app/src/main/res/drawable-night-mdpi/splash.png index dfb4a79e10f68ca0a524aa495f4dd59af37b9b60..4f18799e2c69cfdef6bab8a0871425bcb05fa593 100644 GIT binary patch literal 12062 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 literal 10648 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 jF5GDCyIl|kt2Kn1+up`pgWku`$>FyjhhFZ) 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 diff --git a/android/app/src/main/res/drawable-night-v21/background.png b/android/app/src/main/res/drawable-night-v21/background.png index 1b5df34e7b11f0f86b98ee1597aa936078ce13fb..71e9c817e8c3531d8b353b9818aeece0e1e64971 100644 GIT binary patch delta 49 zcmZ>Bogk^h#K6EXp*;8=kmB)laSW+oOioNl0P;i_SYIspt^;H-c)I$ztaD0e0stb* B41fRt delta 50 zcmZ>Dn;@yn#=yWJFM6aCNb!2QIEGX(CMPB&{NQI`lwf2DVB6XSlwk05^>bP0l+XkK D6dw!0 diff --git a/android/app/src/main/res/drawable-night-xhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xhdpi/android12splash.png index 45bc2cd61a8097f93fed67aaba504063ab40d4a5..b389a0addfa582008eee8f8c01f5af6ba04abda5 100644 GIT binary patch literal 32466 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

_;=HFGpA_iiLC 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 TTOz7T9-5l6wo=t=X!!pDg*AEh diff --git a/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-night-xxhdpi/android12splash.png index b7b98e8170ccca11a8ab8e7475ecd02245208d2e..66ab0f82f2f1c74d2173ce1760d7e96cb54aad43 100644 GIT binary patch literal 57117 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⁣+kX=|U9`W@PoJazatX;R~F!9j*| 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 diff --git a/android/app/src/main/res/drawable-night/background.png b/android/app/src/main/res/drawable-night/background.png index 1b5df34e7b11f0f86b98ee1597aa936078ce13fb..71e9c817e8c3531d8b353b9818aeece0e1e64971 100644 GIT binary patch delta 49 zcmZ>Bogk^h#K6EXp*;8=kmB)laSW+oOioNl0P;i_SYIspt^;H-c)I$ztaD0e0stb* B41fRt delta 50 zcmZ>Dn;@yn#=yWJFM6aCNb!2QIEGX(CMPB&{NQI`lwf2DVB6XSlwk05^>bP0l+XkK D6dw!0 diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png index e29b3b59f99290135b0cf3745bc9993ce935b27c..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 100644 GIT binary patch delta 49 zcmZ>9ogk^h#K6EXp*;8=kmB)laSW+oO#b=*zdZvRA2SnE+1>|0aRyIUKbLh*2~7Y< C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/android/app/src/main/res/drawable-xhdpi/android12splash.png b/android/app/src/main/res/drawable-xhdpi/android12splash.png index 45bc2cd61a8097f93fed67aaba504063ab40d4a5..b389a0addfa582008eee8f8c01f5af6ba04abda5 100644 GIT binary patch literal 32466 zcmeEtWm8;D7i|IrcXu1yLI}a#26qi^!QCN12r@u$cNpB=-2wvycXxMpxbwVK_ZQr+ z_rp|Io$0CR-o4iDwdI5J14V)oI#C4ji5m02c{?yz zh|mGkIRG&TIv}=)z==VJAie+p^Z#$U|2NpIu{z=|^QEF!2J0n;h1Di7lj4VT(y1e==@k-_5A0z-+YSGGcX(Y`%%&?jajqmldfmYiUaa_=4id{5pP_i58~J#3$BT4omO-Tt;$ z=xY93ZTA~0C*Wd9y(NV+Q~e#Jt-d1`B(`u2rPG2gW+ePWtVF;wv!cNEl}xb7=&!Vp zvq43nYq{x6v6`kP|6j+r-j22#efQ1wVz?_x)tS_v&T{^ETC3n6{(`wm7b-{IZ9eFV4=!N!uqniK$&nu#JGC{iC&)Y=LM3yvt7Q;X_?YX zzWMPI>+(E{pZQ^4mp3tt*rtpmX$2-?8=eGZ&?=HsXD>a<9rup`An1nZm;`>RE ziRt}Nu*oXo7Z>)@U!05|_Wy|+^YU#Cd@N9J4yQ*pXki{!14+JTn4rlt0b+ngf%GoD zli|#TO3D3qAadueL=`MGA!k6sl5X~L^Gyq_!?^!VcH3On<4NnMXoo<~k_!MX40r^3 z@CUL+d8pa!@X`F%3o&8z^2~EHN7=RQ+nZp0|a@o-D6rBCu zu4jLGqgvBt8P~}&A0<+Z3OyKW(Ts;5_nM>7<+%P-&~GAA8-E=3f+Cb5iCr)ak(P~4 zDZ_zg-~6qSGMZ~DAJga3wUxo&4E9${x1^iw^NK7>Y=%jywjrjN&f&1v3+9v>QFmBs zIDMhB7}r{tB6y*x(qi3(F5`CB1^umC!*KawshpmRE%WwdtfA`Fbd(vRBIuXArI}bU z6BMI~A~a}RQ^iDln-6^$LbuaJQ9^I+RSzY-lfRCoHW{@Lc?-m~UgDOW58U(@Khtyc ze9?`hePE%D2^!Of$}42PvNY z?)JmF=G)D0v$X_V#$DvdUxw@qdeNmpt)bG0El{XHV8b}!qXn(IAEt%e{-$h?XX_M~ z2!_%+i%Ut93K8UP@vrDHFe#uD^X@@*v(MCA>-w!&QF#WL2NcRpGCzr}pntfrVev0& zYSR_thoFr6+iChtAK$^PXNRY~!h&(Z&c|B<0x@qhF$uA1s4(aWf@tCOb)}KRhPd%> z);0a~KM2B!sw%M~B;kFml_rmg3FI8!AZ4Hk5BKvF!{TzvWsj1MQI3-tIG#$d%0o~o zr6V)QJa$%Nu_t|#^`z$|9~-2X=%r0S8Y~ffc-8U+*?H8TJnX;tbX}IYU6Xsa=QXsD z?L1<`eEfukDEi5d7Vo)?%=hJS8{O~x?>af3)ss`y_Kmz0$%=zC;)^tZ76nXf{-HR7 zhXz^A`8qWJ3CtX!eAAkkNBjlN#QJD{SIjVqc?UtdV#PU^(LFSokRM%%p~p>nl)Y8t*QwmR~OT zJ|}gOG)Q=9W9vqK>~oI-4r0C(QLgw7*u5SZSSf4cc(DZf^tb){dKIB${*_K)4+M)U z=i#L#hHDt9Pj~lVC21QB+J4_Jl%lt9W?69R8@d;Bn)nY9gWK!x+3QP}b1!ZC@0Yqw z4mv_UL~xrGmX$$LG(m(=t|C%9&5(J|B@4Os58A(cuPJno;Ax`5mf$smP1jI2mTh2G zMI(&Jr=*|abBL4|oD#|4)3Pm`NTe=_5@7eymmaeqJqw4>bSm0Eq~U>d-$-JC&1jSA zGGL1;SoDsU=Fh7hi%<}}o!){R9*+jh>()Yoq%9@HE}*1{2{m2vGJKwRxHoucIeW$6 z`AsXm$CWz?x9lV~g&6%ua3|EZ*N&X&N;%k30vN^X5n;(>P|I906Kz}H+R)w`A52vv zN-xYO)3Fh2m)KI<%dRCx%to*mKIb6n)ZM&2_QO9tNznh<24lr_Fp1m18*d7LUDp%j z!4fL6))Bg=@rv+fP0~6Wnd;YLHK>2pcaCp;1S|@pq(aIT88*&Nq)%k1I1p#m|I@l( z>9}Kw+z~j=GX3xtPB-+IlPf>JTA>8z!KR07pIlbnJ<~I*Kg{6afM%!n?I~LDD9*I% zrH__`K=^h!ar|X3#O<0w7Xf$4dp;0xXBFwq>T(GT%J4k-cl`DgXrkX|<{pC~F6ly2 zI)QhmC&f@hY~IiD;b#KXJ0*WDrOSaV=|^evtJ(+v+Q?+69+$fT?(Iw*ev!D*tx*|i zlu(A5#8wCuD=6N_3Z7Kp_4mhZrH6~cg1Wbw1Euv=ll|6$li;XHY$NJ84|q($VY>v0)W?QM>rCXaE($Fsbbg4Gx23uzY-0 zf;_)6R+y}dAB$UVqt%F`+Oj9u#z@BOMG*>^O) zX15C~w%N#n)|dhT3(^MrA^<$iaRQ=eyPs)wId<2lCKmy*t*%0W6q7cS!IMDLa**wz zP(7F#PX+SVnyfwYpO95&Y>3;zuzHkCQ7)?fYn*w{W*=yiiS6B2ud>;i`QP?C-V<8Z z&DwaT-}Dv+i|@rCH=F-W^1YY{&7=#B1ogQiW+Z{-E-Sdz(G|Vg{c}oUra;Q>T zYYF9xdK)fNad)zg zzjl9H_Pw!uZ8sL-U7dfE44yj1gDzL*itoJY?dJIHWfrz@^d)!xWRZc!FDvha&uVIe zRQ9EYE{w*}a$iv08O5ZQEOvtfk3UQ@6{&zYe#eP;GWO3P8Xq&7ehEt-;sDZZ3%X;K zJd$+Y#%V&{Zr9}Wx$?oR{|i!f%3FhfX6*wMa7MG`>m7(P+JER4*NrJ*yetCz7mZ&( zPOotv*4y~|SE;FSqvm6U#J7_*Wsp1dX9wYR->bVt&CqC7;?`1zCv-z-oDJHr0z9R^ zhSv}srbw~qAVKnRh;)p0a@K&Z)jl+SXuj+v2FNA(n1#qv^nNEJ&#dUY4=WBrd`7)t z!v41&^Lp!x?U5ai$^MwJ7w8|bAp8g~dceLRtu?RRltYTPtWnp2_;ql0X!ha8Pe&%( z;5+XY)(A{x;X-0_qgIWv=^qlgPHV(OTvOe{xOQu5U}jb?2D>^+6b)Kx-_6SH@TWj9 z5Gf9Xy(mQ$W*q>e%+9>LrC@jf=~n2_%>$W*Cquajct z_Qa=n{Vs1(Qkrs-c{XoSDqO;|!g9LNWk!luR{j@c)XFaT1X;@R=1(oE;<5xh@l`dF zzEuMA@CPr7k#d@p`bcw?RGbK@1;3jczH}1CwwG%FIe3OEBHexHGx<{e&f&6Q%k5NI z2W&-*!Ij(sP!z7#0f4OYm>2c6^7*)-uPD>6fZl$G;%Qq3VBm)LLb($V3)gAt>Rj1e zCS!T=SX#d%kF0xIXLD3U6uH2*i1u_&gowzj1tgCXo3@m2a+b);qu6{tLp}MiV;HUK z7_U`&L*d^``?d3JX2+}RaVl|n?WdPeJ`fP(izz|*%$C~{wRHA+ckFdV;QtDGr5jD5 z>by|)E(Ew@4<~A@D0xq>{l_|@;l63>j3&{LdEkL>*^N3o@g`YAxBy3RWdeI_@X|mt z>Lguo0KYIw}(q>n``1spFC_v~w9hmgC4azoroXPaR?YF~>kYdPh z!1#@5wk~nQ>Gc{D7%hAP%Pr(wrB+PT9}i3=@s)sjrqEIKZ@m*p4cFww@S_ak+mQG^ zqKqb~klXr(4hNDVJL*i-j+aWET9m8K`rX_oRW8P1i~A(lAt?PdzRP4W+-M-y@hBgB zx%+2xM(lWT1KfLkLZLXeU7bb6om!&*&-wxWcrtx5S}R_g3q%yJQS?VW=u%~+`IA5z zaWc{-a~YNaFASOJVJquUvDkKOqC$#ftBht7^&I*50G3w!p-N90k`gc%(qn-Kn77Bm zbGv9UZ~TN$QO_WI5}3{RdOR-h^_hUc&vUTUYlMn0a^frC88cMmjx1kOC(~tG&i_Ps zYa%``ums7O%qu7Fmu-J8BsW=3h8@Uuz5#%b%=_faR}fjKA`xsgVbD38gt|LS{f&3y znKFA2_4z>`HwHu^JW4M36+1#cju-p(6=H+e(w+%QOHpM!J4xe#@Tv zLXbfb84eEBDLwT3V~U>0*G{Z#_i)M}%9a z4;_I0pb!H;*)wYAM0d6e8s$UQ-3{t1j<>^kZ$W(}s5vCq3egvVWw_KEq={*3kSr z17ioVC|(B;3bTAxR}IumjagW|F2>zABq$xg*t+zQ!y2ul60z8Xwh)}wUJYwRwN0}` zt5Q*sLV-Bx6%JmXe)!SOSqVXtWM;ddewayTLvHN?yg2!;nn8We*N}aT?APh&jLCMZ zznX~BL3H!?s!)?>hAt7LpBGcOoh;HT2=2EUe!U7sqPA6}^)tNE=d(ym)OH*!_8Is% zABlHLZN=)-AE$VNYQ$CQv(8AAG!Ta>-|^Fqm&@xR&NhSJM88}~6rYJi*;kh2_o-RS zXI)ytpV=LlcEIzgE5ARtf*7ekCt3Z|-j_f7)mxoTpU7uQo+gztYC)Wk(dGR zp-S41jMpg;F}b9zPFfwy5!~aF*3Z3+7-xxHyOsuUxg^3V1Xc(B-73>;ZO;K(=T9%+ zme(>~9iVmyfZ87hYX47fLstV|E8hp-NrZOmmFi%p%I01t@N|U^86dC#7%!AWBXr5# z9X%(lc;&yaMAD*K=nl+<6j~*MDXfu69uWoxvTBEM`urAE8pc3vZOy-4jG*Vux)98t z>4Joj)hg0dCX;$xY5VH&VidOh=Cu55 zSdHdZAL4AT&EtXN#RP$A5_NK6uv3mtRKm8u;`2;u+)ye58VaJWLk@7g6(4UhF*>~W z%_){zZSj4G0I?7QIOq~!p-Z@ocz=3s`f??`X0=VQx4x_KWr_jeeC)~)iz4ZyE2l>Jz~$g?lOX5$+&hombGX(5y^9r1Ex|8D zvvF#?M!xN`_lGDYa>^K~da_th4h@c1anvH8l^pM$nYvj)163jnKqS~=_Fz38Tqdwv zc>BkE;iSl}+U=~T5q21vVMOAFsCyqtidv>+_n-v}!J5v{doY_|#cOe}sq^whO@yX) z5bD(TW762Oyqu@y~wIb7_P%cmf5ujCV^ z%vLFk+!<+g?ZsNAPdX{KI7-D~Eb56OH>py}wSwLxEb<~Fs0Q7H_JbH?e4B$MzrSur zOJsAN0v%8R8!X@4tZLMT8L8?B=-!-AsUo7g*9^ zQZwo{uHcGuK+}Jy(jfXZs6BZ*XZX+(kzP;GmS!UH3@XL7MT8UM-vzZx1GjniY@GPkq6v3 zUPk}(Xpz&?7BdBd5OMRUmish%*Wg*<>6gGlmiBpjohZekUi63rg)uUhyW-XG?PeiK zD5HjmTeof{M}F#ary_)fFtTKFV;}k*n0NVH%r3L>m3j4%O!kG`^gr1{9qJkIg*EyW zgV*UvCHuv{YnOgN@=Ez}UVaD6SE%(bj8oBIszSz6I-S?Gz$wWjbzrwU$()LIW7jft z(R)o?F3NkKt*n+32ZeRX#lAWF#CGEhHJfpznvmX8vYkZ8_TY8S_1G73P*?fh#r<|y z5$#D+ixfvc7bfA36Ds2VIV0f1-$-(=2%)=`FZ71DZCz;)@h5aQ&74QvF?C6(Vu--p zA2o;IT$6oWM(4i-B)YaGiN#iTT^2Mcm2}*Ol{Gu|iNuo9K%_%{V9s zgF@;nU5AuB?_PJR*1K7cezHFCk30hQGbt#4gdWzfFCcmL6U}*2*`9wh{eNWtn2r{3 z+}{q@E&kk}0o7`#-=ufTrcCp5opZbqvYCMCV}Jb|eZFGiBz?9yV7j-2`>F**hrbf3 zO7_%~!$)QqLovuoGnxrHABaD;z1a+LIAcXjx+V9$L7?}$N*YBue_NTwi~)j%T*cf( z;A(v^SMN_md+dvTK4$6uaYF+Pue6m@Z%IS?b_`h|;%@&onsH*OSxc7}I^>JK@sRR^ z*p8z=arOT?waMsGhB1h`<79w{qr|(+A6Fxj7|Wa6iHAh}8iQvn6ZvO5PZ0%2F>>3d z)5$;>c0=TILJM2e`92xxa^}zQPoAchmS(hOu z{zA+@#uT<%bD4k$f&6zu&UyYWeS9e`YX&>osZbEie^c%IqM$S(#db6%h3lLfF0RF; zs1ME0h4YE>_M2{QaPpPa!N}H=lz@^1ZdS}|dty}VV3S1U!mT=Dqb#YCl&Dw!5Ta~~ zgF2+hc&~q{RXrS}zdwwv#*{;H>1W$MNKop79>}x?{r4>11zo2iw(}WwJ7x3U3N3}si?5h=FDU}ULzyS* zqbB^Salck_@=Z&BHjd%38qUUixl%sVypd|TeOX%TDpuMqvb)iaCav~PvHg0;xezNv z{${f@IJ|R@H>NK`UOYc{@U@%soN76C^U3ktJED`dH-t)Fz8StiXF;#{CtnL}-770%l+2j1l=xS)_`EB86D&uZ)RSsvAEM z!=soqy=DX5oHm zrSg~o#18Zzkbl{Vuz9l>a$vJCyfwR~JU!|~^b&zn_3d|95IpKVU+;%=0yyJbiR=ry z!hz$zb0M*MY3FMthT#Oat6jDu&~5YOdTt`GelIF?&mF#j&nzZ0A>x9XUSA!2D6oK) zWME-m+wBk~fnd_6jv*9%;mWtn^gshM@!Xv^e#U(`v+kgC0Rf0$5NVQ0P|kh=U~oMZ z3qK?%Wp=(((Ps}RrCCs69HIlsT2|0i2m1#qVE1g*keC|EphK;U63V7o;g}s9c!fmlbuL0#UBv-mft$gh#n!Z zz2s1Dr_+&tcq)1Fh$%%~U*9B42~$G8RWyn~=6WMKsCSij{snv^=z=1NEt-?c4jQu4 z;X9NS(|WqXL>7>Kyq z53S(J2~M{AJA+>rUz;&O4c4uLmF>1w(u5T>y!OY#M&>!X$kqc`m zxv#l)JzeO!bmuf2Qsk39b;u33rXi%yL(%2wZrncI?8LznupxL*ujbrO5t`;bruDhB z{wpJ7&<%%B3ma6@<7|^?1PcFNxz5P&0|!H8{~~Do-KLG2*B;_J%mq zq~-ADkmJHPm^jmAej&nUZZRg4MSfm|=7+pP)+C}~loGLh%79EKJ+>XH&pCl#z3<{z zj0Ri1PJD(0jW3}hOyUAgYyLZ6ag6tc$aO|w6Ss%%m4~G{m|476okIYuX)h|Dg2TR) z9H9K4Ya1>Uz#$67t9CNbK^n+Vn96lN;|i}0s_geIN44plT4X60@?*Pnt`@h45Dm=; z!#P~K-T99bRC>SO8$J=!fLW+xGN49By<8crkN){8Xa74p?m#j3c ztl;c6E{LLH=6He6bw~#1&UVwGZccoow|)3UJGheO8}ufjk3Io22c!MQuMmQr;GjMI znTA{mzFgY|l84dJ|J2MMPuXTW>wM4WPoHDahT}voL6o3;?D3~5b$T%VI-Vqi`svrR z`;F!-FEeb7QP8i0A^cX=#Xw&Dez37Qiuvi`M56xUPvYRfz7yr68mBXO5?nK5w&el% zzYQ}9R)WMTDY;C*R61JCm1sR!S2F2N3hegd{2vEM$$AHoVx1p*7=p4;hLEUZUP9@| z#@oC$N0k}wZqG%c1U;z_(Er*9V zbGNQT7b6H}H&)Q1bh)!lm$cH%#qq;A)R1cpC?Z*hUbk?5Q_AJ{G|gm6bjx2$=ifs& zeB8O--kqxV2J`!$o2rOwv66W)q?9m2Aj@5izWlH6*Xi<@I6zmF z?@hj74H`10M{VorHK+amn_q)XCZ%T!?yCsdj#a>uAJ&O#6q1&ibw3ODZ4k;tL%xbx z)Ubk8P16g>8T6K5B%2?h?wBlceDx;K^S^&B4 zjN9?F??L||Q1YIB4*w<(W5>YlVhuNmpS6d?r2t%}okNX5vY!*nI3766yU1e~>B4cF zV&|%zSVoJ2qZ9t@eWgrnY86-_BukQ?FHJ<;!IdW|P`2gQf99X;KN>cI75b6dE%b5!HtL5$oUB5UnE(qhzM81Al2&U68e zv1)qwtxMobD^$Ov_z5&+#n?)-+Z@RH3Qg}Wd;EYAeAAPD*pi&9Mj-Rqq!)x~SzWdb z-q{rU{qev5Hcaz8Se!Tb2WS7H5&$feKfRxB{o1hEkzr*bC!tRD;VrrQyLaoBvM%Q*t)r?+ETy>0?a^8k4fNl_b>H zB_SyK!86-=^C{axyRSb7pKU&-$v44Zg_7l32or}W3S0_y_UEq3HFZV_s1LG`c{I>N z60IIV)DN{^d}tbyq7bIHOI1^3G~DYKWvm?#^%v#KkL@tWyY7M*uZ(13UD9RalP~Pd zy;qr1k2(Ah9riAY-s`WUmS3)X--B}cq~j0aF#}StqJ`k2h5fY8Uk4QN&Kc(a0x32p zXQB^Na=Y+kF9y^aCK9PCs>VglwE1N0z9Ihoc$ty9b-(2N@ShI0`(E1(>04`ICTmKe z2zo`m#aG{ry&VH^V zz5XrIu%>3VSq6qxvs^Eqqz~g_(;cD}=1)T~=t^gqD@h8MRq;^^16yK3<%mHM7VGjB z*_K9~HH1mhG`SzJLWxu!O6{)}4Idf&yR+{dsk{PASO^-Gg>85W-5^QMj9~}$mze_S zY(sxyKh;^31*( zeJy2@x^=tg;;@DU7D|MjlA=+d8O`$xO8daV;JCgoZJ)vY;G{_@z zbL%RiG|I$rt^^v3zh}TtABn@ne4{03wuH4If{9~(J`sFZAEHGT!sX`9_?>K!puI}o z{nr$02irJSSBMUFn{?1T+J9w&{}|;JonT*XoJ(i!co8mDK37#e{+|%DB-QJT{bT|R zv2~KA?P0LRHK*%UO`zXvS|m7~h%=cx2ILRnwsIV*3{|%?zKRkuKUE?w+pe6)eC?<> zrnG#%qCunj-*%_>O^XcKzhSpdRut1RwE9HYInoCK_*7Dth|p(zmyikTr59pJcRE zk|WnvgL)Q0%i`Yiz5TCkqFrZ_gmYD6ZBdfNjBq%EWV8fnOLEme%Cw5~$*K=d@wFRD z6kN^^PV3P=A4(5tCyD+bKD~I_mJC*TLH;eZ&Tjc{h&c z>Kua&_~f)|StVp&)4jXBiQiaPj@SQuYNt9v@JBxBxy7%2v?z z_jeu*NgF+ny2f|mbe=BaHm#_WQaZNsfguo8uan_nlCiim4|-Ok{ha5IAhNd0mNq~5 zj{)q$A{cnolrSm)WW!n1RGwE$I_XiL;*4*EQ6Jsq|K(93NhEp`RvpZO_wuKs4s?U2 z2j_cw0&QMQX{#PxlLF(0?fE)Le9P&->r%My!QZ-W1cGLIQgM!dVtYAaxinVRl3QK> z8|#^|(F#_*JJyG_AX|b(Ct2HA*10>W7?nADNTFArd zdkyzbZ-De%W2 z-CX!7cZ7VIfiOYXwP4}P;SkK~>ljz2BO8rG)23Q<@o|UY_}!_)Ib0fo%5Ox8NKZJ9 zgB;VsV(deRxNHG6ek5QNpml%5X(g^h;gE0%7C(AbL4b7;GQT6BbNWP9c@Qxi=1l)n zU!v#PV%SeIMWCMKpLZQBx!x2!D_J`l5ot*7TWwzAv_}vvF~V8#zEq0zl9&%qJO$_C2yVAfQJ||dx|rN9)vS^e|5ZP z$j#kuk2hoYG9mTwl-k!m31MsAK18dwvaq;2&ZGTV^R^XI4x}ByZWYt0MOTL4MX6a@ zt~m5sMvHKL7!70){U2^?-V>&kuz(cBKKS;ZwOr(BXF@7jc8(168I%id9T(odIi4lJ zTNVc_JSL2UwJGz0B{J-@uu>DmWhSqs2O~=Zki?NMKrMFFuHriD@iXLcnZ<0cL0~t> z$uGV+9!+A>p*`8m23g2QT&A`FQoeHZGf#JZ7K8by`0wzwG1uGA@gTRr@h%UB8+#V# z{@4zCl_kpr)!#;DsuxFGZW12NR_|CBW&RGoijq$;aZMX_u{%`?DT7%!V$e73#2K0@ z&p#G3_{!J%eux1adb7AE6yixCWu?c{G0BWxe zsp;qcnmTl~w6QSbV*#s?jOd>LWZcJCJZWGs9l#*~>b`;Z5C!x=fKlg?F z3*;JW4HU!>8}Y)Ugz3QoRkdOW7+D{Mx*D3Gk6#h)>2YSntZ5t$K*S4{gLAc}l}Oh< zfX=jFX}MF5LrKdMB9lwRsKmZs@&M@fA{N$l;*WAbKspSzGwJyuWhMR0zc&&sT1_x3F9&><$1FC;eaFNU{by0=Da=cKvc*fq-wff}>dpUC%>j*;l0xo|WT7H9(4jhVkE;Wli$ zRn(#g<$iRrgcgG|lzT^lg5Uc?#$GH!nQkh5^r~`GZt`|@?CR$An&nQRex%O%<&QlcJr=?i|)4jh;Au?kBy=xb-X&UWC`9Ht4*mlm|_xa z|E!cX(Y`mUBLcw0h0J90#k(C%{?T(H}_gmUz}M0VUEBGN^`>=1CkXw95$Wh1+PuRJ7h?OJdLD#ZEBQ{JwKZ9?<@Q6Gl`Njv8Ql z_c4I;j{K+XiC)i63Tu>cP);i?>&`$MkrhuQIjx_ktoTHr+gBcN2AFxKoQGu#em$R! z$1w{?%`LoqHn{AT7*A#w*EvVRZQ#nHd%Y3lHXZA=>(+NfI0W+>^~im5vSULR!!BS9 z+kpOCocA0)S@TJL&zb`j;WrZ(RV#6266O+;?1CLMD*Y<^?6fbK_*Hgy*>hU4psHak zGqKlx>ti#oq!U@6lul(*G;V8eG$G6>Di#<7YD`igFHiq(V*4l`TAbqb|CloJu6aUR z3=;%uzh%^6lz{Br6c+*$GnM)B)>0SvsA>pC`kH#`%pH{wqDXXt=#z`GPsVD^?r*{b zjf}?A9B)(#T9Np!X6%fjsWXJYBrC#QL!|}_Z$$CW-7!LL*k6|BD&ng3Y_U8t>}r%X zP3=CuZ8ry8bVXMTy4CrUp7`OKBdbEFVGl8#b^7nHPk6+ZH~`X3q^$e&Frp%GzxyZx zF!0|xp4-=B6E|kh#!P`q ztT&D-nNEGqvFKO!D$oL&<3gmtQZP$_olWA0?4{TmNue}4Kt$zuRFVhy{H%{&J zIKC`o9k!O7tfLw8TFu}XaNoUE7@&Pxm{gTI&W$r3(4ch<#>*KdAxAb~IHVg7@=U*l z9YD2QzIoEj33G*JGk9LGq-!c`fF~bfB=~??O@o0$c_g|_A8k@BYebj&K=Tja0}g*0 z(-#3CIcuq*V^c*pjn@6sjfRskGs z2IJWceT#oJK?af^@a_$yd9I1F&}*$SA&waD)@taKPiAm-61>=raVhv#w>*}P`U~PsWxC(`oQGq>^O;k+ zj2eZyautekioVjiZ01n)K&(B=lSX`2b6XY2*GB0vYuHjIkGur+cjc`(cZ?|+3k>GX zR|q48Ea7?s5aB@nc{hZdwOVst(KBD5?V9vCmX^Pv-CUN$=sutRUUW*9Z!;c@9`VeK zG00fUkYhsMmMRM^JktvD@6?Qgz=BW^Fe<)AQ=&F%s&YF~l<9Kz@>wcJ_M!~!^h_xT z7kk`_Y0aYYh7SsuVjSo~-)gEBAnBk$%a37nEwCmjz6=!#*3*mp)T8#96XEwSLB>+s6B;HNkO` zJDsh+V-@j%ilMYw+C>x^QnBsU%rDn5w0#zhCT|4zJC^PcGFruWY4RSa^|Nmi%ExAv z%V&tZCT9H*({OHNFE83IJzjIW=Hvi|ev`!ew$yt0oq!>m=accZVSbWO5gN>Z{7pyy zp<2O206`7_Umzf`aF%T`@oqspFC-Xk{ws3!P*uTim@ zNx5)^8?PT@5&!eFLui3(f!a!8%e{!AQ`-zXabmD4mQ&8V+%r5+T-wG5$kQ3Lu8E;y zI*Y+?ksoXtY29Mvkjy$rP}*wje-#dW=WhJYXl{3OMfZ$=UOwN}BS`9;aQ)$?9Ou~} z{8_+l-Na6o>g(Eh2nWj!8@7?*=YdSVqobJW9RHo+;h7*SXQ{I@_Zpwu;JK;n)T_?vzQj zT2d>B6p%1t{@z9v#x;3|Dgll&o|7&7W7n4@5K|i}g8N?-=2q7X!Dsry2}9-_T*>~7 z`K>&9jM)38hO}*sMl+77!YH$(sEl{4F%?i6Nf!GiAhp9Vt6=llpb1(?ENu;YS~QIO z>oQutc4GH8mi(PcM*m3=FA2w0)}vPXsYIN}Tq;)t2Mi&U1zd@Uz{MeHSA{N%wdJHp z$KuasvP~}>V~-%IxZ?of(67{o$Px7qNm=A@1g4G8GT{xCC5{>q`kb5V6p!|*RHq_@ za((jk6hno5Ps?<;7Zo$vG_rO+3x&sn%=u#%^;dAuJrqM$KbJaR<6UC%4g+K5@5GTynoeT{_rR;n&86O8zA8s6D5-n=+X&L55-j>K3$U-_2HQJC>be!< zc(5s)nhSSq<0rV)A&sOS{lIH=zHvk8bz$Rdx~_W0oN=7@wQ(t;7&ARKMd3Z3!!zd9 zU)>sCxw`E+N)b=8jt*%ALqg+&q{-o!F#{}Pf+VRwdPJ;q-25)zQH^7fpyHxioIJB- zevX2i54GB>7KDp&{QiptR3e7iEGj(ntPw0>GyZm-QaTS-#qW`lEX z7Jp3dPM73hi*ke?>p#}&W)AsMNdnj3H3|?6yHP`?#kt`)@k_R$A}bBW)Uyiw^$W2d z-VY$Nh0Ru*DD5bAcr}q&JT5b`wlbWBen%SHC0n>Lj(0Nm&_WlDxEGW%y)rxY89{*` zagDcp9V}Q3ZE@v`L9`XoX{&855$;a#LW2$)`PzRIzj>=3`M`DtpeEwxqA! zP(UVyhS)2hDB97Fq+v|dial*nqFX;odZMe#@0%_eXa+hIb4f>Wu(J=0h5e(E$T<S&tgi`3e81(&l(?lkR4qnt(IQr##FO z7V%Z67xNO2a#|gxW$>Cm4d&L}h0~^s|L56NHgz@sJG(PsXhhS%e)Te>_sByqRAkDr zrHg|>uS*Ae=n{}P?vw8kA=u{VGVA_}jFt94_uz(11=zLPkwi`c)O z%9W$uxw+qk^h~C!=+Knc98%x2mtv!Kd9%Ijv)f?38}qZ9?(rgIPdGslmC z#uNlM|4${TmR;Aj&p8xEJvxEAoP@-;zR|6F%Z=>7?Kq9Lt@7!&87+pOr@x5Ae|J34 zvyVrtF5V+TaSYD`S}jEzjG5!WafP;F>Kt|-nl8fv)pg58t@+PYtX>3`ECd(E?$AB0 z>{yN1Bc;gwJ79(UQufXMd~yiVNWUDqaa}F_#*JA3Rl$>slONv=qF9_}c_t8}JLcd3 z&+`wPgTyDTR(%TYZgtatXTQE&12qj+$@OMn$RI$un>^FIV}|L!R{4$K$y5+cvkT3> z(}JX$E5rKgf7+<&&)%p*MFiX>mH%L@3nC0b;>cmm0A+HKoQ-Am@4Cz`@CV@OI{GUL znV(W4W+em}d+|oGts5ygFB%=nnM)~b=EhlQ^iy`9du#51JB9vy@79Z@siMz|{N7HOw)~YG?S?%Gl?8(wg}DxUr*z z%s_9bqEj{7K(x?a?x~Tgu;Jpg^yc9Q%fjPQ-U!tt3LH9AdHyB`0sK*7j@cP~{#dVd zBZ?-<4Wh!_3tC!U-Uv&K9HRHI zOJmj=jPsZ!*H-`4>LU__{Xi_LF<}!pDlNuS^eA zu`mQ`O=$Xz##n1keXh1$(=KAC6&36j`dDlKr@gOyi28fNRX{pLkZuGCK|s1YMY_9% zr59LI=`Kkr>4v2nq`SMNn}wzOe!jo^H{5sk?Y=o@XU@#$%ro;m$DT=EN+(LX>tvn> zv9+}sF`5XwJ)j&bnWdB*)NHSTVbIh$M7L{93>h&{^XF+m8?Un_EAqg8Yz7?$>I|oC zEFgAL2F=XP-6YF!}-if+3IZ`ol|%i=K&O7Q*qmh)0VD=)}H4uhHo6 z_%gJL!0q^Zke8v&)+M9T#4z+>^$$&~*1vJqP>a3l{w%ofLNy=BPpbb;{1wN7lG>s5 zT2*ts-nfaN2GoiGI*xceS2$Y5ft2Af{%K-76W;!Eh0Oc#htNoK{nhi-8ZStzZ=4Tq z4Fdfq_sWD`Of&335T*&7j(Bc`=!9Tg4Fb~E7N9_e1rYfw927m%8?*e=&TF$ zhL!1_+lHE-vsW17=jypQhQ6<$D9}(^-jAUIgVp9f+pbcPL2kDv5n6uh{%feL?Y`!2 z`lUKLp>c>_n(nK~XTAMsUmWlSH&gU~#veFamb;x_Tx@m$19V-JL9yYq*yP+0yHN49 zVmeoP3jMayKH4}>UR&3iy%hP0iHQ`$Hgyv<75)XsF@V{D9V7S*_hegG%e+UA6LY%U za$dHvvv&S>Q`zj;nLYX}=^#PtQVW({Wns3#Pm1W$BtMy0nnF+-Eq8?ZlPt`PbRf$p zVK20s2j4VQ6=OCCtz#yWp>QDpkT?=bi^?P3z;flY?ZH0rdkR+a-W=p9q41kcNBCbbBWZN8 zQ*|)xN4l2v@^Hg^mr>G}u8}yU_S|v@>r1nvPM3FK{$;s1iTI}D7|=nu@ivegwbwAX z>*i#GEmLp4U42_$dhK{ah9WFj{Khl+u9-lBW>BjkA!DWLYdy_irCzCW9C##%|=D9I7)2yy8p%eJyjVv;WtlZG-bI(X}~5}r#)bI zu2SzR+BKvqIM=a+i5ONyrV_bGG@yB06!4J5=hzpTF;VFyvmZ&)Iw|}4>aVUL!}d#+ ziVSb|$}ZnRoq&OdwFTwEtV%5{2CbwF>2c+v&X4sGM30w7&4msgms+gn!?GNnDW-Su z*(hbwsG`Ta==vXmnhvl)l%(0tKFcqVGfRdv)K24hmLB;SNnhboEMfk9{NSsDOVnz_ z!$ZxHq$HtE*E$ffovHUiwWGk;;pSHbwf z$AJO&CqM4*x&4Z*K?ddPr53brcfUolnFRLSu|o$nuaVqjyr2nnvkzVt611(YRVWGi zGBg-%oBJr#5w7vBtG_WEZ%V?=KmKZA)z(o|X3C=aw4h`6waL{=P&>O9wH zW+5Vn))$qlrM3balo5*|?dI_@M}OjNjy`E{u@-%hEBg1LLnU*}fYiuXBsLJL7y(@e z1GQ9l7NX5swWU^*{&yGjAkPox4M~^bNX4{U1ykoT32havZM?aPbTo<b?r?T72IwV_&KFku<8e zIS5v3dS!ZbakP7-mUVVn>A*xYCQPdH?@HZOaOH1{P;D*d#e7{S@fN?a`irJtdw++$ zU6@=O!h4zK7z0Km~h(A1xC@e&UC3=K}6g zcF#1`$Xl;0{fH*p2tHid`fmvR_GZvC_ZuOGv|aD}D1P0K8Zt>?+HXpFjKxl4gk7dj zR-ar!t!*i_=T)uF(9q!%T~U<*CCOu1!Qjk*4l5HxOxP@%8cJPfETCCnk-o3c-A=`voXJHg<}vVQ2ok5 zv6>@Sv6%T$YkB}8#O(g%)^GJYzlnN`CDAFK{7W$5zUI+Av#v&FHxA)@)L08G+E9AmcX{r4(ze`+r-k8q!&{+^ z8anATC3LA;j481EdTmYT2T#NN-=pOg3ERS4D4GmdTq_(i`}T^p;s#}+tsWB}xxPEa z7sOu1Big{vKqfW>Hk+@g>kj%NFm%>uiDJ0=?{9Ryzq;n`L}HvEG{ZGR?OuInf1Cdd zqQ7SO{I}QTnM3@eMz^PEv;Lcs_+b!2w_)>ub*t*W6ByQnZsu?BoL3c`6DzchP z5vuz8{b|(kJ-!bU-wdS#f1Wk)sk=Q6~mjXMkYUt$tFg~^vIt1yLZ71|LklUs|s&kr?!jFw9|O8J;VOv!7p z)$98|xxRrnNlwh1{#CGjWvGvTT%!k;guT72aL=wM+P83^G|6jpPTK-;YJMELnodZx zS(D&4D#=Qs0`Ke(&F^+jRZqI^Mc0EPxFtj>xbD9J7#fyaH#@?CHqT2HWb?J%7fo;W zy5jG=Q`GENh5_%~qEgn~rGDm9%*qzF>Hh$;VhvJjv4|;A5W#UHqse+MD(IBWvwXnb zE(&Ap-()xo81c z_1Vn91w2_^D-R|{{iZN$Y6KNvKT#>7ZWUfW!*hujlm`Nvv1+-66FzU{=<97UtNzMz z0qNMf=ew2hfd{*FI)0Y&(Z8Nc^o$|F57mDk3rrct^W2uC+pwG$t49R+RT8r66kL4X z)tl5WWvV#s#qkFg4}3z9RGk;H>CjT4Ht?y(tmhj6mQ_p6WGpx&)p{r z@7F|NBIfvKO0C3+#1!>h23uurxo}?lG-nPz+c$hE9D4jW@@N<}m>IA^QEl$L6dUux zSd)3oj*#Qfk3iAMgpB_u1U};R4>EI7W-;2DOht`L@{thkTBm!znn#xZ`Lh4FheaVN$&7W4^x>oNyh>p4> z93{*J9Or;lu1Wc_>jEX_hD81)?)SEb4>BRE+uc-u9hPqLwrlG*=od`_Uv|NQBzj6% zI&QVZvhoUqf6B6=T#_}Y#|+XwGynW}X){zy5oJA6BfP%QW)&Oesa`!Kp@r_F8plfv z3?i}{h|ldd82aMH-{E*7O9B~0XyIvlJix>6q}1sC!HhPV5B9hpdek^@K>?2jbr*ZA zA^uwAby6$M|*D{GL-E6NG_hN2#BIs#5_XKC zGr7Nr<;E0sQ{?8HH&Q;k(&yhi%abqb2HfFrBV^yLHu!SBYv6w)5RiLV+VLh?~c`qHa%lc+R8k3sP$Q zfn6-iM5f2n-P~K@-GM7lj$r`zoYS3XQ(miq(gy?6&W?xGfrIz@?<#ZMZyzS!_;QdRX>5X&rz6w`YwroRO=$74i<6klEF#$PW4o~N zb*#w?Qu-AsTFG-bN6isUV@eeHiv8a)Q(39;eNPR31u|!Xv%gJ!L#!PisIADato_M! ze2o6(9uaASd2Y=HVf7WT_5xOqJzbWlq2K0Mh&RH7ueFlTo(Z3sNsZ{69(Dmmm6ir!(pOp+0s-x& zlE}GVTM#&E@p40%{zB{HVt#Dq3*b-yq{DPWlrkx+XB{^3%?0fx(O(JON8R8^Q`(2C zR+Flpn|rbp@GzRkeYEKovK90^aP-&IR0cgnM_)E}}J zBTQKz*<7i)V=TvNW+~w~zi^=Gtz8q$#T#)0`CwL$WHV!yT&VsOEFB&Ede(ARtap0p zyMVII=xu>UgDU_f{rDTj#y|jOq})Qu=I*an6emZ0$HUs~#xYcTUn3B(B4in*R(n96 z>$bqF^0{WLiBw%12z71?;?+<~W>C_Uwjm`;lpzcGqL#Rp=C7?1(v9677ovG&(N6?&RsdQjxLvH+4yDueRA zJTda;MawB07R12&)bzH^75D@CUIiV_2xHJF_s09C%pB}V?BOFb7KZZVhol4p9esWk zdP{swOXr2?yfPCp-V%?hywZ76eWh!{^60W*ejZ~{m|l|&|=S>j{`%s*rPbFr*e z(k9>mP!;n&TO5 zw&&f-uYxLpvF;v<jvpRc-+4a*UX|Qn9!K(eO>HaV@PSncTj!i zHK2%o%{^%G!CAmae{!2QJ_JXtx1hK51ENk7c>eID@^M30dG0VQXI4v+A_<@_AiJ4K z{W@R;q>_XRb1nAtzC;OypoIA2YQp2C=5Kq&)B1>E#%;|bo>MwEK>HzmL6UH3CDcW0 zAu_IV5%~=yWh^4;-;~9_dR;>aC4)NJ*EgWU{(bcKNe zWeerPe)p9ORhhx`HUyaUHAifz+GN*knwf0_ z4(-U44`bIR`#FN}dryW%2}8Tp;)DDp&bch%u_w+!tUhhvE0rZG`q^KmnUgg3@prz1 zWCc@m8XQ!tP^uU~I%>jzWfpse2m2X zFZ4cZ-t1q|x!5@J_8V)D~d#j^QKRhnQ zD(%NnX=0C!-HrZpy5R+!;k4BXe#f&GONQN`-|r_@iP350sPwh}UGo$_ViX0Kq(JYH zoiJ-Q5p3@051?cgMIB>{rB`8k;%%ICB$jafFVcI~w zWY(%El#CBpum0_E-1DFrBns&Aoa)0-y{>bKr+)1PVgmk0@#ScP9CV9#d32@D8*19^ z3(trQVM*wlQ1m1hr@sz0)kDdi%T)?sU7krAEmYy<{RJY3eIsi#V{U?zfu%Djj?aic zJh4B@Nzz%7dd+W&y(k@gAd^kKR_08ez#Xw{F9Q_qnTtIg;`CR?^&bt)-~j1+Qs$_mE2>%b3w1YBbP~Ls#D>#uVupq9z_4qW z3${kG{goIG@a&R@6Gxkl&}fbJ<>zu{t$sjW`&)R;-Sw&Y1&U`A zlEHj0jhx<&`S4CEWqL{)Ofo8BcU8=%R3|9s%6>m7`odqz2{Rcg|A5gR`p9jq9NUJa zs@b;oJ*YzTmB)Rr3x)EEJB^A8_udZl zAN3EFvy~Jk=Z08KT4mG!o4!;_=q5w}hxe2=D_VwZ@`=nP1Y_S;M&F=&MgS3{JSB;Y z&Jcb8oeW#b{=Y;a%l^?U9JN$=(h@O3Q{rOE;iG{3NkdLPi2^=s#ogfQOMcw*&kQ|D z=z|hqdrWSImTLd<@%3|jRDSPcHWD9PXMkBvBRF{aZO+TYg}Re*`{w0p*+eGmqDs7~ zUS_2+CwMP7ODRUz3~7?m##>v=QS-|Cf?m?8*^JKmKBm$~5CD)D08{D7j z*uJ0gifb$$uAAJAz^f+jSG{Z2C0x4F7Ob#kmZ2(E$^Un@UbfhSj~n}|9%WwMcLDd_ zcHJmuJG86%{nbOezY4={SXI@E07R4ubdw8M)asIF4@#$wE*UFhylKz3RqP#fTkh6H z+6R}-$9*JoaXj}lf&lZA9V2hcP+u`;we1DrF?et0Kj+5q(irxUuCLn}(luL=SF|0W zNipGJM$G`Gmx(SN`Y+XW4~mN={gKaQz{&rd#GP`OTPr3Xo{&9hODaE=n9Eekl+CQz z@w2w%3yivRldO2`ZZ6r^%c>as!2PEwrUbA!|Gy6H0sD!2NJrbQ7iWdn{NDr7BM}=`X z>)U#}XJ>ej-`$up4&O^(WlaE{P2>6KCzg|5vcM?LBC4okYgV*@Zxv;I+dz9&_*1vD z(aC_+&u=hH^PkCK^ipFW)R1Hon|JkL^=8+L{Dvo?e;uD^@=P~=X~?l$<;5HfcC)&3 zm)~veRfYgT*M#G_WuFMpsfD1V9G+@yEh zcBJheu{L>rQA+VSsRjjb@(EUn;_DPK;T>@D^L$YZv@r3{$NC>Bj#faQWy$mtvjT)W zoB8>WG2?&u_K@emvLJ-r&i6ivQrt?wYg5p3kH80(8xA=9(}EJQa*>xGxW?gWq+!ja zTg`o*`B zoR~;ZzNzfXD^MizxzBtk4;Ym;p37#IqTs%JKfMqJ(j(y^^558z?a=ev_qfYHr;Z;T|4zi042L4jJP zh&a@iFx$PS>)$U&0*BCpwh*P?+l8U_Tl0AjO z?IEZ2lnrH`HfVI)Vp%08G=Pc))blgJm9lG4=f!2LU&u2KCp8*ed4G1!32G^*{5uzby8t=+dO6 zHIgzu#=u*@570h>48J@aoVc7m&?0SjDyQQ^TwjNZHe=(3LD!T!A4<>duYV^yyc{RT zv>uNMJWgml-ovcfyjKNYu-^^r?SD3#islxO1MBR|Z;gzO8LGU_$NEiC3rXfLi?yW1u@~Fn6XE+*{E9vL}r?K>M4wa6ZwM8d#ce z6EXP9(XMc-@pXAt)9#t_6CA}tn$$Z$wnHB^Qb}C`c}~c(Dz6MFmlcr~hYrV-v%ZqO zTU6VV+#ii^K>XW}{W^eQGNh82$meRIKp{<2LlsbFo?ENa&SM7u2fb!9YOkKDh2ZB& zXmP>q68MGPu1_#^p>^Mqid(9*d?(e&^}%S$4v2Zx}IWTm}{PSPMa(R z2C*hZeM}s!n_<3lb(gBL!re5YD{~>6dGKJje!cqP&4r^F~kgE1XaLfQICPCr$ZTZh| z4y)QwOuAl_AwUz+jP7hIz4$#m%nkeBU2S3@U(lpU(50YDvlCV^PtoGl|Jbn#1KEcJ z3Tj(L?FzX8IENeMZGM~ZPw0AKyZe#_gZIvc5!WTLVE9$VW0)(09Sci3frvGcTS4A@ zCLMc_9z3w3apaK0j)NJk?|8o)n7caVPz}a1IS3_Ukh*B%it?P%|1l$jo5qjNl)78{ zGb!*QHYBJ*y@?FcSdk|Der)$+{ z`}bb<@UmKt9#&DJNkW2Zwlz=xnHz7la^w|XTO&>Q^dJYh%=0_rnulM+$3T0!MkLFG z+~qm28@LFD1+%CZqmLE#P?gNVIC49(7!sG)L-QyMF-ZXTvi0sj&llr0MDl_{lA?uJ zlB(tXBrr*aN*cxs=#jS{2BnF(%|^a>9#@F_nE54%Vp{R(qcR_%XDVV>$eU+_PXU@s zhCqpij5Z)j0}5bv*rB&&-C!nb8XbIRo)}W`?mmyk!ZdP+dz+ek>x6KS7TV!6orb~v zc+@iAoB`6KMm3Py?v%def>r&e0`<_TD_+YHp;Ypa#bmeEIs`e;N?!Ar+4Fn&#i$a$ zg7$)?NB1JeG;uTKgvc@|u9(Xzu`!u|6tKW}M~E+W0Gd(?X9mTNhz;R_Y3i-ya^1Ff zs{x4Q4Nu~mxIsGVMJqAxP?fG|(wCxvT+r6h#d`aVi_sa<@zysyh-9TT1AJi=Q2OIE zW~I?hCAgYKPa_n$TX7NLhrx3zZ=aODW^2RHy|cZ)(&6Z&c=m6$rgEXJ!<9eSI3*yQOPtKdtY$1o?EJ!D~)=0qj>hDDJH59prL5Tivp{Gp}2{ zps#aj24BQnt}kUI_#INJ60bs~xI`;K9FpdrKLNBcJxRtb7FR3DJc6#>bz~5z+{ONM zZLPlhe>$4uv@~(thV?!>ty1Ibu49S)20kz2hhA7@c!K$3?UV@T?z69{^sh;aojPxy zS<(uEdA&gO@)=(8iD4|q0424*+C$H*W>;U6)-?z}JoQ~9huj-Y5mx-ooqfBhT{%o= zzMRm3faE#{ohIvUk&dTCXRm2XD)@iT9aOthk@(BdZPth#)z|Ip`8ls8P7Av{+_d2E zpZzIX9mXLm2w`xF7@82MPt)e%bD#W7J@##HrAcck0{k~U%Pyb*rCjuSGIUYJtQja* ztSK~fg5fhZJuV4MxNHo}wVp`uSDyk2@}s3Gm<_!hR}o*X5K%*cq?hxa?k(h)9yoVi ze}9FNo+hVpv$z9}kGK7h>DB!Ou}@hfnw&{sL#C)J@b8J4a>X7k2JT~cnBYVipgm@p zU}=fBmrKu*K~0GC!5sJIbK6{C4mEuu=5WN38m=f|g$myj`Zn-P3gnE^e{g4M}3R=Ei63HaPu*XhQSNz4^2kKc*Tg6Y7+>er(Fo zH&{eY+cwj0I{$+E-)Gc)bt?MK?`3BfAb8^-Z7_LC4H^O;oHm>?CrK9?JAv=)JBuB+ zF%A?SLwmbXKI^ku{LyN%;}L+KV@NLk1|&`tvh;Ze!{8^hk^#rH_gA9>4aUd^x(?t< zux({!>JuO1TDM1k)Ed&|EmzMVp|!-JC|dcG^!$xG5(CaWYeVJJaPmtH=)|8dHdf{` z9VM>c5CAFK@bSWGC8i!9wba;N0L@RPx-T%Ii}un_r8fJYiG~cfT)K3w9FgLk;lC$k zwE`>5H9}o@_yu~X^07!z$miBSxzeAejYTcqF-e#sr%thp0Zo{Q}3a;F?n=^g^=~SJczuXzc2pR^PSErXNns19y1}!N7(SJijgO&VX7FARWFK(e& zt2Z4B?-qG!p`4omlfGJMzT4NMd2UA>T#?Ot>qVTqf3|5Z%SJw&-rLl&S;0)kftS>^ z2*1zSLWNMx(efK?^pB(vur7YtA7lYIAg1rdOJtY472KqjFSjRKJx`BEm7gzLHf{tx z;KsR*o?~YJ(-w^ipparvo_+)J{Dq^f(ngEjtM-JVLU zn{BclU^=*;ZvF?)B~~DM$Z+U`3xa=k3uDCJf9P7 z^jd}n_Fy+<)NO7=ky42fmIDP^(MaSq?q0>h`;7Yk^hBU6Y6ghen4R^9!4)o8r;Brx5j=8vK5{DQ<)o06;4<)TpS)| zuxP*D&#Y9zI4!xW-fwxc4)$erYq#te!nk9G~$}DT(*Q=pEREODcs*FsP0m#$E+3ZSb@9b z++^F<^t}0UmzpG&h)JXoG&R)TMvA9~L7{mhZ{OkTjeE(O0`*g@I3RR1il&wE-j>fQ zAdSw^z`n#kjm{lW_2U;-FSv4A*3;~2et}XN6*V^ZVdz@HGMa8Tnin(R7LX)$nKj)M z-g6yKxnG;v7~7}Ep-_A_A&X1m7f6tr+H!yez;E42XzaY1r|tjIn*Lc-dhay6rC<_8 zT>JN0{TGvuL!#J+g9w;5TzP@RT#`TYrw5=+`9tMQ5XYOZiWC*DWi!<$v?sdxYLVh9)}HKOn;*!viqm zhRowWA#zqXE4UF{b;?ePN&_&$RjA~r<+yD!r^5E}*9R6&KYvW`h(F9V7%t!5Dv4Z4 zlUIu4761<(+^L|HS9^y1K;6zjOn%s6n16~3y_v6voNp-$Ka}?yk${(89AM98dAu-z zXc4a!a$(*yBB)X%782${#Ra08?l4%F@9XzTF1hIsB`Y&dr3K{%T46Nw^2|D*X>L%i zdWj;*e0;{ENxxg9BI4`#8Bw%vX8sa?A9s0uiM+{B+#Nd_*LkKhR(&knFGe_Pyl_w- z?AO^K3#*H(sf%9(vz~-GFGiA|9oJ+id?aUQW@JEdlO6}`AL$}}RX%xwG`H-zuyhiC zw2@SC9TUe?_E5JZ&w>-HGixDzzlw(|@*l#c-+cmCs_-DDnwPrTq_jUIg#Fhp*qyuiiEJ zy-ZzU_&(8Y6z_Fv>jq`}VpzzUyyi>p6S`K{v``rg8MH=XjTtVVu3t6dH|KE?n(Ni7 zZ!=5P;%1zh%Upq$Wo!jmaYmO-9i4#I>I;09)yAU@4^b-?sRL;DD{>A~{-VZ)F_ZOb zNj*rRC(8Pg5FPS~K=%%0p3j?`6byBskIXTOX)mQgxpkMX+BY0O^uDVq*^f1-B7!hn zD}Mi*#{vu2q&2fC(m1RSQnnmn_VSgYzZgQ2(v^B^?=a@As!2Xc+8Rk)dP(XTV{b6s z^pJQJ01AmIDmt9#6q{9f11ztkN!zTzj2UNq=xcj(x~lAVdNz6^csY4D-0|pW&|Ryy zHQL_jsL|BdW`}5PgT-9@PLqYCf*y}!zaYQ6s^9(d&i21zgc`aO4w&{F=O#vW3Y;w|PA z1j?S-Ivu8xvz3o4r&+N+wR!FN9!F$3q(F}R^;raS1k8jGO7tb{KdpQF(f?<450gh1 z^Wbl8W|{3CH5>y)u6?|0*Q1G8q9?64!Du3ta%|4=cg#reR5j-L+z`%UIeSrjn#P^rGC$}0Y>}#4 z#dh!fl@68rTu0mV`M7z%>wguePe)qUWS&>=nb5ISoO-TZCJZ#BfW`42x8`0Zc2snm zhqEo$`YB!#PMbM!&dG+UTT;`$$>slvM22>OWHlB05F(Z2^pu@{)-NWizaHGtH=Iu- zcD+|V*EM?f!(VT(U}yxrNIP;)c|D)qv93d&r_SfyiWqq>Pkw}dy3QLvpyDmTe68B% zO8*vF#W16Cfg8#uv&=AV;G7;8-Z=%6*ws@RBI@jm|> zGk&&H=0QX^zW%Lh`E0ROVRYGdWw{ls2AgEe7#PeSwjW$!$Wt!g@~xzmtQN<2^09s8h6w!1jvaX1B>0%;c$<^ zajQGZZRTO>#$Gx+hv-u;37-=o8SbaDi_ux;5VlsZq0~datH**rEul`4FcPYNEvocM zdD_k2+^k}UbSD}18g_q&vE=tL!(~WJHpk_&vho2*k5ZY;Em%o)#7ByB3T|IE3s-oO zZ1uDbote`2j$j{Bk~xzcd_(f@!kB2i`7M0cCVJJBRzr9|?YDgxrRtA=(S;7WozSr9 zaH&uc^6aO+s1>eU|1%OHxipI+v>fh(c0mWqgsZ!0eG6(plZL5#prZkAry;e$H|81R zrh4v+JKB3XU7W@g9aL-x1+Lb&yAcVHcZuG~JRCE#%a=8y1}J{bmVYc@HUuZ*6C2sE zqtB)LCH@4jRagC6QJ=9D4I3Ya{n(3rhs2Gzczek!n4DfEF||vsu)Zg(=aFWEx;G@~ z6rSou)Gfo?c3;KrkY0WU8{~tu=bVSyKB=4&Wxp-`aGACHSPPrfLIf%4d15wc(4?yFjtz`>e{htA;^3YZHH)3Nj45d~Z7f$QiD2 zGDYUH<2&&(Z*p^dNcnl~@KChzsAlD0yp>s1x7{xGtryR1@AR-l=JvxV`!o~Dt4SSF zd?wGNHnN%VYEI;lH5KX#8nkYE>wCTkf?aJ@ z{`wj3kueZc5g>B6F%dNFu*V!lS;|P{YVn!sbeOhyyB*6P(MdSMqI<=w&WJDkVf zj(57)MqgEqk~Mv_yCv2Km`Q?p@@3(YzW@fo@pgRz_}#WV42{G`$KW={mf6ZK**c`# zqOT%vXSiiD>{r-m*ti1MZPmEBFIy7qQ$0wh5>M}2GwCtXc!-pm!^IrpQ~5)~b;jCL zefU?@*54HlLB3^5A#GMmu1SACGw}JKT2bB1G=$91f-RUmT;Kpjy)1 zL_&#=iJ;>>#^Cwu{R%>(!Mu+fzXjh#(nVAe{0fNrbrV@HA~?ee;4$AAxIxf!uYT6qo+wbo+y)baq3F; z;|s;M3U4N7t{c99cM7-e9`rQMVMlqvqz-AC0#`!QBn}47e$US%!KClU%0TJD4yp#- zkqd5#^+MnIqv0bwcYz0>MT{m2{zL{Wx)2&Hb z9ZU42UjIR9}wf9yj`zZ5h-yNq@w!oGWbecY6_ z$vjOeO@*%s*xRJnY+wHwDFQY6x47@2|xIWm4$Jjz?d3S6j4p7d`O6sw5x}B4zE_{MexJ&O_|r-OdkQW%qN3m)k%Wm zZE($%VI&E`n}AI7*a67KQ~R7m#@#{e`7;SYkg7fWl5ZM54GwBAo4QK;PHHt)ZkztO z;c`*6qEp+G`=zQit~27U#3U;-RgKRtucM^{Hq!1!;4lG}qAEpnA^B`S?ccR>$J%Fz zQX!0x$G>lMf#vRfA4b5WHC@CUSX2;-y{uF(J;_IXewe3j!1&Zx6fuyTuV}bjp~2Q* z=W~rBkx||WL90HTFwkmNkRB>7+DM+JOT5loDczcNWK$LE7g=z*)>t2Q1|3IB=d+9gRH{rbo=QTMiLX@gb_LVO6de z?$f%)jf(+MzZIlVN_7x;A8?2O^F$ixA*85&$b={mt~-xgy?o6Cod#`elrqvvdJKGG z)d7Xpeh#6X+?br7OUH?3FgmbXDyTFq43LO{m&A~jn8&u)8m(Cdh|GOF^3ho~O|u(^ z^m$)Y-3c4(Q;UA6a4ajeaS`E#%~QNQM+}Y64m?r7({Ub53ePKwJQ@(MoyjdIvV>ZON9$ zQE&W3m!3$raeaKm);4i}kvxa#`mVyXu)E8RK!8tsy=AZkjUmqv2~+U{}niAgLS z9Y50;BhZL`NOCN^yShkb)w>+*@ZlH;oK)5JFq}~$Kn_054A&r`5e;`ie*u%N)V72B z74%w^k00~HjY4H9Rq|2JI73iS*k9vO;fDz8IKr5I=R_ZMDsAhJ^sPVi#v{ODZ6uEsIZ0YMQ0U})S-n>AkBjge)) z7s}^FtzQLR)h$EQ8bR+hNvo$O{2{bYt5z*vkG*R^^M{lMg4OwQy=>xi3@$xd(w=Wh zP+xOA2W`Y<6|6ihT$CPGwr!kFI?6N^D&Kw+d-xQ>5{9(_Tp_LMMLOVJapeLn(J;ZX zob1jWVJyg~ol8G&=WBIh1aof;6!LU_+sTpq7~z|BaMaz|S&uKave8Mdc93Mo z^r#op8&d)I7wbXckLjplqa^YQ@e=qw-d@GT>nU#-Inat!(#jqOp(B_@{y_xn9KG`7 z{HMsv8czY+^O>30&5R=~XbW-GN^j|=<9@Db^+*%v#vLp262LL!28Xi_W1$B3>Tb%D zQg5j6Uvmf(jNPPgI~+WYnF++`+j*Wa7dCj`e9<@_L+_Hp!Lx69EG}cO{-lWXDit;M zyqMk8Zhp|fVXtuZ?g6XBT5`o8e}-}_?7-=z!G^O$T$epysF>TM;Z(^#@ym) z5D@=bP>c34kiYX>hy^leI4ff#FWwL4=vTy9+lj~9j@#`y3g~||#D7E@HKPxH>_Ye} z@Z%Nn3o6bl7%BqNtABy7Uccg{7Jc>VD=O}*ANc?Or~g-$*nW9!JQm^?(V^Y1&2Uz*Py|@ad&q;{hgQl1Mcg2 z=&^eA*n3o0tyxub)?PbOT~!VPl@#^EhYuJE^3s|gKENdW_d!O4{_?$xckIIlR|N%W z2`x{U6F;QxUFnAR;n%0LX%9wCcz6N?7Cm*GGNnOSJx{${wTmSLGD2*8YyxR<@t*g- zyWFVHGDT=X5i|@kf}_24-Gq9JPYqcw+zND=&f{aCd;hlevs}uR*QDf3Zf=FWm%Z#v zP)D~J2Qj)V+)ecnD)bAY#VtG@a&V6s2WcQm2y`Ki?S}7#E-|uZu;%|=3FHX;@47;q z3~}fZJcX=G1zmb<;OVfTiy05>|K0w7q5J=WO)W3Aoo9^X^aXKnt?YM{kXpJPP@sIG zOvG46D#%>f9|~eRZie%G%a_x{fOY35Q;%4PMU|&-Wy58( z$#vTbD*X=u)s%n=F`Xb~!u+~i`{z|Lf2+VxT}jr5y#jfp`cF5n8q>)}PSYj9QIp`3ed6A5u7ok8KmAmEG_*#8U>8ti$f9oFY?cL;fdvl&mucp#)Bm!!w zWb*?3nq8ZmZW)qlv{}AkoycySN?STh6w9cwB&IZWvQ4VbdmRXHeAXWtF06VfZYL>} zME^U21a(^*7VV=#6862-@vh_J4&pX&)W_X#T^}nlWV(_bv#?4<60}Smg~p;ElX*~@ zWSeHV4`ltDh93#6Y^QOk2)N*=eI0+#yf@WIG~9U}R8w87ZVFI*?qu%lKz7C@L0VOc z3>*%rMeTv_)m!4&2NroGzOFqrka?)c9k*dr@@+?FY^tT?BrzmOCyzd;(M9}w3Av|! z2f6Z(@=is{05s`H)A1{DXx$$ZEyU7gevbzDegytYr?`AP89KP4C5mM=b$+(Y^VyxC zrcdV8T8la?<{-wyq{IFz-FL&Kg(a0Bdp;#*>Me)cz?)8jyBdEh#jsI6^S@_?I5`2z54r$cdIjaLep1Ket3vgd_fIR zxzEuSya8UV9}x*M|DRqUX$aNW35BX+tCu-f#rW)|e!%>Q9k&3tm9)C^)oEJk~{+!+&3^jB;9yFeR7oMdJaMsL~ zGLET+X44eotU&DaD0Ww2fI$0XV|(wU(v>`mBMs+13wqMDwQau-SIZIRaC?oXD_596_hySs$AnhG7N|0^=Nco?Lm;nkH z5d6f_D;C^XhR>lOEi9mz&Jc!0r68H5pk2S?>7s3|Yv&|^s&t0peh)gQ=H<(<`=q41 z-feP_`j)geqcbmpq9eUx%7qRMyIx8aG9CnqGryZEqOnJtkt1N&+r@R0qDWE3CT z7&B;*ku(b{?f08`k3%~Xaqft15^W-NVD8iFpW#q|z2?&DjhK_(rQ5YMEBgG)4LdZ6 zTxlQ8ICLz}tWr*NL6i7>aY#3Jf##E_<>#>+d}oGX5L;uRvy5IV_eI(@WfpxLo9RtI zQT5YSHIbwY-7no7vcy~^ z(I%Q*DKdNa<*W&xoBC#vw~ceLw;(=oRnXSpCTkcTln0<6t;jY;9VH~Qt?zmXow_*? zsFo>LfI=ESW4V2vlG1P{L(|x8OUZHeB*C;;(+W!@%$+qwvL@AzKX3jerIzi*QrwoF z0-s2s#N-?ql?;#qtVKn&BTt}{LBk9h zo6}k0eT^P{%!>jL>z&e9}6|0;P@tYKzQ z0?V;hu6GE^i8!RRNu1ix#5(JC#~q(fa<;w;hUa_ZC8_UR6D@P9gCjEY+tGzxWk?KT zw3IU)oTTNRbqd4 zeIcg6ePUsnh{*opvFh?`_)k0(AJ7+p4DtD|8TsXJ9;Q6cz)!r(H~3EK7*YdKO)vxN z(uvw3FuRy{tg%Lvs>sxTo0fSnN^=^SmE2VdbNp8w@}f)$a@13HX~jc$sD}qd-lf#zdS5?nYQkQEaYJECUQhphMK|Z3z>J`x^E1j zo%t*XX4$*=Tjk>BFn~Q3(Tr0Imq(~(+T=5or`~J1tyfq>>>{~xuZgjkfYQ0&iS)^N7((6bf76q2? zJV}-{*ryiP_2if8A-d1;~;V-v_ax2JBU>|LKi&#Xwp=G#O{^|8@q=1ig;@5QeHBve2 zLn7#}p46}x#4-f8dm<+}>hYiyVP%JnO| z2s}D;S7Row;D!RsUVdw6PXJTsdfxAsW5+c+ElkF!b8V!PK#+{dA$(_I3!5|XqZvCK zkbv7E0DGI!`^6kyuPhhSXvF3-RA7lic=iJL93+TY^TJpEUwI)$>^^#2`X}YOj zBY0z~3>C<>@Oot&!id?_o4yu&?g7sI5&b}wCuU!qbg8w*1n^_mK~#gh8)A)_@&?RL z@#S{Dv*)9JX{enhsi24YOrBArL-};BB)8wM!BvVYw`YvMCJQ^)jznzBfd-D#V&&)W zp)cw9AZLIT7#fm{jL8Y6_I|NF*&gVk25&Mi*v8q$Bi*aI_A5SJ&9po1`pHiK$Ma;z z@+cXT)RsIU(Ra`Da74ylD`*2CAs^uX#u?qlWKhDi^+emS-Fa_rm#?4Tyby#f(3{dI z@eAg|H&WVObsAf#U3`rcSf;A-3Hiw?+BSK_6qalPtz!jZXD$()>iBxt;h;NJbj?q3 zyOb>>9q4nwsr80bunS$4e3CLO_e6WZ+t8ouPTxLV4>2-lM``1$Q9YF&_&RT?oMY@A zPR|?K(XY0*cMc`EAy4>Tx8qDX{3Cwd?nY}L*4~dtoC>=NTb~3G3op7xxe`$q)D|jQRc;B;_C-=Wg*|;E!3CioYkKe%?U0Ttzhw#Z9hZ`9#Pya_%}@9nX?& z@u2}dNVw9ME1qyZii;hDBT*h>R$yO8fy%XXAM>26xLoLAdfk%a5q<pJ(xo3y}=E79C-)3N1-HZ8b;3stE_mtCQ>hm&QgXk9|QmX`3 zmgNYn6rIdH^;~0nw)Y$&Vh_+FSMQ__NeXXZN$1)@WB{HcSlO3`*cksln&rDt&78Tj z*dIPeaCI2|Do-j0c=f!jaa@Oi1oz!4RMe=}4Gsi@s(k732vrrrN=qD%JG#6kf?D`q zzwJN!Ki@8?ht|IkSX4Sgtpe2dg%D@f@g)F9U{6tr+zE%28X$~%JLbaBycA2^lywC8 zf^oPOHe6V$$}ldOOG;aM? z^bqi(>6{Xf%3*-;K1keWddqS9A{?205f;d~H+Q&1Re#7fImPr3yn>{3m#Nz^uK+P4 zNLUrwTUO)if3#cXwie0aI$ZA-FQ%2=eYd{EvGo^rgSg6i;JI3;ho#!%zy}#hasVZn zPmEU)4d)4MKE@ZEE<91cN|2+N5P+y-%@Es5#a2sVjV*=KVCIjm+I;bO7UbakbD>eK z`<$l>@1X>p#`LwqB_nw!@ybcuipCv!cORr*fX0P|cfUoqJfB0?Quz@21$xE|aXR)L zq&#>pWr4l)J}k5=Y$T8ba)0EdeK^+>GiaHTBBMvE@hE1D@d}v^RhjQ|cO|}m@YnLb zWxX$NFv(?0wY(mRgo{p6N3>|%9c42h)z9l7dQ*z4=LWq-qxPSi_u}R8+6_Ow3yc$n zO-j~Z``rf5n`IKELh5&rDu|PzQ>J9Rt5lGH*NdHN=Q3wQya;1OwS87R8MD1~T=66= ze?E^v-7$x-)+?R!Fq_VP0&Uv^b#g1kzMP60Hu}8mYqLq%ALXDAlIbS}BX+aY+gQ|W zzr>PUZ}5oNKiikAOir6%Q{J9?J*{59yS~I_iObMv#x}Xfq{2Zr8A$=KwJ9zExE_hq zzZpJS!t@)i4yo{HK^JfvBWt}H`uIr-C$tc=22`kL4y zo+jX6#F(BrzzJxLRaOF_5v7&XKh;{CiHhR;un$mDq`B6_#lfOL#Z9aU$1443Vfh^e z>?}bWUp5#)KZVNH8A8iDgzE=)BDE6xnM^tf?x$B)YvfH3MGjjNiOLMQB@={NPX6_lO(<huWA-SWTrG73KTs^ z->&49r@vo$VTlh(ad&^G=ySK>K{ZCe#?w)&^p70^IvvuZ7fI=O3|DKQXbtv3o`bOkYnujNO2NrvR$*bV_)v8l&s!@l81I+@rKHg6an-5mb;B0 zEUC!3UIOOe-Y3L0Mwht1wJs9G-ln8CM%#y+@S)W#AL}pgNPMg* zD!CZ1x*N>g{@!G@)Df{0UIT)JcgibYl3R9>mdx*G&U~*XOcyg1z)8@JnUe&@W4+m( zl)SPH^a1Kx zurFhQUU@}wxbKe@ns|6xtTDag!QT`H#H0lUJ7-+4wnCW3UL&qYFj9LQO4TS<)&k}_ zxeRb8T(x6vF+#ka$nz!V&&yJ&jLAE>@@Mz`BcsHIyGX9r0qdSe6l!nVhDZ*zTZe-( zjX0&PC>FFqP#494@fK_poo(D#-HH5~8nT^fiEv|!42rB-lxhF9W2kPM5)IFXHX}Bj zGAhS@O({JS^>HWT?XUBYGOQZdw7eCMonaeE|6S}WfkcKZJRBvzWP42zno}{7soM!9 zpzBhJ9RgqewKsQ25z4Sf!tcD3X0J2$fmmIEt|WeA#7u^PX$u0Hx7Y|OI(i1Z-S9)| z7A3>v-gZS2iUXrg#N!FhZs5K8Urur(HzXdCl(J?vZ6aWE9ki~R7$nS@xG6;s=Lyib zm|iM=?hvELn34i`n})3G4on-20^X$&q@j&B#ouwdDK2!ORZw>UY~?l6N$9mz`~HBZ zPf_Rq^J%#L7t_mPCsKpKM`~C2)Cx;9DlGd^%ax8>PQ2MKO=Z1u9ObHB=hj&Gk`01N z5eAQeGzF>MUrS!Tys4OaKcbhmVsw3XqJ<{cF12CmL-bba36#y}tNj9&y^TF56lnwt z8+E{OGn9hN>h(NC`xWrx1VfULOz_Pk#-0RkJZDP1$(2d!z)kuGBS_25g$t9dc}9=5 ze!n4F7VDKrvhqu_UevvG^Sh{=IOE>0D17hd|4jW}+fcO&J()>X{|jsI0o;-q(@vw!SgvUL?_8sX1+oZodMLqC4 zj0?>)an0~oOoW)JEpzTKbJv1s8ayFYkjfc-IWPiBV?3f$*%iv zRXvsXv?*tr7b9C6!0Ajgl`b=rss1Y(ar&l`B@@TJu>w{r##R8%vxa|6#z^(Tg^K>? z((4@OiFInykMKTkwkunGS_7@7iB_W`qA&LXeD7c-y;{kz-~H(rj~JbJ$aD#j;j)0i z7d!jv<^~IKx^WphEUz6~^1(?8Dft*eyi(DR24b$3N33r$3d&VckO)ob?|3*mzk+T2 z!1=TvAu0)G7&$f~WAKUa1F*RVb!qtSz2jM63|!RO;6Qo7DxrN>j- z->&&4S|0m#Bdn!Ck)VxAm_j^`KxLNM8WhZqbGhqI`e7+?+IS;uaR9tgp~lEr=58tb z%-_)xSD^^l(M^uMluDh0k;D?G1Jp03#<0#im#j+;pI80~y3xCa?hoEPU-6$)>^wzO zT}8Up0+`c4xVr0v3i0ROTdcZkSEAVD z)aQh>V1GsG!mZDG+{Mt|O06;)wDp)E-}xl6&fY~oJ=1lKw&r|Q0eJhD{;sn_9{PLc zZz&2i>cOD+7Yg08N{A3sZ8zn89We4|&D2xTYozW@m$NT?e#3yJFKzd~ieO_J6=Mj+0Ww!Lu4F z`ym)ZO#A0Jg-SsM%ErQpy?e1C!?;2n`G16z-2YXO%iC3ZKO-}9h&7rvDFe+@bIaAK zNAonpUkqt>^N&Wu+Hzf=Et;}#M)oCS04TG9pU^3xEe>(ZpKxC%Vek{J*N30X)keRO zd$|^21|=~(#Qn-a8PrW4*@&WAdwbYGm5AIYTYIVFre-|C)~nP*jx%=(j;n8TJtZ}w zJqi2svt?SEooB`;Y0Q73&a18QP6tLRjn!IDBMnuTEfKZgd#|aD;qm0}sXMSZ&pEX_ zKK-jfEq@(xNI0VS^IukZ>_ws(3&hxzD$j);)+jK5N&6eUM;ViGPjBY_DG-J@Au*}^ z+;n%QG)BUuNJKEkTW=W~D)bF@bSvI{{?iZfiSFdZU}6u+!#bqN5N}0eb#=Qbw)hjO zzOuZei-0Fi|4#_b*lUA?wRN;4CNP-c_tP8*tDPZ8{r}Z1{b&{=ua_kjR-T@R26!AD zGk<%^PdMakUp(2kaTSW>G<^qt>m4!oevrIcW?#P>T321OL>p3&?qrTuC_*!XJp|B{ z(v645wcFgGNHXk;@LYWt+%c!b65Zn{>Tza{%wyn@$Pr8lM*-qWqGO8ulhPf!Yz1!) zZ_^>!Q%>!3oZVuyWFk&k6U1XzrT<(35j$h-Hc7)LgY+3H7RTTA>gz`L9bYaTOntV6 ze$pf~7Ds51DO0V68o7P6JPOMSkVnSdArifFBFX*mc}jEpudtRXS?1?a#b{!@N^~W9 zt8SE6y44Rnd*9lhLEu*ApS$?((gz-l=CMDgCYN?w-1yC0R+7#w%73Wv~6~Ihy1Pt z$}G*YM!9|?;qwl|oWYJd15)_ofn|B>*{#reJ=D$f4U@t=7eSMc+Ynhl0g8!P(cWGr zrGpb+=qwq}(=Uc6avAng4SpAmc)Q!fqp!m z|GD}dH%QN&c$ZN7e7-uQdeYYlpf*@P(u8E0G3Abz3F-b+#}VHxyhB;sijHNqDCIhf z+QdI9PI}CJ_ti&@)T4x&UZD!0|1dI(TIu80zPsZ>xzuSCmWoELxQZ=7Bjk58jkS84 z1MM|OkJxkxnBDNx0<&1sD*6G@M0rUH7;g-6@|d$USVwwLY?8u8F$nL{{++5Lue6V^ zOxx_anUxPt`JO&Q-P1hUeRn9BX2~DpGt}Rj{?jf2p)o!M@u20So2KRSP&2l*zbpRk zIws?uT)+KLcbH*h%WyQ+y`-mPhZIMkE9T>mI|)|T)VC_KR#e0v6C#p-c1jUru%lQj z|7iMTIF(ZOMMjh( z*347(F88cgywTzgggVO()ArqYi0Y~vJru7~&}r;H>LK8@sL6G8jXi|VvZEupD0xyl ze2@oaEmLaOEdrLFG~7u&DSXU_A44r->aLhNh9NhF<69tN4T}Ev)W33sI;w@DXM!7o zup_P}+(4M58ij``x2_>}5;}rpa6nzj%%5U|s>1|13|a92UBW`d4DlZlqC6R1ltPqm zk6E-{JLpODn&+}mRTVax@Fi#ZWTmv)`--FBx5tmL>g=a42UABIO54hNbZGRjqg31r z(E57z0h$-lJ6KEXmOpq4#@%Y--G)5=od8LU!Ak{KtNH_<^R-o+8@UnUOY}LffEjPr;L+PEtmU8qEH&xgr+*CU`a+y+fW^sDXVDeiDapqO=Y(RX?rCZ`@waRtX<8-_Kf$gS_M=8P}dL;bxlj z9l@Kxa-!Z+7`g;2hK~6AH}KR%NcUMxDwGH?Ig@i=n}>Waatjk+D7Z+Gi@lqyi-nbh z;xE%=wX-hbuN!zH8=Mc|gC@mlDOoEG^9~h5IwxjXu$S86^T!%24Zdt62Yr;?kMvZ- zz+owU_ScPx^EQ!t$sHr)iSXGEc=CRw?8@XP6xmNlC%G!F(-&^oy6c0o(NERu8S|-M zR@ap9?^N%lbkC-W{|FBb%k)uE?}q4m6~uIp1^yLbX~+BRxJQ4Z{VZwb_pqoDX6)g* zu7UL_%$Qr(XQT!Dqh%sb9@a3`zT_H3`<%2 z1#ugKM{TYOVhVzVg>7pEL!i$NUYiy7B}8I@lq85w#rL!8+K8(416_g7S`ho~vuU~S z{Ot7}c=@*Ky?>5yJpF{-W-yl{r|Pam4Oq5W+Y^c|BttF;OdpQd-@TTP`=eL{hawif6wtf1YJdVV+qL`H4Fs{hT*_kGQ#dGB3G*}CtM`a0r{nwY5OnCo-wx_ zp>=0l7~`vyOxkRJbA=@$iAQm}f!oDlg(=cCz?QU?MhdLg_3c2zqmZ9*eUW)zb~<1n ziskY(*W8S~h!AQpKU+B9*~8k8Ga3K>k9X7VGaK{NCZ|e}$DX=Z0VNObt8Ir1d9?;L z?KKHOz2s1*djxL*_-T?0J2*UjD$|KxR~#oK22V%4Eh`~ZKTLl^cUMqL= z+0cfC{NV4Ih2(HIWnoqmg(h@vE>F$>4R+o-GR^?(~JyB+Zd#H;NsY$iteKI8`Cy$@43oTimO?9n5LktXX2> zRXOS-3T^yvA!>_+oe3l+XAWIA%Xq5gb;sxC8|_^_Q8X&FQ89+Y9<1#E}3RlE~d>;C*VaOtD&)n^yxvNgcAO;ywTlQBlaSB8kQ1( zn;Njd4zVN83O2 z?&ktS3YFL0T$4U0U#p}@4Rc&|@2^}1%(W!&kK|!2Jw9ZeH(%c@M0=^=SP~C@=~wT8 z$3?si)_|)j^#D>Ui+6=X^>_Z`imZkjCEbE@c{;iIeGxjh zi}7~#E+!SjVCXdt{-JHitiaCG1M)x?fo(kXFIPF)R=p7_pVNX1@qR~volUztNnxme z!P)P`i{^VsP541YFD2jG#9-!`D=ln9Z#eu6KLNFw{U{2kWD7CCN22p@ai90BNacid zY!60O_(sur&OlyfhW%bBw#j~MwLVA!O}{Yz0CHPXk-j8hr>U-1>6q=d4D7TTB{sYU zyd4Z7vHMSiCQO80fLoE2sm!r=sK>S6kK;t|5gCzMvGXX* zGdyhW1;4HVzY=>!POJ__RQKqx)}_65rF5&^`G&mn7JN{}~MrJyRtAJ}MsVw{Zxtj?r>hp7ppQ7PIzq{eL!dsv0#F3M(^2nE?@mV+S zb4L?C<vG&9Xt^0w@kar6N)-Y zi~T|t;PBN1~aX=!4S zX+yEh;;tE1Jtl0Yu*!QzO%i;(AuMrwv_XY06uS+=cI!JMqTl3A9ey2B#cuE(7$uPD zmk6sRhR+aRN!YBge*-2n+&dYafNaEih14X^CVN|VB*Lq^A)K}K6yeo&q;S?=swVld z44G?%cva!h2Ml1_vu6yCl6>YrsySiRJXfVYe!qF*TDQ3j)mZiOt6$u`lLDBHJ3Tp9 zhu7SYyt*7=CV~^pV4VuH-!r^k9PckyvxnH6(7ACRR2N6`5^gXHkV{R)=}xoxlM%D! zw0ZRiv}M*1YZKG!s9$X3QQJxgi-$Dnjb)dBPr*EIfA(d07CeOvae64H#JFimdDiP&33zYoBG$%Y zcvo-nU46Md@LS(s>>XsO;Et8oYq+8Zs!nJk;8P0*74uV(&c~qP|9!<%AR%}HaVHJo z`wGcQ3{_6b3#PHA5#VGr!AR^bAVA4>p5r2p7eV~kFa9v}vwBmBFR#Knh`h_oqgWXKc7zR%vp&Uy{?RC|RXkvA|orraiU-Z`whgJ=Tj-Fyb3G zKZyn4=X!rdXAdq_T*3tE8~1uN&`UR+12k?&hi^_gStm4LtJZqb#Q}|J<}CiD*f4kz zWV@jo|Jf(aZMaE7V8cxYRd6Let)`>q zKNve{*bEzC(Lfo^LlW{I3yJT#~L0 zDsAqH5N{vDZ)X}1@bkO3JxTUe+u#&z*0@hdX!V%StOUNEVE9<;dPCDso8r;P8$wML zM2^7bpQ=Bj$;#Ss(ArS6`QZIVxfa8)h4x5n5r(Tk=F;Z#<{dqRzP5Y#2TF$QF%x=E zYUK0?P7L}Oz>2rnD0;tv(rN-zJrwHn}7~STRA71{HY`JXTqpg}|620mpTC zMDM~%5sOn0cU{4eQ*2{oN>zaaQoAb?dB$6Hvo)iUGX(e4i0MwhMt4J01+XWQys$4f zXpi(Nvib$0YN#BjB>E!Rd|pQIt+xhneDGxEFaXhvWE9a8EE&`O#V@AuF_UdKtMfAB zG_UotcmMmoggi&!BtxI>`P+JNz--*lro=Bid(>(D%CR1$-ucYsqH*<%qID2#d$B@3 zAi4y3=4IqHTP1{f85yOY%Zc3DoE^vbT!9aBC7&IbG-1++FFTm>^ob)D*_>EeDtdEB zw+79p!_#g)_mZD7(_^}^*@g`4fS3Q9QJ??BLM#APC#IYfL(?Tej@UlvamXaA2f%JZ zw2T4y1yGG@9G3WQ1Gyu^0!v>dQi{N$r7z2?+Usha7u_5GCUGYUoDTT7WAk>*Th>z!}(NQEvOJspR?8GvjQr9_Ip= zvWQ4G5kW@DWGs{xupJ|9U^`qw$xraM@7VY4{?mw(np6x9gDv?^{t>prllzeydNEt7 zy`d=6xd|ksc3k$f3UvL=-|IPP7O4MgZnTMJWP#1@eNfI3>(v(W7Zwu6H^@_!np@{^ zxb70aO!{`Ufy=-DgZ_14P^Y8KdAQ*o>m!IZOqQ=85X$`-S8~pd_3!6+ifa z=~{d?i(BLEXq#C4tD;ndf^g3Farxw^RTN|Sx-kFiN!!fYA=#RNq9!}(QPzHBeV|); z(M|V*r=T4XDCuk0`A4{Kr*Jq%{_Dg7igVx)YWHHI!UMGUOyfX@QMs4H zQjxeioM(s$CkC%c34&PbKsH$|Q^f*AflyEy;{TRUWO-^^vNMHgPqwR{xuAF3>>Lkr zFl6#sb)VTl;BE|4ds#mzUyBN&%V(}sipK{5@#g4F2!=gF@`OGPRE-h8Qmxp_n@onnpgi`Zx3Qcmm%}IR^y9F@NPFAE4e8W z@^M^8^0U2vIbHn=*YyjBdfAcGfZ%iPw$S-94-jjrn!h?JKV$>NIJBPChuy$#*e40u z-KPiprUd->nw9sbI^Xds&)y+XmbfL)-{x6+l6Pn*VB5`SGseR{wQ8Q`SQT5;?_ck8 zh}s^SahcB&YGslFi)0dfFWwB~L8D+rNEW3IdWa>Tf^0Wk1E?hr*u=LxHCV zGo9Hl|5)^TB@mb`jNgiae6H@~T2reS^+e>t(&jLO=0Z5|4YJ}?_2woeY><01(Q>|6 zZ=aQoh3r5U`LnUOYqo%%F|yt67{=3XSnJ_6N9k1X$0<|Ot-JZN*z@`6A1;?GWsUo?`XJr26Ravg+|~cl~sJxggy6_ zp?vXK<43n}1ZbiRXkg?B^A6t`L&>M1%|Vo%Az`)BR(){8#!rfpZWS!naG6np`#26y zey@XvyF^24FXgMrqn%1?kLCH~Mu)7!*WaVpCA|)R(h+b)8!UGYla!fJfUMk3MYP|E z0$xU<&xEYSE-~8)FQi)$=&;GApNAy%$V3B5)GF?C-HzL!3XE`Zn=G_icz3v-a?!06 z6wm(`%@!O&4)mHs9_IP16e82V^EAwjwCNH+%%*v;KiL!{rxLIcH}lh!Wk%&nVWXNv zFK^$nUPWAaIl3|DZZCF2O3e6sOdQTtw=3aRhiM(azSYE374Y|z6DOZp7t-IZlysM5 zVf_{Myv0U`7pahGZrOm;`Xm?g98ZEvS**d@1g*t*EVTZqq?6DUE2IM(0h*;dsFi>! zs34sbaqZ(>1@b7xl@A~XYQ`rI)(0ZHFE-O-DPYUW>&|52^bSkY^upXt|5uN zE-!B*-H~uYz&^qi6VdmLPF#s(s{;$lD-5wbb?Yh+} zzoN(s0-Z#3HZD!{?>NTe7T#9z9)%AQGGRq(HX1tQ(McVxsLQUhEqcvSnT8b~rz9UJ zQ$eRW-}K-=lb{^`Lg$yg2i1_D^SDcf=dd1gEE4U8*$_baPS@4#1Es&QShmlMO(Gmn zPF=OZe>^lWH``$pFTi=?cB7t|2!^!P`683Q{<77tWxqCQ*~-qnp(^!jp6AfsMPM`~ zHKO3zvzP>%b7{;<$r%MR!CaFfMfZ$TUglbKj=+tf z_V|1ZKFSMpbP=GxjQnanHbaT5rUXSvxs>S?P*RHOOhLPtyawm$zGa%YIKZS$8||xC zr9-x8!8K7pW8Rc$g+u;<3FJ!tSwaZ2$I^pU*O?A1wEK44WXMM!&sLcxb-YmANWtgw ziT`rJC03Bcw#sLAN>2FoSF(V_NrG>oE2Ao3lkiDprVE?Mopm=L;=hC}MoI!XseNSV z`D){Xmg*^pn3G6H;HxF4L!aDXH@a47nM15+haX)s_c2^m3++?=g1gAK(ZZW7;MjHZ zF5+WVOlL1##3x*SNx54_hv*dNj>6ZQu1xmaBphT_LTN9KTIP|`#v|rU zV7;&OeCma&3NR%?w?dkuL5%C;qO2U_-p`z01VHnmH}AsMMP7zuqY{U&cwk&b*phaK z3hntu!G)>^a+YPnrZIc@j7pOO)Zt?$xt|&8YDv%|1OB9|AMhe#r{TP=Gd)(wQ{Xya zBBwB*#|#lGgVm2};|j@^NoEZ6k)?l~F!+Bx_%<+6R*!#GG7G~?9JP^2fRZ39r_gmx z7#s_cJvx;jM^jCLfhHZ)M$X4G zFn?D8$gYH~b=PS@AFdLvERPA#vjhk$A5Y51iDA4_9X~b9Mo5!+qcauPvGhZycrL6}Qj`j?N zF(0me#tFoD;R%QaT^DJCUqv>x4G1n>W;mi`IE2O`HqJ_LceQ4u1vDI7Vh@CDA@gKE zjMW_I8^xR)jzO-W4Gx8jZeJUp>Z(JlkwKo`bI)e@X0SaPs|*LPgyJj)cG>EZyNk%G zLPw{{3XT1BE9W3r?LOqp-8s_3lCFOXv=Mr?>B=lumNlCujOHyN%Ev(lxt?gw#gTMa znKibMAwgFm*W&srU9Xq4R!S8ozC7NACmI=m+paQzAw%3oj}Pr*d2I*`Ft^p&u*Mjr z(qGe*xh^*93(uisDUMyanz(Pk=MIU6>R*ZC3CDAkwsnyLu`FKhc8>j zmg^W(287>MVV_kFX7)lph-d+&|Lz1rhXx2YYrS9Xnc`PD4`Q_BnBI!dTq?J*cZcI) zcPYmbhmFG!_{fP{Z9_&*r8}?sTmWT_Ez9*uea>1UvoVnkd8VUZn^eRWat?d1Nhwn~ zhoyves3rKiByHA_QH&FB%hTPeVDaQx)e+aQY4lxj9CrLn!rW(*bxz@z=*dHFon-$*p1%?2N zZO#lL8|~0)!R&i8Pv}@jBFH{JNsuq!b}-A6L~qauUuc;PT_Y*sPhh72F3V|1NHtZ> zu^$@lBvIegUzs9DG+f(;YzM<#bAh4t`;W(mPOV1U1|!FGCVIp&cb_9B8#nVStQ-n& zqFUMXxPFym(jb5WeY$kkslcKf>7GzcExE**v?YPMo6t(&+2_7*>q1jy?K-ELG}bM9 zSR+SL=0Wej<_84jGG??b+BdJ!xxq6Fr=>;AG?a&j(tpycwl_=yyLEV&7!KzhIB;oM z_A@|uVa!|T917(%>rZ>UfSa=9ZH_AX+ns@?$=_-~wY%sT%2b#(O)A;MHMYMs@o}?3 zbZ53Maspxb#`OglWViJ{OOV48@?#Z$j(!OV{n0;x;0(vScD5X5t)taM--24v9gOyO zLniBH$Ml0seQf2vBJ!vub#4msmOB~1WKni_eI)s<$!wUxzRur!H3?Afknfgx&}g~9 z>HwK=G%T1~XDR3Arq@pXjP^K4D=PQgOLFPTb>Hf*vF_3P+-H2ao$aXsX^AV``1@OzZo$iWppL@M5n=qk)kT(v zmEf6VlKX>4+FEWAGX3gq7t$|(w>OA%>z*l#%&8d9N*Z3pHzJady2@+qS(1PT$1Hy~ z-F8dc?ix6^_o{}`hndyD1#6qB z!xN}jQpnOiomh{eO!FUU!skF2V>h*|yr=B8#rDNm-31adGr|X=H7->8i5SiQG=?#sjJ|lz=?ibZ zy!^ybrlmuLgw}!LYS+fZL{Aguad7S$;DEa$pVwRd?BXz<0b(ZL>FcIHl`g9Vc& zR8c3!eav;SxJiq@S_$up>KY9Hxkkl`BakY=!>xTM@>!>}*SGLN{zF>y^siG*SsWmi zBA>|7)v!(sTuhOypj~XYnO(?^&AesEi4=az1|loSH8pl}#yd7XwioN{M^yUxrK~JO zVZKpkxshcSh`~D5m`ad_H{pj2CnPF}O0-4_akz+!m}!iqzqpy!$Y871Pw}DFgXp*q zabAmRZV@X%?q0LfAJ1iuzkx@Co@9v?5c=}>BiAVcShe7jK4|te5J1`dXLVU}gY+pR z}prrlaQ7^ZQA-g-IgW(whxcfIO?v9xsPM%W6y>QGUhL6prVC z?f1(?HNuqIhogq=Z_}a)4Yp=xKRxm8%N?>Vgry<5p6=vnam{&OrqHI(3)$Z{1s?9q z$?zS>Dkb$XmaXR6%pp5&c<^5DzPn3=m9`m)bjt=5T<0F~onJ>PET#!J^1~X4m8p1l zC{kE|IFUS@LC*orJJ}`61r$xCw<*kj zgL1V5K4k?e90@{DWgvQLCJljMcxIaFe){W1HRHFH3c`K!Tpjq1f%d?(cBM-foIZB0>e`2F9s(S;a0T;oOY(_`eu$PcGzV{ful&cj0GHjo z|4k<^Kc8{(Qv&iDZ+kBEe-}6?a0*hYLhdH$E%bg@hTFq=ts(~r97b7Q+)70~6*(NU z%7ZOKck7OM(;6Kfoju(j`B$!N$m-$UElwJL9R7aJ*`gddfTQ+E456bxXPpwi6UY9K z7C$LGeG$8!tg?1&Uab(#r^M%L5;;Q4!O9nuV!SAFAZ_Im+S4QN!8*@{J@+3@vac8B zi6ApTO~Y|6;BvKVgjClJd^o+lYGpML zL@hBD14yHqWES_X^P$Ul3XCVJ=;c~sy+3{~6~@k$=7YKbB(pE>x_oATzB|$Fyq?w6 z`}(uS_oGMcxFx;v5Cx0FpK;srPeR89n}FtxIE;-03L+~dTcq$1PEr<00~w~wntU84 z`cb)0SH${>apU2eH7-b-ccC*8PtccoLLF=d%1dUxo&-;{f7NeXsShyYFwB`t_5w<0 zkv6b~)z;RI9b-GRIl^?;oKtcf?a-rjm@Msv1dcx<8hXadA|IWdQ2W; zv%A~I%KrJuXGX(8ZSt6#=U=EY@%#&Q>u0biSN7}cI+AsFlEx!C>XfP}8AjdDy8*?B z8Am_}&_o!WJzMk#XslL_lzL6^13NC#uKp7%`yJz1V&L;WC#B%yR?uJBE!r$ zuvqTz4|^4N=d2rGYJ=JQC`7Fen4JO|HiTvq4xPSzao**sZl@d@Lc#nUsHSkWL`I&E&qMU5#(mb8 zS*Sb-qa%3RRK2Zz$fK4dFP~5DvShv}nfN)MM)|ukqs9JhSl`N-bkHf>waro_-@ye8 zdJ4f!VIufn<{%VNehJNd=)2p`M)jYbp_$5`nH7|Fha_sZCrd2A?s)JXHv4q*nROx_> zs8MU)gD}ob`_(UUzzWpkM8h+vr@fcW_<)xxVwuV>4ds262)@I@gXs3*ZhsITuJtk+?7;QKbic-EW{am(#hYi$=UUj5iF5pCMycSCe|Hx}D&$at`4-&MlUB6uYp<^EhTKToj&E3+?p;dD>C(Rxff z`Hu*G)shF1gdeizj+AmW#J9rRmr3x=>I$+GvtQ2>$3jRV@z<2PN*Jpi?qAk7+-c-f zp<$Iq>j4%QwXKeSDt3RpcED|xbRai*X#qJ_Q7Q9S`%?DF^x>Hd#kkFj{r8za_ZtXQ zLz>=(MGHVr%S24135I=6sb3i;eS4IoT|U@-Qg{yQ>fogedEtO2Iy=~KO=kM#`83b1 zhu+xF#w*=^5Ao2)=CTBcHdbBT#j80&j#E#HOo3EH2mN#+yPm6w|1s z*S`|NPQWK~u5-GnfQ;$|bQae6C5|DQ?rmhAV+4MOhAS(a0W8lVDFq{9bhc z`-nrQYfPp`M6H06Ng>}-#G6uqOEy%)rC;K;;(IQLVxrG+$xBU_O*W2)wG*X6`qGs$ zWHP}PCHxIWfd8o($!G24aB-?Wxn?Nj1CopQ)1hg7GS9I8YkdAep7UOGnDtLvbdAK$ z9{P-xZdliz%aL;Vlg@s(x9a&4(OQmwF0C*l%mJ7}C=($+3Psv|QWkCdIn|;Q+#8$b z{db+s@t41caUbdmh9=Bu1m?+^hSd&)&UggEf3cOBi2mM`OeJ^E!!I4?Xp@FZFxc%KGe5spof~!l>lYC@J^d6lNi#&c0ylf##})M93XbIgsoJ&(-D;nlTWx>E-t*7 zhupn(F#r%@$co6sSkh>1v22YS;Fn6NsQX9$F)ecNzr33oAQ>$J-Hv&+KZ9UKu#VE0 zq2$o_F{NO{J}9hucq?%tjaf+)Ltm`!;7%3~+APaiZPKeyf4~(3TTmHRO%ZUs7$miw z?-%gtU3g1|z+wd_*u~}HduXlC+uBgG1{9|mxU2lxA0iqrWZ!3sOdD|Cz_%k$tKw z5h~4;Pih>n+53J~Yhd^(@c6ThyuOq(COsD`y{j+J@0uMB!s%)p0i@e;tRu+@CcBHgnLv5zujmnop;HT^H(vQg8_IN~um zg@SAL2e)#1^k{{D@W-~E8nP6&QceHZY<*$tk+JhbprVye7F%Ii7<`sMySd2*{Q4En ze~J}C5g2)hC7Sc8sAB8+IqhSARjs)4ykX4o^SXPCq2a&3$3T*SZ__hc7#)K7>c|6G z`b(UrPyy9Sy()?^hIoN-Q!mg_q@~n?-;H6brZC(QDqR!sw(>g}ihKM15(^f&BJxc4 z$4hzwQ|QC+Vi=%C@&%*xcj|w&zr81cV2rg!d&}9SlvRgo7SssR=ah|VGLj3>QoO=7 ziW?<06oLCqq$mYqG1;=pH1(r02T=yUNzA#&YLU{PbxYW*kvk6_02+t=YWOWlZ1(Gf zh+?1BSOU}Z2Z~VJXJjPdz(K5UI2Cv}C_JVgabgW>_Z>igzei6yqg<0TK`K)4G6f%@ zMt>B!%4YyD26$nKBM#JejGH&;Ja&s+^QG4FV`4nQsT4S%}xo>DZ#57kHHen z#1humACco|iPdh~d(lkuIh?m2`40G$K-6v6fC!VkTa`(HG4Qpnk=tGrYs)>x$YS!6 zcN05%QyyKsKw8mSdEID2Ns$6&K3YpUA?g;}3+|Etr)lIe-+{f{TBY0v)-y^cJ6hg` zMPVimkUhf36UAzHl(aCHM^j_R*t6UMYU%s-y8P?qEUGgK(S5o!11X>lQ2&13f2HaPO47Qq*`)bAtUN2kwIFuhweh)P`?CDI05$6WQ5|L4gtj(Z#ysLuye zxO{+9D~HC*4N`l`T0Vz(K)L*Jk+G_;Gl*2XG>9-q`~VXQ6Yi=)>|xJpYXJ5>z@(+&pR+V zHA-3yOA2bB1FOqX=tjoTRn&RFv-_P&ljWt^IeN%=wX|CaSfZcs1q90hO%gr)7DBK9 zf6e&KnMYo!;>!m{q1q>kTS5*ugk5WsYwB{vRqC%ZoyTImdl$^hcf%@)y(7wl)M?GP zTYm~VWfm>V1h}R*UX};QtWWO8L&7^bO6PGKX^WWxJdZ4tT!r?VVcynD3$IxTSz!Nr zriMTyvwa=uh?Hj^!L;AQ;9?qWWg9G0+9)}`O1zqMwsn>hwZOs?(O=Y;63W*y>^ymf zpJ7RrVHpq|R$uU)Ib+>C$)UvMPe5>$N}q5SE>9u>cVF6+Uwgcu2WUYRFv_rhzA1J# za&|-*yS^NToMT@Kc=wc5*#i1+(BzapXQhkaCF`5MgG=z4;<62y@WD^NEbX1ulI{>U0rR4(HbWICBb6PRWiH zp(n7?Ywoq|DkF(|UImL@kMX2+P<|};Pk-%ku7k%HFd5WXlK+CizL9i4X5;I7)ORoS zrVq*1M6=scOl&zsXfopX)RMnc2|q5g;n3>92eHO?O2X2p=WpGt7J5O`MZ2%DIL_cP zR;jM?1KBPgY|<^M!P+2-#20gYl~}(iXlATOgnz(F)}JQgerv;(fS3RdjdMDCu4|2) z#@WP2WP5|h^vVnAQ)^cN8oE-kxQo9eunzi2OdGCdE01`e{NT-vSN$lFQq-U3u_m)F z={VLI*kCevI9bfSWKQ;Sm9Sd-WO{cJZ00f=cnwg;degA})U^`r%{IsVBQy)-^90Cw z>RHo(tHK9NOoYZ@w7B8c*ALA*lNFFH5v}30bm=SShvTxBNv!kdYKsP3H0e@&{1|J7 z($5h6qpmx6c)5v8^*tT?O(jfD!IUFcl3sqLBxtQJ;PmfHdMs?9V_%vpDP*SH<68RY zdtC$(0Zx#cXf&W8bHj0?%-GN;5ix5>B7BQ4LIPc&Ky6o3~g6m+KsChIl4I3pS9wa8O%xVaG-XPqcZFxU(VHAhE{ z#CtP3c|>RvO?>2>N{E}X$b~xRZUHPIUHciB2q5-lK?kS%BQEgGs+v?4_xY`_kEYYH^$Vt@kUqFe+MT z@sy&tC~D~K^8?D5Fr#&%*RSHsOVvr?flR}hYk@6GC*uqM94*wVALC5I8;LOde1-}! zTJ~>o9D>K!{GD|Yhlpj-(8B!x8t6rgCcxNHzKcVKse5UJ*X4ze#OQ8*h`mAvzj$NR z75#OK$$JQ(VPS#8_AS5dI%7WNIqJHi7A=`R67+eJ@{r>-ZnY|2=cH@ZFYd;{8T>7cXQmMBSIq_FN5$X1=b;H5#ZdPtYByf&df838%&J z#WnSJLVpPy+2KVt7c%<)KsgQDOA^S%Q;?PP0aIFw>g%3@7{CFsL>oK()fb|}pN#=G zT-WRi;#li5sGAqy%4xcvv?`KU9n_(ROEfY*bb?kW@XZB z;(6=!GMK#oLm`8QT9+0yzXSJ)`Lb=u5H-YTolq9^T~=?#hGl~8M&idvK?y25>O{`e z;LBwC98Mtu9kOSuzWD=_;6XX9j!&{&%;tzMk}mbj->TXK?`xj}lP0QE=Iu723SEZW zy!Q!>LE!6~i6t`$sT-BDBEK#PLuUL2y7rtrI~`rECYAzXXKlSM^2w+&MyqM;uLAxmLr2ueXeYc*hQZN?tC0fUmh~1>*>jIbNg(fid%6WF=X9Uy zQVN9LJDe99C;L1+V90Fv6n~|S{1?$Q;Z&NQ^qshK%I62O3$d8W`Llf%hL#ZYEG?}LeN{A``~a$kN}qC?&ekVLNuWu~I|89Z-c zvd&}_BGPPsjYb&dTF!*qR1sDQx^2G%VMDT>OY{F)8`Vhyo+}xirfK{~obO~P4t0=B z%I$t~=ly<6oPv`@#9?r^K>WsGIj5w{RIpik@{=|DkKK_rjx=}Ze-AUv3^G_3ecGUK z^L1Ndfx@uZ>&=xq0rq;SRpAX8CYdD)&y3$+G9=LcMr3+Wa-1v^D7X^+v;H-*Pg%9z z>-jzCu(oV;LPRzRp0oVjU5MM;Z$0@~RXDA5;)p=_>=S;G?*}ICHmFHDmzdyz<+gHF zXghwu7L;S6Skff)qDV^gb|A;}WU?ksEUK_4i8v$=RNS0(9?BqvSVGw^OF1(le>ltkyd zf@;?q<-V9gMVXMx2KnlZL;&DVEucrpF}k{Es6=n+j?FQ-Sp5tcvOxTBQA;UO`7Qxo zJy)ApcWEhH6jJgis}-@J5aI~pA+ z%*bY?oh{5Oh*!}jW|vle2I`Va0O!j9W(_)=B&nh0mELr|gU!Uj#_59_7aAjjVu9l$ ze63J92SoOh5oK~`0`^I4W5`wCdxfx*Yysj8e_7B}i{gby%IzS`7?Tv@xNRHw3r&EZ zP^9GUtU|vz4MN{8`EjBZ|9ioNv@-@_eAkcZWBVanuU(_d8~rfv=^-g%fh;19iBB|)+zhUavDrwOmo2tMDyF}^ z*8ONj{Wce)0oex@Z?K#m3EDp=bfdwBh+Ma7x+iG#wwVB%7;+-!G+|v!*TVz{4Uf|b z3?&eSE++LVC(ejbFL1EAY;ff*O6eZ<=5Xd_N{yfd`S9@PMWnxf7iK`9zAz9Ztc3Y? zD;_d1iO7=@VcXdyQFFy*BoIA}Ipl3w5r2F()e^St-h#A60bnuJ(M$}o1{4AL?QQLu z_rneC2W!&JOzbIn*w$8}MoR=8${G`dO8rEFf1p@h>o{d0F(FhWG;oHI0@#lq`5!6p zTUA?#01sJ;F@HZ!K~zU_PXD7`%XYqVIgD!^+)s>wcM^HX@@&cjC&dU)q3+o6i}|ltx(YsN#7CXUHjwM2J4mbM#JIvo(xuQ;_0M&qJ#?C6Xplg zFC@YZe&?7!ksGR^fhw~1X_JeC{ktgms2T!EA-uk)Yh-BANT*&JxjI;1BGJQ zvg8%J4DcDL0HyFmSia1uKEu~CoZf}EVE&Yerx2O!Ek zQB^8>??M0+-`G{YyBp$M=#&`r5wFYvHN~xfZ#);kApAa^$%~oMFXe>ykx1YBdno17 zMQvqc8y}y7IDyQ}`GNx)9uvzHvt0ww7cV=uBz-G9x;{`0E1z5we0C)};pbSw&a?-z zBa7(w=8@M7y%{q_=S|~;>*l(>nizuo5c}V5><0WnP!iwbp;Fz(NP(G|%peb+Ph@b8 zTs0@=5|*Jdi_@z6n`T8a$(IB!CxrLkwj^}{>$|R0_wNc{e~#GpL8+P^DU1w}t<=3Q ztGSRkEd$6~SS+9FQi?!=11f_!adcQjWkm)ZxABe@9IFjp zsBF?=zOqX8tuu)_)zUi%OvGS?$&>cZ1_j>A2m|j;GFd_w@SE!5b*u82-t)vj81;NV zG^gBV+>h!QJnBfoR=HWHKC7<>L=y?hkl~|FbGd}DeTASe&OZ$<(3?}orw=BT1=DX4 zZwmnspi9?D!0r?l2{&$Gnh%yhIf)l%gJ|z(`u(0>!VtBQz-hXq&l1{#z;uA=M+YN8 zemxy5Bqc>$z*Mv3yX3n)uqVU50{K)WsT2u4{|3(2a?Q(w5Y+xmO$DafP5vo#N_VX+ zi@q%bv)6-lbsmaMZSQpk8ZuAirt_Gppu+NGYNbc;CWp+0dTT&vy)^dApcTphiG?2x`pQmr1vQPd}>LgrJCh*Nkk??wornaGon{GeL=h~lm1rz zsis=-P(@m7Ma^i!ZYsxNeQZ!RliFD%DP$=4j$TI8e0ZI|ADCC0=%%xiGr=c)FiF3W z`{BmJqKbzc)i{6;5~-Mb2Z@>I)ztg+bn;k1nGStKk?ib~*ssR84GXLB+qR3~$pE{e z+Dtc&rR!d-#oKmG1og>$Fqe_WX@PaHuk(^727DL`lIbXk zmJ=NPB|P&9g{JTisH`*+0Zv>?y)2Gm4(;bvRzNU>X+Vv8cEa?k_pRx94DF*3jOwj}JVdNDR3wlRy@&{J7Go}Ya)y;# z$bdzLY!!C1`NBFy*T#)Pm$I*k3HkBoGxj%5f)c7C zOxIy4!;U(a971957{9~aA_fvgnk7K%CNw)(7Q+qjb#wvWwze_NRzc-_pfgwHg~d6e z2DTGd>tSitaQn;KOu(*nXL#`+$qrA68i-DOVc!kbpR?}mwI7XBVin#R4Ig>Jhr)7gXvDx#`Z9+m2KjaX?d;-B-BR!T_)oYSfs=xq%v7M`8r`$Yc z3zGN zaPuz?-8Ju4dNYKSqwarf)Pi+`j|O}QG-6%IrxPgPwnB$1;!A%-JI6AZo6#YNS_7%M z9KS%a)r;+N9Q;>=94Go(b`k2JqiHlf)PG38=nSwM$4-c4Cc;?yq1$TbP+f2&^}LVE zNdd%=u=-v8dhkWPUYB)tTk`=Uj%f(01gb-jB-$EZFTE?D;EWYv_cD7LE@O!2Q#{Ku zw|;xA{;7L?ZvJ71Az2{-KsLYmaFX}pwHoD#7pQYrLmIsY7#INJ@`g^+7sZP0?L(!Q z+g!?R=J}D%H2{!c7g}Bnm++?o=>${IyG(*)$oEfyJEcZE%X3*hunBGX*#Lx1 zBq9uD>e8^}uul2-?E9AARg<{iR|4%*n$;?OD`v9rBkw+2Y?kOLV2yzIqQt=PoX_pI z)7<`P;Jx(mz?X~r8Igg07x3#_vC8%5+&@DoG~N(?n(xwmopM{}d&e|+s(=vK?mp0j z3w{oFBAB27!E=!tbSHF>@81O;y_xen6r^or@GIb5uaYKG5=_f(K{xSae8N1tUfd?F)z_GYX;?$`AIt-- z>J0l>=ofg63u6SDNSd2gT9lV;D=5UR018)ue66HJ3DM_f4KP?rVb|5i;*|?6Pn12^ zZo)Nya3GS0fM*NRNfL^(=EjC^m*-9UB160i{EGH`dQp=$eyUmaTg#Nba+PA$YD?!= zm!;wi<9FW=`+gJQrxQdWz#wu-qd>zQG`_<~a~QrfPj`lv-*v(7tb(Yczkn;}jo3W- zRAr=hm?ircWGwdiBE;dAZhbw6I1K6Ph_J;2SahkVvlLbmv$!@J@+UhlhP}I>B0fH5 z85C7d*fI#2%M04m`8B6VIO|hYY|A*n4&6n0g(Adz$FEvqqGa`QJSBEyHzn)xOnBuI zIClmE6m&2$R3d-q-i&lDr9hsn%jblap~WCJnrvqhs#5_@+wZ`=cqCf$c3tf2nkCb= znz`zor5wq2$Rn*)rTn=<9R?wen-hgQj2(dLX?9sL`XPMTC+dh6!-Kd+-OL1dU(oII zch_%9a@}7j&BZy!yJFU3pyT)eqGI2v|1sNLZS^BtB{o*sMUV)ZEp z6PFrS)zph<4Y57utMd5INE;Kv*hJ>kuo^GR6jR#H#69|V~HxQqHpG{E3l+~@HHP3_^!`hKE$c+e{US%bJ)@5N@ommcY8bWPG`JPMLg6nTaB^`-sD~tH<`dPtO2{lOLC!FXy)`v5}7M>O=tHw;!y; zG@g2v-yTpx)xI3P2WBG3mjZJMUiEjjqi}S;<2$>?94rOu5*K}k`2W^Sacsuo90tXZ zgs&?eSL!~0y}kSI-hVW`qh$>`a00JJHW_3)_3ySYUXgGo>l()OKux9ua`q?1* zTsl+VnAq+Z^;0qY_dY{pBPGV9BI9KxXq5|-iafEiy{C=)Mg(eRDIGNoF_KD)>~f9GamGc}lw@BYjmX%%0=D~Vm; z3r*3a&qt}{5xe8w-xyI2B-izgl~Bm>j0%#(M+Z1|^;Fz!EwEPg)_Wr*PyxTX-P*eY zaXhY%j;bidk$zlqdLJP>zRyz}P;^@eR0|$xa=Q@|-+}!4;hzdBZ!~HA z&Gp?-*Llvk_2*ZR_2E~{?ZY>M{c@gENCAgTYHL8%Qgb1z|3QW><#J5K^})w-u~mh0Sr6fOez+wbR+Y^?C;Dugchqf&qhNc%?QM~Ilv>h#EW3i$_J;UHhg$2 z*%3A?b=d^(p|SBZCwgfThNxIeKDGZt#mKfMQDF18D}vVh%F96#pF=h}hb`fi%D9F! z>aXsO;%7jYl2`$!Y6MsI6h>HIC`gH$ZTXD6Lk9Gfdl>#&I0RVmQ3of)1*;5l0e01JtOU z-&f`e(B4^$|GSV1@fU*v9=q7b1$li=h?Mvem9l-}AUZ;S(w9J_)5%xU;^BQZ>z7`$ zdu!^mS|J^gtLrCR&9f!RVL>U{zG4#6;5;o~@i}I|j*8rdOYOMdt_F?Cl&3~cj}8lM zf_IALc;@Ql&83w0*ovt?5^u1uLDTp4St+UZW{Uz!>PPfE3Lsjg5LV4WUg>9g$N5h7 zN&^t+yno_568|`imzw2arTJ2#VVW^v+L>%|?S9fb2^ezb+xGVZWj#e2&-$UHA0&B2 zZ&(%8XU{?~3d%JXtDJHx;iU@aF(*UvCB_kS%-8HcSoVGkArm)4iGsBZA@ZU55!Ei9 ztzlczSMQx1FCJ;W5@~bhGSP#_HTvc3VL=b^0Efdu7ARY}<#=y0-m6j=`Na`{Pr#OF zZ$dSxKlb7q>txCZx8_6@PaUbmhPbZhKpwAp`fGW`_gRYDX!+5nPCjT(FM9EaA>RW| zcN~L}P;uHuNNnV}-R8f}T6z*lHWO^@_zglU z24S-8FiF3>iL*VLQ{N&-DTSRcThUut*LOZ#z15Q=*8$mwUtLGMxoX50Q4Z&AD0RaZSQ zY&g_yJncJ7)nTb*QF-anlVdvi{!?rb&wH1xL$xyeZz3UY`sd5qd~voFBwqS{*{HfJ z$v3x$QSE5gXqX1~2Y2Z20OMDj?t3++vFiQ~%?vwFq_5H6yY9Lq^fTyrJ`*$_bL~m7 zowjnk{^Ob-e0kz)Rr?WsaSQ%6miB4$tZi$-N|Lk^TP&YvWR{WyON^!1*4^zIEl$DB&1m2lvkJR2@pJ_{}yOrH}F_?jC9G}F?~2_-~-)x zfaJohhOFkmooriGXo=-!{&hm z)6aem-l8AO9|cdq@f*ch$GS#e zVyT53T(yB+W2KKRN7 zm#(_ydLQN)2Byh)Ik(UyI49^FJ2+i!lDLsoQ4+125r=uJHeMG_E8_)q=v(}2Ilz$i zY4hEJ{m%5fab!a{#8f|9Fvnw+5!REH%oyn&cUugpQ1_1c*tn1XoX!N(l5wGn5zs%b| zwK9IfjYykfbB50S7 zcDx=Q>P39e&qlIRv!oKLaP*e01{Q&@|6A~#D_%Pl(=0)5-ir9BDubL>TrJ}^Pf*pa zdHGElGY>`{r>(4|js{0eF+?fMOn<~>qF?;BW5Gwa;C=>dhVk}k^wL^3!`tf$8e&vE z`!;^U2RQ6u+bCaY$SyI%oUC!!d9&xz?Xv6i}%r+#sm zbMv^r&~7_rM(w|nuDad&N)*Q=G*8VWXc@VQWV7cnktgDPja*&c%#NVL{P6zllik)ei|KFCk3^-Vo3o;%gADF5<_ zv(dZ029OA-#kcw1Q>xfTqWNB+#oJ};;$!V>o1g2I{gn^h*u%^Ogs+gd=dyi)5P$gv zN{w3cipKOIt)%Gv*~-y%>*qDcLe8z-cTW;~vxY5dgpxmz%cEYQJ~aU7LRMJ|t)9EL z$7Zi0`pAQibK9kV+k+ws#)^Ix`L{FB?Ft)T^@)GuXUVeuJdvh#I&GH}NKg41_=gaz z&qE@!!nBTtnfzA)NwjOKEdLk1-_yLFq4bph`ylYgS*>ixlLyhK2E6Vse)%!eJz+vY j0lxhI{{UUE^yHLas(*ZnnFzRB^oi0NHTgnW8vx4*PCMjmc#4r&mSSHMW^u}*(+=zvD_n! zKUJkIeHS7By`?c20kHgx$duL6^uf`EyA=8uWjEks$)T zfBcvo&fWcfg;-&9OGwJ+k3=5C|GzJg5JkGFJ2;(S*Hdz7Q6H!I9<@-0$paxQ2kSR# zoqO1Wv`tgVRN$hx5)tTxL^kNd)2QO!2d5cig1G8aG3&Q@om7q*VebBDq%4e=?Qgjk z0n9H+SRW1FB!2kiw3%*@{1RZz;uqO|SXh=eHOOyqsm&b*dabnUe04D5vXW=41#me> z4GN!+T5}YkL2p$PfsrBVs=|L&gx?HI%-d@zT3ic{8U-!!jKaUTAMwrR-mypEs(zpj zlZWAK$+yVeqpgc+4>DI1%zg>lqR$H(HGflU^LW2K?ks>nzri4=3W<;3ryiobY8J)Nb_7+j6vafOtUUP#XMa&6hI>*G zCZmU<)NO{Pj=?uUUA8s_2<-JQZ=X~eL~<6}{dO1G&c>Gk!1!TGdUC57MJCwFzw&0f zX-Th_Er!*{6Kc!%3sQ&_JmpW24}5H}%$eOEE5EX^Qm+R>h5^;)+JLo5mS968nvC#~VMBQ3zF$zf%V%nrY^ZTmr@ z69EW`qNMjVC-T64kKQf5eRVqo=ZVB)b0EYQP4GM#*($)su(S23->}mx-B9p6gA!Sq z5+XmudX6iAGJ(C3i=#&CtdWQD=AalaefpS=OT1AP@7@Ut0`;Z2qpB=wR_w*IJ3rQWJH%w8@-;cL<0M zqwZ9yjnL;j-E56Aw`PIoAJ*DA(>O?axam8J;Y>ELe(j=7 zK*^Ey0`3&I4b^x>eI8!UclCK zh(y3klK@-J?Nl+{^y++rfy;GMee%QQZ^k_t0-5IOmqFDB!l$cwiL#Z}M+z3>!2K~fwUj9{AmSjGx6gM5${pUlUSZlfi%xhHfk zm5Ayk1k*;Yw}q*kc>(%AxeVpLhU9YVR3wjx5I}TfT9xE zocvxEfFF?r;QAXyo`yqBg~-A1T2fj0sfGu$<-E;GwRt_YI81H%^=0hSs-Mefo!73+ z)YS;2;@dk#G}4F*TyB`?H3i7DW}O#_1PX(fkq6UKbiVE8X~g%Sm~m>fGn)2B=aapC z04fXj2MzDLQ04!KVi=j)uTKa;Dw0yg-D~Z|{y`F!#PxUJVB^sr%~1Ly-g?$$h=k`$ z+`NnC%HOv?{`bCth7x-R1eu3+BvM9aBc=WC;U6frPY=G1$dd<7riVzl4qzgxrTb)U z39gtsDcz$36|M`h+v6EIP#`eqk?{2QU*jsS^C=NPJ`08a==Y?QRi0a=84sE@ydnMB zauFQEGW9#XF0uer{JxQjwp^F{Jx7T?wr9Vedmb;~t!IL_TJxLWDlCAG8>9X$kjEC@ z5~3xH9W;XZL?3YZ_=~~+x%E?p4~Af74b{VHGW2in{bp(?El8?2CXpde;kut55;9^3 zz&+VjZ>hw$L*iii{FfUO;WyH{+{vEw6e9x~0cyJgYJ%O){aXw2*(iFGqM&25Ztf_i z;C+_Uv+eQV>l31gMAlRHvV5TP_}mUpsx%h+WkdC!EoR_*LHZ;Hm2XbCb-fPLNVqLE zU0Lq@+-_hZibtV(oL}BSb(@mOb&ZUrEc`kZ92PF`tAP}WWUCn#EUQhXYkJ#?)ntV$ z?s^{mIE+p~;u?B_MOxWwzW&Lm7onH*jFivleyA_6@j zw7~~8gj(aQ#m3UkMH!Ak=4*)Z0X_;y2~4hwbp=B)FUcXyqID%=u|>8Nr&G#6@!Y<)9zqE zYE5az5cUA{dyUHHe9A@+=51Z?&mS-WcLg&P+p?C081R;u@{>%L8a^7StEuHAb_4}E z`ti6H3OWhvrC2^Xs>d!Zrjh$dejI9DAtlCBPRGc(i|rPRTd1$EA$DF>CcWg{y9U(U z>ve@_(BsInpC}O9XXL@G#~Z}zgDKxGHCdUJZ$OsY%0%+yeeVSrnf@l{!q{#LIDYgz zbxFY2l{wfRsm*a59w0$EN$R+v(Gu zF;oA6g_2e;s>j37YgOT^+k4jXsI-!@E9 zV5-t{@BZ3@$a-X)s?g5jQ>Wf!!`?9Kho${8M;P?ignuP4)PN!EN?ERG7h(!1*Qj5YOF>qTnakatRrx$aem%66inA zR6*D)Ruqaju$H5);PYjYC7cesroT1HZZpZNjupbx!%3Z{KlgVlA&J*G;~Rt3<UvhqbpUbRq@S4SqF^;*(F;gA}64`ODtZH<1IcGcoWM+gQWW zLMB!Jw~{B`cSIXjlnd{)K2?+O-S9L)Qzorz4X-P^zn$F!Y5OFv%h^dy0il0MMq+v` zG?Qk3Z%skM!Xvyj(p49B#qdyUd!p;dV6sY;oV_>7wni>t|CPgUs+1m6639ob1Lx9I zpHEpz{syeu{d3SepCXC(HV{7bXbC$c>zTe=x+Hq7)(jMxg;21Q&XKez{N)GdAJgX-l z;W<4qY-PMxTQQ)LL#-g^1s_5ISIMc~s}`FylA^{(gia{4GmB4c-@s8_miv2&c>y2c z9axAfY4lE?oUAk`AYg%TC;tx;%m=;(j?a<{BXWT9vWT{`wZ?+r7iM`0@4#LL^8FtDWU_ zH0TpKellW_x$VCyb!1`=C0J4yR}|>PIj5TRk3)BBXurH&xoYQa z=jg{=@I{=cwm|C8*(1{`-d;YAl3*Pi_f~5PbwoxXF^IaZDLi6$(3^N-0{qcB2X}qO z(|~Y0*_|?akv2sqht4DTpRjz}&VyYh8N<{+yKSx#wU^VQn(_M=%iP5l+rO?z?N$C} z<8z&WcVt8M*2G^XJNq!i!WiiBXFNb*K0*hOSjK`q7Cp{&bv5TW1)f@|+_?J5ZMp_- z%)}diO(Y1eN}K zXXDZUeZQlS0qeu8`X*TXE>zvsz?p=;@155XUArJWVB)qBu%EKH3$6s7o3wjT6nAF7 zwxuHuHg|+)cygBtGWk13(IXA3c8oZS(bO;pKPxiPwdB(5IM>)^&(D7xw?|n4>_zTV(wsc=F zsN$~Trkjcr-B>yJjM`7B@k2VNCgb+>mG#3A9N!T8dpD3}9IMT`_xJMbK@RSn$!>iDcT#_M3kYc#8_sf>SWPYlz$%F`QKSUN0H0CYzx){QFCr zg7GLzCpC^8@XyD^HidJjXzIH8rCGg?{YYeneK%Y!d!jr9#}bw~uAWNpdy@pTZNBGe z$L(40aVm~L^^2#3#paIJtN*DDzUD;)_H(uapZ<2#haOh8Nsp09Ju;dLhY!|wUd zza3F@Lp8MDC0;P1gvv;a37zwVSP|?WJy>7_lX-Y_tz{L;?SZiqY1DBy_z0i6X-3n# z6;c0Qw$KUMc#PZ>{+4UDplio2=>FFL!F&c8Rg|9r<<&YLgBaG@-dF@2-$1`du^{+A zJ7DT>@w>6Ts&#TbMz`La_6vDByRl0V(`=xM4=AQjVac`S)@V+G33d08HQ;(^ zR&X$D71ht;DTq!iX)qu>?v`We#h|P$kZn7!VGQ&ALN>CQobUS zFCv!@c}7{F^>4RlM6p>6O2Pk{)EWiV86?PO&u8%e3rb30?e2%0gA?4~#|jCl4Ovb|vmKErO+OMpK)n-tS@qWmbX}UVIo>#U4_a6R6lDs!(OY}C!{mZS z=OVk~L6zjJh0M$}Kw(PVfJkgL<;(s!gmlIn)=#@O0Pi>_Q_h3gU>q3j^aQx{bSHe! zUOhTkEAc>FFzl%TTskD-nP47w14S(N&(ZW4vh4D;{_CIH)ag}PS*5~ZK9w|94q<*mJQvscX+9rT3?d^-_nsZzQSm?xZeBpAD-+2|E-Y>M$~|3eg)u*rW^+gV98xb4#0>X}EZ4$f8xcPC;i&u6g#GT6eGJ z|K-(l>B*@BC7ZBbm?qE^}ZjatH zAOhQ#ufA&aUg&7xTa%EN$wh58%j!uz>P0pl^f@B^y^ItwD^+K<8Xzvd zj*Nl$E**5VF*viN0#9 zx9ewPlL!LED9YXG{I``>3D{!Rr{ceUnkm z@VVZ5T{Gzqb0?}SeaJ$oEamM01r-7DfYN$5eO1RMUzIEp~#C0-4A zA3d4x`hvi-&+3bg2_F6tE~c^9wcJTE z1!8Bh#jljzN}uRCCr6U@lUs|!Cnrka4#+}Cz5#lW8^*-NnTrJ=F z#BZOA_0&Yk@J}c5W{Ci!CKeJ;zG`occ5C_avY6~KUhsNZ$m`W@zCIDGlX}~i@5}lx-{y4+^;B7s< z;FRhe4+2HvFEhwzSl+eIQL%)&`2~M;EO6q8XIy`L$AU3Pf}IZs^6g!#mp;PmuO7d+R5T{ch8ExNPF2xfWI?&DKn~AGr(3l zi1)$}VFq2?L3PlC@0(>90-o(8lprano2fXTCVJ=zKP$WgTe{vQj@Y`?7$u$4?HYD@ zC@BfI5p0oaUiC>cPCG1k(Z&J>r+`Z~+tr{1K?JTF3-awR*Ds{Z{rt#!HtN1N5Q_mE zhW9faq~-E(Qbyu(hk`v|KYY}H*z;oG4u7#+Oor?Ov>^L<1rhDcqrb%IB_WC9jA0co zR`}z-?@MdAqdMUfuZ}QDC#wkA`=qE(hO!8W{D?t~o9%8pWWkls%l*kMLbZ{kECRps zTGytoM?Jm~$dU)YQE12>vc`BV^$F}OOyJ0U!nIlY3sdlAF-8LXERQMaHwcwE2|X)? z>_~XJJre{z#q{8)imF~zQ!dCk5Tls+L~k<`LqDXWAr!4oUPcWUZs47KsMny^|NV7p zB+LV3hGqIbG}&_l3v8%Xi^ts^m{x_*rm{<8NpjG${9bGLyY6OsjaaNY;CrovK78{H z6($DB#jTKfUpV9vaUWdAP(zvf+4h=pmYrz#OUX(LKkwKx@Ra8g3li#nu8XR0_#k>g zT9c~xy}>GUw$CC{vAE~Eh0lG>0qHbT4h~2<7%v)|*c*Yn%Am}%aGzph!T!~eZTBnJ zZR9Vf*NrLpPM6OsyD6EJ0RyfPfU56sx|6M1YafzsGu?ZdPC?2PdCT_%(qH|o0ok-N zV{$+u1j&6cEd)KKYS?=l(2WLB{`{ zY3i5>!^&fT2FEXJ=Uzm4R@hpjvIyOei!Xn_yNX)_uSL((uO5{JUuq2Y#74!Z7ESq6 zJaN0tKm+X+BOz)}&p)0hTt|pDseOr|8v5^|->`yXa|xRIz~5XJi-7ghKF|FC?DGJG zC(t=&R#ryf+_s?;)bln-PoE1${u%_<`+CW-8v*|)Dy z#~Ry0aq3)`gb1?5pYe72@QY;>YiLQRDOrieMOk;`};PRcDa-C#BhoN z(?#6RW{HQ=%J|Qay{88;j?JWII;&~+-Nnr+mQuc`Pm0W`w+Q(5Qs_YMJT<4nZjOL5 zTTT7m$CseP~Vc+!EfkP`;P=;$UUtU2^ z)P(6Yi}pK;EbvhDg9W{Fq)U>ym}o40whgZ(gmly0Pwy~Nb3$F%cth$bzqx^K!kaA=@5tqlEPT*b=ZC; zyz><7?*Rxk(Z}Ji1`zdKf^jj1p@nnrl4fHMnrfZiK?mDXE#(r&68`gOS8t#9YXobr zU(4ml=a6E*)9IrUv2OlkR}Q;4d&ZTd_kJLL92K5}qvDvG+6NVu7BQNHOdpU4Ll4ft zsGJH9uDAcA?bl5k_{DS}JUCr7iPVAIjC!gy;hFeH-KxcFA;xnS)=yZRZ)43C+2{v7 z!!vQ0VSprq*e1He3#k$GE5VDW`um>vIKP`Tk<`vt_m$$EBM@eIxGxH{AndlY50lKV z-^%gnbC5vE1e#e)Jv%P1g|bB-kL?4#WF)%qPk$yrY^s_v28loYc>)WFM{f!yqa~d> z3CtT3O z>g={!;N6kqbsf1n{$dCP3Tq(^ilF-rFKl0biC7YEcQTARtNj$FLM7X^jwv_h;v6_2 zwo+P3E*4q&8k8cAOKTrrXuU&(G+U-Xa8+M``ORGIy3$NhwOOa)U+Gr$e(PK4lkMCe z1Ay<)=pqh;t~0sDXMe*gx1>E16EKKfZ{wcS2e2RnP`OTp1t*Km)5_Ch6&p-7l*mYl zteBCTNt=4cyV`g6gJ6NGUsw3~vHZ&>ZB86M6s!9Ti6ZlJk%uAg3uARjuz)>F?9Y*P zjCZ~D)V&=Tw? zN6RfVQ`u~fb3cSPv9Gwp6>Yg~_FI(?5(Q**KXNH{n_?w#rgo=?D?Fk2#&!X|04i(_ zEUz1#tNsBMd*{u%&A8}ztvEfu@Y(Hg1mDXAo*?L-pz9`h@m)iCKHkhbT{HMqll&8g z;eY~Jj+u+e^GTP6V-NpX6hemM|J7j`8OF%#iu_=ZX$ub)hW37+3XTdtmX>O}oNUR; zk+zbqSyoLq)FiKDuMRm+v^4y#{fhaP+5r2M4Zdkg6TjBFy+FB*HEr|Jd%x-PU(jr* z+w0R)><1uTP2G)dk`GlUsMID(#y5|V8JBmz@5&b8XFM6Al38$?Szbl45!Of;p=L=WIm1)Nu6v#8AUU_(efKxc_$-i+JM} z3ShTOqs4W?C2a-zoIp|?;dxuPNCJHp31JAhSv8MMrA@$(D8uubu09eGyM7FSi>=}HasHEg`%l1 zG&@`k40;q{MEb)Lpbs#*<6N2?2f`Mc9efpQz66VtqqZE~o2y!Sxf>A}q}&h3S3k@3 zFf`!f-9d6i3%8`bgEHiNH0a;U(HB|hiVakI=PxDy4KdNj3D+KA@CK)(P6Z>w%+Ygl z1(Qv!BXxh=ljUP1nW^;i$V~m=xq|YGY-_{VU-`RkmKg2HkHfHViW`6(dHv6{*&N7D zm-yFrKu=QGR=0t4MZrKrj^f>M~y93 zlvid_uJhyfPvcR2& zrCkXxufDkyd$t%SdIwEgwQlB`!^y6rLe$QeqSDWWw@n!EY}2K&ztyp}O5nNvh@Z@& z$t}XgrK&;l$GZ80FtvfwYFrzi%4DQOE2ZoeP~+huM=zmn%cP^I%F&HqEUn$mU9rfY z1fDVM3JjqVqfBQW=feaJ;H_7Y{OtD1TR`Rh>|o#b*M6>t%kuo#18G;z^d2RZCe^;~ z5f}*eLkjD>7HXQQ8(*J_A{QkeY{$MjR)vY(yW9lbq>-glI>gKxi3$YaXy8SBNxcKh383`1yzT1$A79aA0M^YJroGt!T5XDO0no0M3IWkFScW|>=L`<0cdZfKL zg_J&zTi+P8|LL2ms~D4u?7Ypi1k$~^N51#5Z07*`==Wdm8s2^6N|jbayx_54*k>o6 z^&$*steq)tK0gP+^EaP(syJTs+8-9zvFAxU#j@{Zn1AMQy{=WDQFxPPSitNXU)wFqV{KutgqP>bzqFVt5{Cm74N?pYW&?r!&7vSZx`0bKX(;ljGqYk>YOvA`C}`iiF!5Ib@)>=aR|f{)F%QR&orV3zc;& zQcn?YbP$?DmiazXw)7%Rw`6Q$6(Vl5Rmc6e1v^+!vFM_r6*8E(W4jg4#SEREn3)~7 zo`s^Qgq6lZd8GSyYgtE1K|gElfk5bb$T8+0a9faV}efX_56c09nAK}3tp?v5m-5y!kQdld;S9vCbenagQW~m z_6s-W@NFdh5rkxl^F&?&r3dn#QI%1%a9UZ4E&ovH8=P#rab9sWcEblGbz{M-`D05rvhovcZ zm7hF%06l7f)u2W{lyvIw+L~FkkH-CTmaf*}K*a8U2HSc4^D+fVOyc8%!S z;S{ZImenM0faCgfmQ>k@00b_`5TKf;?TaO;`ODt9g8-f|PKT0kQ9K zJKw7T)`*3)bm(C;bzVDiC6Y2Vg6OumoA@)?^p)A$V0LHx&MV6iO=FG0mgDs_XT6d_F`f1>e&&yw!_Le&2 z-Aae>6OXXXnw(-}vuh+Qu~jt*Cm1#1Je1<^<>5VISFdedV;-=ewQR$-pG3w+`l!FO z`MP(B?SF(cRy26+EAPc3+%ZQC_qFvdL|g}puZ+Zch?s%zH3-lAy!=r``MgN}=zfN! zu&-1*jCc65@LSY+=m(>DNyYrRI?u`vMR^EBE| z+?Nek1g6rbO+v7#qdjAyD)4PpxzC`h-hyuS@T8*9KWcUttraa;*38Yr z&+LIh#A{2~#+3-}Uh6m!U%G|1So|h@Y=N1}?0Rv9-n%{4mrA7*7F{`(&Zqe+>*x7e zo!Rg;j%;Dw?5{gCScm zoHr8uHzGe6yJI}hT3c5%kA3_I`im_&w&Y;0i~UjvhFNBjDFj6jQsD(5o=2&Hz| z4hme7QI8ck24iat)QEdzb1QeH>6U*qnZZ;EZ^;$&=&sp?Yt4?;CQW_e+P#HTDd*99 zE-&V{>>Qzm44Paq>(&l*lI9+5?n;4zHujiZjsaaQrdCueO}{4o8AU(8>|2L zdv}e-4xZ$FgA$H7C`w%!jWg7-@D9RF=7DnvE#-$VzrS4r>}cwHgtZNTsa*jLZ-qQ+ zNgXV>7=?$;8NAVD=T~#H1NKpNb%02hJnEvA>v;dB480~q=$xm zdDfdhSaLe5W4!XW0aNW`JCnX8@hfK6w?1zn=ydN4-UjCwxl#cT1FM(Cs!ErlepYNu zP~kbBk%)jc9zT-GYC@9q$t7|H3sL=cXhQO>Jd6S5*B)EmEd+BgL3=4zho1A$YUiid zzV$c`r_g_?r^#^UjRwY`SW%eJsdGui-o5a`rh+?QiEqSoJ`Mo?uKF^BA!~VUc+cn2 z5I5erPIa2sxz>*~z4R|?b>W_JX(*07f}L8x{vJYJ(RSLM3q%-bv8k%l6T|YOnmh%d zL#_p{_UHXhqH&{mxbK{9LG~~y)7mr0;CZDt#%4OdHzjH4zS6#Snu1~I>*@qHJ9PxR z8l%%|I5h#YWX(LD`nSc;nK=C1`dabyKMUZ^!x-la?KidS^w_DAA#L4Og!_s*#T>*O z>2Q)62A&uTLo^5yHej${^e@8Y(0329&!&rdO$^7H({`g-T*N9&*7BslxS$axBZd;fLuQ@!W#9e`Ai#ueroOw<7@(?!-gpH$;kcV_ zD+Zk&Sp;o+mpS+yX~Pkz@j!p|>)a6MjpWZeuNF_^W*e#`{E|{TrXlKuG4x&$Nu1E$ zW%5z=iDE~12Hj0@8)X7(N6(D}y|#K#7!LOn+?>_-14Jt@Xy8yAtEZgoF!fG}RJ@(V zZ{VuY@oilAKtJ&mM&<%q*DR`)>-j@=qvcR1!7z{mf1A1WdpIFfi5R~zEMjMkiu5X> zf_})M>=$7hamG~iVlO0`8Ue<%Z*Wkjw-Bom+fIuKK}?ReG;H97FBPWEtnEBua_9B6 z>Y&1){^zH?FxdmDv-*&>-ZJwx1g~L3(#p~(+wzh!N5}0lABbops(qP55CQ(|)Mc{I z!T1jykH3Yhlf*O#+O8{{PY#ilnI-O*?{zm}{iFA!5x*URuo*^#eb+5$*W2+okX7eB^Tb?**>`;a}1<^hYla)Q$@5S(U`k$}5jv zqkTWNTDx)F>?#k#vUB-r3D6F;@&UCDEBZLQAMue7jw8duXLp3|YqlQy-a4VcG`8o8 zy$_Vh;fPAuQ*4)h$f|`L5O0TLV4cDGQl>C3=z)AL)XhmSf@i;4HKBNv&@x{#j=2)Z zBA1LB;=BDU5?swp=5E2W@7*c^?5MaI{yDNfmNGUm|L4=hI&M)!fv?uydgX;t z14!%3ibiOQ`wHOiIpC%=hf3`c2r7H|g68C)6w-q%L4Tm0IoC%1Mwk;AjgS zcAX2&Iq%|doVX>@-kY)eLO8Bnl1PwipOwo}LySfyN*g-|Wp2A8fz&$&8>$cwENiwc zv?Yr;_XBq(;i4}Kb>Gyt@oQhD4n1Jo=rM=AAt|KF^OVUpBSW?l3xo(M?T#79>^Z(~ z6g&keuUuA5Sq8#N!FWHn9t2B*W6 z+o$7-0#1MX*0uMI1pIvDvo~%;S86_ArMJ_4h(2_jgvf9oKz{1V4&Jv@;i1nse(eZ%7^(BXbsa!Nv&Kx+{j<&BIo_K+Dz}U%!`pe<%Jm zc;hXvGJv3uE?s*^0o5sw2RZ$IDXbV}DSOP^Hw!Vj*(y9!_Tsb^K8vK??OL&QlV6Q? zyD_YNXwn~ZsCz{Pu=>7;ZJ1iVCHRYV`%nnCM(lW~H)BNbmHUJi6D54#m4Dw_=nftJ zPPB!v3k%qu?LiRxnrf+#z)GWMPn2^`PqLZ`)RqqB9`ysYAs2`b*Ke3dnhKKal;I4Nk=Jj zbj`3j26l{6rJ*)f3IbkKGTM+70LbG*dMd^t$2(b+L+}R79v)&-41nUCQjG@vllu8jSW#sH<|>UipJ% z;DiL(uJ0FaH*E#oU>gyw3MlMi)c0h3b&(TRm=Yw^YvMFg%LFUh`FB{SH6UA>S!=i75EPT<#pbC z8(qa;O!Y`g)YlSN8+J_}^FFy32sbAjmP6YjgB|8Ar?tSo$fM1h)sEZ6^7vg1*ZToM zGBV3OpAud!qBzGRWwUXBte1_sDa4?h{x@a~@ z1|&ZW{kj!9MP!lH zi9ldgovJvPrAaoob|=HbLovIhGE2woMZgaf`mr*LJuSPFQpsa9%y)2{j{baUy?(Tm z5K^llP}Ko`=X4YekEESnUEDGL)0L~o4)})OyO^}o0@cD=5|u4!M+tt&YAEG=NS{z< zEJ9Nexn3eh>Qy%pl;)@<{O>@4>LIVOmW3D<-ZFSyp28I8>NH4QT_9gC2c(wra7gk_ z3}s8?Xl^dfkw?30a?@ZPzgS$9i!l0yyQ0cW+Y(iLE&A6O4Hsx#7Q^AJta$QZTX)}Y z)S{B~=c+<}cvdlm^*@a$@HF8c<`apYbzpssW0J;E{YHDTsBvR0)J@TtSGE2U>CW=m zENUs(+OrcL6@Shd`gh2gmQBlvQzK)Jimpw)a82TnzF0kMQjd^Wm9D!2Uy=vmqJz>J z5ZZgB-@nf-h`L<1Jl(Dd|0VDm&Lly`y&5AOjekh=HeWLU{#u41lckD%jC0?Jsf!Yj zLPPP3VaIDm{wHH{6y|Qm@8H}u7dML)`(8uMmG>)3jJwYww2{UhkU?)A618n7fmCaG!Q(-h#jG3PK?7`C z;ayP!w!X3)dW_Zpem@CCXJ{1$$kzz<+Omf6;&6i!^-K}R9-0>1CNujDbhr7M= zMjsnGXM5mk42qj|SA%!D-TR^F*t_uI`>5--hHkg z&*^N7`1<;wjgQ3YTuw0^950a7vH0U{f%E5Y^ZFh?pfPtE=f#&1N2D>w5 zxg0-^AeK47($oU25-(|)Dz6VHLH*B8n-E_u{JUphBrp|Vl+ox2-{p8DO0w{XCuD;q zXXnZLR6|ZK#<b~N0(JJsS#)|o(%n-eLd&Lmpx7Uh z2+%PA>%w2CeEBH*kJs?>OH#riqm1#W^u%#dSLaj^kGuc^Y?tT-Jdak^POFyPKZ$#x zHfaF?{+?@(9Z16Pl8=iXj^C}blg6G~4x(O;>z;3&W0C&ShPQzz)Yj29I4zB)>6s5F zbs9Cs4g_A~mdN7hdsHFmT$mkGO;sO1AHO5*XcgUu5wWV3B(VPvoHG@DV)@az_pk#b({oivZ2GpUx-Ydm+?pbc zJ2U%jCEF6mr(=(aZE>6a2$XIpI(|I+4eDbDi*`bAO>{-A;_+!w$8TkbGwsIU(}a_V zE%8QnO7DtPt2Z6FSlYFl%wM}8x-S9GoMy-R&(E%rF8Q=yY%y6RzsURlD{+>hlqx%s zmKrN;*yd{#JU<*E%@S+vfn`M;VPVE0!JZBcrqg>vl0o6$Cm|tOFG`ucV99a_k5HGt zt?FbTXy~>~BJt;}26>>~WiQN)<tqzXiHluc?BSGuFdOJIKuNe29H6(COmLOyEpE^x+B*g0{ zT8FDFKkwAep%?5k!Q|ls5H0Ge_-)@nw)e+bg4>z{w6G^^aWL(s69otmOJr#tvLjgo z^i5`ug_WE_z@>A!+7sIXOO0T~V3m-r*(tN<`#D|1FAX&7fja7*GV6XkJS$HR2%NVpFGDQhZ77 zwZD#8@GMU_cTbM+RXc*w$)GwA38ZCWg7{vE>rt3K_X6gbdJGSkPZQHilF*@#` zV>_wXwrwXJb!_9Q-~YMej{6Pn+cUBP-Y|k zc~<(PXlruS$6232=UX0zs1u&ol!x?mZou;4EykG8i1qzIQ6))EMZxR#TAv@JjD*#q z0IODkz>3$-%slg~W&~aeephI$Y8;hJwhNLLu$HH$rmET2Kl-Ubk;PZPoC(XIq^_Rb z*|9ucLrUe=YBAJnQwpQ;rMC>>!A`mTYJoZ#sJF*0jc-fveCErj=VDde!>p%1Md<;h z!ZjhY9@@r_XlE1p+Rj^6UL6r}oYHrsb5qBN_p8=*2=U5MRUYgzpc1P_kkd+5qs4`| z(Zy=(o=bUtDb~;oud_$;h`oP)ie{xc=%~0YK@|#w`^D^L?#?)C21X!X8nc*$gL3xu zryO0@+rf!AWfc}CJ!|xL+OQBz#*lOB1tTK}q&M~$_SDoX>WDzb>hOk$m1p#h`igZ! ze7HxJA@F%0&BZ*+H}}8jG0E1K9wSNtaz!^wT^`kt$t5 z$eR7r)LK<3TMN(0_x7bX;rHucR;`8!5qpJ2X)!B-u8^e-{pY`#?oMlo46~KRYdx#a zTuNx}uH@G?_FL}(rd%kexTsuSMoW;cTxFi9c3pwDdR$zHK2>lR5PAkvZ@{~RT5(ea z8=GWtPa|6gT@6WH&$X?}lkR*J*#6INboVP1ri9{hCec(1h>{kjoY0+^d~~~s#mHG4 zcG&m-)-jMjX=gUZsW_>z_)b2Aj?}{tW|6i-4O%9`N;MyYx8%L~oLH0i>q720I$W-g zc>u)tswi(yX6PN`J-+Eorn!Z*H4Y{Qmn^Sm>PTQ()!TE3ij37k@=feoQ5GW+uzAM* zSo1O{jR9QMV2nA7h+;k*zCoLim?`SrX_KeJKPS{$Lfy(8>|V%W!SMZR*IOIDeewXI zQXPlRj3ySsgJnFBX49e-i#Y5Jr@CpCRBBBYv0^R-D{2C-ULsI+M8^>}h=3{1*zC@ z<6e24D?s1wU^no+k{AID|5TvXCe(BJVE17uW!7%BTS<<(ESMDmMgRE%f68h71dH1t z6lN63V5`DwYrN`|G6VyNzj3~P;H!=lu+!C2gG*#MYEV^XpjN=E#BaZq5>1I)3`r5a z`J9$!z1{WC{t?1i%4+?$iM;(yGjt$QrN>#uR+y-4Nb-a_D`jPL{h=Y44OgO~94U}? z$e{QaKkhSgB3Mg456lek5-z5hqgNTiqi@&Y;j`EBjQsGtLLW;G&||PysUX}&2169_ zl`gN!yo;;F;S)&bd9*hb+huGk@R>z2+<*Y}4}E)hYCFN#+Z>91a}%5jr7~o%>-7CP zVJV(r^tgZQ;+jhvcCS&T<@%4X29t(RkHfb6Glk-3cm_W>Sj z{tm!0);jo`|Jla_Z_mzZYKousy$q@8R=*{9W(HoT50r1!@`c?`%e3}dvxY^g`Yzs_ zZ(QuIA)^kdR*!kX=!@t-!((N+gwa6dEc<(_I20`oeC+N=P|=TysPd@aI7+!LH*Eyk z@)S(eNJBIR5fdv|Kx0pC%8qra_ah3^N9O1CCB4?sun4=TEw9eyxRo1q~kNK=S!?EePFf z5XenRTdfm{S;t4;L}y@_;*11NEA=wt&pKjlXHSWIj6tr@^=|n{^qc;CMDT6YcrTwK zro};GeSaWFh|KQ>7tfThmEtN~3Af6ye4?O->WUD?!rJlHMST$^K;}P=i!#`6zr#_ZV7_%j<99DsI$}JyNHtCZ=7EO^|e5lA8D^7b5Ls zc*YU`cMtCf*&YS?+c-Z4UZ+G#87JO*1XwZ(!cHS~(hR4XEU#_GNx#GTRx zT7HHEObHOo%TnHHI{dUYhhes1KJ3wZKGELD7uHibzRm~BYb$)ikICf>@MO* zPSM9nvxsC6BbJJLS6mQ64G8MTgn7&;pw!7h0>ug&7DJ{&1VLzwwV_EMk4rZOR6hsLgIt<%L8FjkxsKQut(Aju}5E%?7{LD0hs|6f?Wmc$=RI7%F)6Hz^MqkVN6w5(d6 z(hFjFA_gtogGNxT0!*+N0V)i=yl}0j1B-tuhuAL2tFP-|ktk@X*5T4s(WTcV46$$G zL+?I@w{Kg;dlqg#rZuB{h~~va!`_57z9h?g{ts2UI(6h9T~TI{i{j;R@1U@|F-q1z`85^`1MbB6+Xx26TKi4rGyAYkZN5Lu&7E^O8;+N|> zd%`h+LeIO`xb6l!nA^BY;>|DQW5ZM5xa)k99z=84JN%utrxI7iZCT;ZbR^*e@`MP}u~}s`bu*mYbh~t43-k z`>oLVAy1O^8w8vWTdS##|Cz>%F&Jr+rg6QnPLK=PqifK0CwLVBYOu=>h)CEYX-ztH z$Eo)?OuGWxav9h|lIc`Ms6V;J1{73o8*dj-x(furr@l9~y%u_`%IUP#BFiC?Rdv$E z%3F7Gt=Y|6P=G*LM&9>!6vYjp!5T6DerFscpGDDg5O+Qxh9bi?g3PB(06=$JZ^K!= z+WuV5cgcHle%6iAi99~X*eywBSEGW(f5XoMAgq@ItskyNx*gjX`zfG2fYOO{U4x&h zHx!a?lDgj_(@CPblwPcPpg!=IPm&8d@TFyr;viYvgwvS!uNj|GBPBvmq1zz;is5p( z_m}%)E!$JgIy-^c;&RXswa&=x=cz`|+h8S3w*N(1a7UQPaqFHSy<{)ld4xXlV&jSslnNQd3`^qLZGQ8E#}eYq3t2G*Mc$&(`>sO!p4>Wrexxu zcAZ5tZZ~qHBgxgmB}@56qJ%BD4FZ75_N4~PbAxA4e^X(Pr0@|yuK^a&QX6pg#+G{i z?DRPy5D_Ot(=ADj2#Iazr`Y9?Vw4F}L=W>96GW;_R+|0~JZTJRTJ+!7-YwFNXUjHa zU8qUfV|@^gpO_1Q+4@lHA!RCM4@&tDA}#|3s#-!Md@~K|!76uH`jxhZGPt*E0H*b; zHEoDigX?(jN`U?0RZ>yLqog&FonHoynpKgl`2q$LEYvK=gfd2&GGC0Z4Ft0Ozmy&- zRqFId3sF(W^-q>l>C^s^1l-VbdlmO#zmB$@iXpe6UpSBACE}hB5C-`HPp5=epBLZa zHLvQPxB57t=p-(nw5rJbZn_*6`d2JCmM&gvtJ>dYNod}yR4`E5hq;p05yMX)J8X(m zlj+yLiS|)9fP6&pH)c}1;ofaK2r!Kjk2!D~6&Qy~b7Gs*f@AC0g**1Y$~+B_xSJUK zJt->`*hqcjFpO7UTe1dT;OU-+uS8gxEB5WH)8ztSbnplW4DwBP#BcvTA`IR`bPH&C zoxN}%+Cn&eDwI$=Y}OF(eV?Zsw!uB4Or~a65W?ML z&}Q<C1DahggZ$7d*P>opz+pM*<^cs@#2_x7afsE=ww0VJ_fV#<0m>4w`tQ^8D_ zjsvM37EH4~1gTK3uLEfOM~oiyC#J%@XmD}6hb$K$9Zla`p>F=YRt7Q6>B8o$u_NGu zbL9#;va^!YI|We!L|)jOFu|Ht>{pRS|QO zUK6y}ycc&N{@C+@@Yd`6>ur)JQMah*<7T>ay>P$z*}2z}r^D}efB2BpBgbxbbU<)3FCGT-f>A)B1*`t7#2 z2`*ySsoYC<0xln99j|;bNE6N)dQQ}9us>or-jG{CB4uJl{Vg6Z+zDBtmYP#!%T@4Gp@5~@e9(dX$@ zM%UeqQeZ}s>Zmm7S7AX(T*AWvkv~1rWUn)k_7%PyJ$;v zcoS^0q3uS$+3PyinuJ~Wa&WDs>OXA0EAOQ_Psp|;fGSR3r24o=NF#5z0?j#1tuXB& zTaOy;MxUk3z>ce+zk(lOqlNny*v2UcC#LK*4kRZqxsNi|;KU~LCaiX51s+!amz;u2 zJ^0A{@4G!U6!#b}no#OT$l=`MA03h#n$HM-9pWNKzMNr3=u!UOyK|IFl_@t z!9gBNCSHLue}L$(9bn2R87u34I30U#sh@Heo0ZahRga+2N9o4Hh29GeMB>H$PBWm> zl7jPy;CP>M_o6VGVF&>p`Z4(Dch-7P#FjMMps&~@Gkc!^j)i!*Zpn4wTZ(RcYLDw$Ixf2$&L z7tdyLV*GL`flB^ijUc?JA&wGR66RGsCB;`qe*QBO1bDp@FD_G3TDAsAR~S`dEzoeN zjHu)r{Y^zN*x`Ab3luxoZ6KyoM% zOK0!i3tcp|Yb#FVZlVjGBLbuyhNNU~{lQB=W4)VztJ0+!gkFRGAD2NYZgk)lwRx=B z^l?qWt$M`NN(gU|o;hgTgof%*2@GA!tX{*>9B>mHlx8(mdU%tE#PNa~)j{t%x)>p; z-h8_D1ln8|H7K5Py{4Cogdb?YXtvv?qnh*0%6TVv<9(s}6jTj{vdS}S=fnL^2x@rj zM=~47^K{)2p@V79)|(A_2O#fV8*xp z!WMFI+f9e=4hcFf@JMxno<3d zSj^dALuC9mbA|Tn?Lfzoz;q7wCKRDjzJ3vi@%)}hxGa45u(4wQ=Pr=z!|qnyvwo{- zHx#IL^j4o0T8~O(rtu@kt%o@o7QKO!phgGEmLs=%j4wsG0TrDP2@C%=f;?8PT z{#wqP{es4v^Q^$DFas z^9_dK$o#OYr+(?`-Bf3XWn`1b@ASBvpsD;XdCU%+!t=Kn4J5beZrMZK?1-M=2vAP3mF%db)C2X}8tpg@O42+fPRiN(bb1v~V zD5++-iUwOIGPJ@jCkMkK4_Ha~iDlb(%M;jk^W_uI?PoJXica~=ALEXS%JMIU{h#WjX`C=mP-pT3y2(bL&r?!4UC$-=1ljsQH5*jm;Yri zncY7YsX@o|{yR4YVn9o`_Y?3`L*5XQMXPC}GTy$t5Dd!}=f)m+vinvuz-yhua;NS+ z_a(YQP}yqKg>TG=S)IBpTkU_;vrPW)T4Nq25<0=uWGE}rtHRNul-c=4x_};kYAN{H ziMbmUy@Y)+^5Eol)f7??;74Q6@uC73c#-}vT8J8y(mK0s+#9Vd2|+JG(1_E1+}Xnl zbe^!-zAJVlaDVWBdd(*>^p5W)AnXp1@GF6dhQOLkKNwU%iMGdrx9J@~Wc&doh0jhD z+@vt+S7dMg2hY`7pq_zNF*P|{vtB8I3_+=0w?$=x2|&jMUYWXXPsiEwEYu{!9@* z`+SK#)3Ir`3pb-)HD0d%aatBMB(l z#U6#05*}5hb(&9MG0hm4N1&`nqI9aKkIyzGeo|8j~Q+4HSgeRb~WDimOFH|sTFpmT6H%1g<;iJ%MgzSsN$J_R{b z<)R@iKaM@7S0dkP0PqA?7lNaR_}z|M{iL$;9ys-G%!%O1IPGJ` z*negv$v0!unD+gLaK^zgy{I^mmQ8gDW@po4S$}=K`YQb#z;zS@XiRpTD(T`dpN<9% zMTTG*&X@$gv;^L*UFAN0S;Ur|^B6%+3}WwpfR7H(hqCulh5SQKw$WnQg`C%-g_iq{ z&u(Nc*$B!Lb+To=i|jdEKs#A39!&0}-opRiay7ef?te`$70N|AGIugW!~jpGfW4pD zu3tml46P6*wKgqR2w1X>a(Px`ckcCOyE2iCrEctm#>C48d>5%MfwOSy`GGEY1EtnMH^uS2F8L2vkn9$B|a?k95{>=e}R59 zgp~Fl+~+2H$>2b*qH?X%2kIe@13hbU_T(j;`nouE(=9;qPuMN$^?-rWCd_h>EhFm2@^7?+5$$v8B24cLky30i;+T$s(UxbKIed21^$N570B%P z*Hx%{%-&%YT7-JEuVPDxQkmWz3-r1=IXgUNG1s4!QnoEsE+t<#6&rD%Y#2_NH zHGM;aTRqFDmrf<6S^8rGsB3Lj8|^OFBYNJ|Q8fLIBbm0}{_eUOBSXgA7)L~0&ASvFduv5R z1Hs)Gpeu}i;0cSlqaL?MpC?+%0};W@nWrv4kSPa!K$5mFJn~p7Y05 z2XXIp$612aM{PITZRTD_9G)GW5H=f5F*dNNPk#kL0U@^r1sFUc22fDArUP%5xIT|J zXNWxxuN*)MsiRVxUj8)w6Nd{=xC1&@Wwu(6#=9Q^} zYe*3^;{Di;OL4{ObbotUA@m$T@2NhY3&i>%|$okEC~j~WQhH8s$|0WJa(j$mUpst1Kajflk)dGXWaEy|*#HB=1N zhf+pRqEe%-t}`}6e2Ue9w|qh&fUv3-;^wmH~b-}V3Q6h{Ur|a1Q z7J^8I2FCYqVSA-R>@h|ggMqX^dS(1>auO_83M{`GU&0JG5yqe%yTGe(E|5S5?)k%{ zY{e&!<6~O3$A56?DX?XyHCf@N$GoqeyFWr(e~K7R9lQ;j1quxiE^0RFT`zmS zY7d)s1R+J9SIUXn>WaIdYH{kOcWrgf(>;}php)cQ-e7Vb4|xiOdjvZ4v_1lS#FSsYjP9$rll5XUKL8}rW^%{2y;KJLu zr^8-Ar2S1!2o6a(!@^tnxWoV2s&&|=kL-)SYFM}Jjh@^7pFiUe-Q4=DWK9+FJl@g8 zv+<03J$cYfQ+LOQg#tDZ?wwURnAll$RX4*zsVl>#<4|FnpjwCEqJnxqFPn>;M`H@% zS4Oa@P=^SiA~^+Uj`RYC3J46&FBvKLv9b~j9J-ozJ~x4%D-e}`P?>7(u3$Yz z)2^GsA2~suO=KMNQ>(P8%J1RRvKg4(v>yrNf4-}aX8aIdZRy`BKFsAq1=>3&t`01K z@*OHPmXP_ND7xHsl_V%(n{az;Q4!5o7IL@BW@em&qNATlp{rqy=t(W z4)v)K$BLtceVJpX`|Yj;neXMUK{D{X#I_5E`3l=wBrJ6cj2v(^f{Ig!2lowH0`cs1BTHGW4bcHFa zW zY=or!j;J|lDVn~)6h--MOz;Fe$9_B#I6|ocqO9HoNr+%>MF=@iH4UXwMbuHcPX>qY zn^v2Qj_lSW3Kzfo+05z6R4xRV)Q!-k`UM+lp4=O)5epjev2u{@;e@A9llNTZRV>Ku z7@l)o9wZMrr}@F*6W2^WBoUVkcQQZ{H0H!YanpR)woG5Ou?EjNU_&}dbwCKwPGiX} z=^~fFi=U9X!HGm^(;ONQ;5tG;YImJ;4cxeYpZS6X>CXM zwWju1I-)ris|@Fvk8_x|*PnJ(a|nI=stvD&=#HR`jcT#3pkek

_;=HFGpA_iiLC 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 TTOz7T9-5l6wo=t=X!!pDg*AEh diff --git a/android/app/src/main/res/drawable-xxhdpi/android12splash.png b/android/app/src/main/res/drawable-xxhdpi/android12splash.png index b7b98e8170ccca11a8ab8e7475ecd02245208d2e..66ab0f82f2f1c74d2173ce1760d7e96cb54aad43 100644 GIT binary patch literal 57117 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⁣+kX=|U9`W@PoJazatX;R~F!9j*| zfPotMg2``J6aG<4Pq}GOc=ZriFLch42qPLeC73zFpnbVMw3og2Jcot7S|V^77v3eu zvvm6fRgxF$)a~Rc?1+Ft`U77N+#gG?skmKgc`)+h)7YYi37mra3uE?8ZN`z{(KUI=Ei0_nYn5inT^zLRqF8fYU?R@*SVJ556~cN zz%+rI3hlef|4_$>{)0vbfA-V7gPGpdr(NX)eX(h0Le*lnk%Ypa1eGXaP92)+EA9)U zE2AF%gR;By(jp7oEMIG?Ap9V`f*E2z|9=3_1Usb-`xMN^05tM!C%m3Hx0VR5`^MZk z9rm$}Vf@yhHEVC78UXCc(2|VYPY!f!baP9qrBc@jEAq*MwA#@c`uh!{9(WAts?Avv zsXn)o0;=;QT{!c^#18XBz2E;+e(0cXorjEM-0@|w8@a!qPRey_fav=Fw8jk`E1y9$rTOqhUeSCnUj| zf}pj>eBum(F|(fCzt>^*I>Vf-pdmz=1$zJTkH~cIKW@meoG;Bsx!fizH6)n$B#-KR z&;@mAk1SjIf4G=4^E9Wf`U~v(EXdu=6ev!V5fyXLPS56waZUil*nhwE*!QFZZ7PZx z04HpLy8;X@+E3%eJH>-P1u3ruuENLe&p)neepmq-gxUXx&5-^-ctUp-&tuAevma_> z3*nWbql22S&@pPom5K}&OD%@uF~L65$u!kW3Prl#N0!Z=0Lv_VZ_SSX5{$d*%x$th zsbeH;_Jn({q=6|Ya)z?MzyJ6TKok;~<;`fm)Lr1E&afLwRmG~%h61O=^sggSSQ8qw z<|B%c#j=1wJ`ftPho1@$?55AL&J(%iW|Em7Bchxf!^Chtq$j`($%D@S*TSg>z|FTF~&_FBgw4{mGDk#v1aM2A^$19$A=8! zBY>(_?o|bGy(X*q5-=TMq&--6+@8W_#3y2Up5Ctl5f4`Lkw_JfjhRTK0kGqvlQjG@v9svz)t3828kfg(_e3YmzFS+@Jb6oG3;1aBRg($nmY3x$ zU(%Jcps^RVxz-QHVJ7qp5R;{^}-%@wf4VqN?`$xJ;%BM4zrkz?j zC;jI*>-OMfbY`;CEo_UzvmH?Z1=l=|-hQfudG|*{Q*dEJX>+k6)RacyaYVtg!rG zCc)%`m_PYhQmy73mff|K+Sp4t*i!`n9TFV74ho$LgFY`VMKNirNTz0MW8NqC0{ zWmv3#GO#>wP47fd`IleherdoS!?}vJ5yXV?Av8XgS<1)a0Oqp05w>%>*FN_r>)@2r zD+80lfGXZLlq`E^LBh|r1E3`Vig)uHt>}&YKY^dGKnAF4t>l_Yu{#;E_=rJI)q)*= z#p&-nOYIn5pmImwkIdBnMo5xS_{vc_EXnpFC+_uz=fx#P_FY%Mt0n&RPCdFBSN~Mk zWraJn{V2ruXE2-85L*=3sbQq|;&sCC+bNDfMYTI&sXL) zmHqmYtJAm`prQLwX%nkvK6+X)1l7$?7)IhGu#HMUFV&6x6C8)iRF@G8yY@FFT$*&3 z^IOqdNC(xd&`$0GLs_o7t>B_Weo?R=Fr0{MN0feK@(Y>pXUwRz2|`V+nmIZzn-O-T zjH$X)#?mb%rv>WLOeL+jxs8T0oV+YS&YPGbCO#|CdUrD!!5ZV>1!FerQaIo)vlUB4 zM788|6S15z%&&(Ty)dOiB3R$?7yVad$O6N=c}@3W5Q6xy>Z!23aD)WguSb)K|8=gB zO}cYgN{Iv>l+hTkl(mLLSY&i$qgO(#5r9g5kHF?^Mfd6TRQc+r)hJs#e#{Q*ZWcZ# zU81oZUTkOM?w$LL^)dq%bGqOx;usN-wS#2QqOmeh7hMK!jKQC1{V!{&Wg(%EkIO<^oU;8X-!qey0hjttL;o}USD`bb0d1Vzh1BAQJC9$x2PS4D6u2O!xurVo7$;kUagUv6lFGU!xb~imNaK-U~cT*I=0JWbNKoVR4 z;Vui#MvSNN$BbtRhnO}50f@7o*GQdB4NCA&6n|(L!Ucx4v!glQV2_B@pwg#l=lH2k zra$Z#;9;GTrfv4lS2B+$V&6EB|x8#V$Ysww~diYpVRnEHzZ&RpgIGyn` zeZ0+3q5po=2}!%Yge)&o-hN6(0i4&uE>o&$5fg%z*}J)*q>NlOI+<61P*Er(#&i3X z-Vzxo^n1W>w^tP^Zqs2~GxL&SD-g=+)Nfzn;iuSY7F3>}gjF>iyw{6iQbz*$_t~WLD80KuTP0gD&Muq{!3cjs5`W^XciQT&Oe|T zXw~VOZRlz`?6| z${v4>|6s$OUUN#2;8s=BI#Rd2eaCQ`fZ`=kUmv;`h#@4Oqb8>ITS)@V^eHZwrjwui zV_ZkJz4yQ*aW}qBETq35?Ko-H;9XgR{lD0E??ZyRYeRu9_4#vI>`_ds+Bhqfl*3wh zd^i2``Jt{J=KVrgI^H3XDcR~6RYS#uN}1T^R11ZAUGfMOWv$M=e;Eu#spu_^r@(U? zR9pX6krsLjkOgZ;L^Io_KQK9mFT1{@ReK|V z+iP|SmVoblU5V~varxn1!d_WnB1?^&iO*KzlV^LVxR^Dk^B`{bE6O}ab)F@=NArt1 zM@d~w%4hztm@GxHYct^FZ&T)gfD2^4TK#7FXU3l;1L|7#NceL2cU!#QnTV^t&g$7p zc<-j0JH08Et|QSu)P#vbmwgn{spxn%H-{5n+9T?F5(Qtz%-2N{vC27}yL(Xiz%3Cm znWuRgjGH4(uoA(}R~zD$`t-#H8!EY_+l*PwlU8g0ZrEX%TC3?xLtzTW3EH4kS1(QNVWkAF(fefD=R9a}ZDFdfk|GHaPOq%1f&VFycc zwoD^gMzXz--YSyJ**^uT3?G9kB!&5e%}kE$A6SGr0=2O!nFo(pu$Z>& z1=hC!HzS%Rb|b#8W}JpUw6JX{uhb6Wclz)pKD>18W#WAut7M6&H_7!ernlh=w>LWT z0>;YpJ> zpuQ?X4_$yH4vPs5sMZ%75P0d0M?z^QkyFGy#Q<@1P(;k(X^V-qXDezM|IAZa9IN1u z{?ZhG>Fole)*&KCPLj75;2{5QTnN?^Iwh=;m{Dbv=nOgWSdql{O`gi_N$sC}e?QbF zWD{u(kIm6T6PfHYuuK-3I}iC7UMk+jj)ngD`O8YEVNGR1P!6h7*2KIkJs{2+#{WS^rhMc6Pb$N3HDe02 zZ7Nk!)GCX-iBwAL$g^QPh3Hk!;~h+1-8H3>fh6isHIjV@r%~njl~5xL@00sBn< z*WLuxuVe1SESdR8h%MKQ4VMsUl<$M&y%c+tsmWmP3lD6=Tv$DDl!4MT(H%R3IUc>; zqN|p=c^^&$?F(>dnl2gf!u2v{)H2yV=)PKj_H`a3)zj;gKuC z5-a4n!k-wUgSjmJilbba50w#fK+Nojky|Y-B9PbIcKZ2AF+A`Y>xD#GQxaQmw?7Q& za|u*Pal;t+lYJ|fhjC4LZsQ-AeH98))C*rq4W%3XgOdp4j;%JPY$0Y#rWS}Cq@b`$ zR_N`w`S)17&R7{2_KPybHfdCD1dvpy+0W@6(iYJCkjUptg-I<|-R%6? ztG;GHvx>_s^$U_y2_Q~=$dQOnwf(E4bd)Q?G+38w4sZ3b4(Uvy3q2)k?`lLtyGY1l zF_rq^=aov|4{1~MkY!=2!$ja_$??+TzGl?=_?Ztd_^Cab?5eTJ$*WP6)XDW+p3;rgd~|I)PhHyLMnTHD+!W-3OBea^cSVglo}fOTHIg#o z>?ggSDR#GcJZQ?YX2=1ut{W+hh6Fs+mzq5>LWrvzDGj(v*S}!I^~nB{0wp~OOv|KZ zL$>0cEN*k=O?XBN(IhQ@X{y7da%X#<;h%^$dF+Yz_u`LrWlF(yXA1T5eQaql>n0KO zbviiQzB7^~@7n!CSLUzEN?ui#FLr3^+(u|t@f$%x(=o|&P>oLEXQ1ULZqM>9mOUNx zcznTnBYIU0ZD)! zSFruB=_(3$dopj}^W~{vszw;S=}oI0Cs%SO##O&sz$iA^a*~M5^(58cXnRa(Wa2%O zx)NFLeL5t=$ZKv88DCL>@Itx*xd;W%AxOhKIfWHFIK{P3>mU&Re4c41i-((@{b<&; zH(tMbnlgcGu2*gZ%}z67ljMTeYWPTc>Pp_LOrKz`r?15USQf{wr!WFp9D^N72mLqm z0lf9sA_4D*ZkM-B(xrG5rT+}!%0E83to$vun^RKw%H(EV22fq09*qxG;gt+2*OdGY z9)JEm(WX$$;jYuNjQ(4%F2fDkTn{E=?310%Hw-+*KD%R+v@}dsa6d5Rb5T^LM+zXD zvqCXXF3H_)=ULsl19!X&P8klWuIvd}01BG^q5U>T-?Lu602b6gbp@Ktp3`)mBS{sf zqeXFQl3zd4`EbbijUfS+!=qy3EwEGQsU@2sLTkK1-DzHCZ3RO1G)KNs?HfujJoKY^ zx!Z2>r9xE!pSp~UK_r$R4XYY8?YF4>oe2K@^xvBm*(Qyt|FT_VH=1-$5%9KGYbA&l zS8rBMLVs6-&!^uiQyp&_tR>{-4+ej1nvqW}>CtRP$JDYRZz&Mh^ZL9g$%Lb8TZ4ta zOZ0Q{0aWgikY%q2OiQ1d%r_bHVk^5Y6)A_5R`NxIl|~B0XYF)IVp$p(u?#6GSLVB} ztN=JlPI+@sJ@lpF)4hOXAC}d0y*6xiKFwkoo+f8nMyH~c2v8p7>awKcFc9TbkT$Y9 z-{zzSU5VvWF?TNfjfg_unz$HU?oMIB0t$1-B8io#$o{R#_Mm68^WOp}*w!T>Ef_og zX?I;LV^EG}MbnEZ9M#DTJ>whor&Mj`vQ#yZ?OUaM#8kk-3P!X`{1+`pWgN!FZ8RM` z4Sn$8oyhDu)F?8Ty5a@8eU+}BDM(uM_}Sa-zNhBq9?YXGt4a)Q)tN7u?mD!O&&Cg^ zztfmOZ`q3FIRCF{^cr9-&;lhcxr!n`- zPQ>u4?<3Ev#HJ4sf(eCG_5XoQe#1^t<>>sw;?boqd0UDYiQvRP^_zwyF0(Q^Tfj~bX*@sZ>5z}MyJ)lO&<1&dzK=c_G;uSWsxj1Y52VsiDLGO5 zta-h!2zKoUlu<1NBi0UQghHj2-OHzEOQBsY0bOq`;Qfi5Gka;Gbj#U*mqA7kJy(D9zMRkh4^NNs#00gi40ot`(Z^;3G*Op#koXO$1|? z!k@rEMmOL~>M`AofA7}vN=9M>r7$?7;D*7=bPieZ9q-SCVgOqDzx z^w9!Hz!%E8M{5srIXlwVshYVof?1>Sc2v-_ zwYlQSXjbaqjc_jyMWl=X;B*nd!K7fn+gE!IuV+FT^>QzFTqUw)h>3@tRmUwNMx1@T zMELtRI%@dT3$68|@3Y*203eyy5&CPan4p6R+n_TPN*G-$Yzn|eYYuNnJ`FoAK+BqQ zNY(pfim?3+OA<8zy!-XbIC+=U$P2(X5SnG8!Ps3zt+|c~RZVZe!^in;|5`M;Esr=8 zA3OP$z2utW-J9aDoDb1=vwiqkqqx}J6<;8}TIy*^;eKjz=A~13ZkFA4Pv1Q5H;SY?y-$&V5#8oohul#Fz|$PPFA`JU+sC& z+5-85A9a$9p@f+{4ASDQhm4#(So{1P>JmM7qZ9_Tu*vTnNmqU-wpk(|ll=^q*ZB2t3ObW<)74r`#B0C7wlzV@dI9>U zD$%J<;u6KcGIAJZ?B?KPa{FxPDKEqol{)1da3oT=7a<%+d znUj^qCb$FX@>M>`ek_f?qbz-=OIml!09j9=zx?Uv;sMKejeHrnlQ-0j$p+2t=FH;` zEtW!kKwxDs<=*{p@4jB(PKA?V|B+MDaSyy&1)I|)~od9 z;U2h4CJ9{S;4#eej=Q^qTL3}H%>m?$MV zr>$&JE$*<*k1TjPOR7ZQHSN`O;az}HLBR2(#23b#Op0%&yIbum8VD4tXV~+#AsT3ZWyqg;*UqWmVuM4AeP(A1Bol>@uvZN1xSnyU|M~Zm;V8`GqQJJ_+b& z4X4U;LHtzSqq0?&Fn?R}SR)XaSX>N<02%^)$eg7<_7tseNCF|sv@^#-WXEKR}lqw-^rD9 zR5VLUomVMi!-Jn35fymD>P@VHU#^X+Jjcm~8zXJ=j^~e5kuN|ARd23o-_#egc;Ka% zEw$iJ6=EqP0C2qHUu9)TLa&!LV| zzM83OaC&>TUe@iWmsyS?&ns8~0-Yuu-}C>lkv5x(J5b2v7Kmr$Rlw^AZxg`LHmP2+ zL`x@txLIBHw|VW;aUqHT36mSDDnfVNpz)jLfF^A6M{TXm(fk;J z0O-0}Aqb7NKdt;mFJ}eUO8E31^N&B&0%Fa!oUX*nkNv7cm{rGO(|_oajfIgj`=MS+ zpqG!f;ixP?YvJ{3^UUPsO7wj;67IrtKLK(8Jl$!I5Vth}>_`zi@>BqLWuR9Uv* z$s5m*S6!cDt{vcZ$pg!X{GjDUXtkHm^%;S~%{v_1VcQCUwd8{8Y7|c=H->~DdJcg$ zY6G|IqB5n;hvNB3HG!xGrmiFq`lTMW=stuGBr#Z3JuWkz`|d?J8bdy)2w;Cw!=G1= zyq*hXDKjOsaKIj0GfP0tn>R~PMAAmpBP)vkbJOt3u-{!8We)GIlnvLt)Vz;=&DHA9 zEj()BRq^SjA>NIP0f%9#7nEeRqUzV>GdEbY9=G;j^qWf{d}-vA^WGK}8p#|FOX30+ zwwn&}j+g8Ij38Qdyj<}!wfGfz;3Ph8MDh;J2s>M5pcR9W%LKwC_Ki?>q@Bv^apm#U zch!e|SvOSY1Bi5?mwazL=Jf4YJ_ zb6w&p-FA?I%{7x1(eR@g#) zFJ}B5@_%{d*^TP3b{P~~&}Uzn$`~k3^1)lC%{t;{uFZ`7y2wL z>+y6e2~sHEPf(R_M z$W{wIw7l-JFn=BpP+ol7JcrkM+lI`hQ0P82IKuT}B@!p~u8+;;n~uQqJ&BwEKk$o5 z`&zsJP9LQFhFd#=lMP7bCO&f{cLj0F(G9Y2-+Nr&B^bD2tncDl>JP;U9o6~(VIpH3 zpzMHLG)0`r+#d6rnM7;KKKjf2L)Y2aMy_RBNK-d``IT?YzECsd@HTBz+qzwwX*Fit z-Of04Tlhh5=>1T=Jxq{$pzZyT4D{xVZA6=O#$O$d1maSfwRFn`E?eB1Bct5)*(0Hl z7So^b?2!lT7xb{YIcPGNs^&ILR9vT8P$}qZHE9{!GHIqNr^l^{a==)&V2y8&YfnB^2=tnq?=4(HaaS;i<}#(5@$5;Ak3A9|KP}K3fpg> zqGl-Tz{Hxq!7BpGcSxRiJ>DrfiYGDQph$pZe(Vm2C5ucu211SQ;EOXV%ypr>Um%{u zDJ`kX5=EFdeO*&`yb~hWM)@|Qqwc-vPDGL&47CB7y?o4_rk{ureas4`5YgAEob z1A6cs#fvqf`=qGu-Fl56L6SzY2Pi72hf^9}%le3+BL_@*tnYA;s@$!yi20UL7^Xgt z-xZ9?oxH>rupjy+lFJ!G6!lVLBfsvH`+NK-;;m)9X4ZUTY1U}9^!d((VXi-!u?11| zo7xP`)j9Wj$@-oDQ<>n@2Wm6_XS$^wwETOYA9{dYKEC(hRewJye#navQ%oBJ>^sm= zrZ%fJvK{m-J~+5cvf(%CZte%#5ZqPQPuKS5Iuqv^mfN6QxjbAa~AL`2v9=q!iNP+n@L!9GJ@ z&_{I?QtAkIPRLs8yv%3CpV5OZ07WM%l05`Jda}cTQ9aa9A zRE9Bu(*k{UaF^K?*AIiSDDjrJ=q1!#o&{Vvf z4NS|~acMp3G&E6jX0Q70IUQZ|!h}g@{OzyQY=h7sn?gOPmJGQH z{z#1OTB*H z+n~W&``;oDR*|=0osQ*u_5p2H-!?&u0M>|{i-`^ySp=+BnYm`}aa5KjPDUkdSjvhQ zG^T4bk#k6J8iPd`ZC>ZUGR2^3dJ%HT0AounAD*Z>nBYR^utLm;yfkJbQgmIv?2PTC z-M%ktU)hYxC*TM@)=A@KrjqQqXs&zez<2bv6iK{kz&` z^ZDLuj%U0fo7@~FTSm4bJU)p+V3;1O4#STse&W81@W3MWa5xdxWIN1Q)_nBBZ*Y3q zzpJ=;*#lC2nPqoc>ojY;bdEy@9uEuk{Zuhtj;<6Cf1!TeWv{H|F)W{{gIT0ys&_MS zWe5jkcWkv zfd7?|H;OZqxFpgS95tekruq!eAk|c@(Tc)TY3@~%pF!Y!<^EV9cdxW?YM&u(0q1T@ zuq=+#|Eq1sPP!Fm+%xS?e!NnT7`52LHHyyd<<@9%xsKXqd%qV<)~%5Od=S@!#{Zfo z6t{e!fn(kKEik=K`~7RIrY(j9;%wD$a4IehdC7qf|0g?Qq1#FlJz#0duj{m8oA_KZ zOw{4Nl8{u`=qc5GcBc5=*Wt0YnPgz{Z+gRJ-K{xJwh^ivr&hz>8y+><+tgR+kwvsX za7#xb#OTo66;c`X(lp^oj3Ak z|3mm7!;$B|#edMe^?Cio|80bW)$ch?y6%IX{OLnT6FT6p?TvGEeUwI3FD!} zapU!2JdVBP%C9!vVIp^(QjsewIP0e7%);#lr-`mtQ65@5D=VA~h`SNjf;gO8 zfj@%b+XfI)kGzHV;DzhaVc|r};wYf`2Khava@}Ti%Z+ZPr*mbu$VHkYz{#8iG}<3i zbqcB%ERhDZNJdJC2EOGhRH)NqRw!lH?aZFCDxsuE3>eZ9IW&u^Ua(ivP7xF4A@NpU=L zs<0bo$i}Ua5cy*g76K$aI;GI{c{XCIH=JGoK&9C|&w~xKaFc`$e!8#Tbo;XBcrI}8 zE8rakm$Sn=zF9C?d9-ez!CHk2t0Ciwx(1#zv<(H?=pgR@1kspP&vI8=@kK)rspLXY zEWG5F1DxDirZvK8OI=pMSw-8uyFo9DeBA(IE|0e*+O_+wCxx5@Jk#M~VZa$G(?Sh2 zM*?XUj5fHh?S$8{^W?fq@G+6kSiq{MT<40-pPwYXiV3~_@e{5&J7mG^z+}K8Bcei* z>jnUZAHEy-$&d?|2$3kES^C`g?fakMmsmQU)l>tkQ+3dlgb4aD*Vv7pE3;J$AjZ!&Ih)jtFgiec`HiB9b^M{()&@0z~e8qLM z_QT>kQWs`Ku8(vRC=lvGps8a?>9Dd&lYMs}FzSu>+~ln?1#R-Rh*8yV&)}VmPXqI} z##Ho}9%c^i4&x|K7EtV#O-OblVW~QN^sTWrg^4nSUOFYPK5xHm)f(5R)L`d4uj$B5z z!11cS;beK&5DL(<^65V?`d9xih2@fL2!aCB$Ph4KrkP@4`IjWZDja#)Yqx({8#s^~ zmLm_=`AQrePh}o~7SRYt2t=+!KLs;{I8hJ|?{uZ{R|$$VdRW|Zd*oYKV^iKtQ7L`R zD}lcK4Vu6(;XY zZ3yL=nL;^{tj03znsF?jd#)125l5^5uv=RDFsDx5NhC{1y$G>$D_fLOv zM%8Au0Of$o%u{4b5>>DR<@<^`RK>ldy3FBpdgV{I9Zvavd<}5LSJ*eYlnjBg3+h&8 z4WKk>#Lxe>o9`U=@V`4#eA|yueBCeZZ&bP5^|<2oUPFE2WSUQ%m zLYHG(IF}H%h>BtC4`+n+wn!+ul3FbVMa25X14CeR{!v4<6168Ki}znEukhOg6w&B@ z^a<$6KJQcV?yzKL5Dg`<)DbTBBQXqdk_QVS zhSCyT-f^4FvBVxbOB_|;mKLIW)VFd-$+hAh&66-4O61E`a$i%nghx-t*|SApC$x>M zhlSxCEJl%~^1ymj+zWiVtE#~yTMC7S0cJggI{&PcIqa99?@p3pRA`fw$P68egAtic zZ)cV7KF51}hFmTiy=kG;<+9>n<&dPNj+0gW=O)HyI&*ltAaMbVPv;70uqF%!>7SG~ zhaC&s2!Weba2z|k4U)<>upxKYeqe~bp~Oo?ZE+|!!0 zl+QHSVJS?u1!G8y2f@^d={8g6N1!^>itB;fXC(8Q56x@e)~+VU^qP0Sd4o*XY`mC0 z9|_x-NL|o7-nay%LCmN}MQH_zMmhcP$vFRY6vkH%%ioaU^Egvj{R`XoFk8e;;)AN^ zmG=^sd(D$-b3?0WRfY}a{F>ZN5ePqzaAdnkKQrd}AWhRtE{-;yJ_K9v522x>$1?X}~F?u*p-=gX-gy>k1UC-lkFX=n=YcGu*XxDc|A1~?Wf(>eZ`#FvfkIIaG@ zukz(vlOIxDNf@9q^j{2@v{(Ht?v(-i!NNiR0)i64JXBc2m!lPEl@hbhm$X|RZKsDk zQVxrq`EZ~$?KHsujm6{Z#@hW_H5QfoM2a<(MaVE{$+$tR-ZMTh`VQ59UG04>Zo7lV zyK;RXh>jT0xoy)Pi$0G5ZHzE{ZFnxd+(ShFj1)w&Z*&fAtusuqtObREs@e=_im|=w z+qu$fzds?!>k(_!nSJK5M)}VYZxsV~%u^WOrX$fJ|3Y)~;Lo^}-@SKn+sQWRdmkGX z7S-iX_a(KD{ZKOcqj@lQfdUrn+ROr(xeqUu@6Y&@k9+lK6KyXnL(Z9UlHbKgY5T&A zc?=Jw^Y`MBlE7v*tRfPk>STSG)rY_k1*#(zYcmC^#g(h zd{U~}#iVA>Fjfm}KSm(7P3oN!@H8n&`7DBKH!#eWPW4z>f|WL&tJ{0?}AZ zZPX;{?qleV0-+?i5)><#&%9O0HD#RT_#q=h1-JLU0WaOhKfbS@M+M+xcH=YA!?4CH z{LJY2Axr|1jx29`SB-7pys{6b`HYaMp_qUb1g^Ae2S>ruh8*)dG41 zU8TY40+(R5rd8bgu3_Kqc~JfJ%<} zf8=eK$p&PYO89o3m%p#8k)OUlMQ=Vm2IPKn+%8wDf~i@HuX{)d!`w`_^z|rU*b1F! z1GE1S2}Q;HW+{XCIRem;S2*Ez@nz>9W@9X2?{`DBBHovg#K=8Re87A@VxV5>*Kd63 zJt^z=AC1UHjP@gYy&n)K`pEqz*PqsVFuMHU>Yb#|JrDyCHBe#DekLJ<4~tx_Z#zyb z$vQ3o9R8~ZoyzBK^rY+-CYa-Ug={e|%&kns2EQIAR-23XoCu#l4`+Jmy%#5h^ad9i zdV#E5pV2K%mvQOsU;zS7>E9zyDcwT?f2e+%SgnuM@ z=|KH|M+Q?jz8njbBazm_6*758Y-HKOs%!1;Hy3ZD?5%H#d0GFxht7UdYME|Ch+t); zvrqqmD`dX{*85y`{59H;*m`xE3l;-X>7lc0x0EsHzwnqjfK%+K!2r?=^Zz4dft~5L zH13`*fUk=PXmwcrqt6>_hoZ_bpKH_GaonmUj#n;*H^{FYpDqy{-|pi+kEgpSu{7Z| zSm&|Y%bG3yB%k)uVdgXXL(HA?cib!WSnYQ6zks$2o}ph~U|GG>6ReEOK#Do>)e*eu z^UzWafjwKgPgG!|;MO z#pG30g%gCc!sL_tsSKm)bmD#xW+4a3oN6AZV zWUwPC3FrXmJDQJ*g{S|wR+F^iC7J>&wVy`%54~|#Zk*6rk1wMY5dK)PHV;bKV-p!c zm2U!Ex~3JQzEx=>9>1WU@Qcv<%z^?r{MJzw9FTWqwnNoB`ujleiI3Xln>0~e8!fjj zoqO*g+qTJq4~tvf?&wtif)H?&zm@6No?cmd*KWPno%egngO_E|u7fe1fUQ%NkqFk8 zT_Wy}^=i@>Io7qTZ~b+eC1_whVo&#R{4HJ4-a+g$MMB>(mwQ7<4@^Tr^Q;sXO|P~^T-{M_ttZtU@)XM;5gLX)lCe8W&yQ}Y78ATwobVi zswftpQdud%Q>`X1vsNd+u4D<>I?li)3mMlqpbD%FBO)RB9i+)f1C9s^67+CRTuNfH z{%vN*f;Pw`Lo8~IhCi3bgnBBq2?LtlfYd}A1df&$K&IIf>W}1?+jE|Cl{CQpvab1- ziUsGjA3o*| zLpAIwibn)eJo=p5ZomAn9pYnr*OTQ4qK%l|=>Yd~_tywn^l`OVGTRuBM44{o3agNC znR%q3cQ!!2QNwd(-6Z7`q~b^;X*&VC-4csqf8|$ww=*P=EVER_IG+7!*vmv*tx;lw zf(zn9+gnF)+OumnzjlGQJAYyRpu;takNiK@(9i|5W~RddbQViw?;YA-H$}ePxlulP zo=gw1Sw_4G*;-Hipv4)!l8gE)|8at%{i_ZM2?h?zw}dv&t44G|dgi(~$c`4Uif!lFPkOyjVdg1gZP`dw9ye(U?VCi=W9 z8$u{G)T28br7vsSJY`C%$fCmX8+tmU5G=o7lOY^*vgQICodS&`zngpl79xKo?B_Qw z;bQVvoTX!>dslYF%$AjDhJ2LKqY%kv_4{Oa>3k8L74ci>A#0;Fz)27_C@Oaj(+M&2 zpNOJ9V(H~>iILl#87vCfZRl|LJ`;8g@g!TcA>q!T6hK@g%!#@xgwPDj(P~kwzpmHE znFHu|R==GicbMRa$0Q-M>5=DTaSD4CSO^n6*{wVX_yq}2mdfr9m zaYhNf#jJv7>_)^w7wY6}YSwaPwrLR^A!R8Uu2-d>(ez(DgOv@lhMNRZ`|f3)hWe}x zw7{nRBp}*U1^c<-toIPi6?r|)w+RnPI;Gg4^_j6fS%thT4K_OzN zGYz@MkUemy9fNdjJ_)$HJU6+S zsBK1@@R_G%RL&aGZ%BVUPZlhEwf>-2fWD$~i62L3 zhR z`4K}?7k`4S&TPAD)Y13VgV5ONmYcA12Rg?n{L~y)ppME{YQcE#1P8reEkyE0iXr%) zmf#Wn+je>NEh>tD;BgXqD|&%A`Ot(0-MK4z9Tkuvp^d>r0M=g-WBFdqISkbrBS5fn zGwYu3Wj(Cm3Z@HWc-jkVlQH*J-X6wWc{0s|P8$2%NpV7OHq4GX${?`OVn1FW_;!ZJ z@n~RJrxI|xR0)Cr;NGdz^|!gq^*I0cwrFS%hjLQCc{eT*b9^Tp zJ%e0fc_Q1(i|rr|dog^}$7_RQ$fem28J>Nnr7}p`6tQkR?EzXN*kM%C|A3y!wHs5K z<3ay}9TS8gH{;3;gZbxJBi<3RNp~8vWkK`VP`-CiedhjftK@?}SKX5i7OgvfyfHJf z6QY0_RJq7e5@cc=<_>9L*nVqYx{KcRZ9Wfi>-gU-lUj`#H1fz(2eC$o5g?kBXaCWZ zL<=qeg+{;-ll|0)f6Q<-?q9D1sP(0=#)cJ3(>>1dIa9!yv?!7gpz4X+zGTS;&99jj zOYFzW@8~9vT|70U7zuz|zh9)(8%m$SHIpnqO&xesz7Oum31yH|TF7y3@D3KnQ^iBK zPKe2BAe0=sAc55oOeX{0J52sNX^k`NI_$MGIe^#Ve;}-7Kqu8@{6+JFoNEj`!}*#V zQ`XU3J&{{3~bb-MAIP;f~-{mAg|b1r%x> zkb)SXQ1g6RHaJb!B!xD_{Lj8lCubO<&kxEG6VK}_(HpPTaRSQ9E}q;dSlXsH7JW1M zK_wkb0rn^(vJ^F6O=Z%8$`=vbP`H{khUz(D#@j1*=h*Xv45)`2z#*ch#spkVUqLLj zGqgG_DKqq>zY*qg`nvI78~ggN!+F>5`+~;rg$<52TJXZOS^PWkGsaZ5P!awo%nodt zaXQDEAz9&XE+>09zg^Z}<7yrjdh8W9pL0~l1@3-c_og?7p;Eigw55$L7P=^a*hGLN zgcklR&0H}5Yg&+=08`Op7@J6+m|f;RAzqVn_vUbkri3YI<(pk|{jf8nz=Ka@KSx39 zGbo1kaFV|6s0}W=2vWYh5X!9N`jXKD5N+!IY(wyW!oew*K?TW?EGH@JxFe?O9Vc$* zw7KF(>VH>1ndAM~ChGYTUF&62UJg=;hZzEn$bS2yc823REyIbrV0_`F!}T2;3;=ef zij|bd3W0$1bd{@f96#X*`@o~r8rn#1eic^=DWB{NnS~y7;{A za9efUnL7%<&Qp3?A?xv{C-pm(xqx#dFEX+aCS!QK3-658q%`k`Ct-%0*M6)?FaN{o zFejz_MP|2~SRVa~Jz2K_X2@eEwrNEYO9$+bT?Rj=b$%Lf+VgU7`*Ld3MZEg^Dxn_U zuBiZ8A&5y#3BH8akDUn?Ye5J^^e&Jl5%o7FfVSe^kn%i4E^bZ!2J9c)cN~l6b_!x1 z|2HSg;Y|Al|EoR;?<(fEj~$79**2@7l;UBr0n9!Sf=J&@gOX<&h&DuUClgPvpb8Hs zLMNnDnxSG-%jvbeQq?_27eW^tc?((UrH^I=8>&Oek|$z`%pG!kI=pC-ZSuK|vaZ4J z=)$l1i10ZSD!LyuGuTn#Xg0$YY0rXd5u)DvcI;21?{D3`Xf>Ve6kIVf;q( z9`102|NSPzbM-?p4oPO64^<+dC?#}M53`8- zZruerh>GPCLW`{VGPpLTkJOS#b;I?yvG2{NQ#M_Cziv7rf=@+(6)~M+-2z?gv2H=fj<=}pu0Q%CO^?5@{llVg^(Gk! z^m1T_{ppUniY7yJ7XJNQ@3_X_bpQD4c6vkQBj!6!G`=Vu@^!Ts1|u|7FOo;lyK$l> zhAYzvZ?#*8P74L>?i{pVCU(8wMjYh4&4^-Xes7hG@KSWGz`3Wf8rspONBWk~oxny7 zwjTNMWQk@M;)inMwdxWa=e@8%zX2C_cX zv>#P(3haSB9E^RJ+l&RRrk4rB>I)eUkQ+m5SzOB}DXw$LYnY(@_S8bdJ|~$Y%{=tA zj2nzA&`TAYePKI2G1IK3WHf=T7HFzRNgSrEfr_{<1=HL0mR7z`C}vC0n`ti>?24#9 z`(>}?S3*H`+!|l=SxpvuhRH&W3L?j#ymh|JB*s-R6m<9twHKbej^I~X%FVNjw%Ov2$r^ST zj)nS>=*7$So@lF`>*5tYQ@#G>hYrC1Sf>AvWrQ|DBkW@@$Gs$eF|L2hYP)V7yF6Ba z0S(7hivcfarXN52zL}PdIJLf%wf$wfhBd0fPe(7~mPc;upj@zh&mc|&xx0z7<3{-bBRYX_m;+v_dg^06b z|J}+>S!%Iqm+C`m@h9o=f9xWJA+YB99$tm3pp81MTF+xWzV^KI&UznbH|cd9(CN1w zUE{w#=Eca0-aTx7pgmoQvFyN5?>!(Ho$$LNcdU*Z{MVz%lGoVg<|9dEU0$ zA6ZEycfuc ziTj#Yt+$;8SmLLjJ2{+wkEiJjG5<&#y5w-8tN5Upx>LXxM4clV^2pa3q9N7=YP4nu z@3{h*E?V(_$)Lk|c3E;I2%a*0dcFhtR@CMF!zTTI=RRjmSx9`M7hnD8jH!o1Qmkd& z0|8S%aiE+6NAlDZ0>dpH@}m;BLv1HZWVIiLR(2-3jvooTp0nO(=7g@(J=5cYm=bw@ zd8Eot6cNgmM)icG!PTHw>&bZPZWmKge!n{pMAhNc7_~VepSb_@X>eCwJN@EnyIEgB3O55Ck^R6HhzJ_7hcoa913U^S}x zt$y_VrAYMYFXa5!Shf#KRyGSDvJJyfUNb?@k7t1@Bd<(}U;*G2j?^>90G*e^qqciU zqEA|vNCrZ2n(#bEn6}NRA|v~{VY$=9q=S`<;dZpbcK7R7XOl&{8%5Q?7bhymUyz$> zv3!|-Dpc_uYLoQ-vP@-07H;?L<#qgZRB6Al*U9!Cc;4XISxTCS)-1wR5&2IZv)-f? zi@)%?Mgs)gwMWr`@N3k>KN8=ha9x1w#;ivflvMYuVAWEc(MU<=UTaj4)hQdo!c5EFLAmV{SRZEE>ic{U#5E;<=42+7aYpQ z7I=1U_COj2tEhDh%M7MC8@8*+qs@bR(|R?oUZq375U1T1KY*%n`_XuL%XPvbMuK@~ z2CpZe`3+%%O85^xIA~fzx{vo;mv4T{(vBT41c0gJe=K5&`fZUAk{c&I`Di^55OG(# zc|h5$#kKW$5S=${;#)8 zUY-R(3Oqr=`j@NHA^6?+)(R+4tx1vQTWhA~kj^{uYcT7Miv6z%X zR1k}L+2cc{_nEsCtcN!YD*0FHot55|*W-cB^#?Nm(zDGcJ6_fhIXd_0d$3LCFz7Vv zq41Kg^rO|TG*5f)g<3q?q-b&@G&^j>QkSj^6!Jwx)+>lFv%Yd4O!WmhB$xMN!B=%~VoP6z5N# zFA2{^BRfla0kKdNIgmJ1yutlZkIi5(l@|rcn?{!XX9SaC3UcSe2`zb(h{)V@*M6+v z=(>Fy%euWF)NF(>VQ9VVx=kx)6w@OGm4N@TU9UfJPa_~CcB{~1{bq((mfVNHv4BRf z{lnR`feY6?SvVDaG%Z#k3SCH9Rea&e-ybuh8pN$X8+4ogvVuz9p72AGqd)pTa-nsj z1bmyV`}o!gK2M#f3mDIN_xIeJTx{J5F=wjRjm(eAHJ7f^ZkHz7LgitDDjHnax5A>M zLrvp$&*_2M4nz;Un>(EzEml&+go4lCk8XfT4ss)p<-F$IJ9 zXKpa`*9{xzkQq_!mrmHAUkVo1X1I91CYBPdhaWDRd1kg>c#cIaa zAlNNvA~jP17UcW5Vg$oI4#>KRCh$WoxOaW1xvv zE+al~%w?dE@kM@&3J#mise#UmfKXueFI`t!cn)?vC4a?I<_<mDb9;aUklIu5Lxq8U?=Zh%S zB}yXQjiecuZA`jSXtG3DS}vUSmg{j6`i)biXMsp^fd ziPa9)$}f9YLAVwCLJbc~GH)_K?Qs)B`wYou%fkk5(bH2AC2*!@OxmISxVXiBC7hXy z6)y4!Qb`9!GXMc4?v2oxibCVyVGlPu!f~Es3w_(SYw``ntqrAxpNKVB}-91Q9b_ zfxKtD(4oyl5AAW%ry5j{`^NS(w8it$%)MgUi@z@1^6**0n+?}s3y!NJPs}fwpvm&0 z$6nttL3+k16TA;0XOkQLUJQ<>7THQKY>6p4EACR8_TgsyTdUsbJHEYBTgyZXjvq2c zru>W#_%-@aE9F$|X%c@3LiTJTwQ<@a1r&fR;d;Uc$`>iLx@H_)?#Zbm32ld-_7l=K z-rEcKRX7WHY9L2?*ckN>b_AKt4p=r6uH<3|wILA@IyjJrqd9V$w|YG@>Z-V1!0gA# z%fDSqS$-Jh0~s@=UB4B%#_EmG5d*Nfm#;+fMpg0P1vZ-F=i0^%d;D98i#~pFej`m) zd&>Hdx4(fs%DQu7vToMp0wEs7j}4Uj&VGkI(FOxyhSY@%lO1xIa8*LL+ECSaOz1J3 zc8c(;@N9JpqKKNVdX@<|0+F01?C|*W@_dF$^Gn~rfSXrJsuZ;y@C9p{xc+<6yAH4+hHz#noh$7-P@6oQgg;boPH-0sP4 zzX>w3J=J+$c;$)8RlYBBB_KAy=5E+3eZ%$@^qRR~nOkK@@JhaA4a-qY6JgkIyV_m| z8*~yeW+Qa5t)_CZAc0mgWHKdO{E`}Y-4sPFN`cnYB?BHi9plHW6pua=yZ!I9t_+ak z)Lzbs#jr)S>T!30Vf<(XQ9qw_t({_{O|(vD=EiuxXB}yO;`9^o{A9%bxTZ$+oOLcB zYI%Xj;)af{Yj5Xe&)K_AP>XZ-xCF{5jJZ=z*LQuN7MN#UHJ#y7PV5&xyS?h`Dn)p@ zT9CdA6AGHS=UIz-G|f7%WpTF1MlA9dtkki9Iu&59ng>EB4!Xghe@&!6MQEzm^1^ow zWP-QraItDyrG{&KqH1iEyj_PWd&yQ!^X3n6m-_}7mqXuOd{m5?m&$JbrU-A58=t@} z_uk&@5C1d!ZtxA2(ziK6E0FLv6Fd`*@(bC2ebO_e{4=uu_1*o-LSxhqC!xliR}Tck zFb-0ptzWA3*g4*49G>yVB1$;f!u->6wHwx@Rpd4xmZY*gZMQdC`mjm~f*m!%y!Siz zS?eGF7L_%N9#-d`)Ub-6iI}FkX9!P+ji|A8E5hlW8v8}dy%ix1uBa{@Pw z&sR{iL9mZ3?oxB1J(lRtHX;<`c-}=8w|8qVCg@s+nRxWIn5`N`r&*Ug4G(~sw!V+lryJV; z<<%k=VN4i5UrXIhu4;nS{q>8=Lgq+dwyvC66vyseoOat5-x>E81+@``Zd8-376O43 z9Z>yV3ZEP9NT_u&!_eP-12S6|GEDE*W>Dl@HY!Og?VHEnP;#WXH|Zs(gfRONq>duE zsbtMJh7fnqH@mjHb>`Uh#149z##uLm!yg4C&uilkJi`xsp8)rPJhj%#3)y`qSgvrj z@xabI$A9T$;w>(zQjQmcX-%ekJW2xz3*1;pJTlqtg{YMEiOBa9FNYxWYvjJ|?j+^; zNG*>Q*cl^)$1z>3(`9Wyu!l-@pCR={bfhM;7+`w{FahAly$1t%fj`8B{#-y;AdP6s zhj={upTD5$%1S>7x75mU8lmTRXN2g9yLds+Prv-A$|A(Ddd<{tx7Uy!uPm$yNPsJR zNfL!F*6Pew2U6%iQGYVasRRmR6=C0EhX{Ychzg`_MJ$0n`)sw}N9Fd76!q%BIeH#F z4@`qw^U`DZ!-vd+M#bDDl5&}f!JY4iqPyvh29;)l$C7G@JJcp=T{|nKZ48-L{+c=Z zDz>CL_i@>jSofE@(l?ws^1d9i+QE$Y+>}nu8YlB^e5Khz@-O+ncgLY@{~03J-I`7h zwX?qCvw^R{iE|lO+-MhjEdc5*GqKE-)C<3V4%NrKeSL@KnOb+_@r%bC(hBV|LfZN^`VLG&352z`NUS1XeSQMZ3vz$8|;{CYM)#NjUI76JEf zq>JZ%)f?*yx?i-A@yV7xA|3>lIsdy)2P;fJ|89vVPqmhqg_ojwqb)%xbpg9Btkrl! zEEL5aA<`KmQtGsjpz4;~ZZ}k2F!<9vXK*p;SWT-Tl}Z4ydvPc?tRt9liNWXP)wSX4 zJft7Eghz0<7ANCd(-ZUdTeBacn16!<<)#`6E4*jDgM0&ZsF=L3E>)Ru(X6lt}7@|087FZGR`Sa2squ%wZ!9oj%)|LetU9VHhB2xu06=~Yt!lTW-4(O zVIEUnO`Gx;5Vu~2Hl_TYqK+0zS-9upQaAVca`Qp~)jW+I!nS&{R@_pRMVFuMLc-Q- z01~k20Kr;OG_q5-xw4FV*om&ma|$@SiB}ntG%|a^q$r2*NdFJ)XNVgVKyMT&FvLYNz92* zYf^)5`vU%zw>j&{8Z%XA0zgE4`nBK@y%(9Dww7zR{4q*fH_K1ViDGZ)E!anRvuS1r zE_Ye?r^$_draAH^9cqMm_)Pe#nu1IZo?r6(h{@hf%#W0TQD&=fP$kjD!Sl?sDmXH$ z=|1V4KQ53gnp@GMboP*xt0YYsKtEYUWEy0Ga{L`JrIFdBh=P+!t>ju6A^3 zhx5htFK9N^j2@e6uq?NV=yR@;&D}G}K*QqhuK50y2In`bK}>bt_daZF4b42$LW(%* z+EmA>wg^x$Q>w(rrN;2FQwR@Mbu}=?QbByZTn^hjg(UrCYI`F{Ful_T$0NJ6+thZEb$^A zvuK4RH|V+Qmxx3};TilKBkyuZ143&8vrbaDQ9HTL1vyqC7)E-%oK1v`7=`rCFR=bF z$%vAAFbA0k+Yzi`$w-Siw zIoiW^Ye&*ajh&*o@xyC%W;g`R+>56WnRXfWxsgn(2vWJ-r! z8U9M{I@8af{$JG6d(EjqgkU$IgbySkyMH?ytLMFJy2DK6MCYgWuv=&!h_hO0OGHI8 zZ%Vy%h*p>yJ31I_Qa_^-DpxUeO2xF7CwvdJju*ok>zcesn5PGt1*9O|;vnIJqx;T! z`k?9}1`)PNrI#0Qu6KPK4A-(>`F$&|P*^i$H9w%5>jRWcc$dvF#0xTRHIzHxJljN= z%063Hy}bDx8vd~4NY|*Q z>8QwPj%fMSQzD_4OLx=cQ<+rGh)TXTSSv^t_TNIGIhm9_ngC zT2jcc9tTmlrQE*Z{AV;p)p9`}3;8TIw&whP$YkhN_X zEeguMAbw@MY@tSqqTI29hI(4Z{^Raqa@5fI5-mZf!Gqe+(Ew~-dy(0^w)>%+XB`EZ zn@nUur5WBXXOy1hov3#>o0>*1 z&q{BC*~QPH$KI7mthGW&Vk{K9RFE*oTN`6iyO~AQ{R;FHoI?)UxJ`3i#^)%7kEi8W zbv`fftK>v|>S5WPp$d#*s|auapBhnbi3Lz%6T3u#W6PKjn$sXy%V33N?~b6_XipSG zqmChl@+QF29Kh&4x-P;w6?MP8AyEc)gh8MPv^P?$pWIe^4{spKUb@j^_=#R3A(p9! z!0L5z=EGX`0M^C zEM5tcnM+1b?HD%tO5_$LyEUc+ZO+I)@i7YZeBw^34#goAoeC1#GU%}DIA|$(vkDBz z05BjA;l)RdDx^~x9BS=dNlP>nqZq+#*e9Cz3&XQ}ANw@7*Lt?DvIa4+ZrP0h)9};% z%1}!UC-MCK{R-p@4BD_30kNt81c#1`Ol2HY7j@nC1Uo&LEFJQuTl!wo+6DPsJKt?g?7USWgs$vmrTe67REO_W0h6zWi53qL3v{@Pi8=T9)5UrJ4x#2nvoDfY=_o7g`L-W9m|YZt!RisWLjmtcHCnAAPaAo~ z=P~y8c;CUbpBQ0H!6FxJl%S!s1$iR^^oy(%71F*G1ua}Yo5X)IGw}p7_>lF;KjFB*;nH!~+RYgokbVC>2yma@_~4I9LO{$s%Sec-dqAFc z!Us@GrgIy<6{lw{XF?O|;4aDQZuimi9z+NDg!$k@NJRy)Zikv^=v|9t?5(ukpdS{ym5Qpo@P*_UhtL4i*T{VIUzSj+uA`bO=mZ4v4L2{BI`R&K4s19=B^z2v>sLvIVN;S|C?WY_4W);CS zVsTYCd^WLE#gPL{;I}^pe#dJjX2tTzt>kE7P8j(rWz82v(*34hR->2(@!IYqni8r$>GQ@~|{Y7;jzImrM^;zW0I6%2Gk)!i6n( z&Xo;{f&xw2pZT;jn@3ol1o(2JW#S+Aw0-9N@0-!I?LAyeO%1#KeF8FlOcS)JO4>_a z&$h-S=?$-`UCjWwNOTTHDr(zqiyRAE$?yx4V0`Ms{V^W%M#uXd4V1ba+?LtLd!73R zrWdD*RKPZ8g8n$8x{SSmKoiRU{t}}0a^OV7nRvbXrQ{?hGB~sl3x;xVK*F?FRU^(N zl}(&hhoe>FrQ(%>1XaF}aopsT-{&c^DX}EXJN1{^#XEuqUk7G=@Ebbn|@%DXd##nMa|JFTWmIReS}X@Cp_bD95ELy z;$wdOHIS&^6R$sct!h+^rtR2cDiYfbd?h<*o*)Oo$q}^0E1sq!qz=XGTI~8CKWKGI z@ir~5zTu+E6av-Nv?&CL*%wzji^XrgjLLp_dXjLtAOzUMD`UO#7>$R3t#m>5am9jq>%ACYpjC=`Yn&%V|7Q0qPXXx*N3+o>ficK*`F zy}5CErgJku+I0i^8_IotvfT2%aaSYI_T#J`-Hn_-YNo$n?=wkeNR`hj73!5z_j*8iq?)h>V4^?(ea%y2}v%Q zQRb1?IZkd~m&8`=S>#gExn59}9JOuZOqXTROzb}C-4>;)^WdL_IQ@?Wh7ZrTzg=0N zLrKpHOv)!Djjba=fwBL}T~o9XF>CT{##3lp@z~@p`s3l2H~D_DD5eRsq%6c4NJGh2 z<}YQSZ463J8Fcg`3fpM*y{UlCi=G?%dGu<=)>y% zn2h`N=g+6N?{x#Tp6ux8?w@^x7HQ!=lzw|O?sakU>8i~}996esarL1fp0yx`muZ+) zGf`vzv?EJ?)QlI?`ERBGmWm2-O)WMj{j%#1d1mq$o(+Lnc-$K*G$ZGz?*qx@3VFep z@wz>OQP*Oi-|5Xnt!PNGGTd%5Lt1l)+uwZ^%?8qVZ{j+5+R&MXlsLV;N!rfeTofhK zi$EW=1otwL16T!NSf8^RJFq2BaD6ra|C)ctdn!|}tnrWS36V>eB7Q~7+!lXmt2t0Q zUXfk~Zq|IjWDP$Kdj+S|Swn)6uM|Q18>%zdo@_UQvwNBnFzn|0L;fn7D4 zsf&kk)x>1DePY8u1hg;8+-NrkuBi=RPFLZ*nYLP9xpp}sBkRRq=VY6 z2N2uaK^5BiNHE|js)AKlNMY}7ETj63Y2Ti6fbzM$8e<{eI7PaZfFUKzl@OMYb%dGY zgh^bjZ-tGQ>*;d40A@n$R{&{f5&H;-M2acjZpJ1gfqF&#s+8jEcEViO_23y=>mlCM z``HRVXkggSd+-6nfhuzKE6{)f9i8_xf+9VWPnhay!m45PYPi+-p3_u+{R%f0YaNs; zSa4zgrCllCJFs6Q@f40}Pq!cKyZpo%yb1)$XXN+P$@Wj0D>(ak<<|!dJqGVd5=$pf zdCbUd!~w7@3D~(6Y6V&^M>~u;I%R#AwxB0}%jXFCfQt)dp54OlZ3k98cAUWq$Gwjge@lwVP-ftVvTQRMD z+|7yAM8&^6$m4;UKTM*3=44)Bjf`yMk4$oy%0`qH?t5_+1}{XVsG6Vab&nrPhFH(* z_7_HQrT}rVaN-|Kinj51-nLk?9v(P;rBScp2|~vTlU9=zGAjqyXfJ=Wq3s9K=T`n2 zk0;W6DWcExdArijE?+(nso)zC?{THz4_K>oAk7_jZxB!;%3l3xR7EgAUBP;^ zQsSMM^$8qtFd;c~JxOdlJ%Lb{4yVMVl;Q&|Q9@$<&9RzhXee*U>Sc)zZ&K*;ql@L$ zM(Fuh%^Ts6FN@$+yTkhzi$YLP9kN}=&%@qctUP$wRkj)g{}7my5rolSt-`RP#!|c@8tQ3qIdeEHxgPrFm+g_zyyZH8Ql3hd^4u=Hqz`eTZqq15 zPezt51kb!fV2=z` zK5RNV%>!7MG6h(2qh*(=1!ZjAdksxyj)iF2*)CIDy+dAadE~t>#WzaTAAb63MAS7J zPg9IbNhLi{ql|i3P9(9+w0bp_a2P9XbbW{>?Ps;H)7^dz?<;8F-u-^asbx2$Lk`P&Q2X=}mUuikKTRPkV?&;(*e-Edpta5~|>qKVr*HG6?MZBAHULYli}6 z0kb$YNn{1Fnhkc8O^nMHlclOzEpJ<-9Y7?v-9eTbzt>ofztykfb8(xuot(7%H|m+v z^8)F^i~o5BU-#$Y=+)>^%lmJ0_M_}@+Nfo`h^GznQ!+;O#2527URL&GKJ@~x+mr|r z&-OvEEh283jaVC*rg(Ps6%VHNbw@cNXI|YY1&Mj^vWfa}sF}_wF7oksf-y5PqTUdL zYOw2<1iuQ(()nV=C8r!=`6ZJYH{X^Y=ZV}Ocu$wC5%a;B#kQWdcR)+= zZ3~!>y?&&GKHJGDn!TLb0nT|KpAGC5?kq46BBx&KZ2e z&Aov*c|D(3X_DPrHRmi;w`(r!W_I-kT!Q@F9oFwyV$Nvqi$JRc^?{XfnTEJu-Xty} zX1YTrN@X6zGO7KDwp~lly?;ol8KoH95;eQX#z_@Z(?fAGO**1su(k^yk_4dDtLDE% zH4ES74<0Jt#-rL8KK{$vFd&o0lkUlWV`i(vRT0ZzJYrYn8&>#uj`Z(*+EIGFKgrSd-0^=W8U)g! zrRxgC3>$~h^i?5mEXA52xCo~*H;XzqpbV>+PDlGDz_8Qz#l z1h@zhBg8%gfrBQ$BuNj{@e4AH-4tE^eK`WLUMR10kWI@n+88P`i4aR$Q0;r!iEgko zKIZd(ho&9?RrT!h5ISuto08|}s;2*b+rsm=Tz#A3e>xKWco1~xe7tlw@;!{Jz;GZ3 z^ln?`2{b8x#^<`X8j7lv-9Kio>uqT?3+tP{Zkf8J6n*Hi(G}j65gMpUxEx()R^FdO zdbxuPPaE?0U{T|)E6@rOYX6(v`(%&JYwcGeXQk1MwLy35d zW#Kp`jBJEv+fv*<3Gv+aOuuDsY59yd0)R+n#WDLILn2~%j zo2zub;7})@UAS{lOVvtq7M~%SopW3(6UVpxp`A9K&^f zm4Axob*yBv<>DCG-RG%mvm>ak)xDd|pCN#zj|ng7b*VF;kq$Y9MbB@8TZu%-?-%iR zyZ(o~C`0W&tSSN7A8Dv`sRf3vsqO+u3Cp#8~mV*i%^a12V$q5wc z9k_Jx1uzE>D7^AiCx%z>gWk`M_Au9@Gex(rF&VMEir_l^GB3~LWZ<><_oJ)7mh|ln zx%p$Np27bihNZyv9h@b8tH<2L`rm1ZtTKCJaMeN((ik~?#21uYc;HkJ@<2&=+JKD^ z$4W6G22BWk?P`@a1gTng zsk?hZW3arr5?cpsl}tM%DSM)Sg4B@d%~quqgzVbIStMNU{ipctUoZ0uR0Pyz;~Wb7 zkLA5k_&&XH?wN$G8_rw6CB6#Gx)*qn`yf^?cew_p<={=cJ{mO*j#Y_pL~47f@)nQq z$xSoM5VC1P1;S+yO#LaJ8>}@T+ev_1LdTHS%$cYG*2B#m_SM>8n!t@dahP|3mup0) zI0i*IsQY2cIzn(N8cn=Oehem7aCKg7|Mc&&9Yj~LC7zA_Zj{nS)8C8s*@56B7+5pl z*PcS+vV=Ut)-C0ATDB#y)epi`49fwmW>2*Pp`HvZjqfnNBh99qkfNaJ?}o}5p?q~& zkSSWvn#jhkQ&W#Fi)EwEZjE4(#l)YSL$GYSe^RWNW>do~s@2bfxc5I~Mj2Nbq7u!P z%?WSn`@5jW0#Hm6PD~1#TTQ!_-jBd|7q1`oUdP2BuaJ?5@dnCR+jCo+-JW7Zg_jaM zE##|cGYB8wOWyvDJ;bK5QW_%kOIWen2`WX8b{g*$MV4A0w?ToF30K9?X=Rj2r4HiN zQZh+_qMXsd(g;LU(`5K4kI5~!qxOW{!;%Z{Qg({g2|ll*HH~6rh|^2usw`{b2`t63Mo|bYT{YV34Dg_wYrIKG(&fH#Ah@@)2QRhqHSMcPYVPXFL0$Ctl+uuF3tkwNk)}(^PJfY(r-DNBT)+2%@7e#~%ff4nD z6d@2zMvualAAp@y+L-ZLg@a)JwXU&+Tw-!;Ogp=nSU+iyKrR_>dtve;=a~bQiAvTh zg>DE@h5gs-&Z?BM%|woWpM`%~>qYv(#`B=KA5NQFo@?pXx7$SKM3T2p_z?`f9Xai) z_Imx`b5fcFLom`LVjSW9CHoUQLoDJ~l$pBgMuckE z#jj4`*NSd|my(P3f32$@58j<8Mynz0C*ZfXpTiJ6SX(`!`k1mCk_{BM^B+F96_h2m z-o@uhc=0fUo}wYj_J{K%0orIV!`_fMH3>Y7*%S1o*}yx$r=I;`4sgoA)Pk&94hd!I z0=vz0C`{EFmM|e82~_M7sDiyH7ClKfc!c=%b(oR$LDZN&T3?Is?50WZF=#5jd)WVO zus{3dWTBb-{RCGcnr7gWrRoa|bd|Jv{Od9GVc)?~I{&SR9M&c_>qCwPf2rvYIIot| zx(eWXs@g2av)ex)_|0EyTmm&s5>{3tR#OsYf)(B4rb3NTb|1sNu6K zye3c;Ec32MV|Z!PiLI67(sEDoUsDPrMmWM_Cz8R+1!beWU}ht{ke(9cmEm|C4%f7s zKTpDU)4a?26q~jb%;ZOPaE`n&kc%+3&n3i-K~}$3a!oQMYS7VHz_fo0~2h$pQoZ5pPnIpdWO!<00tYcdUhZBK@Q@Y zz%<>P4T;{V=rc#Nd;VhP%zYCDVL(|XsCgfID&%mddWss1QLDPkR7?+fTF*myLSqo~ z!~&`K-P5>Jn=AkW>2F@Jf+qY4Qh4*=_FD#A9$g8nH?nW|oK4g=lqD=Y?#(y;j=O(I zby~0o7frag570g{S~}`q#Bcwe1Y<9$!-2COgr29V@Anw8AlBwFtb&G}3ISR|3lnn% z*cC5*94_V3;O>as-KTjSqhfRYFmksil_HDeY*@q;PJNyI-9wDAK$|3VQaw!ltqe}$b zSV6L}oTEA~dfGbF{>+FXev$i>w6s)4qm&Kq{1#Ygf(EnFoOtg!T2F8)BnQc zW?X`Dh{)D>rqy9{-*xeJkIv9IL~)-8f@$RtsqGVV3TZ~-XZl z4h4`_%BpT)2*do`<7)t5|1A*n8k2wq8Q>}pO)_*V06Wqr22<&Cc9%TPh4i}viq`vG zsar%U3EB~Uhz`$($vBL^b!%2XcQ6)ZhDxA)Gq66s(Qi zbfklCfwKBgf^6y6W~tfZvhvCTW!z2lG&q@BamRdU0k0YBgM^-*hie+1dn;r&{rhyF z6;{(GMGSSTe<7S~97gz#6A?2V1wvl^yHsKNo)6qg?L=3bythVmv;^4*hg-j)jh<1=hpUl0x_Uc=x#v zEoDkV?s>Q_I+*}wN^m&LsyKtAi?jCqfM@&EXS`}&^j9yP!bTrH@~lQe_=!X95=S{3 z+G(h`X?1kzASLlF;Pq2Og-9h|6)Hp&{OT-&_uxfFM1-}FRRw|H$)F9MsdjbvSxUXt zah!q>7cLcD??~k*t`)JUdJct5hOHQ2W4nVC@cu|d#j002>EXs zWw$=9Y6(3YT)YdUB>An3*3dE`D1{96_;Cg$7_Vkq`a7-UQwn=n9 z`<-xn$1R@|Zh}H`R)Im2c8)4ag@4^YhwpTqSX{N(G zDP+R-UuMwXDnxs5p~AV_M)Q2$vv*J~p={G}HL z7dOQ?NJo=k!{;!C%fqZGhw3tXoJb(0z8bpCaE zIrrHv`H&VM4}DQ)jubviXq%JDClhaHuH~yNpUO%#rmo31ah@ukXc~P^82pQuuz(~l z;?=4w!an}g4$igP7+36%&-`;?q{X6sG?Hzg;g51I@|4LR&Qm|>z*jqrmYkqRR4AUW z5Q;w+2T5~X%*emx5TlaVeY1PfeV>e4BT)OrBFajDfUgHDPjE@$`nCe|Y}jw_KA3u9 zV^7*vB>vy5aIx<+t9CSe2%!ld&>ZrUiW2;U-?+*a zED#=yTg7LZjy)x(8CR!4WMHLbFZ`wf7tXiVjsK!QtIKUlnLjFjy>;4!v1Jsmu+&Vh zk_r#1bRtWaHcw5&Vug_zuVHhZb-H-$6AycRGK<;=Lh3+apMubF1Tg!0?c;KDl)e)^ zkDdq*Cy?1}Mf_z4VB65n_w{G+yJWCM7vqY;zjdWRIt^dvtZUJ+bY< z3Op23@F9Ed{Xs70_}*SO-;!<=AGsnanOSGa?V6;1M@nY&uwfTLz;Ohb0P|6>ETc$Jxi*gPQJBVOB?;zkxb zbFoJgRR{sh402*L!Gn^M>as>Rq5(MU2V|-4BhrgpYEh0tle@MJjLA$d-m!IwAYAqy ziErt-5f3Oqx@@OMbs~dOvB{)82Gr7jF;y{HM>@$eWiSrWh^_N7rKjbghKEcT^Ada( z=^Eh@&v0BfSYwq5I#1whKE|tZ);vj*eAiMVEv**BLukYVwE@5=)9tNkrPt?8RY2h) zN!0~UgxVmI`$)cV)bZWD>QUB7-aqGzgBG3N8GX+6v!KwE5H`j6y~x z10Bc{-Si5r81a0~^GhDF=J#4L zkiJp7)utw50-vPuU17T11)aW!>(KK!4NZ8ZkwxKzS$2H`(clI%DmH}Y>Hccn&AfQq zulZ>6z>ReMyZSYhlv?Anl!;FJ(rn!h<23!bsYE5b9j|R7zo`b+9+D&4Tn8+!>Bs33 zOv)Q;Mp?=8)_H0t+h779G2pr2)FoL0dznV$gt-rCOBjQaB3-f3fW(b38tbO(gGzfD z?Ug_CC_s4#NAIH1X@4F^k7q`h2nhe+PELo5t_tO}zO;4wes4C5C#B}>!!jY+{`O?f zbNf6s&o4zH2_?~3lDlH5$+!7u}LGZD(U(BIIXN2!pU!&rmsrmwK{FI!b8Hcz~#Rj$ZpgJDuN|0eXb z8HHdadYL)=Y*n_(?qM&d^Ioj1n1?i2Hee0gHtYsCwZ&jQQFLxpb!SCLmvZ zvf7go(bSYEQjyVeMl3vRLmtZb(o=P8V8K^AoWPc(pBnI`5~iU8CL>^NpV~>p*{x|0 zZ%G0Dj7g4!7g@LMjnwr!VgGL16rlfbD;RyksT#=eH6vsV~Jg@i^#;Eh>)%89IUK@O@Y&to8& zcgidRj8vxn3S4uhkz&^tK>#s&frX{aQXQ{&x%uID6+m&i&lnvEcM%a@At?h8lHsn& z_u=WZ6Mf_6uHeT;!@VR$5qJDP-V~Wq2u#Dy0BYEz&X1)-yA%?~4BM07?>yLIK?0v} zsyeV=c~Y5LB39Cn*u2zCJHb5gHK~q=Iu#1s0c0b_f+<4J!rNsbmVr-Dfhi4UQavf3 z3|oE8A&YN;R(`f0}kMg_Fv0rs%pA@7@&(XY5Bro_xOV{@6K@HVoOWmx*vk zA46~&Nyww=!(Ss`8Q-`oBH$-}$!lMZL?S@@3C>keNTf&LIYDgx9ljW)JTF5}$c`U7 zMTTdQLr@=-;@yr;Sw3)*)YVH5m107mC)}f?3Fe7GEN5iN^}#dM^h|DCkeKJ6hx(L+ z$R%I~ozg{Y{&wO}%<_N!>;E`K>VHX+gqnDtoG{9SFP??qlB1f@WHq=U7xy+@V`jR8 zsLV|?_DY+lPN+*rxvUQ{Cs<6cu>50Z9@H4}e_YRgzl2+~oZjd=} zKi6OuGlxtaAAIXDam0)CkUq@=APJu!@u86n;C*8c`7U~tEw1Bhd&94lTSC93jP2tA0+`mMe zEy6quknK*`wb7jO7|N^VZ6ySVibcC3xc%C*B)xpic|WO$p#72NI%3yE8Yuy4mr8;- z!8$k-dikyNz90Fi%kj0oh@Xd=&<;A@Qq}{^hoy4y+3_?M+;!x#fAC3C>ZgO0>11(? z6a;wvjrB9TRSuesbybA}ChGQKk~hH215HMmTiy9RoHe$4U}z+IvyDW zU*0+I`3@K^Xn^=nbs_LpSU)(6cv`JFb^_`&6QHo_0Y`O6^GRGOEqe}UWAko=Kbc&C zY_z%M8_%gIkp+z%NMr6)-zXW6D`NKO#~mbWqcc4w!Gft@k^4z#@zhUNC;1NhY&N{E z0zDlBT`o>&38{;at>DZQ7>LDV5C%CU3f_XSnpfZCzd#^&-|D)CEuu9$K5H)`wM%Lc zWTPhof`^*JHdNt(>LIQgPOj`0+XkS%pB;e%X95$noh}~Bun`Erf#TPHaaC?C><`R; zu=wRO9xbHn$p^9(WObb8E7vDcBQD1yZovF*-)J$(y}!##1jxm8-|iYHwVo#Cxn%i0 zFnHa3igog|f4|Op*I&nTd6_NDhW(@kSoK4pM~GeL&F4`2w+1(g!O_|>!X-&fG4T8) zSIKJcvSmx4(IImvzlNlD`DG%NY;2IFJgSONT`{Xrtv|L#t@N*Mv8W0qGr=eY zHS^Li;JJlzc^1qD6W_V?pzq5C7mXDd6wnDh(9K>`{M#YFtSkkvikl7sQs~!8!@qhoKy_bMos1$V{YLANq!f!{2qd_ak|0k=aP8#O z4-=*3D6{CPazNP$G6X-I;%|!HSB2O#NJRVy9s0q42fDZk&qML#>z1Gg{5l!f(Fc^o z+h8)Q3EszqO{JBiC1jGv{Rm-;!oqvRI7z!R0UGdMYw}n|Wpx?S6sBaZAX0w#GntAs4MH3*cL;&#&uhV(5+JnGO zYpTP?jFE~|P$l0QJsWm7I13NBX#6s}!z}pYvE}Gx*o}z*fOE{?UUS?)R}QDSZq3lt zm8}yWR%=$1IwLHe-;>>_sB>^#Jh%9C>%8Y6>dG8qI#EzvX}e3S>|s&H=-yh|<{UaK zGpC6eUM^Zb3!73^t!A!I^_`YpjVN_8sJ5%NUk`-J4tU_o`?0eumGDP zSfU}402ZF1WhSM7&Sat@y_XK!q(~Wftc)Y$_6xa!qU|Czm03T>EFk#>?EA;c8F$;n zA_=n?-MpRkl%Z{NAUq|yXX10yPFY>vX(va(k1)%nGb796Xsi3g2TXp)ZAzPQk56K! zY4xIURq3DeLL;NiYH+Ear9DC(&cy+%!mvh}2L5|sG`o0aoFw#YNbMJZn_`KGnbrs# zomj3az1wOiBbo?F8Zh7$vB{Xz+1ZW%z|wN>aQ(*6{$}O!V2-z~!^JJ(@*!(|r6}hY zN8#VRIve&v>1KTxMy$}Z-?t;1O>sG%iJ98}z*2=N!RUs~%K72ycM({J$X{4B8Li$C|G@O`tYlt$f7MhDz*;;l|F=@a}r=tbjTb$hDG&jj07c z=6d{-w?Kl3pmCA^(TUDh|v*?cO@It6v+u##3dpW5il1qjyT`$CK<2m*Dk56 zzx3foeMw0u!z_GEgD(UZJYpdQ7`9-mSs5_(zoPx(mawi z`kBI57wIy@yNyDh-^Y{MlJm(%^lD$w78y7>zunNQWKjUBlOhfF9F(1%O*}s`J=B)N zBWEd?i1oeBTFEjxbmoIag;{9F6ORd8r>YWauAwn$at&AZ7s}@fFp}^xm5frklg?TPjWhQp z6rMDm!k*SA>Ux4n@Ha7q^GI&Al9KG1T}#r~4Dm?w8wR(*-qJP!iEi>X3E&NH3&02^ zlK}-E5FL6~jiRX+9uKP1%{zV0^S`I8K~gy=0G%~nMq=m09G*3L@lK2<@U z?nRn3ooS^2r-QIMAZ=N{g?(~Q27iIPu>(HYv`VbLOgc{ViVRBE3Q%SKYp1UccW z3OsYik_5HVgGbM;8^oT@z9Cqog$Lq6KO5q_EJvfw6W%Pny@B7Dh#0bByh+4Y%_6Zn z#d_!__|I-|7wwACQnZwG!4yALf8pnqf}rDeHO<=ZW73Zoh_NoC@M%qva6M?uIz7`* z5yF{w_rcf=|F9x|jz{55(3QfEKRsD6#E|58nfPF3vr?0%==VZwV`Z{RWMTpjr-o`E&d+7IqpS5~op{FZ| zpW8i~SMMz}%c}<{#4^vr!34{~8$}Qk4azY`Q`dDK{-FQ}3YhcP4qKzb*LJhSF1C>$ z3IWi##FD3ExAoe%nClo)HK0O39(uj=4O6%z(I-hNPmb^4_}L?yqXe43);zeFgyP;o zW>%?X<=ovYH?eZ3EKI@gxY}dP^|xWwRdR)Pn!RoZ(^UFh4l!fbP!#3ZuHL;+8(R7!VX+6F_=tovyFgu!u@YSQO?8kL>XTyUbY?7J?k33hguF)zqD>&T@) zqp*{LwX%%Rw=gQ|q5DPE&M;f`DOim7$TVZ_u3uht|F`1*zSS!+f!jUfCr2apW5=gK z)wM)TnAdxVIV?+3V9>KypHQutmnwIw2xx_3Q-Xcg>$)NjEOCQ<))SD9|0$RoB43Cc zZYjCj=J8ZY#%qi}%Z&96kTj^WKMCE68FMAKyVFsmr|B&FjDhT?{j7+obe_ z0o$k(=6j1pj@iXQE?@>IwRhBr%ho+200h^UUtT!>Vo zm41dS+UI!W!j1x-4QM06xNpdT#<7RB-DRhDe#$5mGrFZjC_;<~Ue(i~6RS(2IQ|`G zGao8sfN)|xp^f>@P-AQvA;e)#2r)~jL?dh@8stj_8{^n*5uP=h zQ%v~UJ{V|qJG&{DMawJ*_J?SzI(Q_^YcW=~1p}zni_OsIu%(36^Dn1cGs0)ZX0S;B ze+E@7>xw#UlLfL=8{*B5EbA|W88~tQe;M2r{v(MhU&=ddd=}8Zh%osMdr%D=Vx3Jbbve}T|6&QK|OBIob)e<~GmrXNp zW%*02!m)c@$nBxt-Tzy&b@--!_h9^1ihPLcrt$6IlWZefjF)L3%(yR=^6Y#V^pD)F z_i0wD1M$DeVS~+99d)_(eEpdzasrO;5I_T|6@c)Yi>YLzMypLCRI+pijpIAyxvH=+ z%^!%=CxzvHon}HEzM_sBpyM^tk`hV#}*|8`m3vFCw%feyY?mWTsa&g*ooh548&63pA z`b*{IK5|4M)Ac|)Qw#!PixMO8TTwSDruuiRUjP83EC!bYhHTmo7&VmVP>b{ySj3gV zRM_NZ{d(tGc~FX`=pjGN52OnD(yEG%;POm^aJ8)5USisAssYSk*lVzr@z85CfE}_h`DSj9H1{?JNRC6U z)NkP=FSid1Ignn=WQUvqS5_eu(DBWWeOrCO`tHRkqJYLuq09A%c5dvYEaF!ydt(8$ zf80@ddO&Qfl#K%APkmCht2M-N#n&!#&#q8Gvhd1T=T^w_n0zrFh2>5Jxj zL`NXy!nowEznVYoY%%c2V5dH_toZw5&lvu{j>vdMALm)c7mKl>cy<mt|&TZa6iE9b|Hmr+I6qujIW0>xwJB3+uw|uvg-R!5J`!P1qFX&2kb9 zk`H_bCohZqQs?CN+>Sre6U=@%XbP3T)2696Y|Y0i4_ejTR_?j&O)M$!-0L#RA((!>@CawSl*-#$x{v}-^PWLAra?Fj`Iu*>EsP<+{+v z<--TQnc;%*eK9L`G%l?#r1go+#IB_U6JKKHidv4HZxHiMP+O8hVRg`peum2L-6oNZ zG0l{OwY>}TPIS+&I8MdZ6(iNTuPGSylQp?QYzgu+4VBv?6Zx zFcCj_Oc(7LR)(fXW*VOf#6oTd2<|KHg8_O_pJ;`ef?eQb_{6WALUh5G97Hd=p+<^> zPXw13Ee0$(<`u_E9c8|r4j`$v@xqlw6iBj`ulxE(m)?mVE`GqNl9YK+5032w&=6}j z;u&@FOK!vUS>~DfC(DYZ(QhT%dQ}3pH)1?S@9P87SLBr-O|U(p1PGi>Hg||GSgBei zSu*nPmJ~=OnzZqYAz5`sjxbm=K!+L+?i*)7m<0I~YkX#7ciY5nj0`EBVw)$dB`2^P z(}qgvOQFcd8h&`{f8vJ9$#t&SJipIW+AjE$D3`vviwFw(=RDin)J6BY=d|m&<8Zep zCBxE&c9^$z<@=0ClX=EO#O6?AGsGl#Jk9y=@obpn+v2V~g@g8kV)q^;)Ia8@w9mgF zStfqP7${|$PmMW80$GR;5qnY;9HpFZ0{zc_jI6DVNx8`O(-G9t6+ii?>zE0uflGDC zMPwsmOMH>krO2K=3=yC3WE4G{^M|L5kRiiH)>))Q06ZSBxW#AUl}v}xVQA~)xgCsf zgrw@Vjj|7gN@0sAF*1q1*tGeP={W#h@&S^?S?Z?`-R>hp?W0El$`!+@6!xYCL4LBn zVV|4lU0oG~pS*!*FV=zAMw%AmWE7RFhT$H3bU*J>Qtdc{%V-5E5}&P4&{gf;jZXkM%=ZF_8%gYKYCYcp_LrqjZY^^XA(BK_y} z$ETb_D5w0j&DsbNGJ5YIGxi5XG zQPpOZWH5>_f|I9I3yk)S0%$yiZFl-(5sw9dKG|eGF(DV^x6G3CJC|hNQP%X&PmV$T~IN}7c~Eg;t8@F5oXe*ozyMCNOU{qJS?RR3c{~g zQARCW*WSup0CYkG?lWe z;j{#O@ld{2{xeLK42Jj(w6bYi1LJjRP}{`WwdRlP@hrRsa>bZBjV68}wAAYJ&WdX! z`F6%Wt^;m=wU#cK?L%n@b*K3V@l`w7(A_Hw1`xFU$XERKe?2v!5+D?O_VQtpPOef` z{0Q*dvrmJC>1@!R8evw!y*adr`NI2GliS^Wsh~)>^2rcyd^PMM6f#6zno?w>X(H+@ z6AFuf95gQR{8l}(<>lh_nwucrCujF8y}abqe`K=7jd>7@rnT?9_&Hq_e0Z)MC|6F6P9Ns#@o;>46F}8}d`P#-6sHgA zRzE?m@~auf8ewnZNpx>ybcyc>3Ux@Qnm#-#0qfP-GkP*A;c+w@6%@qu^HfLO+!8=` z1C2qG`a>}&@4XqEW^io|ee;siiEd0Yl+P3xDzPUMv`6>m{6~6;R?N@>j7dfQ$Lrv+ zzki%1&(>q!RLAbam=%y`g~`<9|1ZY`8N zm4EH-zvNj?V!8K^|F*#QYPTOz&kOK@BTCHU%*N({)N1B-qKCcsLiz>`C&7#4yW)> z$9!PFF_qZ8{*2T?i`_jY^wwGpDq_Z#R2mwhj);Ai@|j&dk7aml!oO zF@4tW(_3+I3SiVX1WZlL?q0thwxw`ZABc*L-v;;^ zhHKZz=;x+q=>T>H0c&Fm3~M3%Hxvjx2>ncFL_QWu|KxTCQ07%tM=h$ZY04uGy@R8l zn;o3Kb;##JEw_n`Q5=xaQ98t33-l>cwU(|Gq5+N^KZ%Nl2FD}JQ7#Nkt=r9Grhe?9 z&tr}Iu~p(RYhVvW7N{8}@PD!awDYR5%;-U3bulZL=&3B>{)*MITV*$S03(A@o)CegVDn;p%8QHTNIwm^O z0jHbz6(DBaCxt-C17R*(TY092sY(u@0Zipqq`qoovtOqmuG_u)np0O^edZ5Qtl#OL z!a=cmbTAPi0sFb7>YnF*;}*_W(b%xo9}cX!Gx}KeK67CTK}R_5GE#yrag7%&PZ~uG z5rpYK0h~O+g=NT_s|BF4C=6L}$##Ee9XB$9=gdgVmU*(Z{#5}>sc*7pvh2W`6LEw2 zz2fw<^`h#i4neS=OL~TwvZ`lD^7MpPt$;2S8d<5>&+lD;_}JL^&>L>*A=&%*q`e zCrw*b$HDIjkghb2rp#^0L=nfv`UkZcNgm1^F4euO%wJwOR%rq9nUWo5j#$H@dwfyr z9DBmF13z@vOE-V*$0##+5E=wzI9P~~`|xh~SD(239=j6{wsch2DoDw#G}tLch^V|X zBn?%CxAeDojv@_It2RfIE>3wRL?ganms(5>QIudoCsWB;(FC>YxwIGA_U0SgnP ztju+miB5n~K0I13PgcN+yW$Gkb`gvwTbyF=m-?pgQ|HZ;YzduPtIntxm|;Weo$NQP zRNJ;i*~WVMH{g2;2MZCht3{))O)Nb6;)B@$IQ>mt2}bD#P7$i+X4c`l#sm#l4hiZP zny4c~I**(Ts|v4|Z5|Sp#Zd=#8Ge=eA%!2{*;PuhrSpOYg{UvHyt_Gkas})Z*esk; zm!I7;fYOz~W?rzgda6p_ww_qD+gvEuI_cz}tsa$sj~HiPxDWp(?)C2Xth(*$D^R?0 zbWm)g7z{+nEs#O6$y~3sbwnTF)xPsmVcCn)DTu;3v5;fkAdC@#@?m~DzZEP$th>S<3?I;P9knHp;SO0f;&0rxMg(^$qA}5{osVii}QxNfI;u(MNhi z@(UP#OW6{kVUxBSi;_L!DBD~=pkz20h>(IkRxQq#v;xcB<WkI<5 zI%rLT=Hx7UhCn|vDci|w#i9gthTO_BF9k?~K!OyNwaQv>CC+je$f(>^3SU#^sXQ9 zmJX0W%!xvYQ}w<89h01Vz%$6=sLB=Sp86@WY_lr36?LJ|kSH?vm6VU1KhTeLO%Ghd zyk~v%Hv6MwNC1fX7Jsw+Sha@qgeJhccFs5f=U~sHXL(j(HrBv0P#Wj$UDGEQl7Z1 zaaO`NGQ2%NlSfq0n2rEV41Y(o1*k2oE$y`c)x!WmG9lg@_Tzf`FxuFS(fTg(*F-P9 z*+eggf15+kt{!-PTekX6;U^DYX5KJruLo#cXBABvSwrK)-{EZ)G_t*dhBd-+tdcSf zP&F*f?ywBIdcyMR#b{Ib`^LsTwC3$Tw0?6~p6hzh+KtIcQ~)KeSKzv5&y#`9-A2AM zF*Em*N7d2XN$qIVuqx_kRM5nc^{}2+qcW^Tbu!kzVNs$!QYU-*(5kn3(8jP%uHW1n zmSZ=1VNDlWx1mqozNIcQf-F$qbn$dVr_>Ghy2)xSfXYvkALa{8>7p4nIPtG_j5#Fy zxg7Cxg+tOJq&jgF<1zanXRMI!d$AY&^xn-8VZwX320t!X0rJ%8gMxV@<#*N| zqtMPX+EKN_mnEMLUzS<7ICJl7Hqn|;dH?aTjp$F0ZHUSe1{iV1F2IhG=+|Omu7@Od z&OQ^-o^ywXorg-;Negm8qiaQ-14MSR{{ zAHdwhVy={R7|a^dv_}sM&_1&pXpfn-$XbbxuEW_b*CwZRFrTiZMbcH%#IoFVdJQd{ z(utm5*F?X0qzgT}HgDOmdC}$5_W5i8CJBSz4wD+_s3jxN%yIS5dd`A3saRILsw@-b z9V>D|q5+yPyoOHMbtKwvUI+T)qZ`qk&u&6*cj*q~P!)zoxvQQ{*9iotoA?2Vc|=$b zkKAc2+H3BJ(3-BN$0^dfh=p>@X-)l=DTL27uR;9>+fHS{`kn7k|!wM z_O0Sc+qQ`W0YqJ-L+9G;*m_KE6=S3eKJ=I0KJv8{%TZO43U&GFR1I$GGPS&M%V{iI;|f5)zFTUYNSJy9Ehig&&Z-%9P=brbsYqi>>rzPyQFkzQ7P)5X)N z3R69`O-lpNu&z>sq;8Q%qk2H1t#MEp)fhE(c=wwxZ$tw;PdLy+qwI>&YPH@r#Z6Rk za#IE<(xZaHq7w(rhptDt`^-8zVM$v=P%-Jn%B4w35TWc>k&Z}$tUo2iOz{w#rWv_y zH@=GIj<1AysG*x5??!)K*@Jqa9R*#Z*TplyND>N=d8y-e8iDrTz9YIOQHjouI}IV!bjNeO=+>utLhFXg z0BaQCR{oyV!+FUSP!3u3xzF5Tp%vJPMt4+G;-gAdEK8{3R=Kkwa5F3WX5vE@;*c^O z)m}j#I$#WXW_1tx#eM71qpx-|@nz4hsz18AsZ!4HvSr;DZ_|O!*lQx1HNGugT-D6x z0cpL=r$uk%q{rUp+}Z2YM5i5!cqKH^#$-k6$B&qbZhZJnbnD}9q371hE$#T$P~Q~s z^5Jy>_3ggMDo~TZnFLkwGzl`Yt8K%H&c6}GJTT-I%W#Wi!oTXSr+;p4rCJ?j9><15 z8dgg_rf}xei}k#;IWks0nJ1ZdIdJ<1I$&NSR-nyH;ZPzJ^)d7bREk`MO!weOkyk1~ zWG#(u5741IG|*l%>*(9JZ9=Qw7HlY8qeluqU>w=gs^n}pv4KADjxmv8P4fbYtMmgV7!`8fdE|}<%y|8_tLT}dba<4ir+&j= zum~d}Z1(n4!7s%c*0n?8R1OJR5v6726BQ5{{ybxscC;k42I=r!Ga@0xC~kwou_QYv zq8@*e5i(*zl=#Sy5RVG2)~oK?lqv8M8-0;FMTYH;UNSr)!FbpXb1N9*UrhoUKjn}f zAYUX8L1NXA7fVR77OIoumX3%zK{q`7c1qM>Sm-ueUosMK>@MTb$;-y4gqO}uL&`A@ z0L!2SvQA9gFe-^%LS|)84Dkr=uC|XDhX%o>`oUlkMm>Q^3-&uh4208v#4duV$ECQF5}a^VhT>I(0}qKh5BACdI|+bJ4~#g^Y>~;e_Yvv z9(^s_9#ClbM^{z=IlIpuh7R1ZGqSd*<Me8K zm-KE(oowQGE_VFL8v61{GtjT@djsA0@H*7pi=8Yf(28Y!HJ8h?^pir>4h(t*l;4C5 zquZ#VXWo@+Ve8?li{bP&@ zEvvJa4MVfWRAYsMV(Y63ePB_(?Jyod4!anHS_46R$R3(Kwt~*xqaA(s_D$%qRg$G9 z79{Al-z~##v)a+W>@zwF-ejz5D-vvl1*0fSvSouVRVU?1wsmyYE9ja#--=GJk!KKA z$7QjU?t&Lt<@(G#(2j7T}70ksk zm5GuBb^1f@SI!iR!QV0-{CL7pu~u{fZ^%dHs3lagTK9_2ZRhntBt zcJTa;ungm4+N97Zt$Yww*~;AyUN{<^umAo^mNjrWBn3k)aF&WPC&Xg;Q#1#oRi#`c5Q4 za~@#|$7c8m(gRQZ$(&I@&*sEv>9i`^W^@I8^_I=3S2$73b{IO=Y-}>&9P7WK=qbp7*n|X8GUp~E zLF=R~tvmA^tDFQ=IwC8rqpcNjIg)KNmmD$`UHm`KMdz00(_=3Ijatu5R_~|Co<}eV z>cwbfkl#S?AHVw79F1(5jd zI(bes%wgZ-p3IUNl$jM&LpfhMb3r?}bY(q1d#J6SM{W3)9P$X1fh9#=!}+iw*5uUp@Yzha@Q z{}LaqJL65ZZd`ESl;pr{by*e}rY~dVvR(a5@}C?AaoFO~=#Hn}Mz6lbScPK!(zM%r zh6R16tJ{{niGCXr)jbd679YD7lVPQ;b6I`-ww*nzpIVRd9MLK|=P*!1qv>i<@>ldp zq46Q%%39Q-@3{$ArjDGU2Szr_PaIx}?r`Elb(VABdj&;nm8Gz$C%}WiY7`+Fwl!-ym%@CQW*UGo^Z6IweUim(3ZD5L1Sba?BG& zIc4BHB&vuNry%W`hCI7fX@*w zJo=KOI3ElrH=EaI)w_X^V8JlLg9=H@pIfFjcG;#D?Yqkqx2&OS6wUw-;~CRQdf`Oz zkU6f?cdDbW{k0Eu_aUKd^5v=HTydCb^sq`~4JIEsFFcHw_W~$&(-5pR;(==@ycD#hsXtM(Ve2Gl=b+?X)4PQLP6E5CKr z321<}Pz>bIC^dyMGgw!DpwJSgLD7_ufl}uMHL1{_qZhVC%i~j3S0Mjo591X{KXpTK zBZ?GH5Pw9NES$OPdCjRaNUg+k;gie7+q6gXS~PgkVLa>dD8Z^W#-slvb6ltIHXMEa zM$^I>UEbvc`Pt)Uphk`9ob~6BXvy<}>U83{_)0SWx^U{Sln52U(|>IYrBYUbn&O&* znTkuQ>r^@er8Gys076h5HhO2oZ>ry_Ekf4hO|G+VbFf8cH8Bh#AH8F#r^jfMv>-u4 zI)~41ixzie3P&QsWW`v*H9kantK5jf2~rt2`eMahD7TjamJda}nm?tHIYD?U=Kxc* zN-IX@Z?s_G@v`)A(&R9jHafK2X0@Zcp52_wkm7Zj9MR4*JJG0)YL?G}b<%o-q69$F zjO!%XR~ml{Wbe7d(Xa1cC+$qb@|V{w{k95JiTtzh*-+^+xGrUQ5g{o*^v_cdZ{G9?a)s`8u;`Gyr};;1^BHl~JNe4|GiR!=H`x~kJ#5`XZf zd!?>Yk(_X)OIHY%&h{r|#svxgX&XOxT-WL+>B`Zq+9D+2hDNK6VbRhuDDB&H4@@tu zCD5i}L6lPeEdIO+)$Ck4>@eL8RJtZ*)T&`TX*yBU2++uOgm#}%L3cc#Uo@jgF1eK} zha(opUzMQgz~2WT&ywqM;9i!IP7Y#gX8iCVtV?zD#Ht=qDm3}@a>2A=XvWy~RIwTB zPR>Cc-gS=E9M7&C#ZC-P>Ljra-?QID^r>IIB+r{kmL=>)%oK5*Nzg4_O@<=0P1u$Y z;q!)CimiJi(atY!X+Yd%7*o^Hz! zAun8dsl-IGXD|(~AEC&nrS5 z?osEc^)Lnl4EGMHeT3=IXjmx&w(+DelAD@X;NgmsAe-kv`HsuzVe$ExHY&DYOkYAU zie*KYpl}pHIVpBSqI{j8evd!TWhF6)evhowIa(?l@+lovj^NimP+35^6feznS zR+Wra0ORb4tLbB^hR{(A?nj2*=Zr{5P~9nzis(nH+T`y{C8 zD)MTA%iNMpTvM9LyeQJl{Nr*Q-&sY~uw&6H`Cg&fsEGfqhlM$+qZX%MfY%0M(UvJ6 z#vG9V$spdy_G&c3(AA5P%DT$M1^N{`$iuE}ILTJ{v(8d>%fb(cHApZ}bA&1LkDRvs zA*PlmEmv(gx1Nzr7_0q)W%R%p$Gv9PQ-wpF%U;=-%Li~6Pe@9X;tX!ZCC+A`I_e0$ z-OZ%KRV97znH;4?6gY0G%R>@XTb4RGI+)86QtoCF6!Sz*Ng;;ej+1KWp_jWAO%W^H zvzwXY+j8M#=|S`5`dqek(te?lB+bN~&b}_3HVobK+=hHq@k&)!1;3oXROe{wAxO^v zbQL7s0%7W-ryUqx-k&)2D3-ne5RW zwOn;|9o{W_uDVE?Z~-X&zR<{FmCQ{VQ03haqXqOBIerYyBXqB;u}WeP2-S62OC zAd$g@*|{72b-K>6ql0+m&&ZK&sP7jH7*rSI<4$mPa@79T{U=F;T7`V;jR~S1LToJwYLY4i5W?uF zt2;h%M738mKZxVilQwg#t%k~i$^7k!R2PTbks)SzYKoi)0m;XAX<2IH#ThW>3$$p) zILxfgg%fmhnFP^yG%Y?N)T#rut>B=`Oz|D_mgk0k!a!SucJ)&mws@s59l8x$Aft*a zT$wvm(zJ=5sRVYGL=?ZIVZ1^zWinjjk;Ms^3={KH2sXz~RW-W?w1iNgELC#kGU3Dk zB^y;f+G?WS;oAaMxW_ISHLA?u4zP0uCUHf4nVd4}Bor!AWcvcTc35q-b)wT4pCPL$LF@Qy>Fc&%zFW> zK?C}8_(`U4=wFp9Jva#x)PhVFv@A{e%E>4=jHgResq~?FWb#n2CD)SGMG| zg+u=9ZBlu1veSX=A9uB2l=;%Pqq0``k#Z!m z;sp+saxEB(AyGa!{2fU185>8riJE0_ck(cbG*yD277PKICB?XjHn1N} zuuv+*uRFAYa7cndLV{c=7E#`Su##k8X_(4UI=ZVTMWVbnb~WX4B~K-5TW@aaLBkrA z=oEco4MJ*Ukzslp6q#d%%8l+5x0nb4GJtI!>JLf~s#7h~Rff@#;2^@FA;Ju{J#U#) zffpwW1IdyyjH#CfeBLA&8NmuW->5U`eR3pNa1KeDtmBYq(ZvtuA<{U^rich-OZLq@ z=S|%aoyK=;Sq|_pUQvK8nCQM4W%rFuO{6I@Bc58-jV6z5gQRuuP zPTC{+ud7$ysVLU*)>~4=_Y7L(4MO0SBtOs?a3V}AS0J3Eqb*w?K^66P%tvv5bvg8e zOt^Mq9~#w;qT#%Bp$8kk!0?l47*Ayhwvq%zdGT;&U-bLtX3a+#C1A_;tLmFM%aNSjx_)#1JDEj?L_u+jlAu)A>GKWApE=yXljMLCVT!0?;g}F1L@P#8?wZ0}x2Z3(h$@mgDdwe&4uz>4%LKGe#+?Kl z)~mjpKOb1U)z??6trTi8#rdWzqNL#>+XoAd1B1asgc`uh)=YvBp;mI7(@|AmbERLo z8b>|PN;IsM%*V)1^l%);vxT*ib4`c-;dp+KOvQBf!RJTCvLzNFSuI%)FhJQBBc;3y zK4-eH`jF;0y71I0eCf?*UOrG9Dc9HD>Wzqy{8eekg05<|?O@rKyCceymetAl@A)-7 zg1>u8V4^YU83+HC?HRx*l< z(2VhM`2`ZIQ1@J>mN^)QLu~ zn=sN`C^OxzIcwe=W{YVV7PFk1RwU`SM% zg%T8wAP|(6R7P^&OqBPgP;uY#Eac1TYK21F?|z{NEt^pfNw6;@hOk3Xt(HEF2g+lC zG@)`?H}W6pP!KYFc^x|}>fSi+eSQ;~KDH6whGi)^zqP-IM9Ur#$vqF_-b}XQ-2Xxs zTprZg)5UexLjc)!kzl}l;K4wG1Oq{YnEAzz-T3XRcR2X`cf+F<3sO9cdj$hW0Q9Wh z*n}b_hJ$9>Km(hhD3c}E;yD=WVZ0kF^`fX7ax1s~*uRT%jz>fX$Go zQU*{yL{9YA%!WnD_Z)TEGFgKZ8@ghvDEg>e*r~8OeL50o*|CyjxXAD+#F7^M(>jUc zcKGD$*|4b9+@6IsrS~&A2p$7MJ92ct@xmXN+kVa2Kw5;+U%KNcX8>Skh*bU3tQN;O zhQXqT{8E|ETwheMN_0>)n8#m7XqTyEC@)kzeHB!z)r>=njE6joqrxe3_(^I7B)`NG zBnq4m*WaG6G5*RIqO}GIHiRVbzYlbyQ+6Vjb-c)-T1`$cZP}1$>&sDkk22*=%Cavk zM^cs#zS5V40Fa=nOjo|vh5DMYby=xYQ9$-+>K4rao(nd-oJY|S5lC4^zhs1>kCbH- z-TBOBv~pEX;;$zRWO|op=wg;|C#?cyd8GbVMy3=sYXv;)jUoTo6T5(UW zGY^ZJNRZO-%+9l7Si zSvE`}>xqyIx1ZD&k!-ZRNB4;jN2si7(@?5TkS?5V?v@NM_eJ%x58e3arX)vtBC{%2 z>v{tuL21lkd9!GD zVS#cKuU+9PL1zu(WNwiBJ@OjU9A$}FS~9mky$Q{m*oZnU&1N+^wTHlEsM%bWcI6K3 z#6UV{=>nN#lww0yA6m0PvXS1h;|p3K12ed+(uGBFv<9KFGKu|8hW$;1?87zVzd+Hy zWA1b$2q`9Ar_d-zmj`_UIe$x~q66{&&B_`Y)837yj_ir8!LavT5f^)Kkxay=C&64E zN|=jO$z$E(#Ry@qyQdfRh8E$YYue;#aXFSN6qWm(&-bD^V`F7aly)tsOJu@f)1d$l z;{nT3HH?RFd=NojZ&;4u-vh5S(chm_Sr96PD|e^3=lL$Q6x;+DwQyB!^>nyG%QE*_lL(fC;sZffp>h#ulSXFom}BcnG8UmLi{!13>i!$sUijm zC*;Vmy?`lGLwl)4!k1==zU5YtS7@I%AB0!^t&f(=&U6@ zDCkWl>4P90B84{oqHvjm(aE54viYodNR<4o*@)3|Z`P790I~z(@zEZRs99ufr-BsstJSO4ro$1T87M}o}z5E{&NDm3#& zs^<|i(%%*gMPDHn%gC9xIsrMXeZ6NEaCB> zby9ZE`3d2ABTF#01|NI1Ct7t3u9GHzsXnpSGyJVZ=ccSM5&&dnys(uMA&capar)7c zK=h4%vE(D47AZ)b&19;sJbK|p-k$5io`+wrqg^Ih8}j$;8v(laHT~S6EeXn&ir>5vqgkVS(af>2vW_|wbcj@&y7&xy&N6q)4nhG7 zhPp?VOZZ1R6QpBt&r1P%W?g>x&A4AsmAu6L$<@8+rpGp+1Gi63?Wt6vPDKE$lco+u zk#f|@(#fD@*&EHV_Mr8fdePN)ccI>O3G;?<2hGi4aVCkl5Z9Q50jP&Z{?7v zEY)mfW30T1MYv`ILVte7y@z z=LP%1zx!V5;g0x&2@-GZ^_^WQ$U8R>p%8rqpBGewOPt?c`Ik!>7c7s^It-LW*cAQ} zs7Wj%xR@?wC^BqXl;m=brV3xgUy{UI-Ib6GhoPgl+k{4=uE@@AG|0-w8fd<-hy?>x z-h41Q38t1{sBpTwx=~Me4|;4(13kRDO-q7K3uhEXe%Ff#%^clC+l}i^Mk7K6o~+1K zJwwr9yj*sQ%nM?imM0-VG920){=N2A6aCdWw~ZUANupk9=nbiu+Hk@NIjLR!|nY+{FPyB z$dYkhefxjkfigZ|efxzF2YQZ>{BhqbiAF-jNYpVZ5(5cp6E8|~jEA|iZa#!?RxZa2wi*zeM3G;$bfL1n=zvSc?qPV-eHb>WgdZvmt_T+*C z5*2UZ3brdG-CsS_h5pYTK~g8<7ECQ|y=5qoU!YFvWJ&!|MuKEyf>?sxU0vv{&3)*~ zzjcRYsV6emj)cx%*6y|b5V?@|Yf%SmWkm?0W1WW7&?o_Y!05r(ti0>Waog>7fj&5J zI0sU6mOZzehsi(Zs%K6229wXv!>b!;@x(4Pw!J5vo2gc7IR!qbRyHPST7&^zIm)!7 z?37Ux`B;R}7OiU!OYc~8NL1#BH37Su0s7fv!_iI?H=|{tHA5OQ8H%bm8WACi$FL2w z1(PY8cpj@ev;up=UN<>Z{HEtdqTZ%(2A@lQW$!~Ok{8|;_EE2YEI=nM>_)?r1t$&M z9(5{6S>~-7iNt>DP|)E}y3#gU9U3a{O`E&XpF>OVzSk-!U6q!mt8O>ig)>&04LN)+azTU#abY?PT)0|4=oxj zYlNY;O@d~Ds*0Qo$(dxGI)1+6f{Hx3Hdre3ZyM~~foJ*=t+0gPDdvKa)CiLYUOne; z&+mTl@t2B$B+RG_qs&a#@C=dV5!4=5Nm-JlEO|+OJ%u_nd*k?M>iYZk?u(Wm;0Y5= zP2-~3q(tzj#t!o|Kbg|SLUAw_+>rq9A3)378qm`lc1C^0I=Il#bw0$1l1usfTekzD zTj$oJj~`k<2k%je1SDQoA$BY*4n}s+1WjXG6~SGIgmu)JDAy;R95ZuO1A29HJ>rF< zn=m%S(KP3>l8RnlTSRq1KRV~=QdCa-?wgv*q}bR{*`yoTCROfPB`4h`3uHX7Fc^(h zck~p{JqwCxUAvwHjd?&jzLs(ZQVV&E3+jsG8m@cgvv(kN&d9KmAjXIv!&Lqimp=N7 zHShV{wL_Gdi3HUS@VB9AoX!cRJQN0mQ;4|*>hrl)TxNj zSPoZTmk4o1s&Lqt?vnA{ibV(S{wNv3{&N z7&(z31X-7H*rvmV)5qERj~nNqlmKgD9U*Dev_{Cy9Ic>)!b$v8lP-3vZ6bYU=9cr`r#O z8IKtY#M<9rWwHD~EV!3!ABW~_osf`V)^&k!;#3i2>fT!j&;xHapbzXN$z5y+1r8XbXbO>bCAv($9 z=)XbH5pN54*SrEcYOf;t$RTxT-$}(tv&I^BW4TS@_E^!h(|uoQ(x>Y|nv0?Cct83V z%?gdyT2>}%;p?}ym(Z-0r7{VcA1}+epnB%6KCw`C=TNS^Orl~Kb^D;g7O5Xig2P6J zBfZ5Mu?ZI!{PD8SANQr}|15-pq@?tM5T!vVK;hEp9pZw5P!7c~KyS8dU!GgDr68wckckIaa7W}fI1mxxwjP8YU%LnD97rdjWbVPr zNKi#~rUYVa?Wsc#FKa@(t}UVSj_5~kn^-8<8xi7Vf!V^o*8GZ8QD z9*jwFRa+f;bVYMS+_stJWg63U*oY%utGT?TguZxOsjMN!+H7MXGLu%?q}g0*ES5nN ztkh*O9t(`yB-R4UZM3_r1>UzXM9a3(?@W`PZO0erCkd?gFeNo?)S?G@=0aD?%P3tv zAX`2$EEs7b#J}j_gSz@s>S-n?7t@&NWa?!B{Vf{3D;VLT3#BMaN10?EShWW_WuFdo z&@Kbpp zI~8Hr6fd!;kJ={Ll`XF}Sve*uj5-t1W&_1SqEX|`*PmF5Nie4e1s5`7GEgnf6vj~- z1eGh4rp1pB)&vof2c*{#7F(9TyuI8w`^y5PnGVQqyB6Xj?ZuRY3_>xk5Cv$8u8!@8I)W?hP@s@YV1SK4wu1kRgD})!u%OJw| z9LDG%UEG-%989!oY`Saf3DNq_x-tPaqb=QZXF_Z*YV(_c1SK$P*}8Vh`8~g;gjTne z&_qwH|G~gIo`Ap<)^#^UKa79cyB!@~CdJBl zVST(bAnl1)7Cp!NZANk@V5%Q$Ls8a5$izGICt6FiX?A6o{((XXt?z0=ueVJ?8+)2y zg&j)h$PN$(FI8E*txV|K8qk503h4cBA3*!|08cA_cPZ zN;IWBK5c_^Ca~sGEXC*FVG=Bs1$J5co4uh~@*JA>VDS-HjlpX&fOOW@??C9jMU~Ff zKOb5`C%$8#vfeQ6OyK%!NUq~HiO07qjglQw=f?h`y2O96HeGJ7nEZ-`!DO-)KHBT` zEdhG^EoCuvj|ca+>S$QPLe^-*SZ8bpKF=}{ZbmE-4si+OsDe$mlZP)Ze)#(Pjz0H_ zuknHSDKa+ab*ZyPlEx!mY5j-lm8sMgi;oOyo_%K1uITmFiRi<7Z%2EL?~lz;L28mJ z_r#;c_(ZEgsdh^}{cjO)e=%1(bmg}i(~NVJ&t`_7UDX~A*;;t2_p&TG?O&B3{~TU z!%B!Ftr3z+C`5lN3!;>V@tQtBy@`jr%9#YM1u{TjhkQU)d30p~G}^X-2K30<$!MpB z0@}MwhPyWpqCJ}j(4?k*G_D~;P4!`H-XoooAhzmN1UCi|EO_yB_h4N#CfPaIfHwE+ zRM!5+q26MBG;t@h=@Tf-)h1E#{i(DlbH_(4%o}BrTH4lt#+U2tfU*$ZXF>t((j21Q z$CuFf#_|VO7tbsunssctAm&hviU1FzJwfppYD;&3w)8Zh*4}!wp}QXS73vWG-ofob z=B^?;a9!*2R%D<}FGL;v2>o_mfF_jdY|3u9{t9T{okO%&`8S~v@BJFYGfU&TOf2?c z@|XVg4TflIce!m2glJtm*5re7JqD;}kh84OQvo%W z-MR+qPNHK)dJBUDkRRZ6SAQM+$S`aeEih ze!C#FTXUt8Q5RG?6nL-LzNiC%(AS>y{NF* zzrKI-;_ZlCIx!*`X^k);!OAa42T2(+%(;Fnds#Zoz`EB2@YCg&B`>gfkwaIR=-%v@ zsE(KM^$hz28F@5|&W7s73_M|J>GmeH6j1~z&0CeQt-GO&s`>^BJ*J*?+~Giiy8N-> z=+!dGy}A+K)oJQcRUk8|K+9s&$zc2~FQHO zoT2QGK3`j60pzR8+gK(Yp;>UMJ`S89vzQxI@jzuWkxE|QgeF}kejX%fYWtAy3`#k9 zkR=yo>r?;xpQth{Rv8)_ArizGNg~7`WEc@)=jIjdt7qSP`GF^W_J1nAVY*yGQ$1#L z4Y2W9BFng-I!#DGnc#8w2+YYU{i6H=(H&Gam0!kB0HhU2V%d8edIW$pjDp09u*E!v zdR#EQRiy`R>|)t0{nTYMWh-kh*&3mX$=NPPLnlU)Xr3lfeV&q+A@S>4GV@JT1>=Jl zBTa-Dv|3yYiv!6Dp2|xJlJB2iQ;4-f*w`Qt7QM7AI`W*$ZcBWr^F(D@p}OkSAGnpj2^Nh?-{9;&hODL>d476< zAkQ+N_M6LCCLa($+F;@of@ws31y>Yo*EJ0zJ#^R5J#=?>2?$7+fQXcI2uL$@BV7{G zozmSM(hbrzz&rP|zO}x8aOH`8_SwhRBqNT%d=!cyy|K-=9E;uymAz2i2`03LyQ9M| zGekyd$yCJBK5M~8#t=E!4IBSz zxjs7tHHJ^_cis*c{Y`?0g;$Zj`&qLU9Mp3lW)Kr(p6 zOfYr%-PO>U=M~3GTvZ|o#S!{t|2_fF+rAk4!vQumiiy9pMR&WgPj%xC?8H51XIl$|?p)x56n$qPS;di3cRSv$)E$C{8wgt(y?zo()KO#R}9L z=9#i~b+P2Jzj49Er|rOvT3%k-WC+s5WN5Ux^T!?KmqEe6lA0_@@JOfu#+QW;$O6Zo znpZMGVlp1usD7?rsqvD3%K4aylJ9D!d_8~((4*tWkeLz)^KY|@paEt+Y=xT_!W2;; z=J^z#)86_9{&(^VqQ^@S)1eFKGf)ZQ?C$S3Xiit)M|fb$nhjIt$u*qia?2`xNp>^> zgNshhSCCD%seIMECkX6UI3viv)3cCngd>Xdd)OB)K#@XnWPe7e3C)%T+vStbUX=v3 z%fMlHK4~}vLS2cA<-fmo2Ja~w#?4q9yY`T`YuT+1b-{;~7;w&uQINyQuHfCt zw^)n=FRw_6V3TS}VX}^xj5rKf-6l+U-7qb~5q-BQ+>$dkt)fg?cGr@@SR^O4fBUt} z=*8?lgiez$kIk$q0ZLNifmdl&m_fb$l=R$O5!$4uhA{?pc6!lx@6mCAU{GB+%Hr7T z=r&%LivxMc2R*9DuxXfHO8;QDg4TP_S1Js&)+>X;12B_BAwz9m2mt_LJFu3w9=nv9 zdq0zo+bCJ-1MoW)HT&Y7&1xrGzHR#4{wH8VmHXfY`jtPAh5_D8LbBml0n8mp6eJ-X zQCQ34&r607^O7*IxVq$eTKdgC_$@7lRR=$q3Iy4(0bDcLO5jc;-ei40ux6{nyf%J_ADq8X34u(9*!bj3};HI5r2MB3YTt>fr`bGu00XYxP(9& z3d=WB0iuzxohrV_W6aBjgdn*%o5Q{3bZpHY{QUX|8%f&w1Q?sRoNMjn4b^Ndh8#6~ z+WbXvnFf{G2` zy`7zF2@PzT2kLpXHR@0}ju*9hCO;txza!kNXa2nH%o4|Ia{f*ewIwvZdl$LxER1U{#ZW%p!%MVgv_AAr&?qXEs?T zC(3X6tAlz90CRqqxI{M39JFKS8I*#QWRieY>un`;azAWz|!-Ry`enbr$9+#`4tch?PTqp*oU(LxLeSBow zFiOgy*5R|!ivC0+jbThu@0D~zPWmL$#A%#PBKctc?h z5R=N}2Lp$-9+$B5=eY(cImwR9-buf^QsXb9S0s@xQZgwpyQDBkVV1xk~N@S{5exZOY|O5Z}>Hzw>$z(=2&5ph4gf-oxGYE$^u9lD233< z#6Y#*p#ybO-a+94v5oH43~x|OLhEA|=+|s^mHru!rA6x^rDqGef1apgt=z__^yOOk zHACN}j>{BF8xrqhB8+ah%_7wIBDT-{-gbDro9!l^z$rB4$jb3Iiy}@zMmP?lezX~- zlZlYClL5~#Z<;80%#=*^=%NY}VI*^QFg=yzo$3^!zp-RN+w|CB0#~45V!Ixw zbgU;RO>YZXLT^x=F?=f|d!u}IHbq6BUq!-wSr+>!+d+u>6;8rrKBB4hX@T)wJg$rl z5OdF+#V0z&u)k#-ZeK~AuYDGH*AjbMx?c(lLQ=)w*~zt@Efs;H}{JnQf!Lt0LJa6LP7`Cy>vy zQ@c1d!|!kDR=4zW`*b>40v&(8Ek@zAMXAoSrRQqJ$SNvAPDLU$$_H88-?r@~p08bg zcAc-dP1fK1!Q64_u~N}GdR>#;`l~F?5>!Ih12F|!Tn7E?qj3>=;u4T%=SL?BWe^Y-+T?)6O6_ep$6ACC^ZP)yfn!%*F< z@8>x@(K5twzhoQPgR%FrkR1KO-T#cy$`JrhO}flJub!@&${c}6R@g{KRCvLq?`bPk zJ(P#J%KP?aozva>200A5J}-8}?byafva{f0UGLEbLXB!iZ|4F27N~$LLk(ru?8vqN5ru8ua7P@q}7LW~u4qVTh)f$(_jCZ*2AGAx= zbjX?>1WnFv$|)OhM&vYik;p1l&@N~LdAivuZn@2AFpq2x)zAT$eB1|jSf_Yjxxcqr zmCz|IM%c_e{Pna@Prdx&sNwbL`)95pS!E-(TTf1zZ6!R}Mty?vbTj~9Am`Bl zv$yY6Je7C}F#PydDMcHtL_3YtJ!PX(^_3~HiH_8WC!bl(sFL*>M4Txo+=+}6PECz0 zF<$p8tdGn32fEw<8A9t&cYIVK8wj3g!-H2t`y#y$@99D3xl-I z;Q=VXkP&fya{Z=P3v~IMZ`Q08^PEqZoJDJ+!tjDCXk_F7#oV=A{l8C9+=W1F4<@B&>Fio$YbP z5I2g=uf->!38ofX_)~zJ>;)W2#5LT!Z%v?}|8|#dJCCnc_T7)VRz5vzzgfsEZ+!rn z{x!?EsG%oT|IHgu8W)g2k5{i$Uk7%D9#6Y#28fZq7#6rxVYe*Vp!3!phw( z;Ci&NrERgY4=w!)DZ^PvN_Z1QLg=Xc6Oc526SS{GSA164sN5%4zhfeAlKac7-bMkXq^vT?=b`Zgb3%4>UXD^#Y5Xr7JGiai8tc}- zGH0SMU%I%3Fg%dtz@mWL&beOs7vKE0^3Of)pLH0h0ms+xt-4duA36egxlBlmyXfqV zqb@L(DE}5ZPUl>`D`1Zk&uXvwCXj+e=Y;cS%HrnqaJ|SWbE*3Fps%OEF|2t8Ti*q5 zB3se7(>8^GgV_K(zxR}(^x_MQgZF0hLWuxn>S>p0lbjwq@43(>9F}sc?2~ntjCu4L ztX~XtZLNAOZT5;`-FGj*o}L!h0?cw+izrnv(lAl^gbXEfrp~YrRFh0`<{)1!|IGEx zEx?fORGtm+eq8B>B^rgc&x~*}adTfzL#+K?OJ}kSDZ&RN)j9wvl0g>wFvRtus-j0e zGA;Kp!;Fm6QinWY7X(bToFbs(?}286{aoqpamt%Pg3`HM2q`&+{TocszpG6<$z7( zv9G<599>HqU8DfL?{JMII{vUB9ML7unn6d3?=s59Ch)8(*0vs3(x}WId$)&Xek3Uw zy)XND+``<|zLH5xX*V|0P^qkg)M#zrX{e-`T|L`J$24rT5YL;%zs%J_$DkEm%h23x zJAb;UB`3Z^r52{wNGE#2u-S?rcn_pRFh}dIh?5lRu!7) z1Dw8`zy~z3(0;`m@Nj|gtZB|Z3A)U5z@~!bS5$rd3D0{N=sw z1#Dys(CY+B6g)1_I&%rFHVP<_`z^!dG}Gf?K@ytF0l@$_dxOL+Z&=)K-lZm|aVOgV zlp+Q#Z?+;eP;%Vv6?POKIbyaaZTAf0v%^7i$;!t*s0$K3e4LdkUEZp-vyW!@-%@NK zK)!bK;d-*yn+aErXJus%n*JbWk{Kn#4jQIEFVp~K-~=|9<`=EVNpE*} z;;@loPw43tjm-fV9(N`k0iaFPH;?3e3QaSv-AxXnb{w&a)y(Gd^abfxM20^#RepO{ zWEoswQ_K`IEgMn@j(8uQ&YmvSYQ8}iAOan`$kNx}{H-JFGtFf#WasvclTU}YWp@bo zUk_T0G^24KX#xu;GZ>AYO9^fiGq!*uyir_FdM#8idpvq!7oN@rLOp5lUJRZU2*e}2 zUQAXa!hYBY4Pm=VkZXz%(Phy3)y`+0yOlNbjvk&wz{MD+;4HcA{M7HHC^?)jDmF4b zpI06a7l;!B!7;ad)Niu&*51l|or9-)gw8G>uu=vL4s`F$P+? zCR?47u7GOu2AvIfE*YizS^rGK=$mY)NTpUslR1yFf-OI9XAWLdhZx4^jt{~xhB(ML zI*U0b;kM-VT< zzcKFAeHJ_UUwh`bh5*3}AExB48!WJ1TTA1+f*7>X<_ujfF&7kpbq1)<-W~ee*C%(* zY}maC;?nrHbD5F)f}`+@Xh_hmq)TvzD54V$LH-;o2HU70>|eF;+r;bcNVLOpXBIM9 zS2r;fG?GtG-pQLw6AwuJHRm_Pic^gp%x2FUm7R2YAF*8YUh_`X(_^YS=l8TzFqNsi zAl6LAnsu_Q`R{FjXCEJ-yt>nHKDZ8q6ny`^Wog>zZaf+ke_XYWN(YgR=8I#pxW_d< z30nB&YXGjadfR9kX`2*|2>%DBa&KeJcgeX(XfAjyBgWRecR%J)_!}UF{<52+;Q;o$GH8xrnKngv} z???s7Xxw&{IEdH_+my<`FXspKE7D#Any8@h=$*j1dA|4i!LD35W9$S;kvIs29>Vf1JM8ZAndZn6qLCdfu~zo3s#e0>E`zb zk`V^>pE!%OoKasHUX@>`_C`&lHncvPgN7VZn4E#hMS6#yvzso1R4!m>WRj^snx($Y zH?E8bobM2tW$&0%!P(}2)e`LvGa?&&{~GDkpFC&&T8oT^GlymURL>oy=XurQbv|e&k`Bpw@HB z?Z4;pWZK1I2r$Txg&_j9>87_JMd#8Ot)~uqrtQNw<0YXh2Qabi0Mh?x)B$U zhQwh$L+7{2WlwER{3TejbLk__p=9O62sSfRa)mh8u}T*Gtdcbmecl~VW$BewsLDbE zhmU2WttHk}Ji$KHXOmKj)7Ow)K7!)dRa*E1{fXVP2Xoh) z`cD|DnF?1fJ=%EzC;N>4-|%1=tC$^z{dZ!^P&DqLLXt7F2YPd`EUWDr_$9aO;HRkh zx@o>Do5D+w^ZXopxHjg_uvcV3g70e@5f{>o6lzzqw<8Ax#p19xhqLw4!$ zce);|Z~GT9v&je>#9ub4o^O;kTki#8b{IRvBBX2*7*H4SED96VQg%x|6H@g+#>Ws7 z6|jOekPXFIYI*2k%G0? zVBa9#v1?-wc_J{A)kCK)v{NYqky!UNx#Q3GG~V1#Zcc3S-GVV*V@ML2dJJH=6BHaC zsqW3WgehTZ`D|4E+3@w=blr28vAP{e01}uJ3P~pvC@=;7m*q<0KG>EsB z))5O~&?Y}b{cn)sU=sYCL!tO|*3~>-OqvFhYsfCF79z>P07OctXXeB+uH+~N!_$(E zoI&6(lyb1ov5fFFIpAaLjT&S)2?wV61+4>KoSCn5++|2#v>MVFF|DCEA8L-evb{ zQ2K|Dps-zs$Dx-GO++HOKZeyxfKeYiXiZaVkHK2=?1?F$@{{J=jU-l9L{IC?)B!5| z#e`kz`Ey6iV2Efv9o#38QxWyqgmIjhT{HW^6KvDXF7)RwhU2Op1Zc&vng;**q}kWMqF3J< zVrA{|)QwVGJJFNPR0bq`B>!UO}spuNT5MpyE9cK(%{UB!@iD|Xp z<;L^fTeq!*k@Q@1?kVr{VM;x94tWcCqKX-rRzJM#q#WW939R3`qsJxf@D4%mOhC1- z0{B4^YYOn0M`~o-pk5%oE9s~1gH0s;sh$Xu-3fiETtVmGpfLDKCudhB#s!ZAo9c!%6`t4-t{XfgOsIvF1D>TWDeHXKSPi zj*rE6#o@Ns8%31ecl5VSOeHE_OGfwYJTdoDGYGg%4+(_~(}(;WpR@f=+(ih*uXrtB z5m(A#S_ZX@Wd$Bhm}5JRK*&>9z(Mw=;3KMruhSx8>@%%cA}?;j!y8;t;wR83%MwPA z)y@-WjQzI&x+14(cc>th+E;u0J_gUsn;#)*MN%ec+Vb81i?rg4#=mi8BIQ;Fhls3c ztgEwaDSlNyvI645SZ<~U3{vrb8*M+oemKZiNTKs6>njy=-$1cUN8|oyG{A|CN8L3= zc_BL6ZvR>^X+c|oM3|~)#$d%b8KOJ0!kjZ#B!@lokDFKtAuX190utYvW;`GXH!gLI zS#4))v0%LeRQN&j$yu75wb%293Q3Vm(H{4sk#&j&u|4mP@OMs{l>E2kOO3}zU_g~5 z!I?&*YB1z)+AIq9fH1DbUm^t*&!gMWG;*?(x0glqHlqa-59p$E2PJB3bUsbj4@1aA zV!U!c+=iVV0{Yaid3${h9z+uxj4K4KlH}60o(!VINKrqdGv%VZ(qls71Ac3S#Rd*% zIh2(fxHGjKY`-52Z)~!du?||4_KJ!=BdpPlqEBBOO^&);=kvXyD>XhoyY^+sT*ht4 z$y0b?jnqAq?C)@vMz8l^}nX-dPSf4KfKq#XNLfF-^}@KD#KFkK^Fm7^aWhSYG& zaQ(G9$V#&2|1{3miNH^{c$d;*sEqf;$FPb5FtDk;I@)_Fz0qi1s3Zc()g`MaEM(~E zxtnjwxc*lih$kfzG^ce7YKKZf$ksL@^##Ktl#b~R2nfoc|9QA=l8UZRjd}ErA38al4E987Tj*<|1e&biC$5oC_=l$#! zS-I3q#;?Eso;~RSTj~K~GBf;(Vea4L#@{jTo2e6XiqFD-oD|=`WD>ra5BC0ei#2d%VvzknR{;R_mGZ$7T+Wne z5{thdadPA$4J%y6ukVfByMJ_kQ=9pfuM~&Y048Ao*(VESAtlpKvSORW87DTW|1IMq zlndfL_fmsQA2{e2ujM7?X-gPg=9v0?$Iaf#mNJWUcxhE#$yM54G3hjQ(v- z3zOV{nf)p8q)*>({%MWp62e0Db}KMD@qIW~a(p7-M0kONjpJ!Fd67Jz=d6nk^}aa6 zJS~<4s$rG=uU>B`cI4s4hkxXWv|MFPqvG?3#IF3W^;s*tW)K_gHcOdJyR zD-e--7K!Ay&ne?=ikOIG9pn*{hTEZ`hrC=_qdU+uN#L>ccn0|1(np5gpC%(&2kL8P z>tD2D6rP6eq64yc;bX(7Lo=k4H~ z?({1cu1DS+d8AVON0zOK-||7GqRvDm2g4lXRVyc%1 z^cdi8e(a9-*JhF)z$vCTfDDv7z9hbjS|>a2_^X|iAv4@ey#T8Nq|6XE05n1faKL@t z8Gj{xV@?<|)LLP0m`X7mBHS$yp+>Qlq*?(F$%AGJ_zn4z3-JUo${ue212jV#$6XB| zxns@-5r*5ggfm=+qnYtjAeU%Rr78lXg}FMbubP>}|6f3j%^0wJ{S8dT>-H09>#q^>Pp|XJDHqLm({RPOd&Qt8gt_t7CM` zB&mc^L++hK@O1wndXUc;B~wvzDv=Q2?z$uoACCOGTinYO$|}bs`4f8D23VFHbo zx}^>~*sNcA%u`uFlObAv@KDd53mcxS$oHhleyhrf80QK$Ky8jL8OPf?bZ9R%x$Pni z%5~&EC}Dv`-!=eKt=Niy$UPKXN$Bg7qWaZ}$y-9v-;cMxoHJ8B4v@IVjQeoK3xNyy zx~PTr1TZmkw3HQw4^uhIgcGy|n7lCuz^2SfdrD(rr|eMU0UtI0TmYCb-N3%0MaGw~ zk@zk5?tWBL#1WC~E_vXLb z#Gubj*e_%7i~)}_I^y0vsh%r-UEdS$(#UsJR!D>faf+T(7^tn3s&Jd_SAZ0XmT-0| z!J1mbVqeIU|0T4M%{H<8f+f0w8-fLTA8x~hiJ)UE;TVm5g{(5(=!Z;cSGD1z4@M9V zrnWk^R9*}a1@eu((ulOZe?4K^g2M4an}1Kclg9c(f%HKNmM(Xw1v?~7=5iB3IaT?a z=08~`RC^PvF-W6zLJ^_ec%7$shviwXHPyqpOh6u8>bA!~jsx+R=ahu#G_ooj?=7zF z-?UP%^6a9H1IT(2=u(a&NCaUk8161`oG_f+gh4!r;kMbOnj{6#0x_d}v{4_7WU~%I zWt56uu=Rg5wFdTC2KSLi4nsb2D*gnU#sIDR{zhnG&S)zB$r~@+W&88n>GoIVV%Jr7 z!*j=lj=p^SKdbaWI)1PggXCEB%+2pe9PZO_Ht$7_aYF_+_lyV*_}`mTzMjI`bsD4b zr^drbl85^@;Cf`nGZs`QO+_-vrID*N@&?KQGcWt-Cs6|T5+{8OB|;;c*PBh0)x{>d zI-$8@H$Fs-5bwVzf3TTmOZXIgk~{tHn`|9(-j*Wi#J%?R@EEAv1T7pNYLxIVG?Y^w zKs?HpG4ZPr3>P&LnTGk%-H9V`dgRGrdDBm9;q<20m17jtfAy@jAIq#twLgCvu^!n> zNmB)tT9TSPs@~cj{XZT9y^!rYL(DMo2_i1BHY8FUV)!JW^@U}CGGyfv? z$D=|R%MvxxcXl7yKd7ib7lQl;T%@esvZ-bkb+9hTdB5u|!q3<`hUO6yCACVAAk!$L zg7r$QAHtAdah zM}=O`IqX9{2DqCwc2h_5moViO5<^=pO`wQUp^C2sCbL7t+=akYP&~=T5ofmk z)Wp%@d0n6{9?r62$_ayrH^`6SG(xx_@_o*7x`ogP4`OlmdBCQ`Yp+Pvx7GL(^%zo5 z=Fht~OXiMPn13|Iiqj;WIU2kXKty2gAPh4`>Me{+C49+@@*DT_*4pyxTyl4$vg6W2 zUR)yyljYqaaO$KkR=7mB#$k?q7vdiuy`)hg3?_2@VhF5H)@0~Mi8eq5QG`(a+3Cc! zYaoNVLmu{}hJ~e^u^IvyrA4Mf6eqx-KE*f+!u^e_WC!tY%LS{R%NK_lB{el3#GEyZ ztmnh-lJpM3-qme4#Um=e^oB zZK}aUx$maU@tB;jiWvL9xt1b|;hx+~bf2AI!4cHXuuc<74dWJd@%dQSr$-9+N z1wZF#GTy90y!0?Yc)r=S2`wX?5&KGl1iw4QB<5WevO=_;NOY)quQbdC^&!UP2&r<@wJXd4gIx70_Wp(!+S27(loe&s?0E zmwpy_)N`_bP@V351pjt3&q?71g9gB*&S{E?>ACP6?XYRtvwYdM8nH^~g8A1yXDQXjL{AXO(q0jqU=`l5JzcQklvi-{ zZs@zo{B>4de~HtK-ru&jDsi`;eVxn)gHekM=8%+mrNPV$B>qx4NIZY=%>Ah`ov zlFJWIxJD9Txc6UJW)Pn{GFh}XLtTE45W)<@`j6Mt_P7I39&xgSvLTqZXgLrww?8PK zefB2WR`)ktiOSt_hwZPdD$Sfv)rA*nZm)-6M(8n^SMh5xO(p$8|9Ql)+cMqa`s)Vz zg=iU&R(4p40QZu{!-m;VC8>F^3M*o9l%NTHJ?SS&IWsa%ZtbZ%^KQhtfCOephw6SSaFI zi24(27N+7@%l?phiZ2^0(uUv8l{4()&Y*Jd%OBA{&ZkvhcKwA^m8bgt1MyyIIU|Le zbtAoo+47Q+WC#2x+NHoGP_Jb4o8*elNArX)<<0i#(&i{k9&9dKtb>g1>;X^J*-=zK zqgXyraR=Sy>Y|fN9u-r_6_ycT`+TD%C!Mll%2bP7M-6{FHf)k;b(uh%gwAU0tEvPu z7}e&Dgsu0*WEherDDlrI@f6k(b0H(7X0_-7JeOkz)Y6O4y_RrFg3{b!&h^NuG?vUQ zq+KZtYv(?e;2 zK) z5MLwn$%a|zN{RZ9BnM8Yc0?*xT#61pmlxcQU#a8YVSgcNy zNu0m&@=tt~UTCa?ch7oPXh7^&vZ?s#C>Ck3z zJ7}Gxc)O=q|DDPiI#p|z&m)hFRSB+i=PG8WX!bnF5|Cnuwo+M zY`h2j*&!Y`g|p!A=k_GVfJ?|V`hX(=S7wkh?ZiBS1E6|D;(ORV{I=`xLfJPWjkuOLu=)-XXccs-NNVJ7}Xa z3gTH^)5gDsag$P!yX(x74b#F6&zy_;N%Lr>%56d~dm%3>dn94~=VzRom(LRdl%|m^ zn_|m?nOPKy>M_(Qw8Hut!7>=IGeV!qjcEBUkho1Hrq*gduG1veY=hj$c zY|%CGiwy;wHuB()M2Zu*pwX&!X16rhOSh85qkSCBRJ!CO6>&7WygI(R*zefzyQ?VZ za@*l#)%w@y-~z7gzZ)j`ksK!yooWP9AM1UI{Qhqqo|iLwRkKQB)~3Q`;mHuEWJD{Q z7XosFwMJZ3V0jthw#X^S9Bj=6Q^yx#t|TK_Q`F!PptioReq8r@=tG-np=Z$a9_0no zC2erxKjBjf_26v{1x?{{M2X7EHYoQx7UHE<`G3GEK+#~U?s zbe`T*@gno!Mose*m{86F!efo31gjg;eh22lgt7``y+ny^2;GJdeL6*Q zVBjf$l&j_rz0CCis3lixdv`(Z=r~K|U?aPTr`ocOsI|$JdOKPvGm1a3^tx#z(*?gl zlqLw`$!H&{*oYr&>{ji)6@T}5uXeF|GeE{f@m4U1a72BF83b0 zuh1Y)Tf1-&i_B=#_c-**`QzhLSYox`Z4;&%-bPNEK;lleCa;G9y!BJGQ^9ZuX(w@S z8qHZ1k*Kg|<{qkaIyDJgd#$9xiuXnxC&Y=o*~a>(L5ho%tCuRp5Av%8WX&7LkO(dm zAe&oLXUjhJ&o?aP2C)?+Wd~TFqV`Ah3g9=|3QC-Dh`3JltK?z2m0D83WvD~R$1gK_ z8gGrAF3{ab*Vc+)P=+1O%@PfXQK4;ixyWmD)ca=y2N?#>^gCM5RL1iAIupU_cNLt~ zmB0CI?Rg_u_BtZmF#NGxOj1?S!YO97ew(1Dg(N}Dn3f3`%I14s*{y+4e&tEj!c=)k z7qaXbL#Qa=J%K3hd!la$ASw**#OdqILmt3IyX!^R1H}b1Rc;8Ha#^)EJ=S{t@mHy_ ziWs2MU#vu!s*5f-DzNV83K%$2x)B4L;+akxP=%4lCe37ss(3~3Y@%Lj!kXjL{4($J zHrM5D$O>$btQEnSMtCtWBY*`gx545&Tr*Hjl7Xcr`PV4o(F*f$YGqL2UNaxS6!p>Bz_L z1czJd8HIx%m!)%%(tY<}&54m6p;akf4j0gX#k{25p=eDoa~NAZHIKACyQUUtTzm*) z?=eaxi3Mdri2+`4VVt!+?P6WE_>qr}`r91|s{c)|id%4&OVjcfdHoLq!?{Ipd}Qt^ zu`6X0lX|LU^-?CUjT!mKo`Af-z3)Y(93^ZH-&zUbLk%Z)l@}P6l2pJtw!DZ*n1c=} z>^%N=FB8@pTiNFSJQXg`M;wAe;2xb93f{qhy(g(o*>sQafN#>6LdD2JkecAja6^D<20xztZlFkz^Z*u$y*zNZggW)nE`8eGPcw3ix2=D7LW zY;e0vLSU)W-~4`LISmOgeYr~%hpf)_)_Tb8w+vUHKmfB!hf<0!hkJywI(<}h{y+PS zzYpRLIvMd=x;!@d-bS0Qi|yS+Z8p5kMZNNrI{Uw|Qd(yvHaiC%8*>RMcV;5%ht&i;r{}tpKX#@i@DqKq878D-OYq@^y4i5_y5Qpat!xm3lrc+?cYn zy>)&$6*zCTYWgGojZ`D}lhe5L7liFn%J5VYdEne$rj{!KIlH3b-dQ>3$RC+nWV`Pv zUmVaqgi237Xe&sI6yWTmWhFhau&2ZB-q1O3-QpjkC^f8 z!w9o9o+@hR*a@cQDFlbdF2V2dMA#eE@)z6Bpga!MV-xA;_s9k4ArVE&4lkNs?Dt={ zrb_U*{&pQ5IZv+B&(~e0%h-goP|Y35HW!7D1;fI}b!sXT$rpOW8>>^u7#sbo-J8zj z&x{;54Kf*m&FWFxY!z}fTEdL%)n;mHDvGZ-p#!zdb;wp&73kqVCpPD%ag{WuFSj0| z7?mzTXu=xePTX;7*l&MF*BuT%%O45I48?8WXKvt|HZpDC{bdSe?5%-+LOO@we>*Oz+k2!4+B|F1Y5x*_3T7yBfE^~j@ti> zj}d^2`2~5`W+yrc@Av~ktKIl1j{uo)5gbIwk1 z`PDmIaDtglVrjeX%vDRuv~X3uXnR4s-taf&FBtJ$N1=YE(7GSnUFHVIA1~MN{4zHT zmb%;@^EYD91!$&`MiQx(SEig}_~l_P@iYix3UD!M>^M>B@|~P`Cii%+2#6fHaaGp+ zw;E9{ek&>$7&Bm-ToF|7Zd^#Gma(lf+|=cCMMea~j{_gbB?^WO)` zWR%R`kdMz$RR5*MzddsO6O|_6eC{*5gOdnFsVvjG2TETsVBc;DMd+5&;fK3V$Frqp zJ{JWZ+g3lGlwvHKRqkm!>l%;!cL)alM?<2ps9{pH1lOU^TmoevDBz@>4cfD>Z4IO! z{YE>?oGPX}Cu5l}nEjfPJli<-uq=kS`o0ln67A|3X{5I~R&f~${V6Rma?l1j(BQX~ zcra1@cY8IEWd{bYtrC3F&Gh552>_7-!sGIv_LW7gKO|ICNFAfH{mP%S@N!2wEDs&t zKB{N6Zfre3NSfy3n4UurXVRmb7b(tRoQpZ2?}0bBaI4OEvAamICR^EGyB0{wxm9B5 zoywrUu-3*4HCe;ZTJ zo6FCVB|0Mwt_sw0W$8{!djIVnF!sz5!)%Be4sG8>lgj~OT>2E(=L1W(Q6yGKVo;`; zKq-;7(0kx@N-T}bIr(DEhh$xLBzQLXpp2wSrMcab6HzNA{hJ^2A);xb9BoS`cd=F% zChC3tujdUE=v0qtC+J;9;Y-8p^?)RZX;3RCjSG#h;*01fB-klahBJf*#5}iO==?bM z=`HCbotwW%7#SUrvyR)+rAmk)V1QgjFjeTTB!8%jw}-cX+9s`iV3?98P@>Bn0qwni zja~huE@#)O{v8=`HOZVb9%d!El4ET=?~wQnHc#AgWDZm;e6BdV|J2ClQ~X?+x`2JY z#M|Y1R1sRLOTDY0s4gFJBfnICcfi+8`UCc%kyk*GicbnN! zmOwd#5}Or>?~FuauP8#_!xf)t|7AJ;Gigj*mVPRlVI;5pHZ?in)N$?>N%Ee4GpiY| z2_ z;@63$qLQ%N;+N#iiW|$<5&sv8SM!4!o=F@&eXo0}rp#E8ahGAqNr|`vg|1IaNKTY_ z+UyW9LgsUlF120_^b>0TxBTd4wxN^&gxdzR2y=luNV+e<2dC0^bY;GM^L&qgi$V2%u1AXz;FalF}V-!LAQ z$jP(7OptCOU;QY(BMrS&UpT$|{ojFv8TTMsz;;Z6z}Qn)n}GQ9>W|I44UMyazv-!_ zR7mb>r>-@h$hy?o8+^-^8WIE~${17=Q{&C9qJ!2n5{kw^Zx+- zA-!KwxY6>x1&n+9gQPW{6Ox+(o>-DTIl?5m(x*RAR3pzI4QGnEJG_blybb=qLOK*4 zm3pXy@5N)+Bm5;yY&x=*KBJcyUQI-kW^P7~{=4)!c4fnt59BRa%+iIwpK4AxoYJ4W zKarPOZy=72cDZg|PCHZRr$qJa;)y?3whp-Xpao|@K13&I)Cv(W`AYBy*}yXn3L zwKi&M^V6WJkubeMy7a*1hq<(0S4-O~$DTho-p zhwB3DroCZ}##MB+z?<9}Mv1upAdV*~#ozV^ej7se2QRVWQ46i%jyuD#TXZ8P4BFCL z!3=SlZU>7$0KLic3l^1eY9+d-Mk3d#O-}w>RfD*{QH;Z8x9!c!TVcr_Y*0=5BM><&U-ji`&*}4rVpy$@=dvBpw`Y&H;7MlDW<=q{|D@ zi?9FJ-j)AD-9`VhON`|S5yE796k{z7GsZe&-wGuRPedw8w#H=aPs>;bqh@4DcFJDJ zAjWQF-yT~kvTwsM-;eJf@%`z0e)-&A?(5$3KKGn^U+2E>`2?fw1SByQ_?^TsTjepH z_4N)QgOnp=C}jSPy{pMziZNZ87Fl2Kau3;DYVL-#evYdA8Ks`Ax7e4dlY=!YR zk5ISg(%^U8@}gerON6|2{{;G6!BV@#b5D`C!@w^Og=U&M=$xOWwkj|P`wuho9oTD6 zY44;OO`nOKx3Lz>`>$k}!y(n1FfI&MD4q~f@Av)pHmh|T@89!bnO?WCPL84qD~=nJ z!mU1cjaF3}Ja}}IKV{Y4$hh7xHt6999D}xTV@5w(ZgxY-m-LONl8J@_5;sl{yhO>P z>S8NlMLUpjcB2c(j1NzSd-v%UnRjQRt8|rB!vsFt1VDJH{O+tl7ICU)K4E5siZ%i# zDCd1UvH7#h22JZlpStLr|L_LPY=lV!#F*mlU9$+pWuIj|MK6D#<7Y)osC-%YUD;I4 zc;uD}Q#cItwC4Vl#!*ZfznP`cs`GpL0P%X+pN-j&61<$=!`*Gs8$h_kWVN&BL~n&j z9ah-Mnd|+8Ax|N$L_J2NoPjxu=T7ZVY^9$lZkkoWiKCSCi`V`nOmM$14t!F|Z11Ug z>i5h;e~EZgJF62p>zMO1uQcRUIbWVLBu7Ff@gmhTJ9n#`VI{(hu5XIJy+$WJ#+UhC zsNpH>4(As8wpIsmHi)8&Dyu3pkMLOEU@v~lN%fcz@>I9Xn2?5dPiaOIDs_&$%(69YsDuOuS3 zN6RLo*h5hF-$f;xp4zZg35}X^vla9Vl1c3N7{%tqVyN(HqS|w~XPI=cGuUwJ<^vOD zI&YS}EI3*5=afE|fFRAI5>5?#+v>9K7q-)!Ul100<3ZN`I~TsA{_tczdjIvL*eexw zjzM92?PYF-fB6UL2p+0rv1Z!}-I;kUgq?f4PXPllR|Xin^ScZ5yKL6Zdld zB}?O;-1sCuim}qUgNabBD;V^cYvYzeA-|N9@{~BUqvBdC7?t@WSS=fwcubA6Hhu|x zH;km^ZXr^{$1520)WsR4fW9N%VO{#5IyhV_D@+uD&za<>u! zn0u$x+AYGP7^5tK#lf@juQkgajP4$I;CU+_Qg{j>^qqJ1Jm3)q+GkACH}{SwjMVLE zSReznU1I)E6pxTw~1WMtN+Yn7IFZS>Qr!0*ULN zdz(>yEX)-(nq6I&hJlci4A>{|qgp?f?hC@(a9TwTfkKsed?V-ipo_lwD?o8kCgC-E z%rC(PNARV2+)LYUe~?c8X!yfGLXu*UZH#@ZYHzH?6~oB4C1zpOCC&}^c3spb(sZ?@ zDx5D$BM{++Jh@)dot3;o=Hv1A-&pFD%Gbr-$)wF~jp!RiF*GrK?E>Zn96{%sL$bF- z2iFZ98?vJBs$B`*Ol4lhQWg|p$V+$96YONFK16RRa~E=#w?YcwI2_@FjDFOxC6ms) z|LnLo-zL;rDPx;v;xf2IP4tJ~v7?HAaRVi!gRE@p!zA8yPJT=`{s-$YqT|=IJKf^Z z4dlE6BT3TZkG@h}!&T&(J7U%1<-npcKgwN*Y#C-hw1!SOZBTt8s74*iMEFaqf_~;E zwqb8DPFMT2H=q-Ep?%GOipTJBdeYbLItbYmPI?F3WLa=8l$zRtPw7H^_<)S4hz9rE z4z4E|f9(%?#b#F7N6IEUy$$S`odG#czVb0YPK8_F9u;6hok*amCTF+pwV|1ABh}|_ z{m`w=3R*6_R`Sr?HOe+gcEJS5bg-e;;DRy)wjy>XF0jg+`n&Pp-7OyWz&&Un?#{l% zWg_h06BE--ip8v-4SjXdiE3T<9+@z-kaPs)PG1&0N6>vkm|;z^tQ;L_aHk)^_K_1b zuW7_DTTUV)?uKa@I~V|9-!Oe3u3{G|Dd`~wXu!j$b<@xarf9E0L;6}^3=u_c!N=aB zpi-NKR56GFfni!ZdQ+}Cdhnt`Qy%tsbwr1tSCd!FkEY0qqqi1J`dAigrqRmvl7Pqp zY_%cI&=~Le6uUlHjXAF7Jy8m!(Nvyt<+fGLjd=@l@tFFq=TVY|EsU6b=4dKYtG98v zpmA99@dQEdbLHqvbo&7pRp4@hH{erR5eGu8x=?7LFfdI{N-tzTXtZ6WNzX-4zxxe@ z+xD)F;W6znq?51tQaEZ*{)Nc#a@1q%3Nnd-=m5D2T~4SK5>l`T_ZVaQJv$5G_%FU( z2d*+{`4q6#f%Ym0SC1UHpQJi8uF6eN2uSw9xI;OO+;bXR zRp^FR%j?pkYlX6N_wsV9U_dMbycf__7KFe>of3a~eLrgN&7*;-8V+8IST~B9X0s|u zn%H~FqOwu2OZ&@MGRKk#0o67=O>p3G7B8zQkaqq zfj?x~Szi}*08U*Wvuf5*1msH4oLAqO-+zNeEpXDltY#V!sWhbOn_qTby9=7lJ&#wJ zZ9q7JvO08_8;5`NJ^ni6c(grEj*V^q87WUmWNkPS9y6%?Ra-X6C_T9z`xEB?)GkVP zM{k<7GaY*sAzjjr3AGqMao1&Em!nScpxgWWX!)w29e6$yseYyF{$E>KT0Fi3nV=4t zG0pc3@x9|Ui_cHfFnFCNLxRD2YrA=jbXYvMND0t(u5lzss3R(@Z?t zRm9?cY`(r%ODU{ojtPt}$~s$suEFEy28Q zq1LvF=RxM0U-?rx!Y1mqRSr3ol4o$P*j2t(K~d?i`m02K3D|^PK3)2Mb;~jSFaA+5 zoUBUj=GR@{HfwC_<9G#^h_F}Mu1VuKoN%rE5t){aPSmT8(`$~9hdJ}4yrK^*$Y<`) zoj{Xw7wEnZm+R12h3!z(-@ggpSkyNdgt&ikd{kcKH{|AO(&ZL(Yh*XC@4>hZb0D^h z=z6a_zoDsr@O6!vESsDx3=z7mscWn-$Y6Zr1Oc)T|L7_l&!e@1?bNo^ThEzcI2Wjn z+OAANj-rcT>$3JCpjQf-WLmD#+7!|^Fmh6}?DD3WgeT9m?&(kf8z_JcDDGb6gFk~c z4Y!Xm=N!Iqx2Iv}tx?`rFG#C~Gw@P8x$6@`{m5entLyN=O&H@U&c$#e)$vGdLNMl{o5sIbk=g4lsCd@L7O*$|n`9mOBMK5o4~C? zHnS$Fe!cl{BE2$}%Jv3-*Xv6vn?9LpJa8^8uVCf|FJ`oqY ze&G;8L5UnKVSL7;JJe-Xx6?8v;8#!buw*PkU|T$S`9<#C;iRLajcL-;SB%J0%yY!C z2J`)O=xd;0>uSon#%?lhHOFMU*LOPa|CIUDd(aD#P$g2LX;G>`V$pb>#3SmQ43%M0n$36g|SYnG)+oy-mqW4*~YaM=ngMZR)2rG5P zqsTvpAq802q_R;?nFmhI1gf^8s$IG6cUt-HOny3O1P-DQKDrK$y+2cI*3>7fJWrPh z5q)Orzj+tcwzU|gN+EOhqwTW)t;Eq7@8$NlHla^1vEM%4D3jMNHy`%PQ)r)S{Fd!} z+&c@9L%W>^4JtUP5SNj=G@9G=C4r=rQOM4^{9MO+Tt3Bu4n&0oE%}_M=If-T{*_@{&*AWY8zr=sNgo7VF;zp-S&yGKU{ zuP>;p*PM<%j^^+FoS=$EAxvG|^Z$A3yeUA!L<65smoOy~yt5ge8KQkPuAFei&h~9N zhaiO4Z)vgR6K8f*TkG#R?t7#%?c6u+{S~vmPzv%Lw`I!axg0>)M}mDcv7d}*&j{A> z+iB+!XsXK)dFs6E$Qak2Q3rY*@425H*N(+5PeYzs+7fMxck?hV@ARz0_xv@=yM zRrH@SGYX7%RUSW2oDqZeIUPOMOBo#>;*>|{Q}25_+x$h8V0EE0(qG;9Y-r__X(Rtb z;edzbK9e67KysNK5fw*n=wN&3th~(}d+4F|-m@>ri?QPgQ(`kqnt<*{2~a4GEOW~| z-8x=L!N+kLT;e%2dqL;R(8-7_>W`%|*UsS8(&@*5zdgFrboH2ptd9Gkm0 z)&RQBnMl{#3(}vJ*7JoMDqv76j#)Z<#a<1bpb|EtQ{S&ks_TM#Ey(o8fjs3AT zfFWAj@w*C3)UbBmL*nyGE&spO)-!p;2V?!0mG+kguZPmG2X)lQM|GB$26LOC|MI#3 zsxv1KtCM+RAAjfii+RxG`Rn8zTp&W14it4uWvfpsk)6>~qYll1q|gB+anN{~Bvl6& zIBOISt6Z5z_WAz&Ar7M1jGUmz@_fa-IQx4jH9+~%wJuzaaHEy0! z6UM(F>f9M2e)jDZsabJb;B=6qCc%RhhiU4tYP0K;5xjO0o4W9|5!lW>>N*H_ZOei& z)>SE`#--6~pZnx~#OC?z)}>@yA)!Zbd9#aENeZbgy`TDs8V^gt8!}p!qBQtVQ#uzx z%^oQc?u%qif_sK5QFy>TSXiK@#ES3klIponKDrhSOOhV$gC50-JSLKNlCvpO?)~gE zuC;$UT;P0Y3U~~8@!9y&`KO+g-c%vjEa#^kMr0~F{cE}*2j7A?#wOiIOF)b!Z7z>N zv}?RxcZz>kG+Wx|=IUj(R?XInRs?=dg(#I32~ImPqM$O1>(yb}&EEBgUUc;_Ywqs$ z3xbmmiw=Wh_Ja6WsHe84@0g4UcDNVDuu29*8Si>CrO|{{>4-{OwhuHHBt#!6O^gi5 z7hlZVJ5Ty|U#@@dHi>zi1V}vpc6|D79AE(`k^C0BSk(x(t^mJUkC}6t)`bs{3VyRd z{KRf@`R7;yR>Rw&UBf|>(f0k&oL0#4Llg;EY}vv`R83n`%H3vhkRgI-ead1)Vf(A3 zbRn|{G;w;zaW@ z)*6I8u4P0SKLo~kHUvpJYsCVUHS3*|BIthyykuf!4ua>ga|nH+PjPAfYC}*D)K4TeeV?wWUxbLs7zzlZq6M zhJ!Z znaOjnXZ(2ZxwFRVU%@B?r_i$k6>6_uvU38eV!3>-9zplC>*w4)jX_~lH6UhTyAR}r z6X~6K88S4T#z>M3S6|;eRyA2b!F5K1hjMcPKgo96+D?^{qYyl*tVlKUy1r6Pr z&3I|dAJ#YE8A_uwn@(3)r)o}4;A&Q8d@hiyPkx_Mt7e;G1I8Ngrrhzi21hsWd~y@@ zaDJQ2Z0+e#(a=(LQ_fs9DQJ6su#j)D>wnwY(f+gJ`SPUm;tz`dbw-#59(^KVx%paQ znC9oTMEcZMl$y9N!o1$AwKF2SQ#v0R*fZtQ50#8Wilum)Chx-$v2MDsoDGls6i#~2( zf29Qiwm0n6{`fJX)Ar+;HCw)eeW&{`t7YiO@B1c7+OFG80?JO>2UOoV&9&HnWKcV$ z)Srq~aFdh&P*1HUjF8N37ZJ8iFb&lqkalupOx2c;v_00}0coMJfRW^bmyXxDG?)#` zdVXB8uI!yAjjK#zAj1`gr(L7YdMJ=Hi`rs;>mDC?NuSgwO&+GVnqT~4e7<*`tP=BC z5a4*x>%-2O$+~5S8koHnWqK*M%fZQq4}j{n=TLd$wH5K5uk$-i(%{|Gpw93()CxBS zJVhjnhf_~*vaBD?3=oClU01jkI0Ipwj@;pzf8s0ecL=V&Q2Ch@sr5 zWV-_4^=`hUsBkead&Q{Xi=mNC5k9=%+KZbS0y+8-WWZwl5<#Skws?6mCQ^?wflCo{ z9_~WTMlZ#~bj5|dGfwiFfcu-ZR`cJpH+Eh-v3ZZ!^zfn1owxSiOM+jS2tUUeE;QqX zwJ|n#s_k?u3gGSGGIfvz-Q}YPJNOID4aCAe@$p)aA|^eY=IJ2hQX5tvkE} z+G_ERV=PIP&mf_4L;#h}&>a7if;(=-=e(7_3}SmWWJ@M2TueLa`8@ri+&&Qsf#rBy zf=n_!=CZCY*~B+~br=~2++NzRb=WVs#wFBROkvpV<&_}QV1&fTKdyGtA=o+8RR7#z z9QCoR?P#5uaaKYwfRO*8CMvcKg3*ZavAirJ3W3|%vKZ58QRIR(b%gzu3Q`&C4N-zj z9qqu(mdr51z{6zE#|*x`=uIYSf6+8`A z-5Q+`-kUlsqt1urh1bq?V?VhTaPdb0GhF3cD)uY6^gK->01T>_@OTWjj;_9WD8HC+ zQr=dK{o8bkVd80;be*4f|ZGK!IeyCN?q3Aq2SZT>v9clL;ZRM+8iFeSRtQW~9VN&{?%?YElYJxQg$qL% z5va=`Dls{D+qoQ5F=<*5LmX%#N^6BK~dLj-7sEYX9W-W#4Q@*15qFK|R4ydv8zAXwqNH#ODd|>$hoR63^pS$(7?# zrx;bD4mGjJ-E&PS&lJ-TSX*YYQ0R{+OrAShG3mEnG_nchsxl}efZRxx9Z-@MA#8`y zemBtJlQ|G;SW!N*`(?Pzlx;6T+F6K%iL#l``PUh-3GY)mhU#zMg@BinQMHw`#+ZP+ z;R^-PFzfD9=qvR^5ubL2r*EQ8z35E5jP%xiI?TA|USPlC(lDmWhG4(V#%+Lw9)~lk zPD^Jun7MDc<8z4#=OYqZLT%})*-@cpV~Cum+#nlM^D-KBNPpuLhSG4<&%X(pG)jf? zoJiwagboGj2!(V07`DDdC$iZtw=K#Hl-JA3MA;Y9d27B`Go$J}?}g!J){PHf9Jkk4 zH^qO!v-6cu{=4&)be_ldvCzWG*vozJ2kEEYV;r;}CGeOC1^vXHSueo7CT@m`xH4(wrxfxYhaLHiQ=2gc@{0;pgYb7q z*NKVQd!k*M3_WxR{u~SY)qKtE`&*w*49>P3Uyhg4@;Y{})2Mz@24F|ZgnxG@!o-2S zf?LOXVfhY4c<*vw;%MMKKxp;d?TXDwd0w%;MU-sr;Jx=cF;Yil9K$SQf5LQIerzoQ zC2-B!7%N?mQbQ6QkI)|Qi{U;*Ulw2kL9=8S7X#08V%eHUsr`82${@z{R7Hw4Mo2eT zMt(ZmRQhyN*ivS6H|gi|xjNwS<$1fb%<*mjiz!=T%Ve#zVQ~iamEEF1B6fghe$^fO zRcgM~_D5Tvxu+pY!I{?6%BXO~Ig(KfzZ@3LS&0{~P{KfQgJJat?M8cjyD(smxKyZI zq^!d?xa>FIT!cbNkeW`Oip*}omQgWXgw2$>2lsoyUSGoAg1b3Oslnr#CJ(Ci(`p=u z*v)(zrPsy$DCfD>FuGR#aZe40Sl1B3MxgX1G4%rHWWT2+xhrj$pBmvUgioYX^= zExa)w&@Qv7d2vbFzl-?CV4|dNd|DQ@Oy^U_9cPZs`F#1XJTNKr;Wz&0=j{$hlRM`= z>@+#oaJ}0?laTjcOFq1&9&Of;D{&|I_lpiAyV!@GW#vu}jo*7{0cs)u$l~5pKqWgE zk^)7MbT6FVOpES=N3PO+W#Ff;wYRCooJFmpSMDp>-2O3l`ssgSq1iX|2FqyZmj1Up(qx@<}Fj$QevmHs%^U+Xvph)NlO#I$|8Sh`L!_ zukXDnUIz&3$m)^?X)I*g%-}Qg*78CMj*J{BOi(YUAsuOungpoUqsVwa)x73=bcXlJ z7(S%k!>4%0IGU8zy)l zOozB*o>{^Fart{~~H5DAQbw1uODvJFlbY=0O&R=edA@ z@6p}QXN-V<5o46t>I3h%DCAzl=#kC<*FfyK-toP-%~HgFm68LkSP*PZ)RVtOEHNo+ zN)xCRn23&)vJ{!1vDD3l8Awn=RVoDvs_4tM*dDg}J`O6BALIo(5Xy~s%6UO4dA)yV zj}_&83rT}RF9!Huiv1psJ`&|UoRRwwLmqyk1l;fAU>^C~P$@MT#J5Oeg!al1p@zlX z5*7dfu_jJi=}D_MPqmG)WC3i)bs^C3y>BVz3ff4aQtDIU9{Ozo+&oupOPaQ~Uw zes@p)S+wCf4Cm<*f8k{1$1`rS?>s^hsF#`!BSc#MQA7$6d>Qbzw*6o1L!s+csb?Q# z*2NntwsC6l4sQ;L22JYBWwze2s+_M-gEi@S!x>AezCE2|8I&Wq^C=`ujm zImyQGxqF_{u;~I5Od+QqQ~=9}Nbu^5AO;ML#3SSzWexutFUhxCAZ6lx;<7=D(d8eN z9M=3+{yYIBxgbD9U@ehclsiXG+r$*JPHCRopWaDF{g=Z4&s(d!+sP*pw3u}--8*XF`*E%Vq)j!3so8Y7;%(ZUrZq%UOalo3dec?*;GvTRNX(Wm>TejL#9Ec%9z_J?U1+f1Ixb zymK0AS@4}_*Gro^0rb;RoD&q|U$P>Q{`?O@wIi=MM=b#K>w3vG0ZoWnu&$o@Y=`3&SU6RcW>~ghYiuf?0K2 zOKSyP##3Id%B)`QXK}JG-# zZaVAz4pJW+?ssa&ZKAiP&MpkUDDeC#%jN%hPTtg=-BVk-i=(rNf zcwlY(soe8T0p=m9G-Uod6(!lP6kKrg21S># zR?uq)EiK@IDr;H(E8#fEta8=|xgu_J29^=&N%xitJyl(vXLASS9+-gb>4r_ZUZ-^< zl`dxFsK2`qxhCjnndMQN10O_Vap%6WnG*><)NGb?CfDQSnpt4SNQbcEKPd;(`Y%-U zD$q&(O>dFU2^b4=Fna8|d44`fd%n&R(bQ)r*?HAE`_%zKIsODcc&lei?-)C-rh3=T zTh#P2MX;%*M1Lfd{Mz8A?;Vy@U@E)5A`|i(mNTR$Fj%i}q8vyF%b3*J;%=rNh5WR8 zIOl8H7sdndkXl~S?Xy6bC>3_9;758`l#EJITf?80S6pUi`W^3k zI>oLpCjC#BBmz!|HHgkP9WX+LUVSD`^Hq=p{ST>qyu|jCM2G2e>5Ugwf|8Kma@q6ce;*u+H4{i49p#?HMp7U|y%4>CYC^m! zTp|~RzOmx~E~cr*Q4jhRb;ps&Pm0t;rW2?c7TDEtKkuNt_?;&>-X2jde0>l_7g+yT zfAK$9JPJ)RDSahZU*6<+&NolyHQD~Tl3@aNY;jV8yuVWfOi)Ismeem>Pa%o`=@qv^ zEfokBi%{fMYyseRcAnB}9_6oKFUI?_7TLV|R3oOAu95W*e9Z8@oB{^E309pgql=4ZGKMqMGM1( zCH^`Qe2X#J`7bKqVfBGyt+_FtrHIvRWByM7MI*o`+3pM2_RzIVF^p7e8nM z^r3TF-hytwMuckbF4R^JMnV=FS>|eq2SEXTYDdpIn zaE+*V9HzL0G5u7PuUv5z$1pIPw*nvgC}oLfy<38r4&?0vJSagWeJ2pEh1j8OX@K&V zYKW_1@Ga#4t5xB5=(o9sgGiIdt5xz<-+wi4D~6_m@`KpGl@Z9@>lcb2t-faaJ*KQZ z^C1Q)UOjkxsszLVV}U0ad}b(@X?TkNk^XZts8dwt0e&vn|t9)W)AEK_8K z5KHa@tgK8-P1*9 z`4C-$QG|UG=g)2{Q0gEy0XNm{g(vJZnZyBxa z@x%u+o5sEkS88mj4}Ke;gGkqpg!&HkNV3cOZPu)3_QrbB+BB6dPKYw8_Qr+8^~we)d5G z$+Xs)~pgwN4Ev~S~E!A-h- z_JbEn0sw0Mc7QKnA3CKInWocQQNe1e6iihCiN3ka9?a&CbF@@1SlwLV1hf!wd&nE- zv%;w7tF`CT0%`1RZ9}f&A%qW76*vdiV+KMGmvJu#7ksEZYZ%Fa(5EFrMP7ViJ@y~_ z-HMC?i%@G!myu7ZX&*3M;B6{iGe_`Nl;!`(usB_2Z&NjN=)#;uhZ3C>CtLoPf8V~X z;oA|yG7O$iUQ>i$fql66MFP`(oQH8zU9D-E``Hf5u z<~5mjApQjnkf(Dml@-IP?ciLQ>bZM9?cZ9<7Z3eweAOWYYKD7Oyfdf0>NmCe%R&wV zWUZ0|tTKeqz3I5ZCa(+;))=CgY~T+jKN9d(2#(+!0I&~dwkneu=jBw^gY#>$E*ous zC;bi^C|7^0J)p2ti>WU!^`|?2n;XS+w!rfIi0*{`t?{s&$I4#`lBJb!b z>Mz8;``>(?x7}YzDtbGCN`Acvg`l4JAt&p8=j_s?n&&gaQYw#oD=u2(4g}a#QjR1L zzY>43moH^nmXswv*sV`17Kg%XFHlj86V+*t#SjkH9m=MpE&Mi4U=0$*w;G?z=!?kO zN@%8c7I~vz!OW_M)ln~s?n7tZ>J%y-)2z4t_ZA9av=HAWC{}kYvB~3lIoM9~wOU^# z=Xhk?nzx?6{1q8mB!?p9t;%(qyFTNd_Vnkn_m^KN-+Uo#DkOiMVJxL&7cCi>T%)i~ z;w7nW!O=BbHNslWrXyU}8dK;Q4hgL3*#&7?jJgfEj-JEOk&;v*Y+5rd3RQo9D9S{< zqr)!@Q;cw`izML8m)ziDrhcjWc%FzeCjOUd#mezvC+)`JPu(B2<0u#YBQ6_S!~)lv zHC2C^z;)(@$J?HYss*E{49wH%K?HE|GXQN*GLk_-pVT~>QxYX{U>nhURqh`1I3dLX z-J@Pqs<9tHm)^C_M8h_3G2&V1gB4wK z;4g5UM;2y5;S|)m;!4TU&yPMo10PNWMsm&5u>hIPy>g|vEI6l#QYc$OSp%V{HH@Zr z%WkBLXo^}I(DgYt54gPv&KP=E>O3Wvm?}?~h)!8p@?Z5MC)O|WCtt0ab>l_FUH^TO z@XF95_jEXv?tG9=&Oz=DMd+17>X|d{_F{bh{UE&AeQ84QF85jTvC zb+iM@)k@#fNi5c2V0P(WnD2qnXluJcJ8ZpKOP-n78p&WdbqQnmQ+bQz^(Y~l&})Z8 z3(L8=rc`^ms`Y6Wm926p*ZcN{44h~UHu-$|CSqx@<7}n|%{8_t4+kOSQb>p)hC`Ik z8D^`$(OaHeGy#u=Mn#Vi>Ci!wlZ`Q^3P@xS>f55nGip(sn^94NSRQ08(B?A(Wp+NO zq2df5YUR~zL>wsn8gNBuIOzCv_})VeD_7pDb%cSN^VW$og#un69k3Elkw}~vs>m+Z z5KHxWNMBFP@8T*?=1Q0pLhtDE36;x^4!Wfmt{dlbB2bg=I(B!`^+Z#DkOZg1qvQ>^ zf~I4wl-NBv1Z8U;#v*iGYiUlC4i|C#0Fc?Msn5h)C6vH#qWbdvXHr~rhFEBWlG>TUD-rT-`;_Hd&(HfWE&qs;#|Zhy zHZ$aaQqMnwQWQtk$V6^_2pHiv*$^T9z3bX@TtVl#TZ@iWLQA(iPE-(4Ap>tE`|3Cn z^`zOPSaBIcd&2=7M0?>e<$zrdWGAoRWCU;|1X=9H_pNf@D)FstfdE0B`^M>fXA>G_ zlwi1to7C!CrFI{_iDMa4lBFF%Rg29Jj*mFCx)PsyIXj)m^%f;@LSv9Z=ZxQr!skbbE1_Oy;0G61ZTm0*-t3@do6BCOtd&@npG*qbHAP6i=?Z||I0 z^a+yOH9O@M;I~H+^pk^o>EEad2E4;bVx+ilxyU#C@14#L& zSkIm>biB;iep(P6i$3831@TRP&9@E;%I8XR#!0HftQi0#<;#_i>!!u~7^~Z2eE&CZ zvF{1!51OTD0{&KL+QY?$W-u$`)+^)gFe9g1h)!iw!{;c`U_KW^64O?hb$QCAXnzIf zk=isZW{QhAeP24#_>F#iKE&q(L*_I#y0Jqp(We1OPbQo70ZQkA0KkF2qW3C%CZq z-kvG4)HCAGx5~z@cW9qD9#;fxZa?lIf}rWyhd#zq@|-sOQ&s?Ui0oIq6dVy}`3y<* zZ1uf1=tqRE)wU)kJHR16KWU7;EF$|52d@t)8VoW!pHkYygQtJ6(#ODcaBx86#7lq7 zjx6>Vh8ZE3FF*6Ki>}J%@iKS&(1C2R`S1_9zt^9Dd@izLy(Ea6sV5gAH3JWY0V%I* z|J;|d_bw^H*$gvZBYq0x=2v~33U}YM)f7{is>eW*v`CQs9uN}@s5DiZg<$E*7_cl% zSvJvN)mtKVvrU^C=sM;I_Mb`y5tfc6J?NWj@^!Jz6>d~yE}Aw8_)>gLS8UQzKVg%F zG~}9IJ~pN~8oi8$c}P5TwTI_$eusI&!5R3`YqYKZiaPIo8^3nmrKM|QFFfQ=8am>~t}L!9%q z@Ja&hN3{YnMWIgoEZWy@;oUU&7M@$C#|pIOfS`KOO6)8ejRG|jQs5ZcQNF}AxwT6+ z35kd$#r5=RO07}nb`8~9WTIZJm-aPcE;c{3xLIkPuyCIA)5JaWgSXr4#p2J1az116 z;o`#RdZkz;Y~-Nzau!5r*{yK?Tp&(-*{&6$1L@BpolI{(ON&5Vjm&cGK+{M)OsAbl zWZ*q%?wGDA<+fov8%vhN#sN|FWPW>st$X>2hKx0dV^NpRrYASdW8$4(0!~OX?KNdF z%J_o<&MOR)0^N*`ooakPs3s=0L6 zs*^9*D}hU8sn(h$*;)S1Ff}lSCvl;LG(YCZtDCQGC{SzGMx!x+iz~}r6xl~XTUYHs zcyejAT(tPlU&MN|IojHSf@?#;YhUtAd?pwT)hKxk zLzgJqcX&={FejkpZ>lgC@4qXi*oGuBxB9^R+wMfdEM>X0{weH@D>A}zJdhw#jzV%* zr?b2vQM^j1j8>V@Z?n`7bFU-cwrt=5Z4;WE1k`9~7S0t9(`bQb#gs8KBEk~ILLnCs zk;TtBr(cRo{^^HxT8t>BNwl8nE&Qd{^zN8i*~67XK?DoWt$C*Gz21BF`t*BGk(E1G zRGWJbEtfk^=$8Q7o{@kJr5r$0yFu$9L2Nx#jzsiAZvA8QqRt~LU%6j{9K;mdh z2_33Ji5tP{?poD zL~2qRde}Q@6hTT%Sa<|x1TxjK*v=mTHIVMJm1JZ@j=_3$0yS}7Csa7e@dY?`!Iw{`v#gHA|a#ahqB6E)m zsCpxtn9Wx~d%h2Tter1tpQfINEUI5d?AW9hDyI*|>{vXcHLqB%_gE>|rM%c|@BC4+ zdV`J(<5Ba3)xKsGoa=dDeQ#fxF*YlpZ&)w^4vn1R6jyyFSrfwdDqz#@hQ47|;KaRz zVe?bnnjYq0z~S(!zcv>Da+%cvju>bb%8^_DeuWIcsq!j(c6=8!jy^<@LzaXL#bD|! zPLhXDL}B-QCBSaztb>$=@SW{78(oZGsEIaw>NWBVpl*+xL)hTLZP%e$;q{z&Q|7Lg z?L%jYw|?>CZ#rD;fbF$!e;01J41H@}?sfcrfzg%B#lJ%*e>3P3TaC%iGOQZKAz#ZO zB_n8a_oaAg3;Iq0;yT66h?oqjEABwJtq%Ii+}aKl_No_0_YxA&SC^Y$wJ%B=7k)@O zX}O6iGybwjJ%jjq0|gmMH*M;Eex77C`QCLRj7$0rClf+HO_qvgAn{OcYko%C`n1D(}Bx?O0{_ZFb9qEO38p<3fRt3PHC0DM}s$PPkq?cmP^H|O) zkdyz_71n|PRELz#7FAvpE@#cXzY?QcV>R!vJNcFvOWcwFb4L6+dqO{Kt?nX1LLz)o zrx>A1PMmTGmVUqah^FWFG8+4r@8Tk8j;b3iIvDMUr3*Gg(hv+3^yW;{wSt-kgu&#q6J3{L+Gt+vvxWki1u6{;ggC%slV} zi3uzb4Hc^)7q#2i7vUG8_PB0RhDM0=XB`!lPubfV3La*E>OAiY=y);f!%l!W`C#Cf zL!&#{rui*r=4#Fw;`*b#-FnZA@&zVo3D!(#!F<$AKhRt&VCn_5IO>^8RkJ{V_uR-3)T?YI5iNNw#337uB@x#}7P zi835E)T#Zmey8Vf0wVAd-m3-EqZlA%(M~J%2JINwG3nEjiG*30 z!kaJA6v9(*Fg~w<=Y+(c8|Qb`Qn-_P1S#HC!2HBn!`g@- zi3=(aH6~l=RgI#XVA$u~P2ffr0-B%{%M~LkYA`2;EqrI=%GlwpG7mHds%mV2yGcG? zrjs=JnYL7DWxN&2DkMtR@d~jF7XiRNy6lcVQ=s7?tY2t4=AaF(_k6wHPW`9%S=HpK z;uvSG73WLB2JnrZClpAH+;!_$SX9b(Ai7a`^3-5h6MNCtM~DY5cH-8{n)3>_%U6$| z<&YWxBe|2t6iGT6Q!GT?0+jnEP`aPNE-#l8!P|)loFgK zrZz)}X2Vr*AAOtTjU)DQB@SMV=-HS?w5&OWfqF`FTf*AecPza+kdS&rp2wx-&@s0) zm&Uqf42mE1gUE_F49nE7P7$Itg!X81!dJ0jNb&tmY_Xz$8_Tl=lTZPwjS%NnQ8Kny zB38|I^ZUE!yldJ|X@-Vgz@B!rAYSnj_Gp}h0WQ#DaE_2sASP$JUSCpLWngS4MFg@9O#UPGc|<*h2DYHqa_rYLSxJWmG?9IC{*pFDS1jrt?a zuXh|A@p3&Bv<=w0nmvzzOYh?-5Rwz%hGb$N{|v4^oeHcz>bn7Czo6iOLmd-H#ahO{ z@{O0CM9II%(x}e~u;ny_Igh(rlE2PG^2p``Ujn`4+KrQTxr5pDJsB>7m=mhEvl5ZB zua4C}G64j83G^RkzQ1%MTS{lCC?E$h2S?gEY7*|mU>P{#u9o!uz*(X_&;6Ggalt{^ zcv_t2;B%^nlaIJ%&r3^*s^ypVBw#|Ao7Y7MT_3>ok#`j@b_(c(~YmHJJZoBn>1jml*9KEw_mvnvPVF_A51? zV&*+pgJ6WZOnk6T}!9Uat@v<|L z)Yy_1(ltus@k73dBA3o zMUpRiIo~&vlOBx~>>7w)q;qIJ*_F4Gj|tJ!VPRO@{CW-3OVo!##F{^fWm3Z4NcDg3 zVB_DrC1Yg$i4+eBu5YOI)VaiVMJV>N$R4oZ?t!?g z`gNuG4ssRFTsDZ`E&0@nZ3aAkYzrcII5SB8jX)i*K&Q|lZj#|UR1sAWmttMTIMV7A9QFzV^;;jT0=8Wak22A^Q#7D28IfNnW$v>aaj}Z^%M3rx& z_2<64d@gq+(%ecO!Dq-h?^qCh2v~SxG}}eT!X)!0i-3hQ8?zhOQ_Txo+zmSxWI*sF zly`26U6iWE+FCEiNOYmk@*i3M1a7Ex>Ty13y)CnSv`(3Ogrm9qnQK;6~2aQ>XX z8N#0!xZM@|0ai629>5c(nuniki(3BI``;Fp>O0uMa#bq?^J1==W-M1dm!^Ty#Q#`j z9*J4Om2RL(0NS*_;EsF}UES^L*v~sKc>vTztY< z8EEtkw(5J2k^cvlKxx0|#iw6(p-k9||1lw515hxnCU-dfw&j(Ss!5;4`#D0FntR5XnK$v=yOxL*SosL^- z!%PBtCLPo?9}0pdRE$$p<T2 zB~jssdH?800zyo2MCewUs)t|vrCV_#sU^C$g4#>HWRxXOcBZX%s9t#kg@Tu^H?1DZ zQQMK9?{Qshfn8~3X?{w*u5NfoX;2m;;E0nY_R00BoH$Sqke6*pROFCV=>mh4x)kk0 zqN<2_L0O%v^k-frs%m0Fo*4icwKq-O!=7u+J%iW+$Vo|3P&T=XkbvPn#_B+U{X1y z9FLh6B!qc@U?Ym7lk>N-ILQLe9YNeJ@6GnGVoO5(gk%Bf{r>kCaLxqlB_#nv7 zv^ujqLqHkW(5kFwEawZaH;Yq&@MYasgB~upmkM-BCPR-YbBwN4Ody*@$ZL6}fpm_z?;Lz#RqL}~~y`<)< zT@#m-+k3_j?0)fSG=f%-juarIhebvrU3q>@x6#$TO8**GgO41~ctbJu^AF6T-1ZEl7X^NLx z2?R)4p4>bmpo0{W(GDmDsHaYDnYeg)>!igicRupFO(50kc_D9NA|DMa;piYTXm4jABpQaKk@Vv$3eQk_7aQnmnq zG#L^FJ8Pr*%22sO+DqRK4jG zpUa0eK1;`jsh2ok2Co+K*gY5yQ8tY=b>7n8mK#?Mk4kSRs>p-pfQ> z?d@}y4_04P??$OY)9cMs7e$fC$*Lj~l>!mZAi~H*vML7lk>poZe8){}hUytM)d!5S zK)U2M==z*_?8wsbfmR*>wy_{6d`>dzi%xi9#Bmt{jnr)jtqr|IRe~Eu~s^g5#3o#4UE9UiW_v>Kj04-++e( zY66>qPe|5YHaM~ZI0KneENWgbsLP6jDkTS%d>2r0onZK=AJ?7VCmyJIXm5WF_0>cw z(~VzluQ*+5D6v)6#(`~LW~-`A$n(gai7?veY%Zaes_WOOgIp(hyH~yLp_>2O@7L+h zy*1Qd^AdfkCI+tC0@|C1r+fBQ_Yr8HkPPfp=Oe2}y=a~=xhI&&kSUg&aLW5W-~-{M zhy}u7qu~ZZOiV;LX4a}pa3T+aMRgN&z+$FLufs?NVv+&Kv8TW?e16rx6J5;?nlj2o z(?*xj*ftk6VIVAF2OhQBsG(yYgPnJu?{qK_zO<)~o_@K8Hf*b-o%_51Ak+2$F0`PB zQ!XZ}53_cm8y0S@I%vk2Dw@xnG@Gnk3oCOL|GI|@%|kKY&@OH(VA$RT;hBmR5rtndNAz<9@o0rc|+_6N~U zR?Nxz;F`<}rcQG{j+1@hJ9lL}nm@h?m0Y$ib@j;HIWLTEUiO{$5B|Cn-M49f@WmT2 z2+DYXh(wicqF>b+(*bjn-wyxos9tpBoOaaYH&EAMYe-v{4$B)DsG(wp=6$r-bOJjU^v_nA-!#)eE8e` z`E0rdm}pQ7Y$hP6yP*n2oNcOG29{CYcCijU$mtXPjx-wE?xI;^Ty)6f3Ys>m6hwpA zZ{QzsxE_52Jnm5v+#DxzJ~)CrW@ZJgnO;WE_z~hgoBGkCFV=jg9uA=NupW653~E2ZRscDg6wI&;?s5@X_ScKl;HSWh>2 zZa+(KW1Y~OW5C5=JAG6W+On&Lp4?hTzkRF^ZGFYd^>Bg+pik|1)F6T9rWQ@8q7&!0 zp-J5p)ZO9+Ubh}Za-_;Urt0FC#e3X2SC0;LfCrbbFB$Cv;!(3p=#Z&R=-F)p==P^x zL4SCBFBfsk>P&Hc00*7o0rWFGS;LLeacAPZL&u;clUvc$u}!{Hpz0BY^@RV{>Bn8v zCgXMd>AECs()AoP$#0L7Mpe-zV~JH(B{4D%lu6#OZ!!Upz2}I^Q;*9 z3w=I;P59RE-^8N$m97armCkW({X1X4i)I=Y2>JJmmfT9U2Q$2Mb5I`ZC=+mGDX1XQ zJ2YtqF@xgc#Tv)WuAo!qHw8nXp@Ru~ZS}~h)T2D9{s-fLsAJ0E5GUf07w`thPWZ7- zKW##%54@c?0xhH8_+a>(NBg9&mB_liAWMX!1wlbpyh!66M|b;CU{kPw2wz7KMc2c+ zBz2@5%H+PF;&Hrqcn^j3h)coX+w9-G*}WAsr?(p&JGTve<4-%#hL@?KKAGvFDll+* z@(4y%uD*a17j*?gpm-F4w7Y@27lR+cJ5O1cNg7?RbekmdF4eifbB!yfmC+&7+R!7< z??s>b?@ef5f1SIQ0@|AhxXhX)+y+Cx1sc}P0G^~@!Y`b`RBCE(FIC%``bWS#;Yf%G zgG!jR{8fu4uXxphl!UfQ)HhK0Fe>GuGfBBazDiVi{b@U8&L@b<#=2F zHgeVk2$`sbQJQutNdr&wFwwns$E!yXV)&j|?1XUd|Fi|ZBlm6k?c@FEkr!(|fY8?g z1VNE=k?_RwR3h;4YpXhF)wC9L%A$7E(_RV}4b@4s;suK}Xmz@}R2`E}2_{mHIL#%I zjnACiT|$?w?MAmg_6qvrlY7zD-8DhkqP8M#=R-9wh_7X4PcwS;(r$F<%#L8;P}m^@ zw81eGWw03qCt(jgy?M+U!+B0!Dq}MIfEO9D)i)9=Um)|34^~ib0k&T09 zkHxD}9rV~sHT0AF`_O)Fl_{?<>rkor(s^;)>S}S(8xQS53nx^4Fn9e+swee`5)c%Z zkg}k6L!fl@=W#=zDV-4DW78RTLQJOGWC(~3n$TTAZ$4ryS~9r>{oszR=-KUk zLj5YrJtSICS$QKx10y7-l&|BQhEuNexaCSOVn5V7EMPcXK$zM;IQ!W1XE?6greD6B zlX8GdQQIZ5+M(+eigICxbKZ(3v~*%6j3(;!c&M%}RwFl=cPu)`E^=00(i`{OaQGB& z)mS~Hf?EA3@kjTo7J%^j`BSmy)Xob6^(>#T~AU3VQdk-RKwV_n?~}+>;DDi|Rvl-F)#_ukQAdCSa5hzNsi6JEVu;vZ0tI~MovQVc zn+4-a=#4&T|LlQ%X!EXgU1nLjuD&Ot>lf=ed}a$eb6H2Q2arU8^lDJ8X5cWMur3vO zy@(&&VK1ylJkNIa@^;khcPxJO$R4z3AGG0%(~F!J9N$$zuRC-MI%0Mw3M1%x5JlIi z%alcOLUSQQ&1?ptOx!6Xfan7up6eacRz~kQb{zWt9WS9jKDLX}X%2#*VMZ0tpe!L@ z#WU{b=zXd~T@Pueq|-*I(%OwbuF$ZnMww_3|HjTa^h|hmwY!CapfFd)-d3I!TX2w* zGx^jRKKPxptQk%0ECoY8_@S;T9Cu0wF#0ofIIQ#W!WHgLIEUc6cplS17p!VRKVIL5 z9)B^3408?f2(v=l1wyATYC|V3XhR*%ZVZ5RZeJucf-xP&lgaSMcsGjUk>S#CsPBaN zEvTc#LEpK3XRJ>-{|9XQo;Fsq^>Aj( zbv-n?y^JnCrZ;$#&95Ka5x=QMUxTNH@iw}sy$zqoA zkSIV8z37HK8$oB>ZwTpV6oZ&UGQ4 zTWy<<*kRFO0mI>p2r&g9IDYYQ@%u%Y4y&rS$sH<^G;%tyR6MD)j7F7wg&udLYkV61 zgbo*7xVjnjw7K!BP-#!)%0d`@`CnYVG6w%#s~!SL@=8A6V+pALx|YHTUcCt9eDp{8@l=7J!mht z?!$Cm(4+o^)Ga<7)mlOq9@!gglCN`ZQdO61!Sc?S76dc5NrW6S%jyFnUg`YCHDiO< zw%xz+m2{mm28ymhb}DL*DxSJ5qj^7L5R@fwOrft!bO#&k6B#lx*iegQ=vS)+J%Cjg zeD>HNMFJF15KQNk>x3j4EsoKFpt49<4@*a#O%6J3VHNduxa{Hs4G5Z+!&BD$tQj6z zz!%tuqcJ?Zd)~4t`mPU#yY>%~5lHMfri?11vzB)Rt3*i~v${`&BXvaddQOz^%{;T)NN=ZW zC?JeC(^p!82~)(kK@UkPS$RLzPpIyuDl!OI*>xB^TJ@s-8-Sezu@r=mv2-zYYD~MNGp1ZO$1i`2c);&E4DxH^U z1Opt77L=5d4gS>Y0U+Wx;oyz;*Z+1q+P1eQHC(x0kjumHxb)tRGJ2;UJ>j?DFt3~A z%Tq;id4@!}{Nf>H5eN$SUepevjrX&9o6vFdJJ3(>-p<)eAL{&rm*N@uCmE3G@~QF~ zf}9T2Q+7o%an}N`B6Zx+PPw__4eX;M!h?E_kRBF|SB`e{OkXDgK_)?PsH7ZKXf)gj zkXJ!yjfx5Uf?>*|tYf@DoQ6vBLfTb3;F3di_PUDA#2e0optH4Awr*{Q%D{>T96 z3XK${7RnOk3=vS`G&@lX`@*W)@|bjG3z`u@F?(*ZaG z#$t^*xTk-{vi4x;i+~_Mv}{Vy#YPlEDGwROOXtCBJ$(0F4>yXhnbC|Mcy2#>oIEh)4E+Wu`^lFfdtNbI3k!#!%u?aa7RV>Oe~pDLVw-lqQ_qneWX@a z=d#WQdmk|fp0cP7jq8ktmw6e1eJSn3GK`nfA|x+biG+tJakO^i%ogv?%uL3Ivw%_Gs8Vc=*~O&l9L#Y z>;Z>>ibPJ9E00K)z6#JsBXHyMY4y|!>S}SM4o7c8@y=VWPhgL(JP*Z=2ZPnB$tAR5 zTRr%qds>;|RCB+^cb3rUi`$cKsF$`k>%5>W-J~A#5M7t#QvfTbG@(B{UO|s;Nk@fZ z`y}atJPRkZ2A?+y%g*pP4f2qvyeOS40ZH=mcqf?4K6GX~`pc8M(X-pAx>P;eTEvF) zj5f{#K~P7q`>6w9mbw?d>ioUW-2D;MK#OJgx5^|J4SZ-KQ7}PzFPRhzvqKt}tmkK3 z7+N}^j2uKhU6arFqKEM$qR8Y*1K%Ax9)#xgl>8{T#zckc<>~3-L{a_WGh0!q#4eC2 zii!s|=1f?QG~$ZD5HFrNXGJ^u^#5&(cx)Xq&kXQ+A&2K3HYON?4eK()qAitd0Yjo< z9j0wR`3lH{&I+2)RSkep{S2Bv_k~1zhGgU~A$(reNgX1m+=O4g&2Ok5G8&G>GRe9_g)fc~$ap+MYO7cW&&Qzfrd7?%5`SF;lQzoCX+V12Mq4F- zWyWAw_fWInb(-Is43C=53yRtn{zl@WiPdB%Po#5*heYY)Ji~aY@~G%=Vs|-sk@!8E z_8~FB>y{jzw6HT?Amgzagmwv-V*3Z7O=cRQKy;hLFIWh-RGhbZ6uNigo^Yf>)}crl zY|vH(c~!iTFeEB18`otT4CyU(4Y61TQ*hCxYHO+5Hfo}-)5(+YF@P!ui9(qZR}o%CiQmhKiT{)m%rF@XevMh9>P!^$DKOwW zXjV@th=`xtQ6nsUW=@dQ`I=cBsHdZvfS_sTY!I%s=pj+Q6BB-GHk_Qe=;$8w;h#P$ zk(KEJT(iz^rF@R2tw|yeT}LN}4_|K}z zJ`iqTfl%Fc#Et_;)=MWf2gjm$!K~4sX{H;Qp7s)&Ho6=DA!DW7 z&q{f-@pg%*d{2~5W>aLB)PCr2uS#|Z+T_&HRWxOE1#Nt}UkNJ0dSU8R<=fN_BI~>% z+z$c#DWvS65z;cj0X=nw&=7**a4(h-gP=)ILn)iBx5cu>0LJhmJ^WpR_ppE<7*Tht z6a0t_EoTxz7)Kig%nL$nQGrG9=_dcbo;C+{G@T-Msb_4rGIe6_75cGmA856tX>3;3-GRKtL4*?~e>|jLIlpS8w zCY|7oGtB`I%B|#cBd$(?PQXCDRJTlxRBv_=gcZ!KAsIp%-t7}!FvOmr&Qv`nSYqKr zq6#hWRE>`4Pe+rBI-A@ug3$swuml5#V@}05r~m|`$D>?w(Bknf`tt_$>rr$=Nce-h zvdEg1rg5qBPox_JCVDY)eCV0YI|n%G@+S2&DlB>vJwl9s*TG5j*5gI zQov~rnm(oq1Qt1{WTl~clT{WHZmcJY!d{7KGslAO z9exq@!U;{GZcSaXnPI@LbEM`g8w>QBC~CicKVouc3AHynXxF~<=QWsim}-tm`q;J# zYQ=Bl@jQ5&3mKUyqw99R9(M1qNqkRABgIp9+60Qs_z-)f zYGi&&sx&1Nb`=CNxc=N~ms6^CqXzl<1cUh1wox;h+DFY$-3XS{4~p)lWg>|Vqy2)$ zjY~~4MwbxpGm2i>D9Dt`n{^?AvjCeftduDr1eQ(i@7T6d z(yNcvYm^M~1)9`lZs$!t0ExoyFVaA0dX@OSn<)njjH=VDeBiDws+jx7lu5No{3ZLA zYWn%i(@D?sLTw|;>#KzRJKd?2gnP`|5m!2Hx=JM|>@uiJu`IiP zQB;?OMuO3~6IESryQp)OZs(pPeNMDuR9c=uyU_j|*JU#QTx?Vw60XaN8-Dvy`LHY6 zWbSBB#@G2OL%y(V2tVc47%6_m=s~?|lqTSX8uoZH+%&jqqpqBqVF;v{@K9cv@>wQx zFhx-jL!xAyFL&7D>E~_#A(|L|7uQ_;Fno zq5k0@-5hI?L!!KP{Klth$xWrpDl$*BH)J4~r)-6cqJ)D!BE*!A2$dD2?k&Oloq7?Y zA<+yyD3~4U2PTLJq0IyuwHPf7kO7;{6my5816(`;h35#fVg=3{uKG*Q6RK!178;pQ z5juE%K@@}3PLOfv96S7waafn)d`y8%*}7wu-75J(9}<AIz1FgRu&b zoa0}~_1NfG(GEnsO4$+XPa9)mdYXhz8eW%qBN$y>VhUCv^V(8XCQ1)a@Q|QTe+Ij< z4vCt!$)bi~$$6OOMX$hD*JpTY)?TH2AP?$S8HTRuLu@m9e1?28J*MFV!XdfPJW(E0 zk8xYc(fESyk{9h-a+E=}xP$_Sf-;qpclarGILT(ztW>7<50bjn-b>SHOdGWf9SDlb zCcg?F#mM}yqV1BRL{XurY$M7MIhxp#Uz@BD{xnA?5ehV!{fx@jsqKbdm*yH8Fe2ng z*q?-gPsYZUZ=9Yx%GDVXNM&Et98rGbG8FeRzWFSCsjtNXrxppJ(HL#LCxs5hl}Xw+bw1$NW5o#? zWvHL-R1ETvD0@v}1GQ}#aReAnPG=$Y>8a~YY+`h30FpAE)Mv{4jNr`BuFNuWvxbyL z3=n3k3j+|#Sa_a2g~nL`4-9_ISj~4jB}YFaKh(o`dC4eZ^nZO(r+{U`%j>H}cUKk- z4kF2~6@JfzT$~7aWgKtI-hLSfiVNc%+JGNj;}y-iTFf&fD$^s@nXSXYm#G6m=G;H7 z2S1@1(W!wg1p$OXODMG5SeL3%i~tbCG-7~INXpKG&PjOMO3w3czLXtOe+=n`iSmo{ z`Thpgumg{_4KPD`0N^WP7;h*@=Ya4R>-P`fA1%b`(2OkX^P?af5jw7$eqIZz1G6Df zeLmIjW!43t8hEXb8wpdoKLt0cJBx{rL zUle{kx)vZIq~pn-s@rQJ3uH2N=yODajzVSx(TD&-;UfTzpfmQkbdg>$^Ma5b7R=EQ z!b5?5J^(aTyyzv=(fpRG1ep_Ig;Yj@qCunKC&M98wnQ&*ID7lN=&dpi*L36$F3sDq zx8~QO4}^GfD=H)P1(9JK#w)VSblKrweEryOzpyL)N-$Bwl|464z1WAkTPs1EbR~1H zd56tK@?z2A>r!U}KCk?yqTtGQlZiD=JZ)w=De5sx&ChVV zAONQa%Hc=EVF$vP$O=G-GfFkxVX9l59V(E6j;OR_@1}w0X7+aD!SJ# zQ)Dy;6Q_la20NYpdI?;IyhGW#yB>o9{bfv1*(UWUvm0b%j=F^EjnhzACz!Ws2e4N! z5yMeX5DlVqo8-$cA~Mqri53-oipo#f<0Xq^UfEwuB0?Y;y<$z4H?toC+6B)9BaapK zqSiQEG;)BDP|(O^uOZb%9r6d2kx{6E?H4Sl@#%U_o|yN{b`LF^SVvC17C4-swghiS z5k_>ZKuT71Y(fyQP~{Pw*S+X*spDa&8rs$8p#B=)R>V$4)GK{yPdykO?QRXf?dW>R z{!Hi`t4?M(hD3FCdT~95bEJ5F@R@D$FVu%AvNj#2zqETGSUKwWzcPsi6>So7U7-4q z)MXwr8m1?884ZnY-rkR%-;qpQ=UD|R%n#t{{8UO3Qf^T)vE1;1o`{AM2-7Wqr07OT z4I4~KCf7a4268&4$wczDy}0LDN1gaxPLA))qUHaLzCjq4qO=RkkwqPB0t{r+^McV| z?7Y1&`gnA!%Q!;Qc@#X~dgsPIbo`vK{_6hE6}%rS>m2Jy8OD=ERN=6&ho0P8^E(s* z^Wt)49ls>u`5pb}#hv|VLbn^VN292azpkJ+BDY6orM8@m(Wi)TQAg znQvaOFmZ_v1AnV2Tp%~(C^;NJ=phjZG7_G2h%_q*!VFXOzVvpe81P=2PCr6B_an4p zAD$%U%!VQ-%7tITHd5oQR4dN2GFrH{Yb{C zp;82bLp_XFB!NH>vCjLMZFP=oS|~!Bwhf>SFZZGGT@_TX)r{ZY%8&vCP3ki5kf@I0 z&Y4H%T0OrW`YFDqO=pPqQhc2sk_K%CWkagSs2XW2q@Hz1!Ejh3!p-;H{JUrGz4>>O zmY=*<-FX0jhwh=!=qPkZ)R-@Cc%lbl*M27$)|=2?L$2e7b7m-s3bjL`Au}yALWc2V z(O^9q%EONKneF@qiAgt9x@A`#?c7&GqgtI{e<2D z=!*(pN z0}%M+}m1}HXNL^H7arS$`Qw%#8}4Jim>8ZIEzUaY5z3K>QE zIs*@hsx1=A=z3WCBF#V$Ck^<&2e%-!u&0h(|3SpB3M-clqQXqWc!NWrxvgjzk2r6< zdHeQF)MtMrUkNeR zTfWnw=eP3Chh#Euup*d<7do99+Pn*)&AasZP}0JjcW=!6?pDiu)RlV=ODJp zB6S39vL0=}so~C94gKk<{SnU~;w#8sz@tGq2=aChF*JG6(rq3ihJ=Q5jxfA%5Ayvo zkrIPQFoTRIIx}osdVcl?W?v1VTc38&+8KWD+r>jOp~Invqf|5!heT60A}WIM0kGyf zoBn|sdi14o#1{jdiYKb`7k7JT^Nu>2RjmaeSg(g2iq!C^;JUI7% zJsx^;hx$FMrmOAn;-h;u51<*N5vs*2aLa6j%^ELOX8>l#b(w?M4n;kf$E(){&|RDA z=-Hi$_AN6&Vc6p@_M`Qi_MxSdn}hjlT$ipYDlA}*Rh36$uGu}K@+56?Ab7pp?;qa} z$gh6pRXp(G7)Ywl*9<8HF+_u)6e9+MhBYD_*tct7@3!Y2^^cDiiUn1mT0)lBknA9* zb5|OK*Axd6uK8m3J@5Kap&!W%;7R)6tG%%UmpN~wQ|#yu*Crs~l~)E1a$+5N zzWkvu-GKYp%Pv|lW&lm-><@e3(U-!V@Kg4Y93c7_rf5*LvJpiQ%s}LDcJ8aAyI*KQ zb!h#m>XoB?KK}jtT?6QX6&`Bw>#^VMN98h(3QN-K5<6^9BpMqtY{Pi?WzaqV4h;08 zzP^6+yC*%gdp`o#k;zc$lP?XRho1|hLMMs}OQbChQk#^e7v3g)st5Hr5d1J0{^7|! zv~z!*6;>L~p8}tGV?U$j8?^7^!WpM&mup@e!``y%l3Z)!Olj)L|p3wPd1{Tk;+9oI>(yWe--{R8Ot8=KLN z{Vpq&rAhF4qVuO;M(FgbTk{V425;2NZc_Hu$?UdprZ1JAJz_;ono*Cn10{o5A! zNQ>!nhu?*J+Y^0g;ds2Vw?FL6VlXTv^Vr!*4}NM%xjdxApiS08AjIwRu4nqugU=60 z^M?729&)pEK&M}xbMXBsF9{H62p}XxF0>wQMGa3JULyGGrI*$!swhvR6Xw)4K&Uv< z+mXV7F%P{|LJz-O zl}3Ewsh9_i67kvX8$C3&YXJ3jI&oC(L_^J_Ci5(EDT+*n@o+uj`PG_VkGNxT*JcO3 zycdaYvAO|sr*bF!@Rojb^TT`5N%NY6bJ7+aV4IY8D&YCJ4B~WE9)Vn)fS_NO+h3`n zAKl-_eiPHM6Oom#vpCg7h1gY;jL;szwi1u}8!F-#$_&}VHJo#V!A0Nk)l0rU^Vm1P zJ7h$k6H<5Okai3m0+h-s_Jn+W<5Ke_!mM2qzAo<%A8JOgo4*(JI{it<;s0;%I{^JC z>ip;TdnFB$KoUYRKz$nCET>m2XF;%_D4r++VxdYu zAV3HtkluS<`b*w>c`vV*U)}%C?#}Ma?04GkzCNF1-*0#7cV}n6pZQK(+_fiJ9G=z8 zMmDNAyz072$%Pd*Ccsj$fLePUwDwRvn0F*YLK5U|sj0^&!)s12`VK+)<#W*tNHG6| zWhu3)6OIcyftz=DlVjX+EEQd=x`fsqL}-1pU`8TX=V5oT&{3Rcw-(UJN9ECJ$Dp82 z=DhA^kbe`73z~K>o7PFXEODJIxn)=?6i|0x2|c>05dSbV6W8FK=KSRiKJF}y9@6nQ z2`8!#P&mrDd;1HwBZ?Ocq{;-tZV?6tQr&k}%OylvNz_p?e}k4&(k=>z`rBX5qgNX1 z(OXU`ps5Heaep)JTrK;EN2&$mQ0~4Z=qjCJ(N#PZwEW;?)Y4ZgRSwC70xsSBR~|s< z*drYD`r}KX0a?QHDsICyLeY~hS$uF(4$YcMxRQ!g!WOBMxPi9zKpAamjuoUN zv)~YYs8$r$kV{qZ^`ogX&Z=t_qyOMW_pKWq62utJF~TZhh%gA?2tJOQ3t|bZL8A#W zfKal?pzB~hDjA82Zqs$xcDNQDH>HfuKh__!AYY{jyQPHI44iqEEpIlMSmF32So9T+ ztH575I1z1bpP*s^bv1qH z?4yf5xgfm#TD_;h;XO13camW@o{AK`iV%(o`Xo3|D4|Vlb!b(~L_HETB}dSkEzhU6 zA@q(jD`?KNf+uI4gS%(zyqTmJ@{OhC?{F3qjUcPK>O^Y=OQixTx@FlnP(}-O)}Vvk z@h(xd0Q{x+U4!a6c3It6K~p9SpexU)4??+RiR)x-v{sWY%i-t}jpgY0o4b2m^td|| zPuMCH(9YHpx@T2cN`j^{zvKCX|k(~!ma>7Vl#JBwDjiCQ`__Cy4RM`v|zjq%a6yo za9N5mIAzHOiLwlB-2`O{hn$l&S)Sr{6%JP7 zJKF2eq60^`q@GVtYTQc~cLM@aE_h$lJ66@851dm*$4>RXgIINycWqsjYghnV1)3^v z*=;CDF`U+qEtjBMxwEf?o@%Id%d^JM2`URHJpn-~p9NT*gTL<2qMc<_mv_)xPWR`E zW1_*owRQe_&7r81GSGF>C&8#rcJ@`!A6A!9Tc6ybOEXKzS zeuv`L;Fz}vc_OTAef%f8&%geExIhL3CkSIS^9m4B&yn)bR5YMJAD1S7(QQf;I{tF| zi;YvzK)KH)!y=j-kYR0oy*F6_EAd>;&x9VPq4n)x%xnym4e1Ik``u1h>GTd%(3Zm! z(2}MjJWFs;#sy_081wW0_7rmH(QP&8Z|0WKNk{d2-DP#I>~(dxd#@%?;-rg@ytyVl$xmGm>GSXxThqbv2!EoMUoUqYs-QMRd|(PXG>}IZ9n+7dO)R5YtibCl;kaSm`)Y;U zni0#bue>q5KSs0KqUU0wZ@FZ7}*P*NCbfBXr z_Iq7D_4VaYf!Eg61YLZ|K1izq`Qkw}_=ssaP}o?};Pa-QJbJcqCh9I`_h}_%!-Nh9 zCK-2ca~l*d?8&3X?i{*mZV^qZR=njMb#;Ug^GtUsPl!pnMEUq(H)yc`s&BnuE70HW z>y`br=+(wLRIE~CtAnIYgRDaBZc}MPCv6K1b~IMV8gU&hdE)m=r`J}fMfW$%Ko`vH zL8neDpy?BPJ%!^3U$ z(1yd4QGYoiL9O*wGC*Z2B0E(AfZw*Z8dvsubm4Jjbm~z9Xv&0=H`~=$;<$@1?{9IJ ziAnlf5r0l;Zzn=4T`RDmqmD|9mt0im#qX2pgc_!< z%3c=7|0wdEE34?D*Er}6bE=+oSX1`*c&#f3le=naf*H>^lA=xmA2T@ zMF;KZoZyn+WOQht&W$7J@|L~Wss;vk@9|R+LFy4_b8iiLsv++ZVHwRori|uJFQGgp z!KRE*S1oO*B&Xgd~_1(ve_XXg*x`*5|gMfCJDtn>C6- zZkCwDmA=CVdR-@V^;0k$IKD_l<#gR6yLY*y<7xK2DxiMwh*&fM!m1$q-MV$@z+#td+y%88$A+ z$7<=+i3Q{MWlGA>YfJ=RIUtG~EAy^`gO)edqgBllv?^|@2{J~2@|K16eX;fR><$Ml z-Rqz$PN|~#$CbP~SraxUYNEyksgpH%zc%JjyezAJbC~omu1CNrFB)HF`K-J|D%lUAWYT)f&VYE+WJr)}U7a`&T@=c;E6z zUOn-mYpx^Bp5Bho<#Q`;8J5v8N9547iGJDPiCtdzJ(=W{^P6U*>y$Lgynj_Etdpc( zViGKt9q)t0y+sGDZ_cC5t(xPhhSr`|?}qBVmWz-`E-;KvI$+jr#?`D*0*5+q0pNo0O$(a&j1$$U%mRPoC~008ql~hZ1@h}H*PvHgrlb0r3Yu15 zMl&ZA(QKCxkD5?IN7PkacPCWbWc<*JPE9{22j0R9PkL#0$**~!9<{nhXR+3s!HRdj zNj?6jai4=RE~rDCc(&_~&RVpytHx_g%$Qg~vnN;3u}8QHeNq`ssdG?W4GJ0*IjVsd zNbNJB*NumXuit$u4iDtf!JZn_)LVnv25L}O5$_cm-(-L%W}VwJ=~C7XCezfiMhquc zpL_35ZO@?zu7;X586Q=2;48mkIbzSOw5{8RK<0HCtyt`?8sk?bA8pmCu82DzZ z)NiG~y=jU2`_}kUiRiD0DCGnG@v~(9FpRsGG!%lv2NZ?M=mo?NV4zZi2KsAIbKeBC zk@A~bS4788E}*093utO>*|l;iDDTF=yG#vKYCWQBa|!R@z$Ev)F8;hA*$i6GnIn_* z`QQ9}xI;OmdAqLW=>oI1fl z6Kk=X90+CI@dFgw zcI_*7?C(ay+%1YRk}SeZn_ z3H`WuouxX|+36~D=ZJV5FxhNKP~2s#xEEnoB0q_HEPdErkYP+FOpcq{@SdC0w-q(g zSJh)_eK2S&nGmO_{6J|8>YGj+*T_Sw4&>cKC7VhU}c z*xN{1&u%Avd#GeIettcB>Qecf$!)8^q8g-~FS%_}=W32vLBv7OXD~SaOaPad6!Ih4 zCIKg{h;)S!9R!r0xmx&aQUtUL3JnpB0p^1sRgtCanc6={yMA6q&l?u7_$3zxbfZO& zXv8Kdo_JqC(oKINbBF#0f>21=s*@hE-Gw(s!5#PvzUeNeCcaLcbhJ>yk;A7x?7@^I z*~;ZDgurmt7T)z7HH!3HPvUe>s@2Us_^2KwBL)Z?_AW<-xET_=FM}E#e2P~4xUvNp z$UdsBsZ#LVbInWsUTrp`p*}Ui+Loy>rrU=}a{rg-!F*{|ul!zonEB~a1PUy>>c&Bm zHVaou*_Fb9E&7y^ZqjdKFAKtmyi;FA(oRy6BjYw&8>D64Z-&C7{?#WtoMPCqZ`^=kgmWz{58a5PmMr1Yqh&0(!xq zwAaCKiiZIgk&5c}qKvp7e0`(L(4GY;yi_nP=~v3-#b$>Gy6zm8t#)z3(05GSK4`A| zg8Vjw3Umx;C6Wa!o=pTzR&l%+32yPwS-1lFddyvXi~BmV(>&wAUS*AM3Bwi1VP*EV z08O?tK{Qg-LelXn+ENAW*Njo~Qu4E~^_vZEy}+Z6#(zhAKS(H7bFr3xS_>KROAaC* z7UTB?Zk>|RcNcLv_9WeQJ#KC+8JyRA!bbY@!_+G7(y+*}U^RKH?y@-D0O;^AxEIfC zt>p`C&roWE6e`Mpb(zRcL!@W!g(`%9&=w`z!+W%CImXN05M#O`9A_3NR`>)*o${@&^GSOnVj0%2R3F?z zz#)WbO#fy?ok2Ch?`-FC5uK0X-?50;OEbxaEtiy{83%FwuUv1l*6N3?eqjL$Gwa!293}XS2m^8fzeW6XY+P?6hoZ_fLi$vBoYb00u%5LHQ3gQ=2cw1g{k$LRpdZ6Z5=ELW zrzG}24jQaqj7P@lRbCcZt@y{0f@muj(p)13Irv5a7)Ddxra;gV|GX_&1G*@~55bK$ObF(Maybd? z&;VSv(ZCswNfG^5BMn`L_sk&0+#D-0c{-fq+=)iTD9C!Hgk^E|Xf{e+0K#`1Y*tx# zJTnOk-A^mevpYjs-$q21Q&&x^r1bVo6^UyMDn?VGck*mGg5vRP=@Xyvi_2#!2$`Mq z^re^RSrT-dsA=+${R@1Dhvn(M4RS)$rR_@^Mk`1TO7pul7Lhz(=V9k;wOUDs!3^yX zx8oWv3i?JmYy;ARjg|W6jXj%S<)j`GC`5h{-wPBT>vrdNY^~$7Q_kxAkTEiSJ)M?- zTf>|bkDX@X$Xx3I-L6QELY|G|iz6`pv~OrZ2CDLOVE{3WNo!9=7a}{2&IPO&?*vNe z&EdOf$Kls;)ireWc$OcP0hNQ;c+%%fMs?DHkJ9P=Vo@m38cUDWr+y%b%U#&3+u=Ez zFpO^&R-5V#N$4DhLg%cFi?lRD2be!d=uM0kBuE2>+BZ59iiJ3gFpH9d}Nq#~8_MvSf@Y{Fg(_kRR`v5n3-PL}pc}V=s)D z6Sq4dpIU(uY4e5i)rT29nt~Uef3<{LBRr0T;a;E#^`idhl=J<0$<(X8(R*W&8Jr_O zvURjU#PniW=l^U93e1QkWC_{>?Se6?yRw_2I{B_iRRrfKeohc@? zoyj5H`@lNMVNFtRpX>o1u4$VIO;;wc@fv_O>w;3Y`W;#&=?e_nqbr8We1^lk-tW3RPIc`=7vw@Qs_ z7~v&E4~=}hGt+BGq1#7crst|iH-jn%qPIf!Mj-eMrKvhH{Fgdnfkm;XWi%y{;KN&`_~3BeXT?@$ z|G7CDNj-{s*9>3j^R9H_sIL^ogr6LL2l4Ol1_@_Der(Mar7OqGjIm{MNwmzb*KX29 z)d=f|pEDAC$JsWA=mn9`#iL&IMC0E!pPcz@wL7%GvK#yDtKUZ52<_u5Z>29ODYZs! z)a{jJ*M#~p7#5UNn{nYZdS!SS;I=AIwRYhC2lcgst;LBx|ZeD|V>TT$snPoR_nwN?|)18!9(BUxYc2a5|xq@_hP zhSZcQs8%pWkUd0d0d`N=IeCPI`6@c8sRcvSmo`-(=n?sWwBu)dcUAOxJP!l;iEMUc z6V{8lXOLb6n*I48(trkcKDVB*N~>iL&ilYJt#>wvut*sVfu)v65QcG&M62_e^InG> z@#B+RadwvX8Y9^zKbV@cq<$nxF}f>vgFwS9R1td_O&Kj7oQSbP6ZBnaZcnv^NTfGTK5cCx+E`16pwJuw3j$mR(JKD{T+XT>=>Q8sN)p(u< zY*bI3NX289rYc13O2lw#v^&~G|O8hhKScx0Ya4ZW4l_dAGv80Aq^yWoB9 z?FV#V>U&1W4>Va~M8<3I%WOc|KX!@AC>Si_#>XdJzfWk&Prz-wgSRO=b_evAwhP1Ta0Er301<<7$$F;?+XQ(oEn+nE6rU0#iAKlj% zla%XhGMLhE+kiplAp@rfzi-|6?N`K(qXlyQ5sQ=34qu4-0x?NhjBF-Vho~=IKyb~; zQC3Fv9>^dYup%$vOvSssLMY9Vl3T=FM}1+E)>j;ceoPBadaHo;k*gT`6s>Rg5-arR zib$iS$;4S{o(4`}=Yn}pRmjvjZ?q;+kSHaGL|%S2#SL#6S8)u&?=|yAZ+!_iJmGn6 zGp>Y)IAa6je`kWr&3pA9PqS|Zo;YIz)jv95w3AwLwljr3U=+TA(;kX5zLlouDA6)X zng#L#+T}I3Y7Ae~eLz!F2d>|a@dE6QixIsyu<%92ketBw8PL?t@_wC)q zU(O4ZxwSyaC`zUx7#FSS2+7O_sE^Tl>wSQoYKzZYi^8it!Y>7@Te9lqyyoG$0K!LA zwUQev9C|T94H3N#8lH0y-+Y5dvgkKW9a4Hao_&>!kVeZHG(%_9Tg)O zZ2>c?kU_Q@_t@=K@t2`QmyL7xvn;`Hx6e!@s$a9Tm>wqsw=fD%7||2JVs5^X#QI;o zgV@NE79GE1j1GK2qyU+v>}6*!NLW@t<1S&vks`9Met$vbE^Rlj)4<3uR7?>QoLt6k z7h&A$SauUa{es;CvWehAI;fX2sPi~?>pk-Be%#D_@BP>3z2kL3Uw>+{RKS&HFbr5g z1TUeMIKcJyGB&@{kStu_j4UJssEDud%rIK%QQ*T{ZCgzH&u|D$bTl0~6!2RoES8q! z!bK;}L~w-@6+&~I#2=nc)iD0yz;1f|_*7p@U7u(n`)`@1N1jm%1+A*L4~v!Pr@isx z?D*V)e_~5@9l-8; zF_vm-1f#J}25J;?lH+aYako4y;vohFqT3Nn$v<`Zb-Q%s=Q=>spXN!2`;5qVD=>3w z=Z#A-gVi6r&BnsYy9Jx@Lpa^2mUWMWTd-w7;eLluFdY$HHY&FV@EYACud)2tv2Tf6@$l!xC{IEPO9I^8rP zubCc%P)OQLgwq)YYLtDdg>M7>rCbDu4`YJ6p@2JAYP$^t;n zD3)2E^_+BNT{RCzSP}KNnoiXzuT?N0Xu171L|jn;~VlDDpznGlz=|7aKZ|NabhEEu!}58CA4D*MOxV?Uez3ocuv=QwdTS|onqbe7X6GbD# zAleCBFFJc4%&LdEZgKEl%baS~OB-v=6kcedRYXGA_-PB#Ly(XyDxGs&Gs$;-YcdOp zt2vbor62R!1yaEvGe+OaXsUqdf3wzcC&83hfk_zVIo%ATVHbcA1_nZQptWV)-;Vi1&Gwz zdmO+D#5;RUl}I0DuzbNLUozDP6*4Woq!?_aospdOUiEaHgp1d-?r6l~nh~=0HdEIz zAv`qUdi)#31Ht4UA>yqVGQy<#0x&C=j)UK0oW!KieOT@_j5=*SOB#FsNK4^A4zTo$ z`yH;SUfi#cmVP-8(el=#P016t|v) z*k6nd1)I!;F59I?l+?XO`pbUV0HrW9P@VG4AL_MqyLVQMUk`Vq#P274zO2uektdnG zuWRuC^C`i~{`qS@0igjv4k}36)YFg!0yC{g0|#=mmq&eMKuodbzQ!d^5G;OMhS}=` zUPn#nn7nXihwF|NkF;hxVR^Qn6_>pP+*Y>7uOBkvZ(mxEO~@myB4gU@)uU%*gGrv{ zygNB&b4n=L!+vnQPW)RkdiA70%|Xw?2*sfsWS<#JQD@~l){BN!V0D3GMT(ki@@w2F z765t<+hCg?ucYE9K0Ce*VB*raqUY^Xu=Aqb_=OYZ5&89MKq}dk&P~mMIQBQcf;PgZ zyCKfRc}6tX*%@Vitv-cu%jB+Gt&sf*J9VG+&2S@89MdMe{EsbZe|<5(6E1SXh}2Frx;w1Fx(z1eXb5m>ZoY2W9=*oHdAObX#ga|?d1lH_r2$^ z`DGUbE=*Q6<}pqe*+JPy<@4H%n!iyV!ckcCFXG8Ys$kjCWlR|K=9DN1ty3Y%?$|AG zdj0$$GX)gfX@jta-fH+O!lsv##YOyK2J8Fc};7t_`|<+%m_^Q%?VZ0d_2t{6G#fDC5{$Y^{0JTm6M9^u0yD_V{a#y7H$RS1_&Y(h~A@dS3@SH zpa&{Q?bSFezEz(0186mv^Y~aI?N#yU~!WvYE(~PE7D#f+jR-c3xh!s-I`L4-y|4j&zOR ziU1E?3$rp%qh(F{NsE@D+jJ=#OB3YL>(u(|nqZginn;W|Jr{0QtR&&p=t8=Wuac^jS@Je?cvZ7gySu;&ax1S?V$&q=EPD_t{v(t!pFTU2fnjn-pE^hx>87yEuJ8)BRr__BRr2-qThh$oO8`4J0oNAt4jQqR7d`wDOS80 zFJZs6jX7|-zY_?S57(PppO;e(tdnNIZzj0;m?D0V3*<~}`2=TimOL-5S5rRttPzYq zU^P`{*QGcw)7t*9w?T<d)~+K?2EQSH>$u>LKF{FPh= zQ65IdDO`lL@)RNAA3^s$am^tJmA-eJcLvwxA}X1pSN(Gxzp(i{k%OwT9Lu1^O0%;c zeod9NRuWEG@LREsfjoze(5Md&$cipq0!rXZW=mh~UV4ml6qG)*hdI<<@hsg1vnMET3K{)=ek(~~N+Lg_jRF9M9j0X2PQ6=M|7tXH} z*WQwaq(wObe*}sqj7K)At{WFIui}`omAl!D=Pd*nc+!*7Aw}_yTklk#!~7+si#Bi15E7@OQKv`3VChyG5z86f@}Iqf8PXfYV)nkUbQW4_@#=zs^##fLGW=c6H0&& zl-w=4J90PrWuYiZ5YvCxu;5>FUsz~69`|No2@qXgxMEh&Iab>p0F861)p;&m=R0S6W7E=!v9fj3I9fA#pLz1D9 zf+O;HJOavFK2mcHX8U3#SSc4wTwF*f7b;odP%ntwP+Sg%T0{?M#T&5Yj7l&Ah@7$H^_K;tbfO~A^V+*95hBRySMF$YW^LSd)OIWDfnUY=hw3Yan4-N zedBJ|?aZ1d5rcH+wQ)5@E*uwEh3H(SIg9GgD~5tX7Z?uwPu!lzdT314>6So6iQlSD zXAC6$w<XR9{L}1>jQ4770+6eqNdU^8Kj0#PP!+P#V;Lu zAw{Q=BV)80C`meJGm0Xm6*~BZQ~lc(Fr6PT8$1IP`0j{JJiK*=f&G#4U}LWRI2lE4 zo<0(%P0@8;H7=ifF&sAtmzIAW4bQByuEcz5b$_q>ame9yfzjb@G%4L>k}lwzhlq=} z5{Z5^wp3LFlb$7gCBW9mOT8m_I2h4W+$q6KJRJ}ggw<#Fm!<-65Rs>c^Q_2iin&^~ z3A$0Hi>WvP&=De#=y@YsvR%o84r%a;xePkI;4dYnxPg+6&e7f8g!IRmL96>*&>yeeUcbj1pPyvAD-HnUDZaI=%t}+RvxJwga}VK##i(Um zMNz!v7z#nWp~5!i6%k(e*Fs1i<-O8UT&hr#zybUNmYbMXk{>SQ&s5%)&HOYM1U^AA zs~kGZO-LV$xk#8nvyP~r^O}2h!_Nk!{#^{COIoBHq|r)7*UJZ!G-;(_#E>~ReKu%u zJl^@4gzdt?ze@$frwr34D(?}GA$d^+2Gex&I;V}IwIS$KJV7NU^;;@= zu*a@HKjCw>ZuLgYS#@sUK>4bNFJYS^rX*if(w5?P6A5|s|BxLX7C*S4Mp%w8pGGa zuHNmhJpnZ_1wO`K8ImzbI5o+-Oe8gfC8_X(b(iQFhQrHkf`dvr-yOh%eHv2l`c^oDF2DzBNr3|MeF6tH*KO&xt;!1%* zCULY68De5a;Zt^Z9j;T2rA80wjSLh*F4{%&&XUIE-kL7)^#?RxJM)RN;!5GrBAtx9Oww77WnWn^V>xh25KuLje>f`n6WFl<`o%j{%DSNXQT zc7xSj7U7b^T%g|Uskg7DO93Z_4$ptReWh~1?I~OyBjwf0+aq==72F>ATj${JBsa|< z&18^GlH+EnWL80kTOwAW>{T=;@B?NWnjPsQX*=4s|*hD*&A zf{yum{tPm&EOiBxsVdMhp(zfoyB}6deE``DXKJ&?Fy&W;>wyvjEJ035EsSvP0vW-a z36iobvW5kr7DWP*vUEMcH_VE5YH3Kwc)jRG$^&C_!cnTZvn?|#Bw`+BJz^r>SDap+NKGqmePD$~kGh{0)egqaQK zghT`fC<8N^qIy$+WI*Zk*!*Q60q7q`Qpj+HZG6P6&PV$UH?c1yAGN;QX}wa}?_qXnea>hXpXL-$ z%-#bgLji?z8^PQnV;_7ZoAjBk%To929cbDuClwLph^@_R|GAMDOV8NWT50b?Y1Dd=aX7;F&SDB}(_SpzSZh7FQ+ zWGi%(ot?uVJAo$ey#y>a5+%h@Vi420KEKmszNYx6dlB|0Kl~jU+H51lDVSSCGIY=b zR{zbmF{3P{z3a1|4Tvcj)baCrdF!}JMUetlZQEZA3|o81>y1= zOle_i+;0^wTe^Ns)%nfjtpY3DkaO4}pPxe>*SrId7P%bzo|ZVsMJk+%xu)}OEcg9M z#nkKX-E_trGB-b^vgQA$DX39NctNefnWKY7EJrLPI!4BG6MzL*&Am)Zl6%jM-nR~yBAJ57cNGq}#%>>Xa=!U~E3e&=t8G6OF;3_D zvKXPn7K>Q<9{-XD>f%$Z+9FU6+{}adTE#+a+7H{zJcWTriFvE48v88t4%;xw0@z;u z@}JU}Mwo7bg_$na>=b~HMqww(Z37uLHPEhF<_vL2M+k8{mt7T8J{ddhs)pTXGlH<8 z%^oAM#}bw`gS$HdRB6Mn17x zV7X6o_H;7Nykz{$B~(Jwuu>KxsdMTBj?Hr=?FKEOmqT+|LZl)2i8MC2Z1#WS0>&_$m-EGBGS=iF#5IXmwn-#2`F zaZt_j{Wp?!T_O3?Ge(J;-VG~FNjfuhq)aa%$ZfV&W%*3F@;firkh)(47kTk1~O>H_RRjAzh?BY7A4k z^~ja#!lyHH=i4q}IS;3?xNDRO4!I1&-+X=n@^K8{Q1OU_#A68r*50VaYsxdZ+-{#M z|HO?gD4hc@*7Gf7Z9SMbs(yDwVQM?3E5&TRSRjWCbMiT{B&Aj)vq6o2R|Jfz!a$35 z18wzY{2p_qM{?@NDm0fj9goKM<%Z;c7 zn7j^pi(R{Z+-SE>DA)1pPFRY;YzJac=_p+4y{^f%ia*cYZ^Ao<#t#SO4lna4&Yr25 zPKs>1!e$ppgaCcJVPhMXZV<_@lc4Ce8Dbc_`=ZXKJWIhHJ90(8WekbT0#S zf4DVOx7yD-o{;c=37{gVMnpR`N_<-KVjf(-VF4Li-ijJ@^%oRuF4TzpQ5IsqRx@%$ zNw(|G{hmX9!5N0jY)-e^jj)Chza4$mtTwsaNrj%1+kON>Qcy`dxXVatA5()dNynz? zrJHVJ-)^fFTF)O=u4-FbN_@9nA#Um(-ig~hwVAxciwzX(^he5q-+dqoqL`|lL8oBx zM8W^mC}K@WPCc|k3Ay^Mhk{s1ij09r-@Hdc9BaMkqQl&`z$0TyY~NwoM3Ki=D9f;* zZ9Of*Is%?Buv}pNHSgd43ii&~qZT^KBD=`*sDnd+eBAS_9n#PQRY6-FM1E`GfItTq z91t2!8p>eMT8mNLdh8;Q>oJ0*sM`6MEB@a0(TOpUi2UiK_h4^_KNpUM7H!g7O97zHM~%KxaDv^AS8jy>&JGStyRD$P%cx><#yG_19`xyK!>Cud8wPPeeDU$309Rkn{^ci>U!E`Ve{7!BP%5UyVI>lUAgX6kN6uR1c^qR2_FNA0J^|=1m#dQtea2g zuk?P)n^ZbR_vwH9z6_@OeM`S9_6}oHzGj}vRU*?1R5>7L?+njd(#q&pP@11$QktB; zOkl>qGIF_Z)SdUxkNHKZV7zCo@Lx)dnB*lCT;fv^8clb}H8B>4IB*jzf^TJh9^HVB zKtmPN&KZtaY49#gxmf?7-J$;5fdgz1j&$Isa$|}KJnT&<9!Boa^t; zq{XWyMUQ8@BP#Ox^uxwQ$wnz>e4B#gnXmu^L(`CieXl@wRcYD^0)bt|sKmXNyp&v~ zKn6612}NIVFnkzgf}7T{IPf0m;)>-I1 zmsm^l^*68Y5Q$-03s5R*jVTAtpaekOLC)o-;QWqRJAKj;`i3|d%O#MQiOHd}% zoS}KQGs-jC#>{|O9htQI@F^6}il~r5ZbLqQ2r=qg``!9Y{uE8_xs9UZJ6M}DA5AfM zKM#siINa)~P5Wx-JSSqG={8ANoAuN~?c4l1Oxox}hoj@&&=@TqKe$D-{Nxw3QX*9G zUL?NT&-N1*P=ZH0E-v@70Lu93i91n3_EByn4-; zqQp!tF|{Jm5rTsnwRVQZ!4Bg{n7cy7devwhi;$T^muE^$Kn$7DiZnD11zjZV1oj>{GO+{kOEUe# zadlE8y14zaoA3cy*t;MmRC3vf?m|QI+{Z6}E5ya4mhIKNtjg$nl3-7vC~BBVj(smG zRh1GoSwrmm(&63V{P5GL)3<*JYX2;)J6i{!y6A3VxefJ;rh9+vDH+w}wxUtxvN z7Q3znXF$>bR3Z+UD|?3J!%_M;$)fMRq=}F?32kD%vMB|^2=8$&^Y|=YvWyxlsUnvn zihP~>7|$R3kM}zvs5t~dIJ1Og9Dl*Mvp|3P-fNm7Ib$A+aQFrTr>7xbk5xVaBk`xT z%0H)o>_3O3lTvLc-&Jfq?5Gz@bv2Z>?EUZPb* zpdc$x0`e8u|3`6}yivIvOKY(jJ^3g2qX|>_I1NH<{Heo@`~F%H0kMlu7t=A6!#^MI zFC-o@06Q>{Sr3+9e5F}PKP&l#@^Ek2tZ`7yU;FK{wOCxN&h2%`_w@!UN9~tFo%rJ( z*NkyW@ZyX-P_Hj_cCc-jlin$khoC)EHwX%rhjowsFE_hSY~0-WZvAF7x{Oz)zG`Egnp&Dyz5s0Aa|+WF3yo&`Tt=k&pBWK`vjE$Z z`bqcMfg*H(q&++NtjKM7IvB@7ePu8wF4~0Gk~pzb9@*1#^fGcJjkhLlce9`3fF;1- z&?-XsGYQ_qK+aG6&fO$q%RF!6r&$=S%n>j7Y#MsgztR2dm&sZLOOET)+R)_?r<%b^52> zNAm4;;iLK*fGy9)%4RuEg|-^$onmkhf(G=#NgC`F`t0>rB1PCWV#-?nO#<0G=%;@ZCw7LnWN+8O6()?XBQS38@4zj zY8&fNY#LLK2CZG8T+`V!D#2$V=lN!R zn@8o4)k7$B^)j-%xv8$!4yM8QA@Zq|2IyDZdzg#@=qlb^ZXZaB5X)O>AH zJ>KH7!);8ADuz`&44V-sdD#WV6J@QNZt`@2@sWM!IuD_utVwZHdgSs}A=?PYDEfZ7 znDDT-y&ul}<(>?N$j7kbJTHl%sCs$qJ;$!!=C=Aw^fP&JmJ z`8$hxcl7sKoT9z0?cZYB%t-GU(S6gF+qJ)q^CiOt2DR{8 z-X2~(>q;sn`Ao$vL50MN&(}A{LG{$BxrdrLfu5=Azb{5fOs8O7DUpmribpBf^L>FfcHSJ1qCO} zs7Oh^|MbE^H13c1JwBdHhmWm6AA_mGuV$(ENOLE^4Bx^B=B;Z5J9cBj9=~$vMFLsl z#19P3KEvj$e*w16{WYB%SP{iDo0OAE%)SHSL$?_s_Z zllD=V;J7h%{sdMY{sxLUqxnhj?oi8q5SPBdwxl?^z*2^*=NihyJd&1R&BjY2h9IT= z5J5)U3({OHfO932Xh5GJ@tU8D`Th_;$oMSf>fpJbFO6Z}Mfm`ci$$6>%)bs@fyoIC zCMO(T(tUMao@jf**!zNox847(MZ|1u_`2frv7k?-SMbnf}B@^h$!!*Dd# z^ps|&T|%C={+eC_aN$DrQ~U_qQt<0OV$FkuB%nWLAq`)${CIP=)7|g7TOHymteq!K zNz{j`7)*zH z*5_`5KhmNe70lc8^1?9*t35QrOuN99swHe60Q}Ot=+f*8`iUUT2kFI3C1ivI6`qfL zhb?)LO*>dTAqE;Nf)A8Tn&-p@81hm=N}{>MtOx^(+2rj4;*Di6U_liq1UIXl_u_ww z8bse4j}j(wA99x?6Asj1OMYrs$b7xu%T*G;!79!1cwnqecUq)hD)@DDWwb*f_LXE8 z@HKINJ68~bEtA)g+d^*-Zr7M45r|2o-!*q2o3+)4l*2YE1Zb_Vqt2-~-`Zkrw`jyD*SJpreqh|kUqRfwmsNd_eu3mN7r)_7_d z3eU$hsYaK!h8X=9HqOHjxlO@7j;sYsew&~h< z8$@f0?{A`>$}Y9=;0WiUn*v)8i7E1yA^g8T-B#+qx8FM3mw&Vq$|wR4pj@!mbc#f; zGrA)70k#g_d9vnXwcCO**&(GGZ2TOpe^+Y0*$IpbK3)Fo*q@;GvRmIhbUEx_=3F0A zG2Mf4cOu+lXCP+Bnj+uom7I_H5RS)r(Spup$AmC>) z`d~}5*1sg#2M__k5=KC$bHe9OR)#apusoBkjKlD0OTSn zu8a6x#2l;74;Mw?WT4`YpWEl7O($$J!7}<8lt-jKPJ{P?rAw5d5E2R__rn@%-ybCx z3s3ffPY42USL&tRht3&@q%y^}v>+qFT4k0xk)*B|B{N@DiC-oZ2#Shxf%E$FI99Be zW4~7M?{SP$nT8nO{kbq*Ce3qQ_0j)qwJ;K*tohgcakfk)vuQr=_uD%t~kZM_hA0EMnsb-DXOJK?+NHeTvBAxZ-5iLmR8{ncH{dT034% zCf@V}XbRZ{WPa{4Uz0#P4lW%OaI1mFlr!oD=%1HgLp`+a`J^9IV67rD^j>T~{0{DW zNLcQ`tGM5OVaQ^(2Pxt@k^(-Bm~^HwfkP@J+F2J!LB5HGcT`aB6uU~N>Twd$e3NMH zwJSFTpl>{*(5D|D8QmBt*jyQ%pg ze6A;;tfYRP>Kl8jD-oU!5f6i~NrXQia7(=6Lvisx{!ie)hmqta;%hzEvsV6go^U)1 z&yAtD2oYq;*f(s7x-y~xUp0#mWt?c-QIzB+ozRgu6fio(bva0zM&t_rX+an-d5k!1 z4yb`^Z>V*zG=1Npm@URuW*FBJ6dd0@1O>iFj^zyGgr;iWQm;KL-K8LLz(G`z*3zGV}$GQd?Q-sK&0H?-(H*zI8!Qr?^L z5t5c&HBkYJgE&huQ32STu>OrI&p~|AI1IY^0151E_64;ZwEM$9U~{(r{ULQ+v$zqO zdY-!VfW_!>S(qxh%rWf*3zz2ju%Z}maZ2>5fyZj9{m9vCZWdR9Zlj+pcor`)j3oxr zdTAf1%KVrhY$72vl8IM@2_?r@c+eanTQh1XCfH?m!oux3!Q+|VL_x2W=LpF1TFRr+NmKzF|NNkG2ZxmWg8QRtr_NvLbWo)M9 z5)aY4CePW+e>}PjeCz*7<8$UjO8+(ZJ~p5lytNx>!P#`OqGq$vR_s0%Y3=<(ted>& zBlhJkECyYpI9DSHs+j(#aEAb~n+)>5xsI>iuiU9)s^K28)1yRsfdN0KanA9iA)4=? z0qMy01)U5?lPcH>xkV^=-z_R(v0X_4&pDA6YPV+z(1BpQgAQmo-nZug%vTvH-~tb2 zneN=}KXYVx;R6}CUiLUl~OWoFM{&c(@Gj(OttRs;< ziIM`&;HCfM)Au-G!qfo8BGg7cc<6PZ{qK@;`m22}J@3klSDAudP}OQ+HH77zD+@zU znnnqt6VUPimley*+N97T?9>?_4M=2|2s_QjN}4{<5b{E?0hjch5%W}mhqKK`#u=Qb z`L6rG>HH>yjyv@19dI{?b=lw952G5(uCh2FKttz)-0`;YTg9478F9~Vl*@h;J-@HW zWg)o#Nkj@DddXKScGy%YerLIuiHmh2g^#z1O*7MCA_|fj6%`Tbh)Ys(rTUk8usuv$ zXP5f=T);mQ1qEFrcztMQIIzLv#uXS8Cj(zP1)$>MHSVFxl;q@deF>nxsbWPi^nM~+ z>Rj#Idk8iA*mv})RhP;A=XIW7&&AHS>qYD9RdJD5>-=DtIU+~}-lwYwp7!1ueeLIV z;T)oh!EZj0UMHdt zLLxIKMAw*u&B~T@68r=2f<&0)aL|N>P6r(YxmUDy+R@L2P`666U|6Rs8K?O$0O6&j zrCtVQyl;0j76YF=GYYAYj2k({Nb}#n?;_pK~S-aB{}V#Ld$gCtxrMgPD-rs19*$7}D$Ca0J~Cna>igy~D0T|>J<2!^(U z!8NuOd)02bn)cpAov_Ee&2-+}Q3=IjPd#s>(>Z)>&}CBW^}XNOR!HCsjQPMF$Wd!< zXVHl>$hlUv@yrM1S$r$XBlXCnarBaDsOtRCbT%mmO*yZLZ&ou{jIp>%SqGDrUM<_3d&U($fRl?kEGj&|YA|uYUHTwaXQ4FDFSp%d_*c z=R42;A}}uIC42o+CqGH=4dH*t6G~H;>E(Jk2dmg(WU&fqTPTohW=(Z(l(DkB*m|^I&D*rmByu)|;Yb%be7Leb(RxsbY zcV(}}{~7X$6F%Q=c5Jq>fQuQo+vZR7PhfV2#DsUaY)IDpbQKS&&lD{I0t}=d0RA zEv7ve$l#ZmGlcFVNh^?Mht`paT}K|^ZvHD^i|d&$0Z;9TlYIL^iN*)}vH86OtI$N6 zob`W>43KnmrFSIY#x&}>X+RnhH!VU0&l^c`j@9WR7{pthq-ryud3M*G|+y(Y!hn?9(|XDE9cwi99bu5AxP@v)&3T>>X<%<(F}jvH;*S97mnZxl666& zE%P+OL$9h)%}qf?x>j4?djE=Xunj&$+-Kum&coP>wIY6%l`gIU6`a;$<^&{UA9tlQ zJH(IrTsQj14M9JZbM)P3xc$6J43qW}E1rRe%(*uFaM)sGnJ<2cE{_Io5X}lN+sm@CzBFCHX`eu#>V(=gxt``{Tal~9_&aE z_8>T$f;29@ogaq?08yi!Gq?}T_b)g#0RP^J#xN6AOQeiTfzI8VHvinm6rcSX)xpt; z%KpjPOmSG?v-p~s<%xH9vEt4f+jfZD8s+4gs}d42F(=7LDDSt!WZ-DJ#+@t$N{Du3 ze6^67t#fXJCP>A`ZMde(GT0Yk`O$(kr zl3ea){|Cv(4$|x=ky10I1}kL`=#1_-+LI z$@|?I==sGzv(?7X^M=o@BY>zJvQz2$i=8dECscIx!|u#qq9^K8sn%Y8h1WDKx_WwY zqD8sl_F-mCO;tq*0%oBvH?%bdfp2g|6buBgCBhV&+_{ZkJ{qI*fV*@LIF6r$)bPto zp1Yl$*eW-4+-8# ze|Pds>NQH{i_-C9st4OW650&MDw-xFtYwV?=jV05ssoaM1k4!#?>SF4FrT(kEM&&L84u3i>@N3WL7Ac+?*R+Rl!7IA^tTIVI1TQ^J#+0f7wyENUd`SEf_8vMRYKaFwwN#VHvhxt7ClrQ49&)PlG53|ra zb99axpL&qWe2F(?x88SML&jd#!$KLj>k3zR3J3I@3wKPtJshO}0BmrM%;4L_tu^h^ zr!zM5b7pZ#C4V?A`iC5i7W>VK8sf6OcxTD;tFDt%@JOmXb>O2pYjk{MLjy0CIO}z6 zfsD0eAe3ox(yzXVbOBw~$Y6&;@7KYEHCaCCN2~zuY$*g(=q{0J?P*oXkB$#BT2srn zW@$!e1EK61&*g{nZfPoqQ|@*-Iyg9-6im5D*gtCSTd!-7+h4j3FrEss%rUD+ZO#u0 zn+PpOgSPp6T00LhLroFe8n2tuV%k*%4m*HLnBDc!(FR=hpmr>SHkU(3zP4Z-+1Wwb zZP6RE+&Mqf>1_@+TZ?JZ4V0H3?@w?U!Xj7kZa{SQpej-23(j|bodMaPD^$X zz(e@jUc_gp9cPv#G;e*!*w<^KXPJ1w(8r*gqV{yKDMpokmDfxtC6|1uN3=2Ca)VJB zVTH`~*z<$f^(yz+dlv`F?9HNzjS9-(Biu#B%xTb&gA~5AEkqyvx86NHX&dh z(}=0prUPfjNx0^{WAj(1_-QYBc$D&;~*86z~bP2{6q=r;f?P<&yL)GWc7asttPh)P)&Q6-qh@iAn z&w7AGGk>yuY9`)iX~;F$k> zU~pER@@do?NvTf9a#U?h-W6DWHr2d^m0=)sCp@AvZ91(5AASZJY;AQk1GdCl;S+|F zYT|vA@c}r-cf`HC^z@ibv;esPau)ov7wsRERIB!e7pqW)nCo`*cXy@iwYz5QHIltyJ)(b6?M2C}61V=KUmjQ}sU zZX09G388VQD{n6+&luF}6#Na513_ch)kG?7)}Kw1TJh24MLFeaB@Yj+dB(_sxQXy_ zlmvBO&@@nPTg&~p^slSKe?!l*rh1=o(=|)vpV{L9zfRlzCZh7lv%86mXrjfHJ$bS` z5%ICWVWoW9^q9az;JN@m*k-O835RK-7hV6wx(^7_gJJ8!*1UXvKC^q#WWk^xLCu@j z6FF3LA}d?2u1HzC zS)(b2kj9$>$=G{R8oyz!#$LJKz5D`l*F3Q~qi@RFvBSWwSSBh+lhVLC>K#7wjcN6e z05Tm}T*=*s%t>yaK;#ZU6r9*C{g%bdEp6IRv&<+D7k{eZ$UGIGO++=36{iaeD7am>HUIa5zsV{wB=Xg1x^|Q21Ib!TCM2Rq%_xlegMjKvV5(o3V&F zKWqOJ@OxC^Yi8{zi}_)0Vyy=dI~|09?nNH`oruCYo@ASx9T+3CAN*#ln40^^msmRg z+k(zy0nMW;Oa@ilN>~PxFwxP`dMD}fey&lRWpIGd>!;?$Vj66Kmua2oLJ#kLz;r~d z1Exi{3!PZ!M^g65GfR}1HZY4V?&Os0g_D5?ibj$r0i#1+f)fal|HTfVIY4wQaGL8x wLFsY_6u>FKMm9gedH)KnjrqTz{{^FC!LRKP_nk}WZ0LYtq-UaAu5BOj9|_b4JOBUy diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png index e29b3b59f99290135b0cf3745bc9993ce935b27c..3107d37fa533216ce211fdcdd7c9b8633fab4cc4 100644 GIT binary patch delta 49 zcmZ>9ogk^h#K6EXp*;8=kmB)laSW+oO#b=*zdZvRA2SnE+1>|0aRyIUKbLh*2~7Y< C%MJMe delta 48 zcmZ>DnINgn#=yWJFM6aCNO60*IEGX(CjaDTVc_CtVT_n;@((D?;OXk;vd$@?2>|vK B3nu^o diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml index 03a8d96a3..31529ce0e 100644 --- a/android/app/src/main/res/values-night-v31/styles.xml +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -4,6 +4,7 @@ - + BlueBubbles @@ -40,17 +38,89 @@ var serviceWorkerVersion = null; - - - - + + + + + + - - - + + + + - - + + + \ No newline at end of file diff --git a/web/splash/img/dark-1x.png b/web/splash/img/dark-1x.png index dfb4a79e10f68ca0a524aa495f4dd59af37b9b60..4f18799e2c69cfdef6bab8a0871425bcb05fa593 100644 GIT binary patch literal 12062 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 literal 10648 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 jF5GDCyIl|kt2Kn1+up`pgWku`$>FyjhhFZ) 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 diff --git a/web/splash/img/dark-2x.png b/web/splash/img/dark-2x.png index 92a2043eb59966bae8cccae4f7982fee3b846450..ebd5fb51dbe2b1316ed0aafa2d2876ba18a4d905 100644 GIT binary patch literal 30890 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

_;=HFGpA_iiLC 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 TTOz7T9-5l6wo=t=X!!pDg*AEh diff --git a/web/splash/img/dark-3x.png b/web/splash/img/dark-3x.png index 149866bdf8526cbc86e7a42e5e01957c17c741c8..d5f52a1837a6294173459b3bd6891bc535dbf3e9 100644 GIT binary patch literal 53811 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 diff --git a/web/splash/img/light-1x.png b/web/splash/img/light-1x.png index dfb4a79e10f68ca0a524aa495f4dd59af37b9b60..4f18799e2c69cfdef6bab8a0871425bcb05fa593 100644 GIT binary patch literal 12062 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 literal 10648 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 jF5GDCyIl|kt2Kn1+up`pgWku`$>FyjhhFZ) z{8(BumSe|2HdDkmq4FQb^Q8WrRCNK}*WZmCzqDPHV+Ib~U}(Vx>>iR+AJEkEEcL5< zdVB$!q0o*oJ5seiw!`taSRQ;z?i!l_J+&a-vAO;=dmNRT5B8W_;1>Rwx^oE$&8KV| z7Ux)5UPj{G6^bb#nv;b52*0Tm<{AaozJ7{?*{I|4U$T z#?Ui!A}OLe5M34U>&7?~#_VmIe8aW`LXxGS86sNO{aD1`IZ^ zXSA&-%>Jl>Dp9pJe4mq&A_bl~xchl^_SwkT3UM?Li{`I|Ka;&Lb8^0DnFV~IpF_|- z0FN0^5S9^t0%%}-zh>`ky7ghd#zHZf}QD1p>DHNc685vn8<5|!`bM49PQWNlbs$oo=tp7K=OpAnGWWvvn1(bNzUN8Wa@?m1krwJ*B2Ga>z;U9xV6ds2H>g?yw*cN{+V48k(y2XDmgL!Y2UKX*h@r8rX>5k6TQHN@RuAZcqFz7<-12TtAEHD@|h{H51 z81_&5<1YZeDz(}N1kVS(57hcX=oua(8*uFK#zg zug-R8G%=@{`BTk3Q=HlFCQoPLmi&$~`X31nBPnWhdyC=?b;dyA#$XV@xZe$C560=H zZneiX0GCP;%a5ZaB4{}F+#jMDth4X!@h~&d=C%WP+>`{JXzykcBaR;BaV94_eJG3N zZ`!A$p#HTtn)-FgW$(nePeyJboWigE3r$F~gEwWLzG%IAJY~a34Ik~+*E^n0hJQ)t ztpEbEsJP|`5vhTGQN7o3%T~vlrzi?jwJ?*eUFXl3swJp(;~c>1DalRVs?c)H)ERf^tLa4NW9-wUU(a~FBVE0YX^ z*#~|y_^i4(=W^KfFP7yJ-5mUT?W8doPH(EJbAh@7kve7)i=2@UEH?^}h+Y zS&g_TL{p@Zc?~)NSU?!KQEH*w=PpF2pY%2a&}*(8m(tdGMTer;Q+HKMnFI9)V1ua_ zj(@}jTd|Mvk9_8l{0Je(tFgR{7apwQw7io{z-(k_q5>=U8Fj<<{n1^?PXpsXJ1w(g zZ`AAkTD3TuR*>+-1!AU?CC zx;_yak^R+65*W`;NXwfoZ#2v46yl>ApIO%~;=rCqY{3oGsE zzzFN3erzw~b)rH_&iFDSOAc^r;zHKM-~GSu^idoVpy2eMAj>pM z|8^zOHo|EfON4QtJxkv^Zamo0yoOKAljt8% z4KFeMh7RyS=#;c7B3;$C;uqjzB}~ z^U3{$%2&(BbL32j<{uG}UJ3Gz--cJ+yML;-{s^QPr@Oi(5?B!NgR1Vb9aN_8o?+v% zP#r^8m^5R9tB|VcT*@|{kHsEu$FvU-af|XByL&{peDdp+^trEEiiO-C%7oWWVNE~6 z2(bY>W9ovaZwc31u-sdF98=Pr&gr5BcK|$HL1JLQA%w%-dzLDkU`Uy>z&dzgx8ZYa zqD)gIr3qH^Bw@m1;#x;HxNEIE^*k(gEBBT;TVb!n8#)Pm{=lIl2sLE#QG1`@DED@t zxAWW~gMFrJd8;8ws0qttEvFSj6mbR`qTH^mCNkf;M7u?|m7>eNA4^*)e1|g_^_88N z@8&Pvog(HQ>9KwqQEpQnO&xm@3=#!^65~cDDx%0H6hVKvZt`q3oamzi(dT|%kDw{b zNwl+9vgfN9W(SsDU#oiWT6vLr43jZt0?^<_d6O(hO}w0ry=A#iT|3;?DiSFOINETz zdu<8{JJbX%xf2W!=J=q`g)5~eKoyxPWh|DqX*zz#H*zUo%lYdA@mmgHjOEU8Y+lM}6O$xdGcs)S3qOeOD*aN1XoLey)goamiqFDmQRL}7LL&X~U9{Nq#WHi#Cn5K9;vT{P z`?GCp%Lh9cF2(xLBlKfBU;v1W;8e!P-UT7=!2wo}$LpE<#pELvC(Oe`3un!wsnE_IQ{mU7Tt3Y7dan!t6?QB z%|^>@)DT8DTxGk~A4=TVGQ`kY0|_8e>9jQn%<}49r^s?1i8aU5U8EEDiV0$QAdoNVH+pfw z1L)$?VbYnA+O?RyH2GEpInHJf4LH(Lm#(2wwJ5-&;IID^n+Yblx4){@Tqv%|6Z(ij zjV>SECW+kFE5HMD9mR>ua>hhrg-&s|UOmz6=diR8bHd zR9+5LGf)5-UG56?Lz=IOTRU1jrr;+6rqy`v4(nGq_oV$kDuskOlKZRg$~W)cP8&Nk zTED?e@5>O#V+c%Tr?;PwE4Rhj(uD6w31iFat}x>?X3A|P zN$W7T8(&{Rkr>w>diBtn^~H5ikCdwF0;6KV#J^Vd^=`R~+9k8xZ%CYa)jh2nEym== zI&Vw6Q1KGhTQR87k$>x3EdyIqW0Au_7IR$xd10lre{+-nK@>kERamEiPxIWt6aDu;-0JHuruB>` zmb~ky5->-N9iKJ59xI(jj)j=tkA!?k;)AAbl1|F|6B5C2i3HYo>5Dsm#F+2FLi#oD z)m{p3&p#dv5d+8$bph{3Q zSu&lZb(div)KHtE9$%61SzRuLee%O`u98*u*sQbqBm3i)6nuMd|Iqzs5$=!I@0@Xy z&4J)BOl$YE{e7ij=4~4mm@spNAK0^*-05lGC2Z!*M^HRWDgE;ibvR~qcZB>7z+8_( zCaWvo!n5wj;89EUKB$i|+)}faY|DBGU-V1(w*WTr7hH!BznPKFX2)Lt)+{(KKT)W% z*wF&oUF*`031tApU)FMv1y}J6$U_|E5PRZquMTea;P4WmKKc)YD%H9Bw zxoTR5A7ODatSQ`c9nUu`EB+_VW%-KIGalU^EIQpElQV(7t;-{f@ML8{AsqV8F#T`kU z3*bPKy$qF;%>=|jCFOC%BNFTV!qGbPm){>%bHL#Y6+F#$M0k&xEaRb1RAgwRg!#5x zE~gpHOl&ghQs+mh7QD^>ZCb6UIpz}ibxDvF4r7rI$ZN= z`&R#TbAmRL5aWhp~v$of|)A%^#-E%darY7km=0nnb{e zTRzU{;iI%0F}pOO=Yyi3SQ)S@fFOYZGO`nngh zN0(&Jpmty=iTqnPs>}+o2bh#{!;d~wAc3hD^^mGD)_(L$S$Q*$81^V!5ap9%!%DcZ z)JH4lh7w)$iL*)+*ZtZ?jvFDHNHxyx3r_NFAP?KUV{Rf^4r4h)Qz047G6Nah!$^NR z8XF_%i$$(GT=^~Qa|OO%(^Wa0{8;Ef$Aer!88NlbEYzZ^B|HkFvDYGxiAdTILcG^B za-fG*1dL@5@VqWx00dBGA_ON(Y!K>uT+)hw0~x2>JtCb5J%3fOcHWvak;Mx9fW#|d z>rNe^?8EBOcM;%(A4JBBLgSwF|WdEO5P{1n?VydcH55ibhYVRic5Kobl2$5;^h;wp2po*$wG+Hj6|#K$sa~>&D0ThNekUs{s|xt^@#u#1k6afV=GxhuR>f_esXvo2rMGfs z-d@OY*ULf0i}MmOb0oz1-;P2Z3PID7o?BQ^p5HvXHkRExW&Qji%ILff`>|tsICR+Y zqUCj_PmG-&dli0<*wl(_*(RYomy`* z70g23QCV5jzJH90U>SN*(Mn*zWyh7B_|Nj88>au(Q diff --git a/web/splash/img/light-2x.png b/web/splash/img/light-2x.png index 92a2043eb59966bae8cccae4f7982fee3b846450..ebd5fb51dbe2b1316ed0aafa2d2876ba18a4d905 100644 GIT binary patch literal 30890 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

_;=HFGpA_iiLC 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 TTOz7T9-5l6wo=t=X!!pDg*AEh diff --git a/web/splash/img/light-3x.png b/web/splash/img/light-3x.png index 149866bdf8526cbc86e7a42e5e01957c17c741c8..d5f52a1837a6294173459b3bd6891bc535dbf3e9 100644 GIT binary patch literal 53811 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 From c3fd0e64d90b4e3b5d8e61b1489984da17fae5f4 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 17 Jan 2024 21:06:25 -0500 Subject: [PATCH 008/118] Update all dependencies and fix new linter warnings --- android/app/src/main/AndroidManifest.xml | 13 + lib/app/animations/balloon_rendering.dart | 4 +- lib/app/animations/celebration_class.dart | 7 +- lib/app/animations/celebration_rendering.dart | 4 +- lib/app/animations/fireworks_classes.dart | 12 +- lib/app/animations/fireworks_rendering.dart | 4 +- lib/app/animations/laser_rendering.dart | 4 +- lib/app/animations/love_rendering.dart | 4 +- lib/app/animations/spotlight_rendering.dart | 4 +- .../avatars/contact_avatar_group_widget.dart | 4 +- .../avatars/contact_avatar_widget.dart | 4 +- lib/app/components/circle_progress_bar.dart | 4 +- .../custom_bouncing_scroll_physics.dart | 4 +- .../custom/custom_cupertino_alert_dialog.dart | 43 +- .../custom_cupertino_page_transition.dart | 5 +- .../mentionable_text_editing_controller.dart | 2 +- .../layouts/chat_creator/chat_creator.dart | 4 +- .../widgets/chat_creator_tile.dart | 4 +- .../conversation_details.dart | 2 +- .../dialogs/chat_sync_dialog.dart | 4 +- .../widgets/chat_info.dart | 4 +- .../widgets/chat_options.dart | 2 +- .../widgets/contact_tile.dart | 4 +- .../widgets/media_gallery_card.dart | 6 +- .../dialogs/conversation_peek_view.dart | 2 +- .../pages/conversation_list.dart | 15 +- .../pages/material_conversation_list.dart | 9 +- .../pages/samsung_conversation_list.dart | 9 +- .../pages/search/search_view.dart | 4 +- .../widgets/header/header_widgets.dart | 4 +- .../widgets/initial_widget_right.dart | 2 +- .../widgets/tile/conversation_tile.dart | 4 +- .../tile/cupertino_conversation_tile.dart | 2 +- .../tile/material_conversation_tile.dart | 2 +- .../tile/pinned_conversation_tile.dart | 3 +- .../widgets/tile/pinned_tile_text_bubble.dart | 4 +- .../tile/samsung_conversation_tile.dart | 2 +- .../pages/conversation_view.dart | 16 +- .../pages/messages_view.dart | 4 +- .../media_picker/attachment_picker_file.dart | 4 +- .../text_field_attachment_picker.dart | 4 +- .../message/attachment/attachment_holder.dart | 4 +- .../message/attachment/audio_player.dart | 4 +- .../message/attachment/contact_card.dart | 4 +- .../message/attachment/image_viewer.dart | 4 +- .../message/attachment/other_file.dart | 4 +- .../message/attachment/sticker_holder.dart | 2 +- .../message/attachment/video_player.dart | 15 +- .../message/chat_event/chat_event.dart | 4 +- .../message/interactive/apple_pay.dart | 4 +- .../message/interactive/embedded_media.dart | 4 +- .../message/interactive/game_pigeon.dart | 4 +- .../interactive/interactive_holder.dart | 4 +- .../interactive/supported_interactive.dart | 4 +- .../interactive/unsupported_interactive.dart | 4 +- .../message/interactive/url_preview.dart | 4 +- .../interactive/url_preview.legacy.dart | 4 +- .../widgets/message/message_holder.dart | 4 +- .../widgets/message/misc/bubble_effects.dart | 4 +- .../message/misc/message_properties.dart | 4 +- .../widgets/message/misc/message_sender.dart | 2 +- .../widgets/message/misc/select_checkbox.dart | 2 +- .../widgets/message/misc/slide_to_reply.dart | 2 +- .../widgets/message/popup/message_popup.dart | 8 +- .../message/popup/message_popup_holder.dart | 4 +- .../widgets/message/reaction/reaction.dart | 4 +- .../message/reaction/reaction_holder.dart | 4 +- .../widgets/message/reply/reply_bubble.dart | 4 +- .../widgets/message/send_animation.dart | 2 +- .../widgets/message/text/text_bubble.dart | 4 +- .../timestamp/delivered_indicator.dart | 4 +- .../message/timestamp/message_timestamp.dart | 2 +- .../timestamp/timestamp_separator.dart | 4 +- .../message/typing/typing_indicator.dart | 4 +- .../text_field/conversation_text_field.dart | 8 +- .../widgets/text_field/picked_attachment.dart | 4 +- .../text_field/picked_attachments_holder.dart | 4 +- .../widgets/text_field/reply_holder.dart | 2 +- .../widgets/text_field/send_button.dart | 4 +- .../widgets/text_field/text_field_suffix.dart | 8 +- lib/app/layouts/findmy/findmy_page.dart | 22 +- .../layouts/findmy/findmy_pin_clipper.dart | 4 +- .../fullscreen_media/fullscreen_holder.dart | 4 +- .../fullscreen_media/fullscreen_image.dart | 4 +- .../fullscreen_media/fullscreen_video.dart | 4 +- .../dialogs/create_new_theme_dialog.dart | 2 +- .../dialogs/notification_settings_dialog.dart | 4 +- .../settings/dialogs/old_themes_dialog.dart | 2 +- .../layouts/settings/dialogs/sync_dialog.dart | 2 +- .../pages/server/backup_restore_panel.dart | 4 +- .../settings/pages/server/oauth_panel.dart | 2 +- .../pages/server/server_management_panel.dart | 2 +- .../advanced/advanced_theming_content.dart | 4 +- .../advanced/advanced_theming_panel.dart | 2 +- .../settings/pages/theming/theming_panel.dart | 2 +- lib/app/layouts/settings/settings_page.dart | 14 +- .../content/advanced_theming_tile.dart | 3 +- .../widgets/content/settings_dropdown.dart | 4 +- .../widgets/content/settings_slider.dart | 3 +- .../widgets/content/settings_subtitle.dart | 4 +- .../widgets/content/settings_switch.dart | 4 +- .../widgets/content/settings_tile.dart | 4 +- .../setup/dialogs/connecting_dialog.dart | 8 +- .../dialogs/failed_to_connect_dialog.dart | 9 +- .../setup/dialogs/failed_to_scan_dialog.dart | 2 +- .../setup/dialogs/manual_entry_dialog.dart | 2 +- .../layouts/setup/pages/page_template.dart | 8 +- .../setup/pages/sync/qr_code_scanner.dart | 2 +- .../setup/pages/sync/server_credentials.dart | 8 +- .../pages/unfinished/theme_selector.dart | 6 +- lib/app/layouts/setup/setup_view.dart | 6 +- lib/app/layouts/startup/failure_to_start.dart | 2 +- lib/app/layouts/startup/splash_screen.dart | 2 +- lib/app/wrappers/cupertino_icon_wrapper.dart | 2 +- lib/app/wrappers/scrollbar_wrapper.dart | 4 +- lib/app/wrappers/stateful_boilerplate.dart | 2 +- lib/app/wrappers/tablet_mode_wrapper.dart | 5 +- lib/app/wrappers/theme_switcher.dart | 2 +- lib/app/wrappers/titlebar_wrapper.dart | 6 +- lib/helpers/network/network_helpers.dart | 2 +- .../types/helpers/contact_helpers.dart | 3 +- lib/helpers/ui/message_widget_helpers.dart | 2 +- lib/main.dart | 10 +- lib/models/global/queue_items.dart | 12 +- lib/models/global/server_payload.dart | 7 +- lib/models/html/media_kit.dart | 4 +- lib/models/io/giphy.dart | 1 + .../backend/queue/incoming_queue.dart | 3 +- .../backend/queue/outgoing_queue.dart | 5 +- .../backend/settings/settings_service.dart | 2 +- lib/services/network/http_service.dart | 14 +- lib/services/ui/theme/themes_service.dart | 6 +- lib/utils/color_engine/colors.dart | 8 +- lib/utils/logger.dart | 2 +- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 10 +- pubspec.lock | 831 +++++++++--------- pubspec.yaml | 149 ++-- 139 files changed, 851 insertions(+), 808 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3f02ec39b..e3d3702a7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -31,6 +31,7 @@ + @@ -62,6 +63,7 @@ android:debuggable="false" android:usesCleartextTraffic="true"> + @@ -70,6 +72,17 @@ + + + + + + + + + + + position, + required super.random, + required super.position, required double hueBaseValue, this.saturation, bool isCelebration = false, @@ -204,8 +204,6 @@ class FireworkParticle extends FireworkObjectWithTrail { alphaDecay = random.nextDouble() * .007 + .013, super( trailCount: isCelebration ? 2 : size.toInt() * 2, - position: position, - random: random, size: isCelebration ? random.nextDouble() * 10 : size, ); @@ -244,19 +242,17 @@ class FireworkParticle extends FireworkObjectWithTrail { /// Inspired by https://codepen.io/whqet/pen/Auzch. class FireworkRocket extends FireworkObjectWithTrail { FireworkRocket({ - required Random random, + required super.random, required this.start, required this.target, required this.hue, - required double size, + required super.size, }) : targetDistance = target.distanceTo(start), angle = atan2(target.y - start.y, target.x - start.x), brightness = .5 + random.nextDouble() * .2, super( trailCount: 2, position: start, - random: random, - size: size, ); final Point start; diff --git a/lib/app/animations/fireworks_rendering.dart b/lib/app/animations/fireworks_rendering.dart index 5599790de..5e307577d 100644 --- a/lib/app/animations/fireworks_rendering.dart +++ b/lib/app/animations/fireworks_rendering.dart @@ -4,9 +4,9 @@ import 'package:flutter/widgets.dart'; class Fireworks extends LeafRenderObjectWidget { Fireworks({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); /// The controller that manages the fireworks and tells the render box what /// and when to paint. diff --git a/lib/app/animations/laser_rendering.dart b/lib/app/animations/laser_rendering.dart index 3f06b6b35..be4d2ea47 100644 --- a/lib/app/animations/laser_rendering.dart +++ b/lib/app/animations/laser_rendering.dart @@ -7,9 +7,9 @@ import 'package:flutter/rendering.dart'; class Laser extends LeafRenderObjectWidget { Laser({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); final LaserController controller; diff --git a/lib/app/animations/love_rendering.dart b/lib/app/animations/love_rendering.dart index b5a547667..f9368f7a7 100644 --- a/lib/app/animations/love_rendering.dart +++ b/lib/app/animations/love_rendering.dart @@ -5,9 +5,9 @@ import 'package:flutter/rendering.dart'; class Love extends LeafRenderObjectWidget { Love({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); final LoveController controller; diff --git a/lib/app/animations/spotlight_rendering.dart b/lib/app/animations/spotlight_rendering.dart index be93790bd..7c8da0a6c 100644 --- a/lib/app/animations/spotlight_rendering.dart +++ b/lib/app/animations/spotlight_rendering.dart @@ -7,9 +7,9 @@ import 'package:flutter/rendering.dart'; class Spotlight extends LeafRenderObjectWidget { Spotlight({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); final SpotlightController controller; diff --git a/lib/app/components/avatars/contact_avatar_group_widget.dart b/lib/app/components/avatars/contact_avatar_group_widget.dart index 84456fa3c..9c66d4c4a 100644 --- a/lib/app/components/avatars/contact_avatar_group_widget.dart +++ b/lib/app/components/avatars/contact_avatar_group_widget.dart @@ -15,12 +15,12 @@ import 'package:universal_io/io.dart'; class ContactAvatarGroupWidget extends StatefulWidget { ContactAvatarGroupWidget({ - Key? key, + super.key, required this.chat, this.size = 40, this.editable = true, this.onTap, - }) : super(key: key); + }); final Chat chat; final double size; final bool editable; diff --git a/lib/app/components/avatars/contact_avatar_widget.dart b/lib/app/components/avatars/contact_avatar_widget.dart index dc886f29a..acc81e1dc 100644 --- a/lib/app/components/avatars/contact_avatar_widget.dart +++ b/lib/app/components/avatars/contact_avatar_widget.dart @@ -10,7 +10,7 @@ import 'package:universal_io/io.dart'; class ContactAvatarWidget extends StatefulWidget { ContactAvatarWidget({ - Key? key, + super.key, this.size, this.fontSize, this.borderThickness = 2.0, @@ -21,7 +21,7 @@ class ContactAvatarWidget extends StatefulWidget { this.scaleSize = true, this.preferHighResAvatar = false, this.padding = EdgeInsets.zero - }) : super(key: key); + }); final Handle? handle; final Contact? contact; final double? size; diff --git a/lib/app/components/circle_progress_bar.dart b/lib/app/components/circle_progress_bar.dart index ad627e8da..45b95a636 100644 --- a/lib/app/components/circle_progress_bar.dart +++ b/lib/app/components/circle_progress_bar.dart @@ -11,12 +11,12 @@ class CircleProgressBar extends StatefulWidget { final double value; const CircleProgressBar({ - Key? key, + super.key, this.animationDuration, required this.backgroundColor, required this.foregroundColor, required this.value, - }) : super(key: key); + }); @override CircleProgressBarState createState() { diff --git a/lib/app/components/custom/custom_bouncing_scroll_physics.dart b/lib/app/components/custom/custom_bouncing_scroll_physics.dart index d5558e715..9bd0084c3 100644 --- a/lib/app/components/custom/custom_bouncing_scroll_physics.dart +++ b/lib/app/components/custom/custom_bouncing_scroll_physics.dart @@ -18,7 +18,7 @@ import 'package:flutter/material.dart'; /// ```dart /// CustomBouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()) /// ``` -/// (@end-tool} +/// {@end-tool} /// /// See also: /// @@ -30,7 +30,7 @@ import 'package:flutter/material.dart'; /// of different types to get the desired scroll physics. class CustomBouncingScrollPhysics extends ScrollPhysics { /// Creates scroll physics that bounce back from the edge. - const CustomBouncingScrollPhysics({ScrollPhysics? parent}) : super(parent: parent); + const CustomBouncingScrollPhysics({super.parent}); static const double kMinFlingVelocity = 50.0; // Logical pixels / second @override diff --git a/lib/app/components/custom/custom_cupertino_alert_dialog.dart b/lib/app/components/custom/custom_cupertino_alert_dialog.dart index e94b857cb..7e1fb480d 100644 --- a/lib/app/components/custom/custom_cupertino_alert_dialog.dart +++ b/lib/app/components/custom/custom_cupertino_alert_dialog.dart @@ -123,7 +123,7 @@ class CupertinoAlertDialog extends StatelessWidget { /// /// The [actions] must not be null. const CupertinoAlertDialog({ - Key? key, + super.key, this.title, this.backgroundColor = _kDialogColor, this.content, @@ -132,7 +132,7 @@ class CupertinoAlertDialog extends StatelessWidget { this.actionScrollController, this.insetAnimationDuration = const Duration(milliseconds: 100), this.insetAnimationCurve = Curves.decelerate, - }) : super(key: key); + }); final Color backgroundColor; @@ -233,7 +233,7 @@ class CupertinoAlertDialog extends StatelessWidget { child: MediaQuery( data: MediaQuery.of(context).copyWith( // iOS does not shrink dialog content below a 1.0 scale factor - textScaleFactor: math.max(textScaleFactor, 1.0), + textScaler: TextScaler.linear(math.max(textScaleFactor, 1.0)), ), child: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { @@ -293,10 +293,10 @@ class CupertinoAlertDialog extends StatelessWidget { class CupertinoPopupSurface extends StatelessWidget { /// Creates an iOS-style rounded rectangle popup surface. const CupertinoPopupSurface({ - Key? key, + super.key, this.isSurfacePainted = true, this.child, - }) : super(key: key); + }); /// Whether or not to paint a translucent white on top of this surface's /// blurred background. [isSurfacePainted] should be true for a typical popup @@ -332,10 +332,9 @@ class CupertinoPopupSurface extends StatelessWidget { // See [_RenderCupertinoDialog] for specific layout policy details. class _CupertinoDialogRenderWidget extends RenderObjectWidget { const _CupertinoDialogRenderWidget({ - Key? key, required this.contentSection, required this.actionsSection, - }) : super(key: key); + }); final Widget contentSection; final Widget actionsSection; @@ -363,7 +362,7 @@ class _CupertinoDialogRenderWidget extends RenderObjectWidget { } class _CupertinoDialogRenderElement extends RenderObjectElement { - _CupertinoDialogRenderElement(_CupertinoDialogRenderWidget widget) : super(widget); + _CupertinoDialogRenderElement(_CupertinoDialogRenderWidget super.widget); Element? _contentElement; Element? _actionsElement; @@ -808,11 +807,10 @@ enum _AlertDialogSections { // a SingleChildScrollView with a zero-sized Container. class _CupertinoAlertContentSection extends StatelessWidget { const _CupertinoAlertContentSection({ - Key? key, this.title, this.content, this.scrollController, - }) : super(key: key); + }); // The (optional) title of the dialog is displayed in a large font at the top // of the dialog. @@ -842,7 +840,6 @@ class _CupertinoAlertContentSection extends StatelessWidget { ); } - final double textScaleFactor = MediaQuery.of(context).textScaleFactor; final List titleContentGroup = [ if (title != null) Padding( @@ -850,7 +847,7 @@ class _CupertinoAlertContentSection extends StatelessWidget { left: _kEdgePadding, right: _kEdgePadding, bottom: content == null ? _kEdgePadding : 1.0, - top: _kEdgePadding * textScaleFactor, + top: MediaQuery.of(context).textScaler.scale(_kEdgePadding), ), child: DefaultTextStyle( style: _kCupertinoDialogTitleStyle.copyWith( @@ -865,7 +862,7 @@ class _CupertinoAlertContentSection extends StatelessWidget { padding: EdgeInsets.only( left: _kEdgePadding, right: _kEdgePadding, - bottom: _kEdgePadding * textScaleFactor, + bottom: MediaQuery.of(context).textScaler.scale(_kEdgePadding), top: title == null ? _kEdgePadding : 1.0, ), child: DefaultTextStyle( @@ -897,10 +894,9 @@ class _CupertinoAlertContentSection extends StatelessWidget { // and layout. class _CupertinoAlertActionSection extends StatefulWidget { const _CupertinoAlertActionSection({ - Key? key, required this.children, this.scrollController, - }) : super(key: key); + }); final List children; @@ -995,10 +991,9 @@ class _PressableActionButtonState extends State<_PressableActionButton> { // incoming [isPressed] property. class _ActionButtonParentDataWidget extends ParentDataWidget<_ActionButtonParentData> { const _ActionButtonParentDataWidget({ - Key? key, required this.isPressed, - required Widget child, - }) : super(key: key, child: child); + required super.child, + }); final bool isPressed; @@ -1038,13 +1033,13 @@ class _ActionButtonParentData extends MultiChildLayoutParentData { class CupertinoDialogAction extends StatelessWidget { /// Creates an action for an iOS-style dialog. const CupertinoDialogAction({ - Key? key, + super.key, this.onPressed, this.isDefaultAction = false, this.isDestructiveAction = false, this.textStyle, required this.child, - }) : super(key: key); + }); /// The callback that is called when the button is tapped or otherwise /// activated. @@ -1088,7 +1083,7 @@ class CupertinoDialogAction extends StatelessWidget { bool get enabled => onPressed != null; double _calculatePadding(BuildContext context) { - return 8.0 * MediaQuery.textScaleFactorOf(context); + return MediaQuery.of(context).textScaler.scale(8.0); } // Dialog action content shrinks to fit, up to a certain point, and if it still @@ -1102,12 +1097,11 @@ class CupertinoDialogAction extends StatelessWidget { }) { final bool isInAccessibilityMode = _isInAccessibilityMode(context); final double dialogWidth = isInAccessibilityMode ? _kAccessibilityCupertinoDialogWidth : _kCupertinoDialogWidth; - final double textScaleFactor = MediaQuery.textScaleFactorOf(context); // The fontSizeRatio is the ratio of the current text size (including any // iOS scale factor) vs the minimum text size that we allow in action // buttons. This ratio information is used to automatically scale down action // button text to fit the available space. - final double fontSizeRatio = (textScaleFactor * textStyle.fontSize!) / _kMinButtonFontSize; + final double fontSizeRatio = MediaQuery.of(context).textScaler.scale(textStyle.fontSize!) / _kMinButtonFontSize; final double padding = _calculatePadding(context); return IntrinsicHeight( @@ -1212,11 +1206,10 @@ class CupertinoDialogAction extends StatelessWidget { // See [_RenderCupertinoDialogActions] for specific layout policy details. class _CupertinoDialogActionsRenderWidget extends MultiChildRenderObjectWidget { _CupertinoDialogActionsRenderWidget({ - Key? key, required List actionButtons, double dividerThickness = 0.0, }) : _dividerThickness = dividerThickness, - super(key: key, children: actionButtons); + super(children: actionButtons); final double _dividerThickness; diff --git a/lib/app/components/custom/custom_cupertino_page_transition.dart b/lib/app/components/custom/custom_cupertino_page_transition.dart index 0aec4e154..2b43addbf 100644 --- a/lib/app/components/custom/custom_cupertino_page_transition.dart +++ b/lib/app/components/custom/custom_cupertino_page_transition.dart @@ -20,7 +20,7 @@ class CustomCupertinoPageTransition extends StatelessWidget { /// * `linearTransition` is whether to perform the transitions linearly. /// Used to precisely track back gesture drags. CustomCupertinoPageTransition({ - Key? key, + super.key, required Animation primaryRouteAnimation, required this.child, required bool linearTransition, @@ -46,8 +46,7 @@ class CustomCupertinoPageTransition extends StatelessWidget { parent: primaryRouteAnimation, curve: Curves.linearToEaseOut, ) - ).drive(_CupertinoEdgeShadowDecoration.kTween), - super(key: key); + ).drive(_CupertinoEdgeShadowDecoration.kTween); // When this page is coming in to cover another page. final Animation _primaryPositionAnimation; diff --git a/lib/app/components/mentionable_text_editing_controller.dart b/lib/app/components/mentionable_text_editing_controller.dart index 7aff51f9f..60dc5ae7b 100644 --- a/lib/app/components/mentionable_text_editing_controller.dart +++ b/lib/app/components/mentionable_text_editing_controller.dart @@ -30,7 +30,7 @@ class Mentionable { class MentionTextEditingController extends TextEditingController { - MentionTextEditingController({String? text, this.mentionables=const []}) : super(text: text); + MentionTextEditingController({super.text, this.mentionables=const []}); static const escapingChar = ""; static const zeroWidthSpace = "​"; static final escapingRegex = RegExp('$escapingChar\\d+$escapingChar'); diff --git a/lib/app/layouts/chat_creator/chat_creator.dart b/lib/app/layouts/chat_creator/chat_creator.dart index 21eda49ee..c5ab85999 100644 --- a/lib/app/layouts/chat_creator/chat_creator.dart +++ b/lib/app/layouts/chat_creator/chat_creator.dart @@ -36,11 +36,11 @@ class SelectedContact { class ChatCreator extends StatefulWidget { const ChatCreator({ - Key? key, + super.key, this.initialText = "", this.initialAttachments = const [], this.initialSelected = const [], - }) : super(key: key); + }); final String? initialText; final List initialAttachments; diff --git a/lib/app/layouts/chat_creator/widgets/chat_creator_tile.dart b/lib/app/layouts/chat_creator/widgets/chat_creator_tile.dart index cd4354b4a..2c048bfb0 100644 --- a/lib/app/layouts/chat_creator/widgets/chat_creator_tile.dart +++ b/lib/app/layouts/chat_creator/widgets/chat_creator_tile.dart @@ -11,13 +11,13 @@ import 'package:get/get.dart'; class ChatCreatorTile extends StatefulWidget { const ChatCreatorTile({ - Key? key, + super.key, required this.title, required this.subtitle, this.chat, this.contact, this.format = false, - }) : super(key: key); + }); final String title; final String subtitle; diff --git a/lib/app/layouts/conversation_details/conversation_details.dart b/lib/app/layouts/conversation_details/conversation_details.dart index 04617bc1d..768e1220f 100644 --- a/lib/app/layouts/conversation_details/conversation_details.dart +++ b/lib/app/layouts/conversation_details/conversation_details.dart @@ -26,7 +26,7 @@ import 'package:url_launcher/url_launcher.dart'; class ConversationDetails extends StatefulWidget { final Chat chat; - ConversationDetails({Key? key, required this.chat}) : super(key: key); + ConversationDetails({super.key, required this.chat}); @override State createState() => _ConversationDetailsState(); diff --git a/lib/app/layouts/conversation_details/dialogs/chat_sync_dialog.dart b/lib/app/layouts/conversation_details/dialogs/chat_sync_dialog.dart index a9ece326d..ba89b3346 100644 --- a/lib/app/layouts/conversation_details/dialogs/chat_sync_dialog.dart +++ b/lib/app/layouts/conversation_details/dialogs/chat_sync_dialog.dart @@ -7,12 +7,12 @@ import 'package:get/get.dart'; class ChatSyncDialog extends StatefulWidget { ChatSyncDialog({ - Key? key, + super.key, required this.chat, this.initialMessage, this.withOffset = false, this.limit = 100 - }) : super(key: key); + }); final Chat chat; final String? initialMessage; diff --git a/lib/app/layouts/conversation_details/widgets/chat_info.dart b/lib/app/layouts/conversation_details/widgets/chat_info.dart index 29f06914b..847398468 100644 --- a/lib/app/layouts/conversation_details/widgets/chat_info.dart +++ b/lib/app/layouts/conversation_details/widgets/chat_info.dart @@ -16,7 +16,7 @@ import 'package:get/get.dart'; import 'package:universal_io/io.dart'; class ChatInfo extends StatefulWidget { - const ChatInfo({Key? key, required this.chat}) : super(key: key); + const ChatInfo({super.key, required this.chat}); final Chat chat; @@ -306,7 +306,7 @@ class _ChatInfoState extends OptimizedState { child: Text( "${(chat.displayName?.isNotEmpty ?? false) ? "Change" : "Add"} Name", style: context.theme.textTheme.bodyMedium!.apply(color: context.theme.primaryColor), - textScaleFactor: 1.15, + textScaler: const TextScaler.linear(1.15), ), onPressed: () async { bool? papi = false; diff --git a/lib/app/layouts/conversation_details/widgets/chat_options.dart b/lib/app/layouts/conversation_details/widgets/chat_options.dart index 7207a3ccf..07300e4c7 100644 --- a/lib/app/layouts/conversation_details/widgets/chat_options.dart +++ b/lib/app/layouts/conversation_details/widgets/chat_options.dart @@ -19,7 +19,7 @@ import 'package:printing/printing.dart'; import 'package:universal_io/io.dart'; class ChatOptions extends StatefulWidget { - const ChatOptions({Key? key, required this.chat}) : super(key: key); + const ChatOptions({super.key, required this.chat}); final Chat chat; diff --git a/lib/app/layouts/conversation_details/widgets/contact_tile.dart b/lib/app/layouts/conversation_details/widgets/contact_tile.dart index a3b06625e..d99eb2e91 100644 --- a/lib/app/layouts/conversation_details/widgets/contact_tile.dart +++ b/lib/app/layouts/conversation_details/widgets/contact_tile.dart @@ -21,11 +21,11 @@ class ContactTile extends StatelessWidget { Contact? get contact => handle.contact; ContactTile({ - Key? key, + super.key, required this.handle, required this.chat, required this.canBeRemoved, - }) : super(key: key); + }); @override Widget build(BuildContext context) { diff --git a/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart b/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart index 20377d0bc..d5644ff2f 100644 --- a/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart +++ b/lib/app/layouts/conversation_details/widgets/media_gallery_card.dart @@ -18,7 +18,7 @@ import 'package:universal_io/io.dart'; import 'package:video_player/video_player.dart'; class MediaGalleryCard extends StatefulWidget { - MediaGalleryCard({Key? key, required this.attachment}) : super(key: key); + MediaGalleryCard({super.key, required this.attachment}); final Attachment attachment; @override @@ -224,11 +224,11 @@ class _MediaGalleryCardState extends OptimizedState with Autom class ImageDisplay extends StatelessWidget { const ImageDisplay({ - Key? key, + super.key, required this.attachment, required this.image, this.duration, - }) : super(key: key); + }); final Attachment attachment; final Uint8List image; diff --git a/lib/app/layouts/conversation_list/dialogs/conversation_peek_view.dart b/lib/app/layouts/conversation_list/dialogs/conversation_peek_view.dart index 0f5c75060..b175bb678 100644 --- a/lib/app/layouts/conversation_list/dialogs/conversation_peek_view.dart +++ b/lib/app/layouts/conversation_list/dialogs/conversation_peek_view.dart @@ -40,7 +40,7 @@ class ConversationPeekView extends StatefulWidget { final Chat chat; final List messages; - const ConversationPeekView({Key? key, required this.position, required this.chat, required this.messages}) : super(key: key); + const ConversationPeekView({super.key, required this.position, required this.chat, required this.messages}); @override State createState() => _ConversationPeekViewState(); diff --git a/lib/app/layouts/conversation_list/pages/conversation_list.dart b/lib/app/layouts/conversation_list/pages/conversation_list.dart index 2191ecb8b..aa710165b 100644 --- a/lib/app/layouts/conversation_list/pages/conversation_list.dart +++ b/lib/app/layouts/conversation_list/pages/conversation_list.dart @@ -97,9 +97,8 @@ class ConversationListController extends StatefulController { } class ConversationList extends CustomStateful { - ConversationList({Key? key, required bool showArchivedChats, required bool showUnknownSenders}) + ConversationList({super.key, required bool showArchivedChats, required bool showUnknownSenders}) : super( - key: key, parentController: Get.put( ConversationListController( showArchivedChats: showArchivedChats, @@ -190,8 +189,9 @@ class _ConversationListState extends CustomState SearchViewState(); diff --git a/lib/app/layouts/conversation_list/widgets/header/header_widgets.dart b/lib/app/layouts/conversation_list/widgets/header/header_widgets.dart index bbd3dbd5b..9325ae849 100644 --- a/lib/app/layouts/conversation_list/widgets/header/header_widgets.dart +++ b/lib/app/layouts/conversation_list/widgets/header/header_widgets.dart @@ -146,8 +146,8 @@ class OverflowMenu extends StatelessWidget { await ss.prefs.clear(); await ss.prefs.setString("selected-dark", "OLED Dark"); await ss.prefs.setString("selected-light", "Bright White"); - Get.offAll(() => WillPopScope( - onWillPop: () async => false, + Get.offAll(() => PopScope( + canPop: false, child: TitleBarWrapper(child: SetupView()), ), duration: Duration.zero, transition: Transition.noTransition); }, diff --git a/lib/app/layouts/conversation_list/widgets/initial_widget_right.dart b/lib/app/layouts/conversation_list/widgets/initial_widget_right.dart index f4f63283c..021278742 100644 --- a/lib/app/layouts/conversation_list/widgets/initial_widget_right.dart +++ b/lib/app/layouts/conversation_list/widgets/initial_widget_right.dart @@ -5,7 +5,7 @@ import 'package:flutter_acrylic/window_effect.dart'; import 'package:get/get.dart'; class InitialWidgetRight extends StatefulWidget { - const InitialWidgetRight({Key? key}) : super(key: key); + const InitialWidgetRight({super.key}); @override State createState() => _InitialWidgetRightState(); diff --git a/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart index 4d921be71..8343a0cb7 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart @@ -94,13 +94,13 @@ class ConversationTileController extends StatefulController { class ConversationTile extends CustomStateful { ConversationTile({ - Key? key, + super.key, required Chat chat, required ConversationListController controller, Function(bool)? onSelect, bool inSelectMode = false, Widget? subtitle, - }) : super(key: key, parentController: !inSelectMode && Get.isRegistered(tag: chat.guid) + }) : super(parentController: !inSelectMode && Get.isRegistered(tag: chat.guid) ? Get.find(tag: chat.guid) : Get.put(ConversationTileController( chat: chat, diff --git a/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart index a77ee6f48..aa13d2551 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart @@ -200,7 +200,7 @@ class _CupertinoTrailingState extends CustomState { PinnedConversationTile({ - Key? key, + super.key, required Chat chat, required ConversationListController controller, }) : super( - key: key, parentController: Get.isRegistered(tag: chat.guid) ? Get.find(tag: chat.guid) : Get.put( diff --git a/lib/app/layouts/conversation_list/widgets/tile/pinned_tile_text_bubble.dart b/lib/app/layouts/conversation_list/widgets/tile/pinned_tile_text_bubble.dart index db4986bc3..927482b1f 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/pinned_tile_text_bubble.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/pinned_tile_text_bubble.dart @@ -14,11 +14,11 @@ import 'package:get/get.dart'; class PinnedTileTextBubble extends CustomStateful { PinnedTileTextBubble({ - Key? key, + super.key, required this.chat, required this.size, required super.parentController, - }) : super(key: key); + }); final Chat chat; final double size; diff --git a/lib/app/layouts/conversation_list/widgets/tile/samsung_conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/samsung_conversation_tile.dart index 7d46a1d05..ba9c5e98f 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/samsung_conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/samsung_conversation_tile.dart @@ -219,7 +219,7 @@ class _SamsungTrailingState extends CustomState { : (context.theme.extensions[BubbleColors] as BubbleColors?)?.onReceivedBubbleColor, ), ), - child: WillPopScope( - onWillPop: () async { + child: PopScope( + canPop: false, + onPopInvoked: (_) async { if (controller.inSelectMode.value) { controller.inSelectMode.value = false; controller.selected.clear(); - return false; + return; } if (controller.showAttachmentPicker) { controller.showAttachmentPicker = false; controller.updateWidgets(null); - return false; + return; } if (ls.isBubble) { SystemNavigator.pop(); } controller.close(); - return !ls.isBubble; + if (ls.isBubble) return; + return Navigator.of(context).pop(); }, child: SafeArea( top: false, diff --git a/lib/app/layouts/conversation_view/pages/messages_view.dart b/lib/app/layouts/conversation_view/pages/messages_view.dart index 1c6eeabc7..72312f980 100644 --- a/lib/app/layouts/conversation_view/pages/messages_view.dart +++ b/lib/app/layouts/conversation_view/pages/messages_view.dart @@ -28,10 +28,10 @@ class MessagesView extends StatefulWidget { final ConversationViewController controller; MessagesView({ - Key? key, + super.key, this.customService, required this.controller, - }) : super(key: key); + }); @override MessagesViewState createState() => MessagesViewState(); diff --git a/lib/app/layouts/conversation_view/widgets/media_picker/attachment_picker_file.dart b/lib/app/layouts/conversation_view/widgets/media_picker/attachment_picker_file.dart index aa80dd0d0..3d73df4cb 100644 --- a/lib/app/layouts/conversation_view/widgets/media_picker/attachment_picker_file.dart +++ b/lib/app/layouts/conversation_view/widgets/media_picker/attachment_picker_file.dart @@ -12,11 +12,11 @@ import 'package:photo_manager/photo_manager.dart'; class AttachmentPickerFile extends StatefulWidget { AttachmentPickerFile({ - Key? key, + super.key, required this.onTap, required this.data, required this.controller, - }) : super(key: key); + }); final AssetEntity data; final Function() onTap; final ConversationViewController controller; diff --git a/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart b/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart index f2f3e70e1..32acf8acb 100644 --- a/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart +++ b/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart @@ -23,9 +23,9 @@ import 'package:photo_manager/photo_manager.dart'; class AttachmentPicker extends StatefulWidget { AttachmentPicker({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); final ConversationViewController controller; @override diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart index 484632b87..cb49f8799 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart @@ -21,10 +21,10 @@ import 'package:tuple/tuple.dart'; class AttachmentHolder extends CustomStateful { AttachmentHolder({ - Key? key, + super.key, required super.parentController, required this.message, - }) : super(key: key); + }); final MessagePart message; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart index ae44558fd..58579fda8 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart @@ -13,11 +13,11 @@ class AudioPlayer extends StatefulWidget { final Attachment? attachment; AudioPlayer({ - Key? key, + super.key, required this.file, required this.attachment, this.controller, - }) : super(key: key); + }); final ConversationViewController? controller; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/contact_card.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/contact_card.dart index fb24f6748..eed54cc59 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/contact_card.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/contact_card.dart @@ -16,10 +16,10 @@ import 'package:universal_io/io.dart'; class ContactCard extends StatefulWidget { ContactCard({ - Key? key, + super.key, required this.file, required this.attachment, - }) : super(key: key); + }); final PlatformFile file; final Attachment attachment; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/image_viewer.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/image_viewer.dart index de9cf317f..e6458c14b 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/image_viewer.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/image_viewer.dart @@ -17,12 +17,12 @@ class ImageViewer extends StatefulWidget { final bool isFromMe; ImageViewer({ - Key? key, + super.key, required this.file, required this.attachment, required this.isFromMe, this.controller, - }) : super(key: key); + }); final ConversationViewController? controller; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/other_file.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/other_file.dart index bc27f5c1b..790de4060 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/other_file.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/other_file.dart @@ -20,10 +20,10 @@ import 'package:url_launcher/url_launcher.dart'; class OtherFile extends StatelessWidget { OtherFile({ - Key? key, + super.key, required this.attachment, required this.file, - }) : super(key: key); + }); final Attachment attachment; final PlatformFile file; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/sticker_holder.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/sticker_holder.dart index 8893e4afa..14bb2c8de 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/sticker_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/sticker_holder.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:universal_io/io.dart'; class StickerHolder extends StatefulWidget { - StickerHolder({Key? key, required this.stickerMessages, required this.controller}) : super(key: key); + StickerHolder({super.key, required this.stickerMessages, required this.controller}); final Iterable stickerMessages; final ConversationViewController controller; diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart index 34f066079..7aa91de3d 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart @@ -24,7 +24,7 @@ class VideoPlayer extends StatefulWidget { final Attachment attachment; final bool isFromMe; - VideoPlayer({Key? key, required this.file, required this.attachment, required this.controller, required this.isFromMe}) : super(key: key); + VideoPlayer({super.key, required this.file, required this.attachment, required this.controller, required this.isFromMe}); final ConversationViewController? controller; @@ -225,7 +225,7 @@ class _VideoPlayerState extends OptimizedState with AutomaticKeepAl } class PlayPauseButton extends StatelessWidget { - const PlayPauseButton({Key? key, required this.showPlayPauseOverlay, required this.controller, this.customOnTap}) : super(key: key); + const PlayPauseButton({super.key, required this.showPlayPauseOverlay, required this.controller, this.customOnTap}); final RxBool showPlayPauseOverlay; final VideoPlayerController? controller; @@ -284,8 +284,7 @@ class PlayPauseButton extends StatelessWidget { } class MuteButton extends StatelessWidget { - const MuteButton({Key? key, required this.showPlayPauseOverlay, required this.muted, required this.controller, required this.isFromMe}) - : super(key: key); + const MuteButton({super.key, required this.showPlayPauseOverlay, required this.muted, required this.controller, required this.isFromMe}); final RxBool showPlayPauseOverlay; final RxBool muted; @@ -516,12 +515,12 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati class DesktopPlayPauseButton extends StatelessWidget { DesktopPlayPauseButton({ - Key? key, + super.key, required this.showPlayPauseOverlay, required this.controller, this.customOnTap, this.hover, - }) : super(key: key); + }); final RxBool showPlayPauseOverlay; final Player? controller; @@ -601,7 +600,7 @@ class DesktopPlayPauseButton extends StatelessWidget { } class DesktopMuteButton extends StatelessWidget { - const DesktopMuteButton({Key? key, required this.muted, required this.controller, required this.isFromMe}) : super(key: key); + const DesktopMuteButton({super.key, required this.muted, required this.controller, required this.isFromMe}); final RxBool muted; final Player? controller; @@ -649,7 +648,7 @@ class DesktopMuteButton extends StatelessWidget { } class FullscreenButton extends StatelessWidget { - const FullscreenButton({Key? key, required this.attachment, required this.isFromMe}) : super(key: key); + const FullscreenButton({super.key, required this.attachment, required this.isFromMe}); final Attachment attachment; final bool isFromMe; diff --git a/lib/app/layouts/conversation_view/widgets/message/chat_event/chat_event.dart b/lib/app/layouts/conversation_view/widgets/message/chat_event/chat_event.dart index f7661afe1..459bf743e 100644 --- a/lib/app/layouts/conversation_view/widgets/message/chat_event/chat_event.dart +++ b/lib/app/layouts/conversation_view/widgets/message/chat_event/chat_event.dart @@ -9,10 +9,10 @@ import 'package:intl/intl.dart'; class ChatEvent extends StatelessWidget { ChatEvent({ - Key? key, + super.key, required this.part, required this.message, - }) : super(key: key); + }); final MessagePart part; final Message message; diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/apple_pay.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/apple_pay.dart index ddce26e27..761069b8c 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/apple_pay.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/apple_pay.dart @@ -8,10 +8,10 @@ class ApplePay extends StatefulWidget { final Message message; ApplePay({ - Key? key, + super.key, required this.data, required this.message, - }) : super(key: key); + }); @override OptimizedState createState() => _ApplePayState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/embedded_media.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/embedded_media.dart index 1dfc7af8e..95aedf923 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/embedded_media.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/embedded_media.dart @@ -14,10 +14,10 @@ import 'package:universal_io/io.dart'; class EmbeddedMedia extends CustomStateful { EmbeddedMedia({ - Key? key, + super.key, required this.message, required super.parentController, - }) : super(key: key); + }); final Message message; diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/game_pigeon.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/game_pigeon.dart index 1e0780fb2..878b4d7ef 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/game_pigeon.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/game_pigeon.dart @@ -11,10 +11,10 @@ class GamePigeon extends StatefulWidget { final Message message; GamePigeon({ - Key? key, + super.key, required this.data, required this.message, - }) : super(key: key); + }); @override OptimizedState createState() => _GamePigeonState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart index a4126179a..530ffe6de 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart @@ -16,10 +16,10 @@ import 'package:url_launcher/url_launcher.dart'; class InteractiveHolder extends CustomStateful { InteractiveHolder({ - Key? key, + super.key, required super.parentController, required this.message, - }) : super(key: key); + }); final MessagePart message; diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/supported_interactive.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/supported_interactive.dart index 1c3d48bc9..7a31e58ed 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/supported_interactive.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/supported_interactive.dart @@ -12,10 +12,10 @@ class SupportedInteractive extends StatefulWidget { final Message message; SupportedInteractive({ - Key? key, + super.key, required this.data, required this.message, - }) : super(key: key); + }); @override OptimizedState createState() => _SupportedInteractiveState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/unsupported_interactive.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/unsupported_interactive.dart index 7f5899019..a772b8c60 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/unsupported_interactive.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/unsupported_interactive.dart @@ -10,10 +10,10 @@ import 'package:universal_io/io.dart'; class UnsupportedInteractive extends StatefulWidget { UnsupportedInteractive({ - Key? key, + super.key, required this.message, required this.payloadData, - }) : super(key: key); + }); final Message message; final iMessageAppData? payloadData; diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.dart index 017293442..1b20bed8f 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.dart @@ -21,11 +21,11 @@ class UrlPreview extends StatefulWidget { final PlatformFile? file; UrlPreview({ - Key? key, + super.key, required this.data, required this.message, this.file, - }) : super(key: key); + }); @override OptimizedState createState() => _UrlPreviewState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart index effdd7351..d478c92f1 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart @@ -14,9 +14,9 @@ class LegacyUrlPreview extends StatefulWidget { final Message message; LegacyUrlPreview({ - Key? key, + super.key, required this.message, - }) : super(key: key); + }); @override OptimizedState createState() => _LegacyUrlPreviewState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 99a465640..68c5fbd2f 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -33,14 +33,14 @@ import 'package:universal_io/io.dart'; class MessageHolder extends CustomStateful { MessageHolder({ - Key? key, + super.key, required this.cvController, this.oldMessageGuid, this.newMessageGuid, required this.message, this.isReplyThread = false, this.replyPart, - }) : super(key: key, parentController: getActiveMwc(message.guid!) ?? mwc(message)); + }) : super(parentController: getActiveMwc(message.guid!) ?? mwc(message)); final Message message; final String? oldMessageGuid; diff --git a/lib/app/layouts/conversation_view/widgets/message/misc/bubble_effects.dart b/lib/app/layouts/conversation_view/widgets/message/misc/bubble_effects.dart index ced88c3f0..634cf1296 100644 --- a/lib/app/layouts/conversation_view/widgets/message/misc/bubble_effects.dart +++ b/lib/app/layouts/conversation_view/widgets/message/misc/bubble_effects.dart @@ -14,13 +14,13 @@ import 'package:supercharged/supercharged.dart'; class BubbleEffects extends StatefulWidget { BubbleEffects({ - Key? key, + super.key, required this.child, required this.message, required this.part, required this.globalKey, required this.showTail, - }) : super(key: key); + }); final Widget child; final Message message; diff --git a/lib/app/layouts/conversation_view/widgets/message/misc/message_properties.dart b/lib/app/layouts/conversation_view/widgets/message/misc/message_properties.dart index 123ebebfa..d1a4973e5 100644 --- a/lib/app/layouts/conversation_view/widgets/message/misc/message_properties.dart +++ b/lib/app/layouts/conversation_view/widgets/message/misc/message_properties.dart @@ -11,11 +11,11 @@ import 'package:get/get.dart'; class MessageProperties extends CustomStateful { MessageProperties({ - Key? key, + super.key, required super.parentController, required this.part, this.globalKey, - }) : super(key: key); + }); final MessagePart part; final GlobalKey? globalKey; diff --git a/lib/app/layouts/conversation_view/widgets/message/misc/message_sender.dart b/lib/app/layouts/conversation_view/widgets/message/misc/message_sender.dart index 335e996c3..68aae04bd 100644 --- a/lib/app/layouts/conversation_view/widgets/message/misc/message_sender.dart +++ b/lib/app/layouts/conversation_view/widgets/message/misc/message_sender.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class MessageSender extends StatelessWidget { - const MessageSender({Key? key, required this.message, required this.olderMessage}) : super(key: key); + const MessageSender({super.key, required this.message, required this.olderMessage}); final Message message; final Message? olderMessage; diff --git a/lib/app/layouts/conversation_view/widgets/message/misc/select_checkbox.dart b/lib/app/layouts/conversation_view/widgets/message/misc/select_checkbox.dart index c7001c9e2..f699c47fe 100644 --- a/lib/app/layouts/conversation_view/widgets/message/misc/select_checkbox.dart +++ b/lib/app/layouts/conversation_view/widgets/message/misc/select_checkbox.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class SelectCheckbox extends StatelessWidget { - const SelectCheckbox({Key? key, required this.message, required this.controller}) : super(key: key); + const SelectCheckbox({super.key, required this.message, required this.controller}); final Message message; final ConversationViewController controller; diff --git a/lib/app/layouts/conversation_view/widgets/message/misc/slide_to_reply.dart b/lib/app/layouts/conversation_view/widgets/message/misc/slide_to_reply.dart index f781a576a..45d9a51e7 100644 --- a/lib/app/layouts/conversation_view/widgets/message/misc/slide_to_reply.dart +++ b/lib/app/layouts/conversation_view/widgets/message/misc/slide_to_reply.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class SlideToReply extends StatelessWidget { - const SlideToReply({Key? key, required this.width, required this.isFromMe}) : super(key: key); + const SlideToReply({super.key, required this.width, required this.isFromMe}); final double width; final bool isFromMe; diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart index abc5b4be8..438b0a625 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart @@ -47,7 +47,7 @@ class MessagePopup extends StatefulWidget { final BuildContext? Function() widthContext; const MessagePopup({ - Key? key, + super.key, required this.childPosition, required this.size, required this.child, @@ -57,7 +57,7 @@ class MessagePopup extends StatefulWidget { required this.serverDetails, required this.sendTapback, required this.widthContext, - }) : super(key: key); + }); @override State createState() => _MessagePopupState(); @@ -1554,9 +1554,9 @@ class _MessagePopupState extends OptimizedState with SingleTickerP class ReactionDetails extends StatelessWidget { const ReactionDetails({ - Key? key, + super.key, required this.reactions, - }) : super(key: key); + }); final List reactions; diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart index 240092259..09beb6e16 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart @@ -13,13 +13,13 @@ import 'package:universal_html/html.dart' as html; class MessagePopupHolder extends StatefulWidget { MessagePopupHolder({ - Key? key, + super.key, required this.child, required this.part, required this.controller, required this.cvController, required this.isEditing, - }) : super(key: key); + }); final Widget child; final MessagePart part; diff --git a/lib/app/layouts/conversation_view/widgets/message/reaction/reaction.dart b/lib/app/layouts/conversation_view/widgets/message/reaction/reaction.dart index d25a49202..b35018ba2 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reaction/reaction.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reaction/reaction.dart @@ -17,11 +17,11 @@ import 'package:get/get.dart'; class ReactionWidget extends StatefulWidget { const ReactionWidget({ - Key? key, + super.key, required this.message, required this.reaction, this.reactions, - }) : super(key: key); + }); final Message? message; final Message reaction; diff --git a/lib/app/layouts/conversation_view/widgets/message/reaction/reaction_holder.dart b/lib/app/layouts/conversation_view/widgets/message/reaction/reaction_holder.dart index 26fd22c17..cb398fd4c 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reaction/reaction_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reaction/reaction_holder.dart @@ -8,10 +8,10 @@ import 'package:flutter/material.dart'; class ReactionHolder extends StatefulWidget { ReactionHolder({ - Key? key, + super.key, required this.reactions, required this.message, - }) : super(key: key); + }); final Iterable reactions; final Message message; diff --git a/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart b/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart index 151967ce4..81d6dd180 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart @@ -13,12 +13,12 @@ import 'package:get/get.dart'; class ReplyBubble extends CustomStateful { ReplyBubble({ - Key? key, + super.key, required super.parentController, required this.part, required this.showAvatar, required this.cvController, - }) : super(key: key); + }); final int part; final bool showAvatar; diff --git a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart index 85a7b5555..0bed15ddd 100644 --- a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart +++ b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart @@ -15,7 +15,7 @@ import 'package:simple_animations/simple_animations.dart'; import 'package:tuple/tuple.dart'; class SendAnimation extends CustomStateful { - const SendAnimation({Key? key, required super.parentController}) : super(key: key); + const SendAnimation({super.key, required super.parentController}); @override CustomState createState() => _SendAnimationState(); diff --git a/lib/app/layouts/conversation_view/widgets/message/text/text_bubble.dart b/lib/app/layouts/conversation_view/widgets/message/text/text_bubble.dart index 0bea27b91..d88813f82 100644 --- a/lib/app/layouts/conversation_view/widgets/message/text/text_bubble.dart +++ b/lib/app/layouts/conversation_view/widgets/message/text/text_bubble.dart @@ -10,11 +10,11 @@ import 'package:supercharged/supercharged.dart'; class TextBubble extends CustomStateful { TextBubble({ - Key? key, + super.key, required super.parentController, required this.message, this.subjectOnly = false, - }) : super(key: key); + }); final MessagePart message; final bool subjectOnly; diff --git a/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart b/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart index 2ebc595a6..585aec47a 100644 --- a/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart +++ b/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart @@ -8,10 +8,10 @@ import 'package:get/get.dart'; class DeliveredIndicator extends CustomStateful { DeliveredIndicator({ - Key? key, + super.key, required super.parentController, required this.forceShow, - }) : super(key: key); + }); final bool forceShow; diff --git a/lib/app/layouts/conversation_view/widgets/message/timestamp/message_timestamp.dart b/lib/app/layouts/conversation_view/widgets/message/timestamp/message_timestamp.dart index b71bb5b0c..3b1fd4d97 100644 --- a/lib/app/layouts/conversation_view/widgets/message/timestamp/message_timestamp.dart +++ b/lib/app/layouts/conversation_view/widgets/message/timestamp/message_timestamp.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class MessageTimestamp extends StatelessWidget { - const MessageTimestamp({Key? key, required this.controller, required this.cvController}) : super(key: key); + const MessageTimestamp({super.key, required this.controller, required this.cvController}); final MessageWidgetController controller; final ConversationViewController cvController; diff --git a/lib/app/layouts/conversation_view/widgets/message/timestamp/timestamp_separator.dart b/lib/app/layouts/conversation_view/widgets/message/timestamp/timestamp_separator.dart index 3fab9c38b..88246e2a5 100644 --- a/lib/app/layouts/conversation_view/widgets/message/timestamp/timestamp_separator.dart +++ b/lib/app/layouts/conversation_view/widgets/message/timestamp/timestamp_separator.dart @@ -7,10 +7,10 @@ import 'package:tuple/tuple.dart'; class TimestampSeparator extends StatelessWidget { const TimestampSeparator({ - Key? key, + super.key, required this.olderMessage, required this.message, - }) : super(key: key); + }); final Message? olderMessage; final Message message; diff --git a/lib/app/layouts/conversation_view/widgets/message/typing/typing_indicator.dart b/lib/app/layouts/conversation_view/widgets/message/typing/typing_indicator.dart index de531a0e3..4e9e23916 100644 --- a/lib/app/layouts/conversation_view/widgets/message/typing/typing_indicator.dart +++ b/lib/app/layouts/conversation_view/widgets/message/typing/typing_indicator.dart @@ -10,11 +10,11 @@ import 'package:get/get.dart'; class TypingIndicator extends StatefulWidget { const TypingIndicator({ - Key? key, + super.key, this.visible, this.controller, this.scale = 1.0, - }) : super(key: key); + }); final bool? visible; final ConversationViewController? controller; diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 2963bb56c..fa1b10615 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -38,9 +38,9 @@ import 'package:universal_io/io.dart'; class ConversationTextField extends CustomStateful { ConversationTextField({ - Key? key, + super.key, required super.parentController, - }) : super(key: key); + }); static ConversationTextFieldState? of(BuildContext context) { return context.findAncestorStateOfType(); @@ -768,7 +768,7 @@ class ConversationTextFieldState extends CustomState { if (widget.controller!.showRecording.value) { if (kIsDesktop) { File temp = File(join(fs.appDocDir.path, "temp", "recorder", "${widget.controller!.chat.guid.characters.where((c) => c.isAlphabetOnly || c.isNumericOnly).join()}.m4a")); - await RecordPlatform.instance.start(bitRate: 320000, path: temp.path); + await RecordPlatform.instance.start(widget.controller!.chat.guid, const RecordConfig(bitRate: 320000), path: temp.path); return; } await widget.recorderController!.record( @@ -108,7 +108,7 @@ class _TextFieldSuffixState extends OptimizedState { late final String? path; late final PlatformFile file; if (kIsDesktop) { - path = await RecordPlatform.instance.stop(); + path = await RecordPlatform.instance.stop(widget.controller!.chat.guid); if (path == null) return; final _file = File(path); file = PlatformFile( diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index be230fe7b..8839f2daf 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -30,7 +30,7 @@ import 'package:sliding_up_panel2/sliding_up_panel2.dart'; import 'package:universal_io/io.dart'; class FindMyPage extends StatefulWidget { - const FindMyPage({Key? key}) : super(key: key); + const FindMyPage({super.key}); @override State createState() => _FindMyPageState(); @@ -92,7 +92,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi point: LatLng(e.location!.latitude!, e.location!.longitude!), width: 30, height: 35, - builder: (_) => ClipShadowPath( + child: ClipShadowPath( clipper: const FindMyPinClipper(), shadow: const BoxShadow( color: Colors.black, @@ -119,7 +119,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), ), ), - anchorPos: AnchorPos.align(AnchorAlign.top), + alignment: Alignment.topCenter, ); } if (!(Platform.isLinux && !kIsWeb)) { @@ -174,7 +174,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi point: LatLng(e.latitude!, e.longitude!), width: 35, height: 35, - builder: (_) => Container( + child: Container( decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), child: Center( child: Padding( @@ -184,7 +184,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), ), ), - anchorPos: AnchorPos.align(AnchorAlign.top), + alignment: Alignment.topCenter, ); } setState(() { @@ -214,7 +214,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi point: LatLng(pos.latitude, pos.longitude), width: 25, height: 55, - builder: (_) => Stack( + child: Stack( alignment: Alignment.center, children: [ if (pos.heading.isFinite) @@ -252,7 +252,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), ], ), - anchorPos: AnchorPos.align(AnchorAlign.center), + alignment: Alignment.topCenter, ); } @@ -1274,14 +1274,16 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi return FlutterMap( mapController: mapController, options: MapOptions( - zoom: 5.0, + initialZoom: 5.0, minZoom: 1.0, maxZoom: 18.0, - center: location == null ? null : LatLng(location!.latitude, location!.longitude), + initialCenter: location == null ? const LatLng(0, 0) : LatLng(location!.latitude, location!.longitude), onTap: (_, __) => popupController.hideAllPopups(), // Hide popup when the map is tapped. keepAlive: true, - interactiveFlags: InteractiveFlag.all & ~InteractiveFlag.rotate, + interactionOptions: const InteractionOptions( + flags: InteractiveFlag.all & ~InteractiveFlag.rotate, + ), onMapReady: () { if (!completer.isCompleted) { completer.complete(); diff --git a/lib/app/layouts/findmy/findmy_pin_clipper.dart b/lib/app/layouts/findmy/findmy_pin_clipper.dart index 112fbdfdf..61c076a76 100644 --- a/lib/app/layouts/findmy/findmy_pin_clipper.dart +++ b/lib/app/layouts/findmy/findmy_pin_clipper.dart @@ -31,11 +31,11 @@ class ClipShadowPath extends StatelessWidget { final Widget child; const ClipShadowPath({ - Key? key, + super.key, required this.shadow, required this.clipper, required this.child, - }) : super(key: key); + }); @override Widget build(BuildContext context) { diff --git a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart index fabaaf155..1b40e3715 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart @@ -17,11 +17,11 @@ import 'package:get/get.dart'; class FullscreenMediaHolder extends StatefulWidget { FullscreenMediaHolder({ - Key? key, + super.key, required this.attachment, required this.showInteractions, this.currentChat, - }) : super(key: key); + }); final ChatLifecycleManager? currentChat; final Attachment attachment; diff --git a/lib/app/layouts/fullscreen_media/fullscreen_image.dart b/lib/app/layouts/fullscreen_media/fullscreen_image.dart index 0b2af4136..5f8a40f6e 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_image.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_image.dart @@ -18,12 +18,12 @@ import 'package:universal_io/io.dart'; class FullscreenImage extends StatefulWidget { FullscreenImage({ - Key? key, + super.key, required this.file, required this.attachment, required this.showInteractions, required this.updatePhysics, - }) : super(key: key); + }); final PlatformFile file; final Attachment attachment; diff --git a/lib/app/layouts/fullscreen_media/fullscreen_video.dart b/lib/app/layouts/fullscreen_media/fullscreen_video.dart index 28f1f5942..6d4432393 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_video.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_video.dart @@ -23,11 +23,11 @@ import 'package:video_player/video_player.dart'; class FullscreenVideo extends StatefulWidget { FullscreenVideo({ - Key? key, + super.key, required this.file, required this.attachment, required this.showInteractions, - }) : super(key: key); + }); final PlatformFile file; final Attachment attachment; diff --git a/lib/app/layouts/settings/dialogs/create_new_theme_dialog.dart b/lib/app/layouts/settings/dialogs/create_new_theme_dialog.dart index 1e7165b1e..02d2dcf2b 100644 --- a/lib/app/layouts/settings/dialogs/create_new_theme_dialog.dart +++ b/lib/app/layouts/settings/dialogs/create_new_theme_dialog.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class CreateNewThemeDialog extends StatelessWidget { - CreateNewThemeDialog(this._context, this.isDarkMode, this.currentTheme, this.onComplete, {Key? key}) : super(key: key); + CreateNewThemeDialog(this._context, this.isDarkMode, this.currentTheme, this.onComplete, {super.key}); final BuildContext _context; final bool isDarkMode; final ThemeStruct currentTheme; diff --git a/lib/app/layouts/settings/dialogs/notification_settings_dialog.dart b/lib/app/layouts/settings/dialogs/notification_settings_dialog.dart index ddcf226a1..3b06ea700 100644 --- a/lib/app/layouts/settings/dialogs/notification_settings_dialog.dart +++ b/lib/app/layouts/settings/dialogs/notification_settings_dialog.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class NotificationSettingsDialog extends StatelessWidget { - NotificationSettingsDialog(this.chat, this.updateParent, {Key? key}) : super(key: key); + NotificationSettingsDialog(this.chat, this.updateParent, {super.key}); final Chat chat; final VoidCallback updateParent; @@ -213,7 +213,7 @@ class NotificationSettingsDialog extends StatelessWidget { } class TextDetectionDialog extends StatelessWidget { - TextDetectionDialog(this.controller, {Key? key}) : super(key: key); + TextDetectionDialog(this.controller, {super.key}); final TextEditingController controller; @override diff --git a/lib/app/layouts/settings/dialogs/old_themes_dialog.dart b/lib/app/layouts/settings/dialogs/old_themes_dialog.dart index 869512d0a..e29bbdd1f 100644 --- a/lib/app/layouts/settings/dialogs/old_themes_dialog.dart +++ b/lib/app/layouts/settings/dialogs/old_themes_dialog.dart @@ -9,7 +9,7 @@ import 'package:get/get.dart'; import 'package:universal_io/io.dart'; class OldThemesDialog extends StatelessWidget { - OldThemesDialog(this.oldThemes, this.clearOld, {Key? key}) : super(key: key); + OldThemesDialog(this.oldThemes, this.clearOld, {super.key}); // ignore: deprecated_member_use_from_same_package final List oldThemes; final Function() clearOld; diff --git a/lib/app/layouts/settings/dialogs/sync_dialog.dart b/lib/app/layouts/settings/dialogs/sync_dialog.dart index 5b6975bc4..1c706fec8 100644 --- a/lib/app/layouts/settings/dialogs/sync_dialog.dart +++ b/lib/app/layouts/settings/dialogs/sync_dialog.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class SyncDialog extends StatefulWidget { - SyncDialog({Key? key, required this.manager}) : super(key: key); + SyncDialog({super.key, required this.manager}); final IncrementalSyncManager manager; diff --git a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart index 653fe7a1a..68c3fde8c 100644 --- a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart +++ b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart @@ -89,7 +89,7 @@ class _BackupRestorePanelState extends OptimizedState { return "Android (${androidInfo.model})"; } else if (kIsWeb) { WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo; - return "Web (${describeEnum(webInfo.browserName)})"; + return "Web (${webInfo.browserName.name})"; } else if (Platform.isWindows) { WindowsDeviceInfo windowsInfo = await deviceInfo.windowsInfo; return "Windows (${windowsInfo.computerName})"; @@ -621,7 +621,7 @@ class _BackupRestorePanelState extends OptimizedState { title: Text(item["name"]), subtitle: !item.containsKey('data') ? Text("Incompatible backup!", style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.error)) - : Text("${describeEnum(Brightness.values[data["colorScheme"]["brightness"]]).capitalizeFirst!} theme"), + : Text("${Brightness.values[data["colorScheme"]["brightness"]].name.capitalizeFirst!} theme"), leading: !item.containsKey('data') ? null : Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/app/layouts/settings/pages/server/oauth_panel.dart b/lib/app/layouts/settings/pages/server/oauth_panel.dart index 3282022ca..510f0d8dc 100644 --- a/lib/app/layouts/settings/pages/server/oauth_panel.dart +++ b/lib/app/layouts/settings/pages/server/oauth_panel.dart @@ -280,7 +280,7 @@ class _OauthPanelState extends OptimizedState { padding: const EdgeInsets.all(24), child: const Text( "No Firebase Projects found!\n\nMake sure you're signed in to the same Google account that you used on your server!", - textScaleFactor: 1.1, + textScaler: TextScaler.linear(1.1), textAlign: TextAlign.center, ), ), diff --git a/lib/app/layouts/settings/pages/server/server_management_panel.dart b/lib/app/layouts/settings/pages/server/server_management_panel.dart index f62b95cd9..8ee860617 100644 --- a/lib/app/layouts/settings/pages/server/server_management_panel.dart +++ b/lib/app/layouts/settings/pages/server/server_management_panel.dart @@ -153,7 +153,7 @@ class _ServerManagementPanelState extends CustomState createState() => _AdvancedThemingPanelState(); diff --git a/lib/app/layouts/settings/pages/theming/theming_panel.dart b/lib/app/layouts/settings/pages/theming/theming_panel.dart index c393bb2e9..2e01b37ac 100644 --- a/lib/app/layouts/settings/pages/theming/theming_panel.dart +++ b/lib/app/layouts/settings/pages/theming/theming_panel.dart @@ -154,7 +154,7 @@ class _ThemingPanelState extends CustomState describeEnum(val), + textProcessing: (val) => val.name, capitalize: false, title: "App Skin", secondaryColor: headerColor, diff --git a/lib/app/layouts/settings/settings_page.dart b/lib/app/layouts/settings/settings_page.dart index 32ccb5720..153088798 100644 --- a/lib/app/layouts/settings/settings_page.dart +++ b/lib/app/layouts/settings/settings_page.dart @@ -38,9 +38,9 @@ import 'package:universal_io/io.dart'; class SettingsPage extends StatefulWidget { SettingsPage({ - Key? key, + super.key, this.initialPage, - }) : super(key: key); + }); final Widget? initialPage; @@ -841,8 +841,8 @@ class _SettingsPageState extends OptimizedState { await ss.prefs.setString("selected-light", "Bright White"); themeBox.putMany(ts.defaultThemes); await ts.changeTheme(context); - Get.offAll(() => WillPopScope( - onWillPop: () async => false, + Get.offAll(() => PopScope( + canPop: false, child: TitleBarWrapper(child: SetupView()), ), duration: Duration.zero, transition: Transition.noTransition); }, @@ -891,8 +891,9 @@ class _SettingsPageState extends OptimizedState { ), right: LayoutBuilder(builder: (context, constraints) { ns.maxWidthSettings = constraints.maxWidth; - return WillPopScope( - onWillPop: () async { + return PopScope( + canPop: false, + onPopInvoked: (_) async { Get.until((route) { if (route.settings.name == "initial") { Get.back(); @@ -901,7 +902,6 @@ class _SettingsPageState extends OptimizedState { } return true; }, id: 3); - return false; }, child: Navigator( key: Get.nestedKey(3), diff --git a/lib/app/layouts/settings/widgets/content/advanced_theming_tile.dart b/lib/app/layouts/settings/widgets/content/advanced_theming_tile.dart index 3c78f30a3..95118fc67 100644 --- a/lib/app/layouts/settings/widgets/content/advanced_theming_tile.dart +++ b/lib/app/layouts/settings/widgets/content/advanced_theming_tile.dart @@ -8,8 +8,7 @@ import 'package:get/get.dart'; import 'package:tuple/tuple.dart'; class AdvancedThemingTile extends StatefulWidget { - AdvancedThemingTile({Key? key, required this.currentTheme, required this.tuple, required this.editable}) - : super(key: key); + AdvancedThemingTile({super.key, required this.currentTheme, required this.tuple, required this.editable}); final ThemeStruct currentTheme; final Tuple2, MapEntry?> tuple; final bool editable; diff --git a/lib/app/layouts/settings/widgets/content/settings_dropdown.dart b/lib/app/layouts/settings/widgets/content/settings_dropdown.dart index 2461c84f6..8614a4d19 100644 --- a/lib/app/layouts/settings/widgets/content/settings_dropdown.dart +++ b/lib/app/layouts/settings/widgets/content/settings_dropdown.dart @@ -7,7 +7,7 @@ import 'package:get/get.dart'; class SettingsOptions extends StatelessWidget { SettingsOptions({ - Key? key, + super.key, required this.onChanged, required this.options, this.cupertinoCustomWidgets, @@ -21,7 +21,7 @@ class SettingsOptions extends StatelessWidget { this.secondaryColor, this.useCupertino = true, this.clampWidth = true, - }) : super(key: key); + }); final String title; final void Function(T?) onChanged; final List options; diff --git a/lib/app/layouts/settings/widgets/content/settings_slider.dart b/lib/app/layouts/settings/widgets/content/settings_slider.dart index 314ec92cc..96a80d615 100644 --- a/lib/app/layouts/settings/widgets/content/settings_slider.dart +++ b/lib/app/layouts/settings/widgets/content/settings_slider.dart @@ -14,8 +14,7 @@ class SettingsSlider extends StatelessWidget { required this.divisions, this.leading, this.backgroundColor, - Key? key}) - : super(key: key); + super.key}); final double startingVal; final Function(double val)? update; diff --git a/lib/app/layouts/settings/widgets/content/settings_subtitle.dart b/lib/app/layouts/settings/widgets/content/settings_subtitle.dart index 9acd63bab..2546cd6db 100644 --- a/lib/app/layouts/settings/widgets/content/settings_subtitle.dart +++ b/lib/app/layouts/settings/widgets/content/settings_subtitle.dart @@ -4,11 +4,11 @@ import 'package:get/get.dart'; class SettingsSubtitle extends StatelessWidget { const SettingsSubtitle({ - Key? key, + super.key, this.subtitle, this.unlimitedSpace = false, this.bottomPadding = true, - }) : super(key: key); + }); final String? subtitle; final bool unlimitedSpace; diff --git a/lib/app/layouts/settings/widgets/content/settings_switch.dart b/lib/app/layouts/settings/widgets/content/settings_switch.dart index eb2619d97..f2dd18f7c 100644 --- a/lib/app/layouts/settings/widgets/content/settings_switch.dart +++ b/lib/app/layouts/settings/widgets/content/settings_switch.dart @@ -4,14 +4,14 @@ import 'package:get/get.dart'; class SettingsSwitch extends StatelessWidget { SettingsSwitch({ - Key? key, + super.key, required this.initialVal, required this.onChanged, required this.title, this.backgroundColor, this.subtitle, this.isThreeLine = false, - }) : super(key: key); + }); final bool initialVal; final Function(bool) onChanged; final String title; diff --git a/lib/app/layouts/settings/widgets/content/settings_tile.dart b/lib/app/layouts/settings/widgets/content/settings_tile.dart index dabfece64..29897224b 100644 --- a/lib/app/layouts/settings/widgets/content/settings_tile.dart +++ b/lib/app/layouts/settings/widgets/content/settings_tile.dart @@ -6,7 +6,7 @@ import 'package:universal_html/html.dart' as html; class SettingsTile extends StatelessWidget { const SettingsTile({ - Key? key, + super.key, this.onTap, this.onLongPress, this.title, @@ -15,7 +15,7 @@ class SettingsTile extends StatelessWidget { this.subtitle, this.backgroundColor, this.isThreeLine = false, - }) : super(key: key); + }); final Function? onTap; final Function? onLongPress; diff --git a/lib/app/layouts/setup/dialogs/connecting_dialog.dart b/lib/app/layouts/setup/dialogs/connecting_dialog.dart index 395cd69bb..3303c600c 100644 --- a/lib/app/layouts/setup/dialogs/connecting_dialog.dart +++ b/lib/app/layouts/setup/dialogs/connecting_dialog.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class ConnectingDialog extends StatefulWidget { - ConnectingDialog({Key? key, required this.onConnect}) : super(key: key); + ConnectingDialog({super.key, required this.onConnect}); final Function(bool) onConnect; @override @@ -41,10 +41,8 @@ class _ConnectingDialogState extends OptimizedState { onDismiss: () => Navigator.of(context).pop(), ); } else { - return WillPopScope( - onWillPop: () async { - return false; - }, + return PopScope( + canPop: false, child: AlertDialog( title: Text( "Connecting...", diff --git a/lib/app/layouts/setup/dialogs/failed_to_connect_dialog.dart b/lib/app/layouts/setup/dialogs/failed_to_connect_dialog.dart index 217dbec76..b00c9137b 100644 --- a/lib/app/layouts/setup/dialogs/failed_to_connect_dialog.dart +++ b/lib/app/layouts/setup/dialogs/failed_to_connect_dialog.dart @@ -3,15 +3,16 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class FailedToConnectDialog extends StatelessWidget { - const FailedToConnectDialog({Key? key, required this.onDismiss}) : super(key: key); + const FailedToConnectDialog({super.key, required this.onDismiss}); final Function() onDismiss; @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async { + return PopScope( + canPop: false, + onPopInvoked: (_) async { onDismiss(); - return true; + Navigator.of(context).pop(); }, child: AlertDialog( backgroundColor: context.theme.colorScheme.properSurface, diff --git a/lib/app/layouts/setup/dialogs/failed_to_scan_dialog.dart b/lib/app/layouts/setup/dialogs/failed_to_scan_dialog.dart index d6a97566c..d041c553b 100644 --- a/lib/app/layouts/setup/dialogs/failed_to_scan_dialog.dart +++ b/lib/app/layouts/setup/dialogs/failed_to_scan_dialog.dart @@ -5,7 +5,7 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart'; class FailedToScanDialog extends StatelessWidget { - const FailedToScanDialog({Key? key, required this.exception, required this.title}) : super(key: key); + const FailedToScanDialog({super.key, required this.exception, required this.title}); final dynamic exception; final String title; diff --git a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart index ce38ea052..08eb40943 100644 --- a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart +++ b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart @@ -11,7 +11,7 @@ import 'package:flutter/services.dart'; import 'package:get/get.dart' hide Response; class ManualEntryDialog extends StatefulWidget { - ManualEntryDialog({Key? key, required this.onConnect, required this.onClose}) : super(key: key); + ManualEntryDialog({super.key, required this.onConnect, required this.onClose}); final Function() onConnect; final Function() onClose; diff --git a/lib/app/layouts/setup/pages/page_template.dart b/lib/app/layouts/setup/pages/page_template.dart index 183496365..f09e0b85d 100644 --- a/lib/app/layouts/setup/pages/page_template.dart +++ b/lib/app/layouts/setup/pages/page_template.dart @@ -86,7 +86,7 @@ class SetupPageTemplate extends StatelessWidget { class PageContent extends StatelessWidget { const PageContent({ - Key? key, + super.key, required this.aboveTitle, required this.customTitle, required this.title, @@ -96,7 +96,7 @@ class PageContent extends StatelessWidget { this.titleWrapper, this.subtitleWrapper, this.contentWrapper, - }) : super(key: key); + }); final Widget? aboveTitle; final Widget? customTitle; @@ -166,11 +166,11 @@ class PageContent extends StatelessWidget { class PageButtons extends StatelessWidget { PageButtons({ - Key? key, + super.key, required this.title, required this.customButton, required this.onNextPressed, - }) : super(key: key); + }); final String title; final Widget? customButton; diff --git a/lib/app/layouts/setup/pages/sync/qr_code_scanner.dart b/lib/app/layouts/setup/pages/sync/qr_code_scanner.dart index 42381b941..548291abf 100644 --- a/lib/app/layouts/setup/pages/sync/qr_code_scanner.dart +++ b/lib/app/layouts/setup/pages/sync/qr_code_scanner.dart @@ -7,7 +7,7 @@ import 'package:get/get.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; class QRCodeScanner extends StatefulWidget { - QRCodeScanner({Key? key}) : super(key: key); + QRCodeScanner({super.key}); @override State createState() => _QRCodeScannerState(); diff --git a/lib/app/layouts/setup/pages/sync/server_credentials.dart b/lib/app/layouts/setup/pages/sync/server_credentials.dart index 924a03ba5..5199ea60f 100644 --- a/lib/app/layouts/setup/pages/sync/server_credentials.dart +++ b/lib/app/layouts/setup/pages/sync/server_credentials.dart @@ -183,7 +183,7 @@ class _ServerCredentialsState extends OptimizedState { padding: const EdgeInsets.all(24), child: const Text( "No Firebase Projects found!\n\nMake sure you're signed in to the same Google account that you used on your server!", - textScaleFactor: 1.1, + textScaler: TextScaler.linear(1.1), textAlign: TextAlign.center, ), ), @@ -645,10 +645,8 @@ class _ServerCredentialsState extends OptimizedState { context: context, barrierDismissible: false, builder: (context) { - return WillPopScope( - onWillPop: () async { - return false; - }, + return PopScope( + canPop: false, child: AlertDialog( title: Text( "Fetching server info...", diff --git a/lib/app/layouts/setup/pages/unfinished/theme_selector.dart b/lib/app/layouts/setup/pages/unfinished/theme_selector.dart index c8c1badb1..e89624d85 100644 --- a/lib/app/layouts/setup/pages/unfinished/theme_selector.dart +++ b/lib/app/layouts/setup/pages/unfinished/theme_selector.dart @@ -696,10 +696,10 @@ class Skin extends InheritedWidget { final Skins skin; const Skin({ - Key? key, - required Widget child, + super.key, + required super.child, required this.skin, - }) : super(key: key, child: child); + }); static Skin? of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType(); diff --git a/lib/app/layouts/setup/setup_view.dart b/lib/app/layouts/setup/setup_view.dart index 73de1f581..6ac177e24 100644 --- a/lib/app/layouts/setup/setup_view.dart +++ b/lib/app/layouts/setup/setup_view.dart @@ -44,7 +44,7 @@ class SetupViewController extends StatefulController { } class SetupView extends StatefulWidget { - SetupView({Key? key}) : super(key: key); + SetupView({super.key}); @override State createState() => _SetupViewState(); @@ -82,8 +82,8 @@ class _SetupViewState extends OptimizedState { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async => false, + return PopScope( + canPop: false, child: Scaffold( backgroundColor: ss.settings.windowEffect.value != WindowEffect.disabled ? Colors.transparent : context.theme.colorScheme.background, body: SafeArea( diff --git a/lib/app/layouts/startup/failure_to_start.dart b/lib/app/layouts/startup/failure_to_start.dart index 6fe0d1b9b..e864590c3 100644 --- a/lib/app/layouts/startup/failure_to_start.dart +++ b/lib/app/layouts/startup/failure_to_start.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class FailureToStart extends StatelessWidget { - const FailureToStart({Key? key, this.e, this.s, this.otherTitle}) : super(key: key); + const FailureToStart({super.key, this.e, this.s, this.otherTitle}); final dynamic e; final StackTrace? s; final String? otherTitle; diff --git a/lib/app/layouts/startup/splash_screen.dart b/lib/app/layouts/startup/splash_screen.dart index d776d6e6e..bfe75fde5 100644 --- a/lib/app/layouts/startup/splash_screen.dart +++ b/lib/app/layouts/startup/splash_screen.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class SplashScreen extends StatefulWidget { - SplashScreen({Key? key, required this.shouldNavigate}) : super(key: key); + SplashScreen({super.key, required this.shouldNavigate}); final bool shouldNavigate; diff --git a/lib/app/wrappers/cupertino_icon_wrapper.dart b/lib/app/wrappers/cupertino_icon_wrapper.dart index 02d42760d..a54971471 100644 --- a/lib/app/wrappers/cupertino_icon_wrapper.dart +++ b/lib/app/wrappers/cupertino_icon_wrapper.dart @@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/widgets.dart'; class CupertinoIconWrapper extends StatelessWidget { - const CupertinoIconWrapper({Key? key, required Icon this.icon}) : super(key: key); + const CupertinoIconWrapper({super.key, required Icon this.icon}); final Widget icon; diff --git a/lib/app/wrappers/scrollbar_wrapper.dart b/lib/app/wrappers/scrollbar_wrapper.dart index 9479785d5..b23b2c1dc 100644 --- a/lib/app/wrappers/scrollbar_wrapper.dart +++ b/lib/app/wrappers/scrollbar_wrapper.dart @@ -8,12 +8,12 @@ import 'package:get/get.dart'; class ScrollbarWrapper extends StatelessWidget { ScrollbarWrapper({ - Key? key, + super.key, required this.child, this.showScrollbar = false, this.reverse = false, required this.controller, - }) : super(key: key); + }); final Widget child; final bool showScrollbar; diff --git a/lib/app/wrappers/stateful_boilerplate.dart b/lib/app/wrappers/stateful_boilerplate.dart index 2d58e7626..f730ef919 100644 --- a/lib/app/wrappers/stateful_boilerplate.dart +++ b/lib/app/wrappers/stateful_boilerplate.dart @@ -18,7 +18,7 @@ class StatefulController extends GetxController { /// [StatefulWidget] with support for optimized state management and a built-in /// [GetxController] abstract class CustomStateful extends StatefulWidget { - const CustomStateful({Key? key, required this.parentController}) : super(key: key); + const CustomStateful({super.key, required this.parentController}); final T parentController; } diff --git a/lib/app/wrappers/tablet_mode_wrapper.dart b/lib/app/wrappers/tablet_mode_wrapper.dart index aa0258871..d36de8daf 100644 --- a/lib/app/wrappers/tablet_mode_wrapper.dart +++ b/lib/app/wrappers/tablet_mode_wrapper.dart @@ -18,7 +18,7 @@ class TabletModeWrapper extends StatefulWidget { final double? minWidthLeft; final double? maxWidthLeft; - const TabletModeWrapper({Key? key, + const TabletModeWrapper({super.key, required this.left, required this.right, this.initialRatio = 0.5, @@ -29,8 +29,7 @@ class TabletModeWrapper extends StatefulWidget { this.minWidthLeft, this.maxWidthLeft }) : assert(initialRatio >= 0), - assert(initialRatio <= 1), - super(key: key); + assert(initialRatio <= 1); @override State createState() => _TabletModeWrapperState(); diff --git a/lib/app/wrappers/theme_switcher.dart b/lib/app/wrappers/theme_switcher.dart index 77a4871a0..c838e41a9 100644 --- a/lib/app/wrappers/theme_switcher.dart +++ b/lib/app/wrappers/theme_switcher.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; class ThemeSwitcher extends StatefulWidget { - ThemeSwitcher({Key? key, required this.iOSSkin, required this.materialSkin, this.samsungSkin}) : super(key: key); + ThemeSwitcher({super.key, required this.iOSSkin, required this.materialSkin, this.samsungSkin}); final Widget iOSSkin; final Widget materialSkin; final Widget? samsungSkin; diff --git a/lib/app/wrappers/titlebar_wrapper.dart b/lib/app/wrappers/titlebar_wrapper.dart index 1dc7fb6d3..1bec2654c 100644 --- a/lib/app/wrappers/titlebar_wrapper.dart +++ b/lib/app/wrappers/titlebar_wrapper.dart @@ -10,7 +10,7 @@ import 'package:get/get_utils/src/extensions/context_extensions.dart'; import 'package:window_manager/window_manager.dart'; class TitleBarWrapper extends StatelessWidget { - TitleBarWrapper({Key? key, required this.child}) : super(key: key); + TitleBarWrapper({super.key, required this.child}); final Widget child; @@ -59,7 +59,7 @@ class TitleBarWrapper extends StatelessWidget { } class TitleBar extends StatelessWidget { - const TitleBar({Key? key}) : super(key: key); + const TitleBar({super.key}); @override Widget build(BuildContext context) { @@ -77,7 +77,7 @@ class TitleBar extends StatelessWidget { } class WindowButtons extends StatelessWidget { - const WindowButtons({Key? key}) : super(key: key); + const WindowButtons({super.key}); @override Widget build(BuildContext context) { diff --git a/lib/helpers/network/network_helpers.dart b/lib/helpers/network/network_helpers.dart index a9c172f4b..08f70adfb 100644 --- a/lib/helpers/network/network_helpers.dart +++ b/lib/helpers/network/network_helpers.dart @@ -36,7 +36,7 @@ Future getDeviceName() async { items.addAll([androidInfo.brand, androidInfo.model, androidInfo.id]); } else if (kIsWeb) { WebBrowserInfo webInfo = await deviceInfo.webBrowserInfo; - items.addAll([describeEnum(webInfo.browserName), webInfo.platform!]); + items.addAll([webInfo.browserName.name, webInfo.platform!]); } else if (Platform.isWindows) { WindowsDeviceInfo windowsInfo = await deviceInfo.windowsInfo; items.addAll([windowsInfo.computerName]); diff --git a/lib/helpers/types/helpers/contact_helpers.dart b/lib/helpers/types/helpers/contact_helpers.dart index 39c5532bb..aacd39f1a 100644 --- a/lib/helpers/types/helpers/contact_helpers.dart +++ b/lib/helpers/types/helpers/contact_helpers.dart @@ -1,6 +1,5 @@ import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; -import 'package:flutter/foundation.dart'; import 'package:get/get.dart'; import 'package:phone_numbers_parser/phone_numbers_parser.dart'; @@ -25,7 +24,7 @@ Future formatPhoneNumber(dynamic item) async { String? formatted; try { final parsed = PhoneNumber.parse(address); - formatted = parsed.getFormattedNsn(isoCode: IsoCode.values.firstWhereOrNull((element) => describeEnum(element) == cc)); + formatted = parsed.getFormattedNsn(isoCode: IsoCode.values.firstWhereOrNull((element) => element.name == cc)); } catch (_) {} return formatted ?? address; diff --git a/lib/helpers/ui/message_widget_helpers.dart b/lib/helpers/ui/message_widget_helpers.dart index d74940be2..feeca69fb 100644 --- a/lib/helpers/ui/message_widget_helpers.dart +++ b/lib/helpers/ui/message_widget_helpers.dart @@ -200,7 +200,7 @@ Future> buildEnrichedMessageSpans(BuildContext context, Message final TrackingCarrier c = data!.first; final String number = data.last; Clipboard.setData(ClipboardData(text: number)); - await launchUrl(Uri.parse("https://www.google.com/search?q=${describeEnum(c)} $number"), mode: LaunchMode.externalApplication); + await launchUrl(Uri.parse("https://www.google.com/search?q=${c.name} $number"), mode: LaunchMode.externalApplication); } else if (type == "flight") { final String c = data!.first; final String number = data.last; diff --git a/lib/main.dart b/lib/main.dart index a79cb7ce4..f28c8a448 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -34,6 +34,7 @@ import 'package:google_ml_kit/google_ml_kit.dart' hide Message; import 'package:intl/date_symbol_data_local.dart'; import 'package:local_auth/local_auth.dart'; import 'package:local_notifier/local_notifier.dart'; +import 'package:network_tools/network_tools.dart'; import 'package:on_exit/init.dart'; import 'package:path/path.dart' show basename, dirname, join; import 'package:path/path.dart' as p; @@ -149,6 +150,7 @@ Future initApp(bool bubble, List arguments) async { HttpOverrides.global = BadCertOverride(); dynamic exception; StackTrace? stacktrace; + await configureNetworkTools('build', enableDebugging: kDebugMode); /* ----- APPDATA MIGRATION ----- */ if ((Platform.isLinux || Platform.isWindows) && kIsDesktop) { @@ -509,7 +511,7 @@ class Main extends StatelessWidget { final ThemeData darkTheme; final ThemeData lightTheme; - const Main({Key? key, required this.lightTheme, required this.darkTheme}) : super(key: key); + const Main({super.key, required this.lightTheme, required this.darkTheme}); @override Widget build(BuildContext context) { @@ -670,7 +672,7 @@ class Main extends StatelessWidget { } class Home extends StatefulWidget { - Home({Key? key}) : super(key: key); + Home({super.key}); @override State createState() => _HomeState(); @@ -910,8 +912,8 @@ class _HomeState extends OptimizedState with WidgetsBindingObserver { showUnknownSenders: false, ); } else { - return WillPopScope( - onWillPop: () async => false, + return PopScope( + canPop: false, child: TitleBarWrapper(child: kIsWeb || kIsDesktop ? SetupView() : SplashScreen(shouldNavigate: fullyLoaded)), ); } diff --git a/lib/models/global/queue_items.dart b/lib/models/global/queue_items.dart index 856a15b0c..f2d278989 100644 --- a/lib/models/global/queue_items.dart +++ b/lib/models/global/queue_items.dart @@ -17,12 +17,12 @@ class IncomingItem extends QueueItem { String? tempGuid; IncomingItem._({ - required QueueType type, - Completer? completer, + required super.type, + super.completer, required this.chat, required this.message, this.tempGuid, - }) : super(type: type, completer: completer); + }); factory IncomingItem.fromMap(QueueType t, Map m, [Completer? c]) { return IncomingItem._( @@ -43,12 +43,12 @@ class OutgoingItem extends QueueItem { Map? customArgs; OutgoingItem({ - required QueueType type, - Completer? completer, + required super.type, + super.completer, required this.chat, required this.message, this.selected, this.reaction, this.customArgs, - }) : super(type: type, completer: completer); + }); } \ No newline at end of file diff --git a/lib/models/global/server_payload.dart b/lib/models/global/server_payload.dart index 077bb4015..000dd38f5 100644 --- a/lib/models/global/server_payload.dart +++ b/lib/models/global/server_payload.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'package:bluebubbles/services/backend/settings/settings_service.dart'; import 'package:bluebubbles/utils/crypto_utils.dart'; import 'package:collection/collection.dart'; -import 'package:flutter/foundation.dart'; enum PayloadEncoding { JSON_OBJECT, @@ -66,11 +65,11 @@ class ServerPayload { originalJson: json, data: json["data"] ?? json, isLegacy: json.containsKey("type"), - type: PayloadType.values.firstWhereOrNull((element) => describeEnum(element) == json["type"]) ?? PayloadType.OTHER, + type: PayloadType.values.firstWhereOrNull((element) => element.name == json["type"]) ?? PayloadType.OTHER, subtype: json["subtype"], isEncrypted: json["encrypted"] ?? false, isPartial: json["partial"] ?? false, - encoding: PayloadEncoding.values.firstWhereOrNull((element) => describeEnum(element) == json["encoding"]) ?? PayloadEncoding.JSON_OBJECT, - encryptionType: EncryptionType.values.firstWhereOrNull((element) => describeEnum(element) == json["encryptionType"]) ?? EncryptionType.AES_PB, + encoding: PayloadEncoding.values.firstWhereOrNull((element) => element.name == json["encoding"]) ?? PayloadEncoding.JSON_OBJECT, + encryptionType: EncryptionType.values.firstWhereOrNull((element) => element.name == json["encryptionType"]) ?? EncryptionType.AES_PB, ); } \ No newline at end of file diff --git a/lib/models/html/media_kit.dart b/lib/models/html/media_kit.dart index d0713756d..b4f8ac8c4 100644 --- a/lib/models/html/media_kit.dart +++ b/lib/models/html/media_kit.dart @@ -152,9 +152,9 @@ class Video extends StatefulWidget { /// {@macro video} const Video({ - Key? key, + super.key, required this.controller, - }) : super(key: key); + }); @override State

The isolate is configured as follows: - * - *

- * - *

Preconditions: - * - *

    - *
  • The given callback must correspond to a registered Dart callback. If the handle does not - * resolve to a Dart callback then this method does nothing. - *
  • A static {@link #pluginRegistrantCallback} must exist, otherwise a {@link - * PluginRegistrantException} will be thrown. - *
- */ - public void startBackgroundIsolate() { - if (isNotRunning()) { - long callbackHandle = getPluginCallbackHandle(); - if (callbackHandle != 0) { - Log.i(TAG, "Found background isolate callback handle"); - startBackgroundIsolate(callbackHandle, null); - } else { - Log.i(TAG, "No callback handler available for background isolate"); - } - } - } - - /** - * Starts running a background Dart isolate within a new {@link FlutterEngine}. - * - *

The isolate is configured as follows: - * - *

    - *
  • Bundle Path: {@code io.flutter.view.FlutterMain.findAppBundlePath(context)}. - *
  • Entrypoint: The Dart method represented by {@code callbackHandle}. - *
  • Run args: none. - *
- * - *

Preconditions: - * - *

    - *
  • The given {@code callbackHandle} must correspond to a registered Dart callback. If the - * handle does not resolve to a Dart callback then this method does nothing. - *
  • A static {@link #pluginRegistrantCallback} must exist, otherwise a {@link - * PluginRegistrantException} will be thrown. - *
- */ - public void startBackgroundIsolate(long callbackHandle, FlutterShellArgs shellArgs) { - if (backgroundFlutterEngine != null) { - Log.e(TAG, "Background isolate already started."); - return; - } - - Handler mainHandler = new Handler(Looper.getMainLooper()); - Runnable myRunnable = - () -> { - io.flutter.view.FlutterMain.startInitialization(ContextHolder.getApplicationContext()); - io.flutter.view.FlutterMain.ensureInitializationCompleteAsync( - ContextHolder.getApplicationContext(), - null, - mainHandler, - () -> { - String appBundlePath = io.flutter.view.FlutterMain.findAppBundlePath(); - AssetManager assets = ContextHolder.getApplicationContext().getAssets(); - if (isNotRunning()) { - if (shellArgs != null) { - Log.i( - TAG, - "Creating background FlutterEngine instance, with args: " - + Arrays.toString(shellArgs.toArray())); - backgroundFlutterEngine = - new FlutterEngine( - ContextHolder.getApplicationContext(), shellArgs.toArray()); - } else { - Log.i(TAG, "Creating background FlutterEngine instance."); - backgroundFlutterEngine = - new FlutterEngine(ContextHolder.getApplicationContext()); - } - // We need to create an instance of `FlutterEngine` before looking up the - // callback. If we don't, the callback cache won't be initialized and the - // lookup will fail. - FlutterCallbackInformation flutterCallback = - FlutterCallbackInformation.lookupCallbackInformation(callbackHandle); - DartExecutor executor = backgroundFlutterEngine.getDartExecutor(); - initializeMethodChannel(executor); - DartCallback dartCallback = - new DartCallback(assets, appBundlePath, flutterCallback); - - executor.executeDartCallback(dartCallback); - } - }); - }; - mainHandler.post(myRunnable); - } - - boolean isDartBackgroundHandlerRegistered() { - return getPluginCallbackHandle() != 0; - } - - /** - * Executes the desired Dart callback in a background Dart isolate. - * - *

The given {@code intent} should contain a {@code long} extra called "callbackHandle", which - * corresponds to a callback registered with the Dart VM. - */ - public void executeDartCallbackInBackgroundIsolate(Intent intent, final CountDownLatch latch) { - if (backgroundFlutterEngine == null) { - Log.i( - TAG, - "A background message could not be handled in Dart as no onBackgroundMessage handler has been registered."); - return; - } - - Result result = null; - if (latch != null) { - result = - new Result() { - @Override - public void success(Object result) { - // If another thread is waiting, then wake that thread when the callback returns a result. - latch.countDown(); - } - - @Override - public void error(String errorCode, String errorMessage, Object errorDetails) { - latch.countDown(); - } - - @Override - public void notImplemented() { - latch.countDown(); - } - }; - } - - // Handle the message event in Dart. - RemoteMessage remoteMessage = - intent.getParcelableExtra("notification"); - if (remoteMessage != null) { - backgroundChannel.invokeMethod(remoteMessage.getData().get("type"), remoteMessage.getData().get("data"), - result); - } else { - Log.e(TAG, "RemoteMessage instance not found in Intent."); - } - } - - /** Get the registered Dart callback handle for the messaging plugin. Returns 0 if not set. */ - private long getPluginCallbackHandle() { - if (ContextHolder.getApplicationContext() == null) { - return 0; - } - SharedPreferences prefs = - ContextHolder.getApplicationContext().getSharedPreferences(BACKGROUND_SERVICE_SHARED_PREF, Context.MODE_PRIVATE); - return prefs.getLong(BACKGROUND_HANDLE_SHARED_PREF_KEY, 0); - } - - private void initializeMethodChannel(BinaryMessenger isolate) { - // backgroundChannel is the channel responsible for receiving the following messages from - // the background isolate that was setup by this plugin method call: - // - "FirebaseBackgroundMessaging#initialized" - // - // This channel is also responsible for sending requests from Android to Dart to execute Dart - // callbacks in the background isolate. - backgroundChannel = - new MethodChannel(isolate, "com.bluebubbles.messaging"); - backgroundChannel.setMethodCallHandler(this); - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/bluebubbles/messaging/services/FlutterFirebaseMessagingBackgroundService.java b/android/app/src/main/java/com/bluebubbles/messaging/services/FlutterFirebaseMessagingBackgroundService.java deleted file mode 100644 index 7c0d360c1..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/services/FlutterFirebaseMessagingBackgroundService.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.bluebubbles.messaging.services; - -import android.content.Context; -import android.content.Intent; -import android.os.Handler; -import android.util.Log; -import androidx.annotation.NonNull; -import com.google.firebase.messaging.RemoteMessage; -import io.flutter.embedding.engine.FlutterShellArgs; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import static com.bluebubbles.messaging.method_call_handler.handlers.InitializeBackgroundHandle.BACKGROUND_SERVICE_SHARED_PREF; - -public class FlutterFirebaseMessagingBackgroundService extends JobIntentService { - private static final String TAG = "FLTFireMsgService"; - - private static final List messagingQueue = - Collections.synchronizedList(new LinkedList<>()); - - /** Background Dart execution context. */ - private static FlutterFirebaseMessagingBackgroundExecutor flutterBackgroundExecutor; - - /** - * Schedule the message to be handled by the {@link FlutterFirebaseMessagingBackgroundService}. - */ - public static void enqueueMessageProcessing(Context context, Intent messageIntent) { - RemoteMessage message = (RemoteMessage) messageIntent.getExtras().get("notification"); - - enqueueWork( - context, - FlutterFirebaseMessagingBackgroundService.class, - 2020, - messageIntent, - message.getOriginalPriority() == RemoteMessage.PRIORITY_HIGH); - } - - /** - * Starts the background isolate for the {@link FlutterFirebaseMessagingBackgroundService}. - * - *

Preconditions: - * - *

    - *
  • The given {@code callbackHandle} must correspond to a registered Dart callback. If the - * handle does not resolve to a Dart callback then this method does nothing. - *
  • A static {@link #pluginRegistrantCallback} must exist, otherwise a {@link - * PluginRegistrantException} will be thrown. - *
- */ - @SuppressWarnings("JavadocReference") - public static void startBackgroundIsolate(long callbackHandle, FlutterShellArgs shellArgs) { - if (flutterBackgroundExecutor != null) { - Log.w(TAG, "Attempted to start a duplicate background isolate. Returning..."); - return; - } - flutterBackgroundExecutor = new FlutterFirebaseMessagingBackgroundExecutor(); - flutterBackgroundExecutor.startBackgroundIsolate(callbackHandle, shellArgs); - } - - /** - * Called once the Dart isolate ({@code flutterBackgroundExecutor}) has finished initializing. - * - *

Invoked by {@link FlutterFirebaseMessagingPlugin} when it receives the {@code - * FirebaseMessaging.initialized} message. Processes all messaging events that came in while the - * isolate was starting. - */ - /* package */ - static void onInitialized() { - Log.i(TAG, "FlutterFirebaseMessagingBackgroundService started!"); - synchronized (messagingQueue) { - // Handle all the message events received before the Dart isolate was - // initialized, then clear the queue. - for (Intent intent : messagingQueue) { - flutterBackgroundExecutor.executeDartCallbackInBackgroundIsolate(intent, null); - } - messagingQueue.clear(); - } - } - - /** - * Sets the Dart callback handle for the Dart method that is responsible for initializing the - * background Dart isolate, preparing it to receive Dart callback tasks requests. - */ - public static void setCallbackDispatcher(long callbackHandle) { - FlutterFirebaseMessagingBackgroundExecutor.setCallbackDispatcher(callbackHandle); - } - - @Override - public void onCreate() { - super.onCreate(); - if (flutterBackgroundExecutor == null) { - flutterBackgroundExecutor = new FlutterFirebaseMessagingBackgroundExecutor(); - } - flutterBackgroundExecutor.startBackgroundIsolate(); - } - - /** - * Executes a Dart callback, as specified within the incoming {@code intent}. - * - *

Invoked by our {@link JobIntentService} superclass after a call to {@link - * JobIntentService#enqueueWork(Context, Class, int, Intent, boolean);}. - * - *

If there are no pre-existing callback execution requests, other than the incoming {@code - * intent}, then the desired Dart callback is invoked immediately. - * - *

If there are any pre-existing callback requests that have yet to be executed, the incoming - * {@code intent} is added to the {@link #messagingQueue} to be invoked later, after all - * pre-existing callbacks have been executed. - */ - @Override - protected void onHandleWork(@NonNull final Intent intent) { - if (!flutterBackgroundExecutor.isDartBackgroundHandlerRegistered()) { - Log.w( - TAG, - "A background message could not be handled in Dart as no onBackgroundMessage handler has been registered."); - return; - } - - // If we're in the middle of processing queued messages, add the incoming - // intent to the queue and return. - synchronized (messagingQueue) { - if (flutterBackgroundExecutor.isNotRunning()) { - Log.i(TAG, "Service has not yet started, messages will be queued."); - messagingQueue.add(intent); - return; - } - } - - // There were no pre-existing callback requests. Execute the callback - // specified by the incoming intent. - final CountDownLatch latch = new CountDownLatch(1); - new Handler(getMainLooper()) - .post( - () -> flutterBackgroundExecutor.executeDartCallbackInBackgroundIsolate(intent, latch)); - - try { - latch.await(); - } catch (InterruptedException ex) { - Log.i(TAG, "Exception waiting to execute Dart callback", ex); - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/bluebubbles/messaging/services/JobIntentService.java b/android/app/src/main/java/com/bluebubbles/messaging/services/JobIntentService.java deleted file mode 100644 index a52335a7d..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/services/JobIntentService.java +++ /dev/null @@ -1,602 +0,0 @@ -package com.bluebubbles.messaging.services; - -import android.app.Service; -import android.app.job.JobInfo; -import android.app.job.JobParameters; -import android.app.job.JobScheduler; -import android.app.job.JobServiceEngine; -import android.app.job.JobWorkItem; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; -import android.os.Build; -import android.os.IBinder; -import android.os.PowerManager; -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import java.util.ArrayList; -import java.util.HashMap; - -abstract class JobIntentService extends Service { - static final String TAG = "JobIntentService"; - - static final boolean DEBUG = false; - - CompatJobEngine mJobImpl; - WorkEnqueuer mCompatWorkEnqueuer; - CommandProcessor mCurProcessor; - boolean mInterruptIfStopped = false; - boolean mStopped = false; - boolean mDestroyed = false; - - final ArrayList mCompatQueue; - - static final Object sLock = new Object(); - - // Class only used to create a unique hash key for sClassWorkEnqueuer - private static class ComponentNameWithWakeful { - private ComponentName componentName; - private boolean useWakefulService; - - ComponentNameWithWakeful(ComponentName componentName, boolean useWakefulService) { - this.componentName = componentName; - this.useWakefulService = useWakefulService; - } - } - - static final HashMap sClassWorkEnqueuer = new HashMap<>(); - - /** - * Base class for the target service we can deliver work to and the implementation of how to - * deliver that work. - */ - abstract static class WorkEnqueuer { - final ComponentName mComponentName; - - boolean mHasJobId; - int mJobId; - - WorkEnqueuer(ComponentName cn) { - mComponentName = cn; - } - - void ensureJobId(int jobId) { - if (!mHasJobId) { - mHasJobId = true; - mJobId = jobId; - } else if (mJobId != jobId) { - throw new IllegalArgumentException( - "Given job ID " + jobId + " is different than previous " + mJobId); - } - } - - abstract void enqueueWork(Intent work); - - public void serviceStartReceived() {} - - public void serviceProcessingStarted() {} - - public void serviceProcessingFinished() {} - } - - /** Get rid of lint warnings about API levels. */ - interface CompatJobEngine { - IBinder compatGetBinder(); - - GenericWorkItem dequeueWork(); - } - - /** An implementation of WorkEnqueuer that works for pre-O (raw Service-based). */ - static final class CompatWorkEnqueuer extends WorkEnqueuer { - private final Context mContext; - private final PowerManager.WakeLock mLaunchWakeLock; - private final PowerManager.WakeLock mRunWakeLock; - boolean mLaunchingService; - boolean mServiceProcessing; - - CompatWorkEnqueuer(Context context, ComponentName cn) { - super(cn); - mContext = context.getApplicationContext(); - // Make wake locks. We need two, because the launch wake lock wants to have - // a timeout, and the system does not do the right thing if you mix timeout and - // non timeout (or even changing the timeout duration) in one wake lock. - PowerManager pm = ((PowerManager) context.getSystemService(Context.POWER_SERVICE)); - mLaunchWakeLock = - pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, cn.getClassName() + ":launch"); - mLaunchWakeLock.setReferenceCounted(false); - mRunWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, cn.getClassName() + ":run"); - mRunWakeLock.setReferenceCounted(false); - } - - @Override - void enqueueWork(Intent work) { - Intent intent = new Intent(work); - intent.setComponent(mComponentName); - if (DEBUG) Log.d(TAG, "Starting service for work: " + work); - if (mContext.startService(intent) != null) { - synchronized (this) { - if (!mLaunchingService) { - mLaunchingService = true; - if (!mServiceProcessing) { - // If the service is not already holding the wake lock for - // itself, acquire it now to keep the system running until - // we get this work dispatched. We use a timeout here to - // protect against whatever problem may cause it to not get - // the work. - mLaunchWakeLock.acquire(60 * 1000); - } - } - } - } - } - - @Override - public void serviceStartReceived() { - synchronized (this) { - // Once we have started processing work, we can count whatever last - // enqueueWork() that happened as handled. - mLaunchingService = false; - } - } - - @Override - public void serviceProcessingStarted() { - synchronized (this) { - // We hold the wake lock as long as the service is processing commands. - if (!mServiceProcessing) { - mServiceProcessing = true; - // Keep the device awake, but only for at most 10 minutes at a time - // (Similar to JobScheduler.) - mRunWakeLock.acquire(10 * 60 * 1000L); - mLaunchWakeLock.release(); - } - } - } - - @Override - public void serviceProcessingFinished() { - synchronized (this) { - if (mServiceProcessing) { - // If we are transitioning back to a wakelock with a timeout, do the same - // as if we had enqueued work without the service running. - if (mLaunchingService) { - mLaunchWakeLock.acquire(60 * 1000); - } - mServiceProcessing = false; - mRunWakeLock.release(); - } - } - } - } - - /** Implementation of a JobServiceEngine for interaction with JobIntentService. */ - @RequiresApi(26) - static final class JobServiceEngineImpl extends JobServiceEngine - implements JobIntentService.CompatJobEngine { - static final String TAG = "JobServiceEngineImpl"; - - static final boolean DEBUG = false; - - final JobIntentService mService; - final Object mLock = new Object(); - JobParameters mParams; - - final class WrapperWorkItem implements JobIntentService.GenericWorkItem { - final JobWorkItem mJobWork; - - WrapperWorkItem(JobWorkItem jobWork) { - mJobWork = jobWork; - } - - @Override - public Intent getIntent() { - return mJobWork.getIntent(); - } - - @Override - public void complete() { - synchronized (mLock) { - if (mParams != null) { - try { - mParams.completeWork(mJobWork); - // The following catches are to prevent errors completely work that - // is done or hasn't started. - // Example: - // Caused by java.lang.IllegalArgumentException: - // Given work is not active: JobWorkItem { - // id=4 intent=Intent { (has extras) } dcount=1 - // } - // Issue: https://github.com/OneSignal/OneSignal-Android-SDK/issues/644 - } catch (SecurityException e) { - Log.e(TAG, "SecurityException: Failed to run mParams.completeWork(mJobWork)!", e); - } catch (IllegalArgumentException e) { - Log.e( - TAG, - "IllegalArgumentException: Failed to run mParams.completeWork(mJobWork)!", - e); - } - } - } - } - } - - JobServiceEngineImpl(JobIntentService service) { - super(service); - mService = service; - } - - @Override - public IBinder compatGetBinder() { - return getBinder(); - } - - @Override - public boolean onStartJob(JobParameters params) { - if (DEBUG) Log.d(TAG, "onStartJob: " + params); - mParams = params; - // We can now start dequeuing work! - mService.ensureProcessorRunningLocked(false); - return true; - } - - @Override - public boolean onStopJob(JobParameters params) { - if (DEBUG) Log.d(TAG, "onStopJob: " + params); - boolean result = mService.doStopCurrentWork(); - synchronized (mLock) { - // Once we return, the job is stopped, so its JobParameters are no - // longer valid and we should not be doing anything with them. - mParams = null; - } - return result; - } - - /** Dequeue some work. */ - @Override - public JobIntentService.GenericWorkItem dequeueWork() { - JobWorkItem work; - synchronized (mLock) { - if (mParams == null) return null; - - try { - work = mParams.dequeueWork(); - } catch (SecurityException e) { - // Work around for https://issuetracker.google.com/issues/63622293 - // https://github.com/OneSignal/OneSignal-Android-SDK/issues/673 - // Caller no longer running, last stopped +###ms because: last work dequeued - Log.e(TAG, "Failed to run mParams.dequeueWork()!", e); - return null; - } - } - - if (work != null) { - work.getIntent().setExtrasClassLoader(mService.getClassLoader()); - return new WrapperWorkItem(work); - } else return null; - } - } - - @RequiresApi(26) - static final class JobWorkEnqueuer extends JobIntentService.WorkEnqueuer { - private final JobInfo mJobInfo; - private final JobScheduler mJobScheduler; - - JobWorkEnqueuer(Context context, ComponentName cn, int jobId) { - super(cn); - ensureJobId(jobId); - JobInfo.Builder b = new JobInfo.Builder(jobId, mComponentName); - mJobInfo = b.setOverrideDeadline(0).build(); - mJobScheduler = - (JobScheduler) - context.getApplicationContext().getSystemService(Context.JOB_SCHEDULER_SERVICE); - } - - @Override - void enqueueWork(Intent work) { - if (DEBUG) Log.d(TAG, "Enqueueing work: " + work); - mJobScheduler.enqueue(mJobInfo, new JobWorkItem(work)); - } - } - - /** Abstract definition of an item of work that is being dispatched. */ - interface GenericWorkItem { - Intent getIntent(); - - void complete(); - } - - /** - * An implementation of GenericWorkItem that dispatches work for pre-O platforms: intents received - * through a raw service's onStartCommand. - */ - final class CompatWorkItem implements GenericWorkItem { - final Intent mIntent; - final int mStartId; - - CompatWorkItem(Intent intent, int startId) { - mIntent = intent; - mStartId = startId; - } - - @Override - public Intent getIntent() { - return mIntent; - } - - @Override - public void complete() { - if (DEBUG) Log.d(TAG, "Stopping self: #" + mStartId); - stopSelf(mStartId); - } - } - - /** This is a task to dequeue and process work in the background. */ - final class CommandProcessor extends AsyncTask { - @Override - protected Void doInBackground(Void... params) { - GenericWorkItem work; - - if (DEBUG) Log.d(TAG, "Starting to dequeue work..."); - - while ((work = dequeueWork()) != null) { - if (DEBUG) Log.d(TAG, "Processing next work: " + work); - onHandleWork(work.getIntent()); - if (DEBUG) Log.d(TAG, "Completing work: " + work); - work.complete(); - } - - if (DEBUG) Log.d(TAG, "Done processing work!"); - - return null; - } - - @Override - protected void onCancelled(Void aVoid) { - processorFinished(); - } - - @Override - protected void onPostExecute(Void aVoid) { - processorFinished(); - } - } - - /** Default empty constructor. */ - public JobIntentService() { - mCompatQueue = new ArrayList<>(); - } - - @Override - public void onCreate() { - super.onCreate(); - if (DEBUG) Log.d(TAG, "CREATING: " + this); - - if (Build.VERSION.SDK_INT >= 26) { - mJobImpl = new JobServiceEngineImpl(this); - mCompatWorkEnqueuer = null; - } - - ComponentName cn = new ComponentName(this, this.getClass()); - mCompatWorkEnqueuer = getWorkEnqueuer(this, cn, false, 0, true); - } - - /** - * Processes start commands when running as a pre-O service, enqueueing them to be later - * dispatched in {@link #onHandleWork(Intent)}. - */ - @Override - public int onStartCommand(@Nullable Intent intent, int flags, int startId) { - mCompatWorkEnqueuer.serviceStartReceived(); - if (DEBUG) Log.d(TAG, "Received compat start command #" + startId + ": " + intent); - synchronized (mCompatQueue) { - mCompatQueue.add(new CompatWorkItem(intent != null ? intent : new Intent(), startId)); - ensureProcessorRunningLocked(true); - } - return START_REDELIVER_INTENT; - } - - /** - * Returns the IBinder for the {@link android.app.job.JobServiceEngine} when running as a - * JobService on O and later platforms. - */ - @Override - public IBinder onBind(@NonNull Intent intent) { - if (mJobImpl != null) { - IBinder engine = mJobImpl.compatGetBinder(); - if (DEBUG) Log.d(TAG, "Returning engine: " + engine); - return engine; - } else { - return null; - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - doStopCurrentWork(); - synchronized (mCompatQueue) { - mDestroyed = true; - mCompatWorkEnqueuer.serviceProcessingFinished(); - } - } - - /** - * Call this to enqueue work for your subclass of {@link JobIntentService}. This will either - * directly start the service (when running on pre-O platforms) or enqueue work for it as a job - * (when running on O and later). In either case, a wake lock will be held for you to ensure you - * continue running. The work you enqueue will ultimately appear at {@link #onHandleWork(Intent)}. - * - * @param context Context this is being called from. - * @param cls The concrete class the work should be dispatched to (this is the class that is - * published in your manifest). - * @param jobId A unique job ID for scheduling; must be the same value for all work enqueued for - * the same class. - * @param work The Intent of work to enqueue. - */ - public static void enqueueWork( - @NonNull Context context, - @NonNull Class cls, - int jobId, - @NonNull Intent work, - boolean useWakefulService) { - enqueueWork(context, new ComponentName(context, cls), jobId, work, useWakefulService); - } - - /** - * Like {@link #enqueueWork(Context, Class, int, Intent, boolean)}, but supplies a ComponentName - * for the service to interact with instead of its class. - * - * @param context Context this is being called from. - * @param component The published ComponentName of the class this work should be dispatched to. - * @param jobId A unique job ID for scheduling; must be the same value for all work enqueued for - * the same class. - * @param work The Intent of work to enqueue. - */ - public static void enqueueWork( - @NonNull Context context, - @NonNull ComponentName component, - int jobId, - @NonNull Intent work, - boolean useWakefulService) { - if (work == null) { - throw new IllegalArgumentException("work must not be null"); - } - synchronized (sLock) { - WorkEnqueuer we = getWorkEnqueuer(context, component, true, jobId, useWakefulService); - we.ensureJobId(jobId); - - // Can throw on API 26+ if useWakefulService=true and app is NOT whitelisted. - // One example is when an FCM high priority message is received the system will - // temporarily whitelist the app. However it is possible that it does not end up getting - // whitelisted so we need to catch this and fall back to a job service. - try { - we.enqueueWork(work); - } catch (IllegalStateException e) { - if (useWakefulService) { - we = getWorkEnqueuer(context, component, true, jobId, false); - we.enqueueWork(work); - } else throw e; - } - } - } - - static WorkEnqueuer getWorkEnqueuer( - Context context, ComponentName cn, boolean hasJobId, int jobId, boolean useWakefulService) { - ComponentNameWithWakeful key = new ComponentNameWithWakeful(cn, useWakefulService); - WorkEnqueuer we = sClassWorkEnqueuer.get(key); - if (we == null) { - if (Build.VERSION.SDK_INT >= 26 && !useWakefulService) { - if (!hasJobId) { - throw new IllegalArgumentException("Can't be here without a job id"); - } - we = new JobWorkEnqueuer(context, cn, jobId); - } else we = new CompatWorkEnqueuer(context, cn); - sClassWorkEnqueuer.put(key, we); - } - return we; - } - - /** - * Called serially for each work dispatched to and processed by the service. This method is called - * on a background thread, so you can do long blocking operations here. Upon returning, that work - * will be considered complete and either the next pending work dispatched here or the overall - * service destroyed now that it has nothing else to do. - * - *

Be aware that when running as a job, you are limited by the maximum job execution time and - * any single or total sequential items of work that exceeds that limit will cause the service to - * be stopped while in progress and later restarted with the last unfinished work. (There is - * currently no limit on execution duration when running as a pre-O plain Service.) - * - * @param intent The intent describing the work to now be processed. - */ - protected abstract void onHandleWork(@NonNull Intent intent); - - /** - * Control whether code executing in {@link #onHandleWork(Intent)} will be interrupted if the job - * is stopped. By default this is false. If called and set to true, any time {@link - * #onStopCurrentWork()} is called, the class will first call {@link AsyncTask#cancel(boolean) - * AsyncTask.cancel(true)} to interrupt the running task. - * - * @param interruptIfStopped Set to true to allow the system to interrupt actively running work. - */ - public void setInterruptIfStopped(boolean interruptIfStopped) { - mInterruptIfStopped = interruptIfStopped; - } - - /** - * Returns true if {@link #onStopCurrentWork()} has been called. You can use this, while executing - * your work, to see if it should be stopped. - */ - public boolean isStopped() { - return mStopped; - } - - /** - * This will be called if the JobScheduler has decided to stop this job. The job for this service - * does not have any constraints specified, so this will only generally happen if the service - * exceeds the job's maximum execution time. - * - * @return True to indicate to the JobManager whether you'd like to reschedule this work, false to - * drop this and all following work. Regardless of the value returned, your service must stop - * executing or the system will ultimately kill it. The default implementation returns true, - * and that is most likely what you want to return as well (so no work gets lost). - */ - public boolean onStopCurrentWork() { - return true; - } - - boolean doStopCurrentWork() { - if (mCurProcessor != null) { - mCurProcessor.cancel(mInterruptIfStopped); - } - mStopped = true; - return onStopCurrentWork(); - } - - void ensureProcessorRunningLocked(boolean reportStarted) { - if (mCurProcessor == null) { - mCurProcessor = new CommandProcessor(); - if (mCompatWorkEnqueuer != null && reportStarted) { - mCompatWorkEnqueuer.serviceProcessingStarted(); - } - if (DEBUG) Log.d(TAG, "Starting processor: " + mCurProcessor); - mCurProcessor.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - } - - void processorFinished() { - if (mCompatQueue != null) { - synchronized (mCompatQueue) { - mCurProcessor = null; - // The async task has finished, but we may have gotten more work scheduled in the - // meantime. If so, we need to restart the new processor to execute it. If there - // is no more work at this point, either the service is in the process of being - // destroyed (because we called stopSelf on the last intent started for it), or - // someone has already called startService with a new Intent that will be - // arriving shortly. In either case, we want to just leave the service - // waiting -- either to get destroyed, or get a new onStartCommand() callback - // which will then kick off a new processor. - if (mCompatQueue != null && mCompatQueue.size() > 0) { - ensureProcessorRunningLocked(false); - } else if (!mDestroyed) { - mCompatWorkEnqueuer.serviceProcessingFinished(); - } - } - } - } - - GenericWorkItem dequeueWork() { - if (mJobImpl != null) { - GenericWorkItem jobWork = mJobImpl.dequeueWork(); - if (jobWork != null) return jobWork; - } - - synchronized (mCompatQueue) { - if (mCompatQueue.size() > 0) return mCompatQueue.remove(0); - else return null; - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/bluebubbles/messaging/services/ReplyReceiver.java b/android/app/src/main/java/com/bluebubbles/messaging/services/ReplyReceiver.java deleted file mode 100644 index 4f396198f..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/services/ReplyReceiver.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.bluebubbles.messaging.services; - -import android.app.Notification; -import android.app.Person; -import android.app.NotificationManager; -import android.app.RemoteInput; -import android.graphics.drawable.Icon; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Build; -import android.os.Bundle; -import android.service.notification.StatusBarNotification; -import android.util.Log; - -import androidx.annotation.RequiresApi; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; - -import com.bluebubbles.messaging.workers.NotificationWorker; - -import java.util.HashMap; -import java.util.Map; -import java.io.File; -import java.io.IOException; -import java.io.FileInputStream; -import java.io.DataInputStream; -import java.io.BufferedInputStream; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import io.flutter.plugin.common.MethodChannel; - -import com.bluebubbles.messaging.helpers.HelperUtils; -import com.bluebubbles.messaging.method_call_handler.handlers.NewMessageNotification; - -import static android.content.Context.NOTIFICATION_SERVICE; -import static com.bluebubbles.messaging.MainActivity.CHANNEL; -import static com.bluebubbles.messaging.MainActivity.engine; - -public class ReplyReceiver extends BroadcastReceiver { - - final String TAG = "BlueBubblesApp"; - - @RequiresApi(api = Build.VERSION_CODES.P) - @Override - public void onReceive(Context context, Intent intent) { - if (intent == null) return; - - Integer existingId; - String chatGuid; - - if (intent.getType().equals("reply")) { - existingId = intent.getExtras().getInt("id"); - chatGuid = intent.getExtras().getString("chatGuid"); - String messageGuid = intent.getExtras().getString("messageGuid"); - - // Get the text message in the reply - Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); - String replyText = remoteInput.getString("key_text_reply"); - - // Find the existing notification & add the message to it. - NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(context); - NotificationManager notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); - for (StatusBarNotification notification : notificationManager.getActiveNotifications()) { - if (NewMessageNotification.notificationTag.equals(notification.getTag()) && notification.getId() == existingId) { - Notification.MessagingStyle style; - Notification.Builder builder; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - builder = Notification.Builder.recoverBuilder(context, notification.getNotification()); - style = (Notification.MessagingStyle) builder.getStyle(); - } else { - Notification notif = notification.getNotification(); - // get the builder from the original notification - builder = Notification.Builder.recoverBuilder(context, notif); - // get the compat messagingstyle from the original notification - NotificationCompat.MessagingStyle temp = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(notif); - style = new Notification.MessagingStyle(temp.getUser().getName()); - } - SharedPreferences mPrefs = context.getSharedPreferences("FlutterSharedPreferences", 0); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - Person.Builder sender = new Person.Builder() - .setName(mPrefs.getString("flutter.userName", "You")) - .setImportant(true); - String avatarPath = mPrefs.getString("flutter.userAvatarPath", ""); - if (avatarPath != "") { - File file = new File(avatarPath); - byte bytes[] = new byte[(int) file.length()]; - try { - BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); - DataInputStream dis = new DataInputStream(bis); - dis.readFully(bytes); - Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); - Icon senderIcon = Icon.createWithAdaptiveBitmap(HelperUtils.getCircleBitmap(bmp)); - sender.setIcon(senderIcon); - } catch (IOException e) { - e.printStackTrace(); - } - } - style.addMessage(new Notification.MessagingStyle.Message(replyText, System.currentTimeMillis() / 1000, sender.build())); - } else { - style.addMessage(replyText, System.currentTimeMillis() / 1000, mPrefs.getString("flutter.userName", "You")); - } - builder.setStyle(style); - builder.setOnlyAlertOnce(true); - notificationManagerCompat.notify(NewMessageNotification.notificationTag, existingId, builder.build()); - } - } - - // Spin up a Dart isolate to actually send the reply - Map params = new HashMap<>(); - params.put("chat", chatGuid); - params.put("text", replyText); - params.put("guid", messageGuid); - - if (engine != null) { - new MethodChannel(engine.getDartExecutor().getBinaryMessenger(), CHANNEL).invokeMethod("reply", params); - } else { - NotificationWorker.createWorker(context.getApplicationContext(), "reply", params); - } - } else if (intent.getType().equals("markAsRead")) { - existingId = intent.getExtras().getInt("id"); - chatGuid = intent.getExtras().getString("chatGuid"); - Log.d(TAG, "Marking chat notification as read: " + chatGuid); - - HelperUtils.tryCancelNotifications(context, existingId, null); - - // Build params to send to Dart for it to handle whatever it needs - Map params = new HashMap<>(); - params.put("chat", chatGuid); - - // Invoke the Dart isolate to clear the notification from that side - if (engine != null) { - new MethodChannel(engine.getDartExecutor().getBinaryMessenger(), CHANNEL).invokeMethod("markAsRead", params); - } else { - NotificationWorker.createWorker(context.getApplicationContext(), "markAsRead", params); - - } - } else if(intent.getType().equals("alarm")) { - - Map params = new HashMap<>(); - params.put("id", intent.getExtras().getInt("id")); - if (engine != null) { - new MethodChannel(engine.getDartExecutor().getBinaryMessenger(), CHANNEL).invokeMethod("alarm-wake", params); - } else { - NotificationWorker.createWorker(context.getApplicationContext(), "alarm-wake", params); - } - } else if (intent.getType().equals("swipeAway")) { - existingId = intent.getExtras().getInt("id"); - HelperUtils.tryCancelNotifications(context, existingId, null); - } - intent.replaceExtras(new Bundle()); - intent.setType(""); - intent.setAction(""); - intent.setData(null); - intent.setFlags(0); - } -} diff --git a/android/app/src/main/java/com/bluebubbles/messaging/sharing/Contact.java b/android/app/src/main/java/com/bluebubbles/messaging/sharing/Contact.java deleted file mode 100644 index 5073c67ef..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/sharing/Contact.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.bluebubbles.messaging.sharing; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.drawable.Icon; -import android.os.Build; - -import androidx.annotation.RequiresApi; -import androidx.core.graphics.drawable.IconCompat; - -import com.bluebubbles.messaging.helpers.HelperUtils; - -import java.util.ArrayList; - -public class Contact { - public String name; - public String id; - public byte[] icon; - - @RequiresApi(api = Build.VERSION_CODES.M) - public Contact(String name, String id, byte[] icon) { - this.name = name; - this.id = id; - this.icon = icon; - } - - public IconCompat getIcon() { - Bitmap bmp = BitmapFactory.decodeByteArray(icon, 0, icon.length); - return IconCompat.createWithAdaptiveBitmap(HelperUtils.getCircleBitmap(bmp)); - } - -} diff --git a/android/app/src/main/java/com/bluebubbles/messaging/sharing/ShareShortcutManager.java b/android/app/src/main/java/com/bluebubbles/messaging/sharing/ShareShortcutManager.java deleted file mode 100644 index 42569bc10..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/sharing/ShareShortcutManager.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.bluebubbles.messaging.sharing; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -import androidx.core.app.Person; -import androidx.core.content.pm.ShortcutInfoCompat; -import androidx.core.content.pm.ShortcutManagerCompat; -import androidx.core.graphics.drawable.IconCompat; - -import com.bluebubbles.messaging.R; -import com.bluebubbles.messaging.MainActivity; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -public class ShareShortcutManager { - private static final String CATEGORY_SHARE_TARGET = "com.bluebubbles.messaging.directshare.category.TEXT_SHARE_TARGET"; - - public static void publishShareTarget(Context context, Contact contact) { - - // Category that our sharing shortcuts will be assigned to - Set contactCategories = new HashSet<>(); - contactCategories.add(CATEGORY_SHARE_TARGET); - - Intent staticLauncherShortcutIntent = new Intent(context, MainActivity.class) - .putExtra("chatGuid", contact.id) - .putExtra("bubble", false) - .setType("DirectShare") - .setAction(Intent.ACTION_DEFAULT); - - @SuppressLint("RestrictedApi") - ShortcutInfoCompat.Builder shortcut = new ShortcutInfoCompat.Builder(context, contact.id) - .setShortLabel(contact.name) - .setIntent(staticLauncherShortcutIntent) - .setCategories(contactCategories) - // .addCapabilityBinding("actions.intent.CREATE_MESSAGE") - .setLongLived(true) - .setIsConversation() - .setPerson(new Person.Builder() - .setName(contact.name) - .build()); - if (contact.icon != null && contact.icon.length != 0) { - shortcut.setIcon(contact.getIcon()); - } - ShortcutManagerCompat.pushDynamicShortcut(context, shortcut.build()); - } -} diff --git a/android/app/src/main/java/com/bluebubbles/messaging/workers/DartWorker.java b/android/app/src/main/java/com/bluebubbles/messaging/workers/DartWorker.java deleted file mode 100644 index 9092952f9..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/workers/DartWorker.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.bluebubbles.messaging.workers; - -import io.flutter.plugin.common.MethodChannel; - -public interface DartWorker { - - MethodChannel destroyHeadlessThread(); -} - diff --git a/android/app/src/main/java/com/bluebubbles/messaging/workers/NotificationWorker.java b/android/app/src/main/java/com/bluebubbles/messaging/workers/NotificationWorker.java deleted file mode 100644 index b81a13f49..000000000 --- a/android/app/src/main/java/com/bluebubbles/messaging/workers/NotificationWorker.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.bluebubbles.messaging.workers; - -import android.content.Context; -import android.os.Build; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -import android.content.res.AssetManager; - -import androidx.annotation.NonNull; -import androidx.annotation.RequiresApi; -import androidx.work.Data; -import androidx.work.ExistingWorkPolicy; -import androidx.work.OneTimeWorkRequest; -import androidx.work.OutOfQuotaPolicy; -import androidx.work.WorkManager; -import androidx.work.Worker; -import androidx.work.WorkerParameters; - -import com.baseflow.permissionhandler.PermissionHandlerPlugin; -import com.bluebubbles.messaging.helpers.NotifyRunnable; -import com.bluebubbles.messaging.method_call_handler.MethodCallHandler; - -import java.util.Map; - -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugins.pathprovider.PathProviderPlugin; -import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin; -import io.flutter.view.FlutterCallbackInformation; -import io.flutter.view.FlutterMain; -import io.flutter.view.FlutterNativeView; -import io.flutter.view.FlutterRunArguments; -import io.flutter.FlutterInjector; - -import io.flutter.embedding.engine.loader.FlutterLoader; -import io.flutter.embedding.engine.loader.ApplicationInfoLoader; -import io.flutter.embedding.engine.loader.FlutterApplicationInfo; -import io.flutter.embedding.engine.FlutterEngine; -import io.flutter.embedding.engine.plugins.PluginRegistry; -import io.flutter.embedding.engine.dart.DartExecutor; -import io.flutter.embedding.engine.dart.DartExecutor.DartCallback; - -import static com.bluebubbles.messaging.MainActivity.engine; -import static com.bluebubbles.messaging.MainActivity.CHANNEL; -import static com.bluebubbles.messaging.method_call_handler.handlers.InitializeBackgroundHandle.BACKGROUND_HANDLE_SHARED_PREF_KEY; -import static com.bluebubbles.messaging.method_call_handler.handlers.InitializeBackgroundHandle.BACKGROUND_SERVICE_SHARED_PREF; - -public class NotificationWorker extends Worker implements DartWorker { - private FlutterEngine backgroundEngine; - private MethodChannel backgroundChannel; - private Context context; - private static final String TAG = "NotificationWorker"; - - - public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { - super(context, workerParams); - this.context = context; - } - - @RequiresApi(api = Build.VERSION_CODES.O) - @NonNull - @Override - public Result doWork() { - - String type = getInputData().getString("type"); - Log.d("BlueBubblesApp", "type: " + type); - if (type.equals("reply") || type.equals("markAsRead") || type.equals("alarm-wake")) { - getBackgroundChannel(); - invokeMethod(); - - return Result.success(); - } else { - return Result.failure(); - } - } - - @Override - public void onStopped() { - Log.d("BlueBubblesApp", "Stopping Notification Worker..."); - - // When this worker gets cancelled, clean up - destroyHeadlessThread(); - super.onStopped(); - } - - @RequiresApi(api = Build.VERSION_CODES.P) - private void initHeadlessThread() { - Context context = (this.context != null) ? this.context : getApplicationContext(); - FlutterMain.startInitialization(context); - FlutterMain.ensureInitializationComplete(getApplicationContext(), null); - - FlutterApplicationInfo info = ApplicationInfoLoader.load(context); - String appBundlePath = info.flutterAssetsDir; - AssetManager assets = context.getAssets(); - - if (backgroundEngine == null) { - backgroundEngine = new FlutterEngine(context); - DartExecutor executor = backgroundEngine.getDartExecutor(); - Long callbackHandle = context.getSharedPreferences(BACKGROUND_SERVICE_SHARED_PREF, Context.MODE_PRIVATE).getLong(BACKGROUND_HANDLE_SHARED_PREF_KEY, -1); - FlutterCallbackInformation callbackInformation = FlutterCallbackInformation.lookupCallbackInformation(callbackHandle); - - if (callbackInformation == null) { - Log.e("BlueBubblesApp", "Fatal: failed to find callback: " + callbackHandle); - return; - } - - DartExecutor.DartCallback dartCallback = new DartExecutor.DartCallback( - assets, - appBundlePath, - callbackInformation - ); - executor.executeDartCallback(dartCallback); - - backgroundChannel = new MethodChannel(backgroundEngine.getDartExecutor().getBinaryMessenger(), CHANNEL); - backgroundChannel.setMethodCallHandler((call, result) -> MethodCallHandler.methodCallHandler(call, result, context, this)); - } - } - - @Override - public MethodChannel destroyHeadlessThread() { - if (backgroundEngine == null) return null; - new Handler(Looper.getMainLooper()).post(() -> { - if (backgroundEngine != null) { - try { - Log.d("BlueBubblesApp", "Destroying Notification Worker isolate..."); - backgroundEngine.destroy(); - backgroundEngine = null; - backgroundChannel = null; - } catch (Exception e) { - Log.d("BlueBubblesApp", "Failed to destroy Notification Worker isolate!"); - } - } - }); - return null; - } - - private void invokeMethod() { - if (backgroundChannel != null) { - Handler handler = new Handler(Looper.getMainLooper()); - synchronized (handler) { - NotifyRunnable runnable = new NotifyRunnable(handler, () -> backgroundChannel.invokeMethod(getInputData().getString("type"), getInputData().getKeyValueMap())); - handler.post(runnable); - while (!runnable.isFinished()) { - try { - handler.wait(); - } catch (InterruptedException is) { - // ignore - } - } - } - } - } - - - @RequiresApi(api = Build.VERSION_CODES.O) - public MethodChannel getBackgroundChannel() { - if (backgroundChannel == null) { - - Handler handler = new Handler(Looper.getMainLooper()); - synchronized (handler) { - NotifyRunnable runnable = new NotifyRunnable(handler, () -> initHeadlessThread()); - handler.post(runnable); - while (!runnable.isFinished()) { - try { - handler.wait(); - } catch (InterruptedException is) { - // ignore - } - } - } - } - return backgroundChannel; - } - - public static void createWorker(Context context, String type, Map data) { - if (engine != null) return; - OneTimeWorkRequest notificationWork = new OneTimeWorkRequest.Builder(NotificationWorker.class) - .setInputData( - new Data.Builder() - .putString("type", type) - .putAll(data) - .build() - ) - .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) - .addTag(TAG) - .build(); - WorkManager.getInstance(context).enqueue(notificationWork); - } -} diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/BubbleActivity.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/BubbleActivity.kt new file mode 100644 index 000000000..ebbfff17e --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/BubbleActivity.kt @@ -0,0 +1,29 @@ +package com.bluebubbles.messaging + +import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel + +class BubbleActivity : FlutterFragmentActivity() { + companion object { + var engine: FlutterEngine? = null + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + engine = flutterEngine + super.configureFlutterEngine(flutterEngine) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Constants.methodChannel).setMethodCallHandler { + call, result -> MethodCallHandler().methodCallHandler(call, result, this) + } + } + + override fun getDartEntrypointFunctionName(): String { + return "bubble" + } + + override fun onDestroy() { + engine = null + super.onDestroy() + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt new file mode 100644 index 000000000..0a99163c2 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt @@ -0,0 +1,22 @@ +package com.bluebubbles.messaging + +class Constants { + companion object { + const val logTag: String = "BlueBubblesApp" + const val methodChannel = "com.bluebubbles.messaging" + const val categoryTextShareTarget = "com.bluebubbles.messaging.directshare.category.TEXT_SHARE_TARGET" + const val googleDuoPackageName = "com.google.android.apps.tachyon" + const val newMessageNotificationTag = "com.bluebubbles.messaging.NEW_MESSAGE_NOTIFICATION" + const val newFaceTimeNotificationTag = "com.bluebubbles.messaging.NEW_FACETIME_NOTIFICATION" + const val notificationGroupKey = "com.bluebubbles.messaging.NOTIFICATION_GROUP_NEW_MESSAGES" + const val dartWorkerTag = "DartWorker" + const val pendingIntentOpenChatOffset = 0 + const val pendingIntentMarkReadOffset = 100000 + const val pendingIntentOpenBubbleOffset = 200000 + const val pendingIntentDeleteNotificationOffset = 300000 + const val pendingIntentAnswerFaceTimeOffset = -100000 + const val pendingIntentDeclineFaceTimeOffset = -200000 + const val notificationListenerRequestCode = 1000 + } +} + diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt new file mode 100644 index 000000000..1f7c57aa1 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt @@ -0,0 +1,34 @@ +package com.bluebubbles.messaging + +import android.content.Intent +import androidx.activity.ComponentActivity +import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel + +class MainActivity : FlutterFragmentActivity() { + companion object { + var engine: FlutterEngine? = null + } + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + engine = flutterEngine + super.configureFlutterEngine(flutterEngine) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, Constants.methodChannel).setMethodCallHandler { + call, result -> MethodCallHandler().methodCallHandler(call, result, this) + } + } + + override fun onDestroy() { + engine = null + super.onDestroy() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == Constants.notificationListenerRequestCode) { + MethodCallHandler.getNotificationListenerResult?.success(null) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/models/MethodCallHandlerImpl.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/models/MethodCallHandlerImpl.kt new file mode 100644 index 000000000..16bf2e222 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/models/MethodCallHandlerImpl.kt @@ -0,0 +1,9 @@ +package com.bluebubbles.messaging.models + +import android.content.Context +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +abstract class MethodCallHandlerImpl { + abstract fun handleMethodCall(call: MethodCall, result: MethodChannel.Result, context: Context) +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt new file mode 100644 index 000000000..65d47535c --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt @@ -0,0 +1,36 @@ +package com.bluebubbles.messaging.services.backend_ui_interop + +import android.content.Context +import android.util.Log +import androidx.lifecycle.Observer +import androidx.work.Data +import androidx.work.OneTimeWorkRequest +import androidx.work.OutOfQuotaPolicy +import androidx.work.WorkInfo +import androidx.work.WorkManager +import com.bluebubbles.messaging.Constants + +object DartWorkManager { + fun createWorker(context: Context, method: String, arguments: HashMap, callback: () -> (Unit)) { + Log.d(Constants.logTag, "Creating new ${Constants.dartWorkerTag} for method $method") + val work = OneTimeWorkRequest.Builder(DartWorker::class.java) + .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) + .setInputData(Data.Builder() + .putString("method", method) + .putAll(arguments).build()) + .addTag(Constants.dartWorkerTag) + .build() + WorkManager.getInstance(context).enqueue(work) + + // Observe when the worker is finished and run the provided callback + lateinit var observer: Observer + observer = Observer { workInfo -> + if (workInfo.state.isFinished) { + Log.d(Constants.logTag, "Running callback after worker with method $method completed") + callback() + WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).removeObserver(observer) + } + } + WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).observeForever(observer) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt new file mode 100644 index 000000000..df253a615 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -0,0 +1,85 @@ +package com.bluebubbles.messaging.services.backend_ui_interop + +import android.content.Context +import android.util.Log +import androidx.concurrent.futures.CallbackToFutureAdapter +import androidx.work.ListenableWorker +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity.Companion.engine +import com.google.common.util.concurrent.ListenableFuture +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.embedding.engine.loader.ApplicationInfoLoader +import io.flutter.embedding.engine.loader.FlutterLoader +import io.flutter.plugin.common.MethodChannel +import io.flutter.view.FlutterCallbackInformation +import kotlinx.coroutines.runBlocking + +class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWorker(context, workerParams) { + + companion object { + var workerEngine: FlutterEngine? = null + } + + override fun startWork(): ListenableFuture { + val method = inputData.getString("method")!! + if (engine == null && workerEngine == null) { + Log.d(Constants.logTag, "Initializing engine for worker with method $method") + initNewEngine() + } + + if (engine != null) { + Log.d(Constants.logTag, "Using MainActivity engine to send to Dart") + } else { + Log.d(Constants.logTag, "Using DartWorker engine to send to Dart") + } + return CallbackToFutureAdapter.getFuture { completer -> + runBlocking { + Log.d(Constants.logTag, "Sending method $method to Dart") + MethodChannel((engine ?: workerEngine)!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, inputData.keyValueMap, object : MethodChannel.Result { + override fun success(result: Any?) { + Log.d(Constants.logTag, "Worker with method $method completed successfully") + completer.set(Result.success()) + closeEngineIfNeeded() + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { + Log.e(Constants.logTag, "Worker with method $method failed!") + completer.set(Result.failure()) + closeEngineIfNeeded() + } + + override fun notImplemented() { } + }) + } + } + } + + /// Code idea taken from https://github.com/flutter/flutter/wiki/Experimental:-Reuse-FlutterEngine-across-screens + private fun initNewEngine() { + Log.d(Constants.logTag, "Ensuring Flutter is initialized before creating engine") + FlutterLoader().startInitialization(applicationContext) + FlutterLoader().ensureInitializationComplete(applicationContext.applicationContext, null) + + Log.d(Constants.logTag, "Loading callback info") + val info = ApplicationInfoLoader.load(applicationContext.applicationContext) + workerEngine = FlutterEngine(applicationContext) + val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(applicationContext.getSharedPreferences("FlutterSharedPreferences", 0).getLong("flutter.backgroundCallbackHandle", -1)) + val callback = DartExecutor.DartCallback(applicationContext.assets, info.flutterAssetsDir, callbackInfo) + + Log.d(Constants.logTag, "Executing Dart callback") + workerEngine!!.dartExecutor.executeDartCallback(callback) + } + + private fun closeEngineIfNeeded() { + val currentWork = WorkManager.getInstance(applicationContext).getWorkInfosByTag(Constants.dartWorkerTag).get().filter { element -> !element.state.isFinished } + Log.d(Constants.logTag, "${currentWork.size} worker(s) still queued") + if (currentWork.size <= 1 && workerEngine != null) { + Log.d(Constants.logTag, "Closing ${Constants.dartWorkerTag} engine") + workerEngine?.destroy() + workerEngine = null + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt new file mode 100644 index 000000000..551926a89 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt @@ -0,0 +1,76 @@ +package com.bluebubbles.messaging.services.backend_ui_interop + +import android.content.Context +import android.util.Log +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.ActivityResultRegistry +import androidx.activity.result.contract.ActivityResultContracts +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity.Companion.engine +import com.bluebubbles.messaging.services.filesystem.GetContentUriPathHandler +import com.bluebubbles.messaging.services.firebase.FirebaseAuthHandler +import com.bluebubbles.messaging.services.firebase.ServerUrlRequestHandler +import com.bluebubbles.messaging.services.firebase.UpdateNextRestartHandler +import com.bluebubbles.messaging.services.notifications.CreateIncomingFaceTimeNotification +import com.bluebubbles.messaging.services.notifications.CreateIncomingMessageNotification +import com.bluebubbles.messaging.services.notifications.DeleteNotificationHandler +import com.bluebubbles.messaging.services.notifications.NotificationChannelHandler +import com.bluebubbles.messaging.services.notifications.NotificationListenerPermissionRequestHandler +import com.bluebubbles.messaging.services.notifications.StartNotificationListenerHandler +import com.bluebubbles.messaging.services.system.BrowserLaunchRequestHandler +import com.bluebubbles.messaging.services.system.CheckChromeOsHandler +import com.bluebubbles.messaging.services.system.NewContactFormRequestHandler +import com.bluebubbles.messaging.services.system.OpenCalendarRequestHandler +import com.bluebubbles.messaging.services.system.OpenConversationNotificationSettingsHandler +import com.bluebubbles.messaging.services.system.OpenExistingContactRequestHandler +import com.bluebubbles.messaging.services.system.PushShareTargetsHandler +import com.bluebubbles.messaging.services.system.StartGoogleDuoRequestHandler +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class MethodCallHandler() { + companion object { + var getNotificationListenerResult: MethodChannel.Result? = null + + /// Send a method call back to Dart (app must be launched, otherwise use the DartWorker!) + fun invokeMethod(method: String, arguments: Map) { + if (engine != null) { + MethodChannel(engine!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, arguments) + } else { + throw Exception("Engine not initialized!") + } + } + } + + fun methodCallHandler(call: MethodCall, result: MethodChannel.Result, context: Context) { + Log.d(Constants.logTag, "Received new method call from Dart with method ${call.method}") + when(call.method) { + FirebaseAuthHandler.tag -> FirebaseAuthHandler().handleMethodCall(call, result, context) + NotificationChannelHandler.tag -> NotificationChannelHandler().handleMethodCall(call, result, context) + ServerUrlRequestHandler.tag -> ServerUrlRequestHandler().handleMethodCall(call, result, context) + UpdateNextRestartHandler.tag -> UpdateNextRestartHandler().handleMethodCall(call, result, context) + BrowserLaunchRequestHandler.tag -> BrowserLaunchRequestHandler().handleMethodCall(call, result, context) + PushShareTargetsHandler.tag -> PushShareTargetsHandler().handleMethodCall(call, result, context) + NewContactFormRequestHandler.tag -> NewContactFormRequestHandler().handleMethodCall(call, result, context) + OpenExistingContactRequestHandler.tag -> OpenExistingContactRequestHandler().handleMethodCall(call, result, context) + OpenCalendarRequestHandler.tag -> OpenCalendarRequestHandler().handleMethodCall(call, result, context) + StartGoogleDuoRequestHandler.tag -> StartGoogleDuoRequestHandler().handleMethodCall(call, result, context) + CheckChromeOsHandler.tag -> CheckChromeOsHandler().handleMethodCall(call, result, context) + NotificationListenerPermissionRequestHandler.tag -> { + getNotificationListenerResult = result + NotificationListenerPermissionRequestHandler().handleMethodCall(call, result, context) + } + StartNotificationListenerHandler.tag -> StartNotificationListenerHandler().handleMethodCall(call, result, context) + OpenConversationNotificationSettingsHandler.tag -> OpenConversationNotificationSettingsHandler().handleMethodCall(call, result, context) + GetContentUriPathHandler.tag -> GetContentUriPathHandler().handleMethodCall(call, result, context) + CreateIncomingMessageNotification.tag -> CreateIncomingMessageNotification().handleMethodCall(call, result, context) + CreateIncomingFaceTimeNotification.tag -> CreateIncomingFaceTimeNotification().handleMethodCall(call, result, context) + DeleteNotificationHandler.tag -> DeleteNotificationHandler().handleMethodCall(call, result, context) + else -> { + val error = "Could not find method call handler for ${call.method}!" + Log.d(Constants.logTag, error) + result.error("500", error, null) + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/filesystem/GetContentUriPathHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/filesystem/GetContentUriPathHandler.kt new file mode 100644 index 000000000..161567b31 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/filesystem/GetContentUriPathHandler.kt @@ -0,0 +1,24 @@ +package com.bluebubbles.messaging.services.filesystem + +import android.content.Context +import android.net.Uri +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.bluebubbles.messaging.utils.FilesystemUtils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Fetches the actual path of a shared item with a content-uri path +class GetContentUriPathHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "get-content-uri-path" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val uri: String = call.argument("uri")!! + result.success(FilesystemUtils.getAbsolutePath(context, Uri.parse(uri))) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt new file mode 100644 index 000000000..e701591c8 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt @@ -0,0 +1,76 @@ +package com.bluebubbles.messaging.services.firebase + +import android.content.Context +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.google.android.gms.tasks.Task +import com.google.firebase.FirebaseApp +import com.google.firebase.FirebaseOptions +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.messaging.FirebaseMessaging +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.tasks.await + +class FirebaseAuthHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "firebase-auth" + var firebaseApp: FirebaseApp? = null + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // Don't auth multiple times + if (firebaseApp != null) result.success(null) + + val projectId: String? = call.argument("project_id") + val storageBucket: String? = call.argument("storage_bucket") + val apiKey: String = call.argument("api_key")!! + val databaseUrl: String? = call.argument("firebase_url") + val gcmSenderId: String? = call.argument("client_id") + val applicationId: String = call.argument("application_id")!! + + Log.d(Constants.logTag, "Authenticating client $applicationId with Firebase...") + // Get a FirebaseApp (manually provide config since we fetch it dynamically) + firebaseApp = FirebaseApp.initializeApp(context, FirebaseOptions.Builder() + .setApiKey(apiKey) + .setApplicationId(applicationId) + .setDatabaseUrl(databaseUrl) + .setGcmSenderId(gcmSenderId) + .setProjectId(projectId) + .setStorageBucket(storageBucket) + .build() + ) + + Log.d(Constants.logTag, "Fetching FCM token...") + // Attempt to get an FCM registration token to pass to the server + val tokenTask: Task = FirebaseMessaging.getInstance().token; + CoroutineScope(Dispatchers.Main).launch { + try { + val fcmToken: String = tokenTask.await() + result.success(fcmToken) + } catch (exception: Exception) { + val error = "Failed to get FCM token!" + Log.e(Constants.logTag, error) + result.error("500", error, exception) + } + + // Set up Firestore / Realtime DB listeners for server URL changes + // databaseUrl null indicates Cloud Firestore setup + Log.d(Constants.logTag, "Setting Firebase database listeners...") + if (databaseUrl == null) { + FirebaseFirestore.getInstance().collection("server").document("config").addSnapshotListener(FirestoreDatabaseListener()) + } else { + FirebaseDatabase.getInstance().getReference("config").addValueEventListener(RealtimeDatabaseListener()) + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseDatabaseListener.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseDatabaseListener.kt new file mode 100644 index 000000000..18305c0c5 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseDatabaseListener.kt @@ -0,0 +1,43 @@ +package com.bluebubbles.messaging.services.firebase + +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.DatabaseError +import com.google.firebase.database.ValueEventListener +import com.google.firebase.firestore.DocumentSnapshot +import com.google.firebase.firestore.EventListener +import com.google.firebase.firestore.FirebaseFirestoreException + +class RealtimeDatabaseListener: ValueEventListener { + override fun onDataChange(snapshot: DataSnapshot) { + Log.d(Constants.logTag, "Realtime Database updated with new URL. Fetching...") + val serverUrl: String? = snapshot.child("serverUrl").getValue(String::class.java) + if (serverUrl != null) { + MethodCallHandler.invokeMethod("NewServerUrl", mapOf("server_url" to serverUrl)) + } else { + Log.e(Constants.logTag, "Realtime Database provided invalid URL!") + } + } + + override fun onCancelled(error: DatabaseError) { + Log.e(Constants.logTag, "Realtime Database failed to provide a new URL!") + } +} + +class FirestoreDatabaseListener: EventListener { + override fun onEvent(value: DocumentSnapshot?, error: FirebaseFirestoreException?) { + if (value != null) { + Log.d(Constants.logTag, "Firestore Database updated with new URL. Fetching...") + val serverUrl: String? = value.get("serverUrl", String::class.java) + if (serverUrl != null) { + MethodCallHandler.invokeMethod("NewServerUrl", mapOf("server_url" to serverUrl)) + } else { + Log.e(Constants.logTag, "Firestore Database provided invalid URL!") + } + } else { + Log.e(Constants.logTag, "Firestore Database failed to provide a new URL!") + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt new file mode 100644 index 000000000..46626e5c7 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt @@ -0,0 +1,64 @@ +package com.bluebubbles.messaging.services.firebase + +import android.content.Context +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.google.android.gms.tasks.Task +import com.google.firebase.FirebaseApp +import com.google.firebase.database.DataSnapshot +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.firestore.DocumentSnapshot +import com.google.firebase.firestore.FirebaseFirestore +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.tasks.await + +/// Fetches a new URL immediately from Firebase +class ServerUrlRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "get-server-url" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // Make sure a FirebaseApp is initialized + lateinit var firebaseApp: FirebaseApp + try { + firebaseApp = FirebaseApp.getInstance() + } catch (e: Exception) { + result.error("500", "No Firebase app found!", e) + return + } + + // Get server URL via Firestore or Realtime DB + Log.d(Constants.logTag, "Fetching server URL...") + if (firebaseApp.options.databaseUrl == null) { + CoroutineScope(Dispatchers.Main).launch { + val serverUrlTask: Task = FirebaseFirestore.getInstance().collection("server").document("config").get() + val serverUrl: String? = serverUrlTask.await().get("serverUrl", String::class.java) + submitData(serverUrl, result) + } + } else { + CoroutineScope(Dispatchers.Main).launch { + val serverUrlTask: Task = FirebaseDatabase.getInstance().getReference("config").child("serverUrl").get() + val serverUrl: String? = serverUrlTask.await().getValue(String::class.java) + submitData(serverUrl, result) + } + } + } + + private fun submitData(serverUrl: String?, result: MethodChannel.Result) { + if (serverUrl != null) { + result.success(serverUrl) + } else { + result.error("500", "Failed to get server URL!", null) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt new file mode 100644 index 000000000..d58f7ef5d --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt @@ -0,0 +1,44 @@ +package com.bluebubbles.messaging.services.firebase + +import android.content.Context +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.google.firebase.FirebaseApp +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.firestore.FirebaseFirestore +import com.google.firebase.firestore.SetOptions +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Set the next-restart value in the Firebase database +class UpdateNextRestartHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "set-next-restart" + } + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // Make sure the FirebaseApp is initialized + lateinit var firebaseApp: FirebaseApp + try { + firebaseApp = FirebaseApp.getInstance() + } catch (e: Exception) { + result.error("500", "No Firebase app found!", e) + return + } + + val nextRestart: Long = call.argument("value")!! + Log.d(Constants.logTag, "Updating next restart value...") + // null databaseUrl indicates Cloud Firestore setup + if (firebaseApp.options.databaseUrl == null) { + val newData = hashMapOf("nextRestart" to nextRestart) + FirebaseFirestore.getInstance().collection("server").document("config").set(newData, SetOptions.merge()) + } else { + FirebaseDatabase.getInstance().getReference("config").child("nextRestart").setValue(nextRestart) + } + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt new file mode 100644 index 000000000..891306d28 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt @@ -0,0 +1,40 @@ +package com.bluebubbles.messaging.services.intents + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.utils.Utils +import io.flutter.plugin.common.MethodChannel + +/// Receives intents from other apps. This is primarily used for Tasker integration. +class ExternalIntentReceiver: BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (context == null || intent == null) return + + Log.d(Constants.logTag, "Received intent ${intent.type} from external app") + when (intent.type) { + "com.bluebubbles.external.GET_SERVER_URL" -> { + val password = intent.extras?.getString("password") + val identifier = intent.extras?.getString("id") + + if (password != null) { + Utils.getServerUrl(context, password, object : MethodChannel.Result { + override fun success(result: Any?) { + Log.d(Constants.logTag, "Got URL: $result - sending to Tasker...") + val intent = Intent() + intent.setAction("net.dinglisch.android.taskerm.BB_SERVER_URL") + intent.putExtra("url", result.toString()) + intent.putExtra("id", identifier) + context.sendBroadcast(intent) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {} + override fun notImplemented() {} + }) + } + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt new file mode 100644 index 000000000..f6396da50 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/InternalIntentReceiver.kt @@ -0,0 +1,100 @@ +package com.bluebubbles.messaging.services.intents + +import android.annotation.SuppressLint +import android.app.Notification +import android.app.NotificationManager +import android.app.Person +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.core.app.RemoteInput +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.services.backend_ui_interop.DartWorkManager +import com.bluebubbles.messaging.services.notifications.DeleteNotificationHandler +import com.bluebubbles.messaging.utils.Utils +import java.io.BufferedInputStream +import java.io.DataInputStream +import java.io.File +import java.io.FileInputStream +import java.io.IOException + + +class InternalIntentReceiver: BroadcastReceiver() { + @SuppressLint("NewApi") + override fun onReceive(context: Context?, intent: Intent?) { + if (context == null || intent == null) return + + Log.d(Constants.logTag, "Received internal intent ${intent.type}, handling...") + when (intent.type) { + "DeleteNotification" -> { + val notificationId: Int = intent.getIntExtra("notificationId", 0) + DeleteNotificationHandler().deleteNotification(context, notificationId) + } + "MarkChatRead" -> { + val notificationId: Int = intent.getIntExtra("notificationId", 0) + val chatGuid: String? = intent.getStringExtra("chatGuid") + DeleteNotificationHandler().deleteNotification(context, notificationId) + + DartWorkManager.createWorker(context, intent.type!!, hashMapOf("chatGuid" to chatGuid)) {} + } + "ReplyChat" -> { + val notificationId: Int = intent.getIntExtra("notificationId", 0) + val chatGuid: String? = intent.getStringExtra("chatGuid") + val messageGuid: String? = intent.getStringExtra("messageGuid") + val replyText = RemoteInput.getResultsFromIntent(intent)?.getString("text_reply") ?: return + + DartWorkManager.createWorker(context, intent.type!!, hashMapOf("chatGuid" to chatGuid, "messageGuid" to messageGuid, "text" to replyText)) { + val notificationManager = context.getSystemService(NotificationManager::class.java) + // this is used to copy the style, since the notification already exists + Log.d(Constants.logTag, "Fetching existing notification values") + val chatNotification = notificationManager.activeNotifications.last { it.id == notificationId } + val oldBuilder = Notification.Builder.recoverBuilder(context, chatNotification.notification) + val oldStyle = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + oldBuilder.style as Notification.MessagingStyle + } else { + val temp = NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(chatNotification.notification) + Notification.MessagingStyle(Person.Builder() + .setName(temp!!.user.name) + .setIcon(temp.user.icon?.toIcon(context)) + .setImportant(true) + .build() + ) + } + + Log.d(Constants.logTag, "Creating sender and message object for the user-created reply") + val prefs = context.getSharedPreferences("FlutterSharedPreferences", 0) + val sender = Person.Builder() + .setName(prefs.getString("flutter.userName", "You")) + .setImportant(true) + val avatarPath = prefs.getString("flutter.userAvatarPath", "") + if (avatarPath!!.isNotEmpty()) { + val file = File(avatarPath) + val bytes = ByteArray(file.length().toInt()) + try { + val bis = BufferedInputStream(FileInputStream(file)) + val dis = DataInputStream(bis) + dis.readFully(bytes) + sender.setIcon(Utils.getAdaptiveIconFromByteArray(bytes).toIcon(context)) + } catch (e: IOException) { + e.printStackTrace() + } + } + oldStyle.addMessage(Notification.MessagingStyle.Message( + replyText, + System.currentTimeMillis() / 1000, + sender.build() + )) + + Log.d(Constants.logTag, "Posting the user-created reply") + oldBuilder.setStyle(oldStyle) + oldBuilder.setOnlyAlertOnce(true) + oldBuilder.setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY) + notificationManager.notify(Constants.newMessageNotificationTag, notificationId, oldBuilder.build()) + } + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt new file mode 100644 index 000000000..73b68a9ec --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt @@ -0,0 +1,112 @@ +package com.bluebubbles.messaging.services.notifications + +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Bundle +import androidx.core.app.NotificationCompat +import androidx.core.app.Person +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity +import com.bluebubbles.messaging.R +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.bluebubbles.messaging.services.intents.InternalIntentReceiver +import com.bluebubbles.messaging.utils.Utils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class CreateIncomingFaceTimeNotification: MethodCallHandlerImpl() { + companion object { + const val tag = "create-incoming-facetime-notification" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // channel details + val channelId: String = call.argument("channel_id")!! + val notificationId: Int = call.argument("notification_id")!! + // call details + val callUuid: String? = call.argument("call_uuid") + val title: String = call.argument("title")!! + val body: String = call.argument("body")!! + // contact details + val callerName: String = call.argument("caller")!! + val callerIcon: ByteArray? = call.argument("caller_avatar") + val callerBitmap = if ((callerIcon?.size ?: 0) == 0) null else BitmapFactory.decodeByteArray(callerIcon!!, 0, callerIcon.size) + val callerIconCompat = if ((callerIcon?.size ?: 0) == 0) null else Utils.getAdaptiveIconFromByteArray(callerIcon!!) + + // build the caller object + val caller = Person.Builder() + .setName(callerName) + .setIcon(callerIconCompat) + .setImportant(true) + .build() + + // create a bundle for extra info + val extras = Bundle() + extras.putString("callUuid", callUuid) + + // intent to open the app + val openSummaryIntent = PendingIntent.getActivity( + context, + 0, + Intent(context, MainActivity::class.java) + .putExtras(extras) + .putExtra("answer", false) + .putExtra("caller", callerName) + .setType("OpenSummary"), + PendingIntent.FLAG_IMMUTABLE + ) + + // Create intent for answering and opening the facetime link + val answerIntent = PendingIntent.getActivity( + context, + notificationId + Constants.pendingIntentAnswerFaceTimeOffset, + Intent(context, MainActivity::class.java) + .putExtras(extras) + .putExtra("answer", true) + .putExtra("caller", callerName) + .setType("AnswerFaceTime"), + PendingIntent.FLAG_IMMUTABLE + ) + + // Create intent for declining the facetime + val declineIntent = PendingIntent.getBroadcast( + context, + notificationId + Constants.pendingIntentDeclineFaceTimeOffset, + Intent(context, InternalIntentReceiver::class.java) + .putExtra("notificationId", notificationId) + .setType("DeleteNotification"), + PendingIntent.FLAG_IMMUTABLE + ) + + val notificationBuilder = NotificationCompat.Builder(context, channelId) + .setSmallIcon(R.mipmap.ic_stat_icon) + .setAutoCancel(true) + .setCategory(NotificationCompat.CATEGORY_CALL) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setContentTitle(title) + .setContentText(body) + .addExtras(extras) + .addPerson(caller) + .setColor(4888294) + if (callerBitmap != null) { + notificationBuilder.setLargeIcon(callerBitmap) + } + if (callUuid != null) { + notificationBuilder.setContentIntent(openSummaryIntent); + notificationBuilder.setStyle(NotificationCompat.CallStyle.forIncomingCall(caller, declineIntent, answerIntent).setIsVideo(true)) + // clear after 30 seconds in case we didn't get an event from the server + notificationBuilder.setTimeoutAfter(30000); + } + + val notificationManager = context.getSystemService(NotificationManager::class.java) + notificationManager.notify(Constants.newFaceTimeNotificationTag, notificationId, notificationBuilder.build()) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt new file mode 100644 index 000000000..18914ae9d --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt @@ -0,0 +1,208 @@ +package com.bluebubbles.messaging.services.notifications + +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.core.app.NotificationCompat +import androidx.core.app.Person +import androidx.core.app.RemoteInput +import androidx.core.graphics.drawable.IconCompat +import com.bluebubbles.messaging.BubbleActivity +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity +import com.bluebubbles.messaging.R +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.bluebubbles.messaging.services.intents.InternalIntentReceiver +import com.bluebubbles.messaging.services.system.PushShareTargetsHandler +import com.bluebubbles.messaging.utils.Utils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class CreateIncomingMessageNotification: MethodCallHandlerImpl() { + companion object { + const val tag = "create-incoming-message-notification" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // channel details + val channelId: String = call.argument("channel_id")!! + // chat details + val chatGuid: String = call.argument("chat_guid")!! + val chatTitle: String = call.argument("chat_title")!! + val chatIsGroup: Boolean = call.argument("chat_is_group")!! + val chatIcon: ByteArray? = call.argument("chat_icon") + val chatBitmap = if ((chatIcon?.size ?: 0) == 0) null else Utils.getAdaptiveIconFromByteArray(chatIcon!!) + // message details + val messageText: String = call.argument("message_text")!! + val messageGuid: String = call.argument("message_guid")!! + val messageDate: Long = call.argument("message_date")!! + val messageIsFromMe: Boolean = call.argument("message_is_from_me")!! + // contact details + val contactName: String = call.argument("contact_name")!! + val contactIcon: ByteArray? = call.argument("contact_avatar") + val contactBitmap = if ((contactIcon?.size ?: 0) == 0) null else Utils.getAdaptiveIconFromByteArray(contactIcon!!) + + // calculate a notification ID based on the chat database ID + val notificationId: Int = call.argument("chat_id")!! + + val notificationManager = context.getSystemService(NotificationManager::class.java) + // check if the message has already been posted as a notification + val notificationPostedAlready = notificationManager.activeNotifications.firstOrNull { it.notification.extras.getString("chatGuid") == chatGuid && it.notification.extras.getString("messageGuid") == messageGuid } != null + // this is used to copy the style, since the notification already exists + val chatNotification = notificationManager.activeNotifications.lastOrNull { it.notification.extras.getString("chatGuid") == chatGuid } + // don't double post a notification + if (notificationPostedAlready) return result.success(null) + + // build the sender object and push the share target again + val sender = Person.Builder() + .setName(contactName) + .setIcon(contactBitmap) + .setImportant(true) + .build() + PushShareTargetsHandler().pushShareTarget(context, chatTitle, chatTitle, chatIcon) + + // get or create a messaging style + val style = if (chatNotification != null) NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(chatNotification.notification)!! else NotificationCompat.MessagingStyle(Person.Builder().setName("You").build()) + if (chatIsGroup) { + style.isGroupConversation = true + style.conversationTitle = chatTitle + } + // add the new message to the style + style.addMessage(NotificationCompat.MessagingStyle.Message( + messageText, + messageDate, + sender + )) + + // create a bundle for extra info + val extras = Bundle() + extras.putString("chatGuid", chatGuid) + extras.putString("messageGuid", messageGuid) + + // intent to open the conversation in-app + val openConversationIntent = PendingIntent.getActivity( + context, + notificationId + Constants.pendingIntentOpenChatOffset, + Intent(context, MainActivity::class.java) + .putExtras(extras) + .putExtra("notificationId", notificationId) + .putExtra("bubble", false) + .setType("OpenChat"), + PendingIntent.FLAG_IMMUTABLE + ) + + // intent to swipe away the notification + val deleteNotificationIntent = PendingIntent.getBroadcast( + context, + notificationId + Constants.pendingIntentDeleteNotificationOffset, + Intent(context, InternalIntentReceiver::class.java) + .putExtras(extras) + .putExtra("notificationId", notificationId) + .setType("DeleteNotification"), + PendingIntent.FLAG_IMMUTABLE + ) + + // intent and action for 'mark as read' + val markAsReadIntent = PendingIntent.getBroadcast( + context, + notificationId + Constants.pendingIntentMarkReadOffset, + Intent(context, InternalIntentReceiver::class.java) + .putExtras(extras) + .putExtra("notificationId", notificationId) + .setType("MarkChatRead"), + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + val markAsReadAction = NotificationCompat.Action.Builder(0, "Mark As Read", markAsReadIntent) + .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ) + .setShowsUserInterface(false) + .build() + + // intent and action for quick reply + val replyIntent = PendingIntent.getBroadcast( + context, + notificationId, + Intent(context, InternalIntentReceiver::class.java) + .putExtras(extras) + .putExtra("notificationId", notificationId) + .setType("ReplyChat"), + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + val replyAction = NotificationCompat.Action.Builder(0, "Reply", replyIntent) + .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY) + .setShowsUserInterface(false) + .setAllowGeneratedReplies(true) + .extend(NotificationCompat.Action.WearableExtender().setHintDisplayActionInline(true)) + .addRemoteInput(RemoteInput.Builder("text_reply").setLabel("Reply").build()) + .build() + + // intent and metadata for bubbling + val bubbleIntent = PendingIntent.getActivity( + context, + notificationId + Constants.pendingIntentOpenBubbleOffset, + Intent(context, BubbleActivity::class.java) + .putExtras(extras) + .putExtra("notificationId", notificationId) + .putExtra("bubble", false) + .setType("OpenChat"), + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + val bubbleMetadata = NotificationCompat.BubbleMetadata.Builder(bubbleIntent, chatBitmap ?: IconCompat.createWithResource(context, R.mipmap.ic_stat_icon)) + .setDesiredHeight(600) + .setDeleteIntent(deleteNotificationIntent) + .build() + + val notificationBuilder = NotificationCompat.Builder(context, channelId) + .setSmallIcon(R.mipmap.ic_stat_icon) + .setGroup(Constants.notificationGroupKey) + .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN) + .setOnlyAlertOnce(messageIsFromMe) + .setAutoCancel(true) + .setCategory(NotificationCompat.CATEGORY_MESSAGE) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setContentIntent(openConversationIntent) + .setDeleteIntent(deleteNotificationIntent) + .setStyle(style) + .setAllowSystemGeneratedContextualActions(true) + .setColor(4888294) + .setBubbleMetadata(bubbleMetadata) + .setShortcutId(chatGuid) + .addAction(markAsReadAction) + .addAction(replyAction) + .addPerson(sender) + .addExtras(extras) + .extend(NotificationCompat.WearableExtender().addAction(markAsReadAction).addAction(replyAction)) + + // intent to open the main app + val openSummaryIntent = PendingIntent.getActivity( + context, + 0, + Intent(context, MainActivity::class.java) + .putExtra("chatGuid", "-1") + .putExtra("notificationId", 0) + .putExtra("bubble", false) + .setType("OpenSummary"), + PendingIntent.FLAG_IMMUTABLE + ) + + val summaryNotificationBuilder = NotificationCompat.Builder(context, channelId) + .setSmallIcon(R.mipmap.ic_stat_icon) + .setGroup(Constants.notificationGroupKey) + .setGroupSummary(true) + .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN) + .setAutoCancel(true) + .setCategory(NotificationCompat.CATEGORY_MESSAGE) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setContentIntent(openSummaryIntent) + .setColor(4888294) + + notificationManager.notify(Constants.newMessageNotificationTag, notificationId, notificationBuilder.build()) + notificationManager.notify(0, summaryNotificationBuilder.build()) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt new file mode 100644 index 000000000..1719d2079 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt @@ -0,0 +1,48 @@ +package com.bluebubbles.messaging.services.notifications + +import android.app.NotificationManager +import android.content.Context +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class DeleteNotificationHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "delete-notification" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val notificationId: Int = call.argument("notification_id")!! + val success = deleteNotification(context, notificationId) + if (success) { + result.success(null) + } else { + result.error("500", "Failed to cancel notification!", null) + } + } + + fun deleteNotification(context: Context, notificationId: Int): Boolean { + Log.d(Constants.logTag, "Cancelling notification with ID $notificationId") + val notificationManager = context.getSystemService(NotificationManager::class.java) + return try { + // We don't know what type of notification is being cancelled so explicitly do both + notificationManager.cancel(Constants.newMessageNotificationTag, notificationId) + notificationManager.cancel(Constants.newFaceTimeNotificationTag, notificationId) + // cancel the summary if needed + if (notificationManager.activeNotifications.size == 1 && notificationManager.activeNotifications.first().id == 0) { + Log.d(Constants.logTag, "Cancelling notification summary") + notificationManager.cancel(0) + } + true + } catch (exception: Exception) { + Log.e(Constants.logTag, "Failed to cancel notification with ID $notificationId!") + false + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt new file mode 100644 index 000000000..b48971c6a --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt @@ -0,0 +1,53 @@ +package com.bluebubbles.messaging.services.notifications + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.os.Build +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class NotificationChannelHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "create-notification-channel" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // check if we are on a lower SDK + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + result.success(null) + return + } + val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java) + val channelName: String = call.argument("channel_name")!! + val channelDescription: String = call.argument("channel_description")!! + val channelId: String = call.argument("channel_id")!! + Log.d(Constants.logTag, "Creating channel with name $channelName") + // check if the channel exists + if (notificationManager.getNotificationChannel(channelId) != null) { + Log.d(Constants.logTag, "Notification channel already exists! Ignoring...") + result.success(null) + return + } + // setup channel with parameters + val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH) + channel.description = channelDescription + // set the 'New Messages' channel to allow bubbling, bypassing DND, and showing badges + if (channelId == "com.bluebubbles.new_messages") { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + channel.setAllowBubbles(true) + } + channel.setBypassDnd(true) + channel.setShowBadge(true) + } + // create the channel + notificationManager.createNotificationChannel(channel) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt new file mode 100644 index 000000000..c9eddcb1c --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt @@ -0,0 +1,78 @@ +package com.bluebubbles.messaging.services.notifications + +import android.content.ComponentName +import android.content.Context +import android.media.MediaMetadata +import android.media.session.MediaController +import android.media.session.MediaSessionManager +import android.service.notification.NotificationListenerService +import android.util.Log +import androidx.palette.graphics.Palette +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler + +/// Class used to listen for media notifications and fetch album art to update app theming +class NotificationListener: NotificationListenerService() { + companion object { + private var hasInit: Boolean = false; + + fun init(context: Context) { + if (hasInit) return + val manager: MediaSessionManager = context.getSystemService(MediaSessionManager::class.java) + val sessionListener = MediaSessionListener() + sessionListener.init(context) + manager.addOnActiveSessionsChangedListener(sessionListener, ComponentName(context, this::class.java)) + hasInit = true; + } + } +} + +class MediaSessionListener: MediaSessionManager.OnActiveSessionsChangedListener { + companion object { + val callback = MediaControllerCallback() + var oldControllers: MutableList = mutableListOf() + } + + fun init(context: Context) { + Log.d(Constants.logTag, "Initializing media session listener...") + val manager: MediaSessionManager = context.getSystemService(MediaSessionManager::class.java) + val controllers = manager.getActiveSessions(ComponentName(context, NotificationListener::class.java)) + onActiveSessionsChanged(controllers) + } + + override fun onActiveSessionsChanged(controllers: MutableList?) { + if ((controllers?.size ?: 0) == 0) { + return + } + + Log.d(Constants.logTag, "Media session changed, unregistering and re-registering callbacks...") + for (controller in oldControllers) { + controller.unregisterCallback(callback) + } + oldControllers = controllers!! + for (controller in controllers) { + controller.registerCallback(callback) + } + } +} + +class MediaControllerCallback: MediaController.Callback() { + override fun onMetadataChanged(metadata: MediaMetadata?) { + super.onMetadataChanged(metadata) + if (metadata == null) return + Log.d(Constants.logTag, "Media metadata changed (new track ${metadata.getString(MediaMetadata.METADATA_KEY_TITLE)})") + val art = metadata.getBitmap(MediaMetadata.METADATA_KEY_ART) + val albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART) + + if (art != null || albumArt != null) { + Log.d(Constants.logTag, "Fetching palette for new media") + Palette.from((art ?: albumArt)!!).generate {palette -> + val vibrant = palette?.vibrantSwatch?.rgb; + if (vibrant != null) { + Log.d(Constants.logTag, "Sending primary color to Dart") + MethodCallHandler.invokeMethod("MediaColors", hashMapOf("primary" to vibrant)) + } + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListenerPermissionRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListenerPermissionRequestHandler.kt new file mode 100644 index 000000000..e1be57fcf --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListenerPermissionRequestHandler.kt @@ -0,0 +1,32 @@ +package com.bluebubbles.messaging.services.notifications + +import android.content.Context +import android.content.Intent +import android.provider.Settings +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Used to request the notification listener permission +class NotificationListenerPermissionRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "request-notification-listener-permission" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val hasPermission = Settings.Secure.getString(context.contentResolver, "enabled_notification_listeners").contains(context.packageName) + if (hasPermission) { + Log.d(Constants.logTag, "Notification listener permission already granted, ignoring...") + return result.success(true) + } + val intent = Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS") + (context as MainActivity).startActivityForResult(intent, Constants.notificationListenerRequestCode) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/StartNotificationListenerHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/StartNotificationListenerHandler.kt new file mode 100644 index 000000000..a76348e41 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/StartNotificationListenerHandler.kt @@ -0,0 +1,28 @@ +package com.bluebubbles.messaging.services.notifications + +import android.content.Context +import android.provider.Settings +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +class StartNotificationListenerHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "start-notification-listener" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val hasPermission = Settings.Secure.getString(context.contentResolver, "enabled_notification_listeners").contains(context.packageName); + if (hasPermission) { + Log.d(Constants.logTag, "Notification listener permission found, starting listener") + NotificationListener.init(context) + return result.success(true) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/BrowserLaunchRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/BrowserLaunchRequestHandler.kt new file mode 100644 index 000000000..7f6ec97f4 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/BrowserLaunchRequestHandler.kt @@ -0,0 +1,28 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.net.Uri +import androidx.browser.customtabs.CustomTabsIntent +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Launch given URL in a Chrome Custom Tab +class BrowserLaunchRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "open-browser" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val link: String = call.argument("link")!! + val intent: CustomTabsIntent = CustomTabsIntent.Builder() + .setSendToExternalDefaultHandlerEnabled(false) + .build() + intent.launchUrl(context, Uri.parse(link)) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/CheckChromeOsHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/CheckChromeOsHandler.kt new file mode 100644 index 000000000..e87837010 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/CheckChromeOsHandler.kt @@ -0,0 +1,22 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Check if ChromeOS is the current OS +class CheckChromeOsHandler: MethodCallHandlerImpl() { + companion object { + const val tag: String = "check-chromeos" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val packageManager = context.packageManager; + result.success(packageManager.hasSystemFeature("org.chromium.arc") || packageManager.hasSystemFeature("org.chromium.arc.device_management")) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NewContactFormRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NewContactFormRequestHandler.kt new file mode 100644 index 000000000..95811d9e3 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/NewContactFormRequestHandler.kt @@ -0,0 +1,36 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.content.Intent +import android.provider.ContactsContract +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Open the new contact form picker +class NewContactFormRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "open-contact-form" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val address: String = call.argument("address")!! + val addressType: String = call.argument("address_type")!! + + val intent = Intent(Intent.ACTION_INSERT_OR_EDIT) + .setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE) + // Problem in Android 4.0+ (https://developer.android.com/training/contacts-provider/modify-data#add-the-navigation-flag) + .putExtra("finishActivityOnSaveCompleted", true) + if (addressType == "email") { + intent.putExtra(ContactsContract.Intents.Insert.EMAIL, address) + } else { + intent.putExtra(ContactsContract.Intents.Insert.PHONE, address) + } + context.startActivity(intent) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenCalendarRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenCalendarRequestHandler.kt new file mode 100644 index 000000000..83525a747 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenCalendarRequestHandler.kt @@ -0,0 +1,29 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.content.Intent +import android.provider.CalendarContract +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Create a new event in the calendar +class OpenCalendarRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "open-calendar" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val begin: Long = call.argument("date")!! + val intent = Intent(Intent.ACTION_EDIT) + .setType("vnd.android.cursor.item/event") + .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) + .putExtra("finishActivityOnSaveCompleted", true) + context.startActivity(intent) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenConversationNotificationSettingsHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenConversationNotificationSettingsHandler.kt new file mode 100644 index 000000000..de58951a5 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenConversationNotificationSettingsHandler.kt @@ -0,0 +1,55 @@ +package com.bluebubbles.messaging.services.system + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.os.Build +import android.provider.Settings +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Open/Create the conversation-specific notification settings +class OpenConversationNotificationSettingsHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "open-conversation-notification-settings" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + // check if we are on a lower SDK + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + result.error("500", "Cannot create chat notification settings below Android R!", null) + return + } + val notificationManager: NotificationManager = context.getSystemService(NotificationManager::class.java) + val channelName: String = call.argument("display_name")!! + val channelId: String = call.argument("channel_id")!! + // We don't check if the channel exists because the underlying new messages channel gets returned then + Log.d(Constants.logTag, "Creating channel...") + // setup channel with parameters + val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH) + // set the channel to allow bubbling, bypassing DND, and showing badges + channel.setAllowBubbles(true) + channel.setBypassDnd(true) + channel.setShowBadge(true) + channel.setConversationId("com.bluebubbles.new_messages", channelId); + // create the channel + notificationManager.createNotificationChannel(channel) + // create the intent and launch + Log.d(Constants.logTag, "Launching notification settings for conversation") + val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, context.packageName) + .putExtra(Settings.EXTRA_CHANNEL_ID, channel.id) + .putExtra(Settings.EXTRA_CONVERSATION_ID, channel.conversationId) + .putExtra("finishActivityOnSaveCompleted", true) + context.startActivity(intent) + result.success(null) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenExistingContactRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenExistingContactRequestHandler.kt new file mode 100644 index 000000000..3f234cc19 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/OpenExistingContactRequestHandler.kt @@ -0,0 +1,40 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.content.Intent +import android.provider.ContactsContract +import androidx.core.content.ContentResolverCompat +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Open an existing contact page +class OpenExistingContactRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "view-contact-form" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val contactId: String = call.argument("id")!! + // perform a manual lookup even though we have a contact ID because there is no guarantee the actual content URI will be based off the ID + val cursor = ContentResolverCompat.query(context.contentResolver, ContactsContract.Contacts.CONTENT_URI, null, "${ContactsContract.Contacts._ID} = ?", arrayOf(contactId), null, null) + if (cursor != null) { + cursor.moveToFirst() + val contactIdLong: Long = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)) + val lookupId: String = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.LOOKUP_KEY)) + val uri = ContactsContract.Contacts.getLookupUri(contactIdLong, lookupId) + val intent = Intent(Intent.ACTION_VIEW) + .setDataAndType(uri, ContactsContract.Contacts.CONTENT_ITEM_TYPE) + // Problem in Android 4.0+ (https://developer.android.com/training/contacts-provider/modify-data#add-the-navigation-flag) + .putExtra("finishActivityOnSaveCompleted", true) + context.startActivity(intent) + result.success(null) + } else { + result.error("500", "Failed to find contact!", null) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/PushShareTargetsHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/PushShareTargetsHandler.kt new file mode 100644 index 000000000..9ead6daf1 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/PushShareTargetsHandler.kt @@ -0,0 +1,62 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.content.Intent +import android.util.Log +import androidx.core.app.Person +import androidx.core.content.pm.ShortcutInfoCompat +import androidx.core.content.pm.ShortcutManagerCompat +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.MainActivity +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.bluebubbles.messaging.utils.Utils +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Create android share sheet targets +class PushShareTargetsHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "push-share-targets" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val name: String = call.argument("title")!! + val guid: String = call.argument("guid")!! + val icon: ByteArray? = call.argument("icon") + pushShareTarget(context, name, guid, icon) + result.success(null) + } + + fun pushShareTarget(context: Context, name: String, guid: String, icon: ByteArray?) { + val adaptiveIcon = if ((icon?.size ?: 0) == 0) null else Utils.getAdaptiveIconFromByteArray(icon!!) + + Log.d(Constants.logTag, "Creating intent for shortcut with name $name") + val contactCategories = setOf(Constants.categoryTextShareTarget) + val launcherIntent = Intent(context, MainActivity::class.java) + .putExtra("chatGuid", guid) + .putExtra("bubble", false) + .setAction(Intent.ACTION_DEFAULT) + val person = Person.Builder().setName(name) + if (adaptiveIcon != null) { + person.setIcon(adaptiveIcon) + } + + Log.d(Constants.logTag, "Creating and pushing shortcut for $name") + val shortcut = ShortcutInfoCompat.Builder(context, guid) + .setShortLabel(name) + .setIntent(launcherIntent) + .setCategories(contactCategories) + .setLongLived(true) + .setIsConversation() + .setPerson(person.build()) + if (adaptiveIcon != null) { + shortcut.setIcon(adaptiveIcon) + } + + ShortcutManagerCompat.pushDynamicShortcut(context, shortcut.build()) + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/StartGoogleDuoRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/StartGoogleDuoRequestHandler.kt new file mode 100644 index 000000000..13b89f142 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/system/StartGoogleDuoRequestHandler.kt @@ -0,0 +1,33 @@ +package com.bluebubbles.messaging.services.system + +import android.content.Context +import android.content.Intent +import android.net.Uri +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +/// Start a google duo call +class StartGoogleDuoRequestHandler: MethodCallHandlerImpl() { + companion object { + const val tag = "google-duo" + } + + override fun handleMethodCall( + call: MethodCall, + result: MethodChannel.Result, + context: Context + ) { + val number: String = call.argument("number")!! + val intent = Intent("${Constants.googleDuoPackageName}.action.CALL") + .setPackage(Constants.googleDuoPackageName) + .setData(Uri.parse("tel:${number}")) + if (intent.resolveActivity(context.packageManager) != null) { + context.startActivity(intent) + result.success(null) + } else { + result.error("500", "Failed to find Google Duo!", null) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/com/bluebubbles/messaging/helpers/FileDirectory.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/FilesystemUtils.kt similarity index 85% rename from android/app/src/main/java/com/bluebubbles/messaging/helpers/FileDirectory.kt rename to android/app/src/main/kotlin/com/bluebubbles/messaging/utils/FilesystemUtils.kt index ba35e5710..040e5dc9c 100644 --- a/android/app/src/main/java/com/bluebubbles/messaging/helpers/FileDirectory.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/FilesystemUtils.kt @@ -1,21 +1,20 @@ -package com.bluebubbles.messaging.helpers +package com.bluebubbles.messaging.utils import android.content.ContentUris import android.content.Context import android.database.Cursor import android.net.Uri -import android.os.Build import android.os.Environment import android.provider.DocumentsContract import android.provider.MediaStore +import android.util.Log +import android.webkit.MimeTypeMap import java.io.File import java.io.FileOutputStream -import java.util.* -import android.webkit.MimeTypeMap -import android.util.Log - +import java.util.Date -object FileDirectory { +/// This code taken from receive_sharing_intent package +object FilesystemUtils { /** * Get a file path from a Uri. This will get the the path for Storage Access @@ -27,9 +26,8 @@ object FileDirectory { * @author paulburke */ fun getAbsolutePath(context: Context, uri: Uri): String? { - // DocumentProvider - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) { + if (DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { val docId = DocumentsContract.getDocumentId(uri) @@ -41,16 +39,17 @@ object FileDirectory { } else { getDataColumn(context, uri, null, null) } + // DownloadsProvider } else if (isDownloadsDocument(uri)) { return try { val id = DocumentsContract.getDocumentId(uri) - val contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)) + val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)) getDataColumn(context, contentUri, null, null) } catch (exception: Exception) { getDataColumn(context, uri, null, null) } + // MediaProvider } else if (isMediaDocument(uri)) { val docId = DocumentsContract.getDocumentId(uri) val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() @@ -68,8 +67,7 @@ object FileDirectory { val selection = "_id=?" val selectionArgs = arrayOf(split[1]) return getDataColumn(context, contentUri, selection, selectionArgs) - }// MediaProvider - // DownloadsProvider + } } else if ("content".equals(uri.scheme, ignoreCase = true)) { return getDataColumn(context, uri, null, null) } @@ -87,9 +85,7 @@ object FileDirectory { * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ - private fun getDataColumn(context: Context, uri: Uri, selection: String?, - selectionArgs: Array?): String? { - + private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array?): String? { if (uri.authority != null) { var cursor: Cursor? = null val column = "_display_name" @@ -146,28 +142,15 @@ object FileDirectory { return null } - - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is ExternalStorageProvider. - */ - fun isExternalStorageDocument(uri: Uri): Boolean { + private fun isExternalStorageDocument(uri: Uri): Boolean { return "com.android.externalstorage.documents" == uri.authority } - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is DownloadsProvider. - */ - fun isDownloadsDocument(uri: Uri): Boolean { + private fun isDownloadsDocument(uri: Uri): Boolean { return "com.android.providers.downloads.documents" == uri.authority } - /** - * @param uri The Uri to check. - * @return Whether the Uri authority is MediaProvider. - */ - fun isMediaDocument(uri: Uri): Boolean { + private fun isMediaDocument(uri: Uri): Boolean { return "com.android.providers.media.documents" == uri.authority } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt new file mode 100644 index 000000000..d01706063 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt @@ -0,0 +1,60 @@ +package com.bluebubbles.messaging.utils + +import android.content.Context +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import androidx.core.graphics.drawable.IconCompat +import com.bluebubbles.messaging.services.firebase.FirebaseAuthHandler +import com.bluebubbles.messaging.services.firebase.ServerUrlRequestHandler +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel + +object Utils { + fun getAdaptiveIconFromByteArray(data: ByteArray): IconCompat { + val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size) + // Scale the bitmap to 108x108dp to comply with adaptive icon guidelines + // Start by scaling the inner image to 72x72dp + var width = bitmap.width + var height = bitmap.height + val aspectRatio = width / height + if (aspectRatio > 1) { + width = (72 * Resources.getSystem().displayMetrics.density).toInt() + height = width / aspectRatio + } else { + height = (72 * Resources.getSystem().displayMetrics.density).toInt() + width = height / aspectRatio + } + val scaledBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true) + // Add transparent padding to achieve 108x108dp + val padding = ((108 - 72) * Resources.getSystem().displayMetrics.density).toInt(); + val adaptiveBitmap = Bitmap.createBitmap(scaledBitmap.width + padding, scaledBitmap.height + padding, Bitmap.Config.ARGB_8888) + val tempCanvas = Canvas(adaptiveBitmap) + tempCanvas.drawBitmap(scaledBitmap, (padding / 2).toFloat(), (padding / 2).toFloat(), null) + return IconCompat.createWithAdaptiveBitmap(adaptiveBitmap) + } + + fun getServerUrl(context: Context, password: String, result: MethodChannel.Result) { + val prefs = context.getSharedPreferences("FlutterSharedPreferences", 0) + val storedPassword = prefs.getString("flutter.guidAuthKey", "") + if (password != storedPassword) return + + val fcmData = HashMap() + fcmData["project_id"] = prefs.getString("flutter.projectID", "") + fcmData["storage_bucket"] = prefs.getString("flutter.storageBucket", "") + fcmData["api_key"] = prefs.getString("flutter.apiKey", "") + fcmData["firebase_url"] = prefs.getString("flutter.firebaseURL", "") + fcmData["client_id"] = prefs.getString("flutter.clientID", "") + fcmData["application_id"] = prefs.getString("flutter.applicationID", "") + val map: Map = HashMap(fcmData) + FirebaseAuthHandler().handleMethodCall(MethodCall("", map), object : MethodChannel.Result { + override fun success(temp: Any?) { + ServerUrlRequestHandler().handleMethodCall(MethodCall("", null), result, context) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {} + override fun notImplemented() {} + }, context) + } +} \ No newline at end of file diff --git a/lib/app/layouts/conversation_details/widgets/chat_info.dart b/lib/app/layouts/conversation_details/widgets/chat_info.dart index 847398468..019a75c86 100644 --- a/lib/app/layouts/conversation_details/widgets/chat_info.dart +++ b/lib/app/layouts/conversation_details/widgets/chat_info.dart @@ -449,7 +449,7 @@ class _ChatInfoState extends OptimizedState { final handle = chat.participants.first; if (contact == null) { await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'addressType': handle.address.isEmail ? 'email' : 'phone'}); + {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { await mcs.invokeMethod("view-contact-form", {'id': contact.id}); } diff --git a/lib/app/layouts/conversation_details/widgets/chat_options.dart b/lib/app/layouts/conversation_details/widgets/chat_options.dart index 07300e4c7..326751f93 100644 --- a/lib/app/layouts/conversation_details/widgets/chat_options.dart +++ b/lib/app/layouts/conversation_details/widgets/chat_options.dart @@ -59,10 +59,9 @@ class _ChatOptionsState extends OptimizedState { ), isThreeLine: true, onTap: () async { - await mcs.invokeMethod("open-convo-notif-settings", { - "parentId": NotificationsService.NEW_MESSAGE_CHANNEL, - "id": chat.guid, - "displayName": chat.getTitle() + await mcs.invokeMethod("open-conversation-notification-settings", { + "channel_id": chat.guid, + "display_name": chat.getTitle() }); }, ), diff --git a/lib/app/layouts/conversation_details/widgets/contact_tile.dart b/lib/app/layouts/conversation_details/widgets/contact_tile.dart index d99eb2e91..24e0e6237 100644 --- a/lib/app/layouts/conversation_details/widgets/contact_tile.dart +++ b/lib/app/layouts/conversation_details/widgets/contact_tile.dart @@ -42,7 +42,7 @@ class ContactTile extends StatelessWidget { onTap: () async { if (contact == null) { await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'addressType': handle.address.isEmail ? 'email' : 'phone'}); + {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { await mcs.invokeMethod("view-contact-form", {'id': contact!.id}); } diff --git a/lib/app/layouts/conversation_view/widgets/header/material_header.dart b/lib/app/layouts/conversation_view/widgets/header/material_header.dart index 110f884f5..195368368 100644 --- a/lib/app/layouts/conversation_view/widgets/header/material_header.dart +++ b/lib/app/layouts/conversation_view/widgets/header/material_header.dart @@ -71,7 +71,7 @@ class MaterialHeader extends StatelessWidget implements PreferredSizeWidget { final contact = handle.contact; if (contact == null) { await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'addressType': handle.address.isEmail ? 'email' : 'phone'}); + {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { await mcs.invokeMethod("view-contact-form", {'id': contact.id}); } diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart index 438b0a625..b7e3e21f9 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart @@ -677,7 +677,7 @@ class _MessagePopupState extends OptimizedState with SingleTickerP void openLink() { String? url = part.url; - mcs.invokeMethod("open-link", {"link": url ?? part.text, "forceBrowser": true}); + mcs.invokeMethod("open-browser", {"link": url ?? part.text}); popDetails(); } @@ -881,8 +881,7 @@ class _MessagePopupState extends OptimizedState with SingleTickerP void createContact() async { popDetails(); - await mcs - .invokeMethod("open-contact-form", {'address': message.handle!.address, 'addressType': message.handle!.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': message.handle!.address, 'address_type': message.handle!.address.isEmail ? 'email' : 'phone'}); } void showThread() { diff --git a/lib/app/layouts/settings/pages/theming/advanced/advanced_theming_content.dart b/lib/app/layouts/settings/pages/theming/advanced/advanced_theming_content.dart index ed91b0312..98b152321 100644 --- a/lib/app/layouts/settings/pages/theming/advanced/advanced_theming_content.dart +++ b/lib/app/layouts/settings/pages/theming/advanced/advanced_theming_content.dart @@ -176,9 +176,9 @@ class _AdvancedThemingContentState extends OptimizedState buildMessageSpans(BuildContext context, MessagePart part, Messa final handle = cm.activeChat!.chat.participants.firstWhereOrNull((e) => e.address == part.mentions[i].mentionedAddress); if (handle?.contact == null && handle != null) { await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'addressType': handle.address.isEmail ? 'email' : 'phone'}); + {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else if (handle?.contact != null) { await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); } @@ -170,7 +170,7 @@ Future> buildEnrichedMessageSpans(BuildContext context, Message final handle = cm.activeChat!.chat.participants.firstWhereOrNull((e) => e.address == data!.first); if (handle?.contact == null && handle != null) { await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'addressType': handle.address.isEmail ? 'email' : 'phone'}); + {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else if (handle?.contact != null) { await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); } diff --git a/lib/models/io/chat.dart b/lib/models/io/chat.dart index 8e98d9d47..04c5eb70a 100644 --- a/lib/models/io/chat.dart +++ b/lib/models/io/chat.dart @@ -651,7 +651,7 @@ class Chat { try { if (clearLocalNotifications && !hasUnread && !ls.isBubble) { - mcs.invokeMethod("clear-chat-notifs", {"chatGuid": guid}); + mcs.invokeMethod("delete-notification", {"notification_id": id}); } if (privateMark && ss.settings.enablePrivateAPI.value && (autoSendReadReceipts ?? ss.settings.privateMarkChatAsRead.value)) { if (!hasUnread) { diff --git a/lib/services/backend/java_dart_interop/background_isolate.dart b/lib/services/backend/java_dart_interop/background_isolate.dart index 0f33a9d86..0d3902446 100644 --- a/lib/services/backend/java_dart_interop/background_isolate.dart +++ b/lib/services/backend/java_dart_interop/background_isolate.dart @@ -10,7 +10,7 @@ import 'package:universal_io/io.dart'; class BackgroundIsolate { static void initialize() { CallbackHandle callbackHandle = PluginUtilities.getCallbackHandle(backgroundIsolateEntrypoint)!; - mcs.invokeMethod("initialize-background-handle", {"handle": callbackHandle.toRawHandle()}); + ss.prefs.setInt("backgroundCallbackHandle", callbackHandle.toRawHandle()); } } diff --git a/lib/services/backend/java_dart_interop/intents_service.dart b/lib/services/backend/java_dart_interop/intents_service.dart index 7d65f7430..e69a243af 100644 --- a/lib/services/backend/java_dart_interop/intents_service.dart +++ b/lib/services/backend/java_dart_interop/intents_service.dart @@ -58,7 +58,7 @@ class IntentsService extends GetxService { if (data is List) { for (String? s in data) { if (s == null) continue; - final path = await mcs.invokeMethod("get-content-path", {"uri": s}); + final path = await mcs.invokeMethod("get-content-uri-path", {"uri": s}); final bytes = await File(path).readAsBytes(); files.add(PlatformFile( path: path, @@ -68,7 +68,7 @@ class IntentsService extends GetxService { )); } } else if (data != null) { - final path = await mcs.invokeMethod("get-content-path", {"uri": data}); + final path = await mcs.invokeMethod("get-content-uri-path", {"uri": data}); final bytes = await File(path).readAsBytes(); files.add(PlatformFile( path: path, diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 192cc7242..c26e64401 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -19,8 +19,6 @@ class MethodChannelService extends GetxService { // music theme bool isRunning = false; Color? previousPrimary; - Color? previousLightBg; - Color? previousDarkBg; Future init({bool headless = false}) async { if (kIsWeb || kIsDesktop) return; @@ -36,7 +34,7 @@ class MethodChannelService extends GetxService { if (!kIsWeb && !kIsDesktop && !headless) { try { if (ss.settings.colorsFromMedia.value) { - await mcs.invokeMethod("start-notif-listener"); + await mcs.invokeMethod("start-notification-listener"); } if (!ls.isBubble) { BackgroundIsolate.initialize(); @@ -46,12 +44,12 @@ class MethodChannelService extends GetxService { } } - Future _callHandler(MethodCall call) async { + Future _callHandler(MethodCall call) async { switch (call.method) { - case "new-server": + case "NewServerUrl": await storeStartup.future; // remove brackets from URL - String address = call.arguments.toString().replaceAll("[", "").replaceAll("]", ""); + String address = call.arguments["server_url"]; String sanitized = sanitizeServerAddress(address: address)!; if (sanitized != ss.settings.serverAddress.value) { ss.settings.serverAddress.value = sanitizeServerAddress(address: address)!; @@ -122,18 +120,18 @@ class MethodChannelService extends GetxService { notif.createFailedToSend(chat, scheduled: true); } return true; - case "reply": + case "ReplyChat": await storeStartup.future; Logger.info("Received reply to message from FCM"); final data = call.arguments as Map?; - if (data == null) return; + if (data == null) return false; // check and make sure that we aren't sending a duplicate reply final recentReplyGuid = ss.prefs.getString("recent-reply")?.split("/").first; final recentReplyText = ss.prefs.getString("recent-reply")?.split("/").last; - if (recentReplyGuid == data["guid"] && recentReplyText == data["text"]) return; - await ss.prefs.setString("recent-reply", "${data["guid"]}/${data["text"]}"); + if (recentReplyGuid == data["messageGuid"] && recentReplyText == data["text"]) return false; + await ss.prefs.setString("recent-reply", "${data["messageGuid"]}/${data["text"]}"); Logger.info("Updated recent reply cache to ${ss.prefs.getString("recent-reply")}"); - Chat? chat = Chat.findOne(guid: data["chat"]); + Chat? chat = Chat.findOne(guid: data["chatGuid"]); if (chat == null) { return false; } else { @@ -154,13 +152,13 @@ class MethodChannelService extends GetxService { await completer.future; return true; } - case "markAsRead": - if (ls.isAlive) return; + case "MarkChatRead": + if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received markAsRead from Java"); final data = call.arguments as Map?; if (data != null) { - Chat? chat = Chat.findOne(guid: data["chat"]); + Chat? chat = Chat.findOne(guid: data["chatGuid"]); if (chat != null) { chat.toggleHasUnread(false); return true; @@ -168,7 +166,7 @@ class MethodChannelService extends GetxService { } return false; case "chat-read-status-changed": - if (ls.isAlive) return; + if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received chat status change from FCM"); Map data = jsonDecode(call.arguments); @@ -179,18 +177,12 @@ class MethodChannelService extends GetxService { chat.toggleHasUnread(!data["read"]!, privateMark: false); return true; } - case "media-colors": + case "MediaColors": await storeStartup.future; if (!ss.settings.colorsFromMedia.value) return false; final Color primary = Color(call.arguments['primary']); - final Color lightBg = Color(call.arguments['lightBg']); - final Color darkBg = Color(call.arguments['darkBg']); - final double primaryPercent = call.arguments['primaryPercent']; - final double lightBgPercent = call.arguments['lightBgPercent']; - final double darkBgPercent = call.arguments['darkBgPercent']; - if (Get.context != null && - (!isRunning || primary != previousPrimary || lightBg != previousLightBg || darkBg != previousDarkBg)) { - ts.updateMusicTheme(Get.context!, primary, lightBg, darkBg, primaryPercent, lightBgPercent, darkBgPercent); + if (Get.context != null && (!isRunning || primary != previousPrimary)) { + ts.updateMusicTheme(Get.context!, primary); isRunning = false; } return true; @@ -201,7 +193,7 @@ class MethodChannelService extends GetxService { await ActionHandler().handleIncomingFaceTimeCallLegacy(data); return true; case "ft-call-status-changed": - if (ls.isAlive) return; + if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received facetime call status change from FCM"); Map data = jsonDecode(call.arguments); diff --git a/lib/services/backend/notifications/notifications_service.dart b/lib/services/backend/notifications/notifications_service.dart index 1e022bf9b..8ade606ed 100644 --- a/lib/services/backend/notifications/notifications_service.dart +++ b/lib/services/backend/notifications/notifications_service.dart @@ -136,16 +136,16 @@ class NotificationsService extends GetxService { } Future createNotificationChannel(String channelID, String channelName, String channelDescription) async { - await mcs.invokeMethod("create-notif-channel", { + await mcs.invokeMethod("create-notification-channel", { "channel_name": channelName, "channel_description": channelDescription, - "CHANNEL_ID": channelID, + "channel_id": channelID, }); } Future createReminder(Chat? chat, Message? message, DateTime time, {String? chatTitle, String? messageText}) async { await flnp.zonedSchedule( - Random().nextInt(9998) + 1, + Random().nextInt(9998) + 50000, chatTitle ?? 'Reminder: ${chat!.getTitle()}', messageText ?? (hideContent ? "iMessage" : MessageHelper.getNotificationText(message!)), TZDateTime.from(time, local), @@ -197,21 +197,19 @@ class NotificationsService extends GetxService { } else if (kIsDesktop) { _lock.synchronized(() async => await showDesktopNotif(message, text, chat, guid, title, contactName, isGroup, isReaction)); } else { - await mcs.invokeMethod("new-message-notification", { - "CHANNEL_ID": NEW_MESSAGE_CHANNEL, - "CHANNEL_NAME": "New Messages", - "notificationId": Random().nextInt(9998) + 1, - "summaryId": chat.id, - "chatGuid": guid, - "chatIsGroup": isGroup, - "chatTitle": title, - "chatIcon": isGroup ? chatIcon : contactIcon, - "contactName": contactName, - "contactAvatar": contactIcon, - "messageGuid": message.guid!, - "messageText": text, - "messageDate": message.dateCreated!.millisecondsSinceEpoch, - "messageIsFromMe": false, + await mcs.invokeMethod("create-incoming-message-notification", { + "channel_id": NEW_MESSAGE_CHANNEL, + "chat_id": chat.id, + "chat_guid": guid, + "chat_is_group": isGroup, + "chat_title": title, + "chat_icon": isGroup ? chatIcon : contactIcon, + "contact_name": contactName, + "contact_avatar": contactIcon, + "message_guid": message.guid!, + "message_text": text, + "message_date": message.dateCreated!.millisecondsSinceEpoch, + "message_is_from_me": false, }); } } @@ -233,14 +231,14 @@ class NotificationsService extends GetxService { _lock.synchronized(() async => await showPersistentDesktopFaceTimeNotif(callUuid, caller, chatIcon, isAudio)); } else { final numeric = callUuid?.numericOnly(); - await mcs.invokeMethod("incoming-facetime-notification", { - "CHANNEL_ID": FACETIME_CHANNEL, - "notificationId": numeric != null ? int.parse(numeric.substring(0, min(8, numeric.length))) : Random().nextInt(9998) + 1, + await mcs.invokeMethod("create-incoming-facetime-notification", { + "channel_id": FACETIME_CHANNEL, + "notification_id": numeric != null ? int.parse(numeric.substring(0, min(8, numeric.length))) : Random().nextInt(9998) + 1, "title": title, "body": text, - "avatar": chatIcon, + "caller_avatar": chatIcon, "caller": caller, - "callUuid": callUuid + "call_uuid": callUuid }); } } @@ -250,7 +248,7 @@ class NotificationsService extends GetxService { await clearDesktopFaceTimeNotif(callUuid); } else if (!kIsWeb) { final numeric = callUuid.numericOnly(); - mcs.invokeMethod("clear-chat-notifs", {"id": int.parse(numeric.substring(0, min(8, numeric.length)))}); + mcs.invokeMethod("delete-notification", {"notification_id": int.parse(numeric.substring(0, min(8, numeric.length)))}); } } @@ -690,7 +688,7 @@ class NotificationsService extends GetxService { return; } await flnp.show( - chat.id! * (scheduled ? -1 : 1), + (chat.id! + 75000) * (scheduled ? -1 : 1), title, subtitle, NotificationDetails( diff --git a/lib/services/network/firebase/cloud_messaging_service.dart b/lib/services/network/firebase/cloud_messaging_service.dart index 6f3467f14..b50ffd457 100644 --- a/lib/services/network/firebase/cloud_messaging_service.dart +++ b/lib/services/network/firebase/cloud_messaging_service.dart @@ -80,7 +80,7 @@ class CloudMessagingService extends GetxService { try { // First, try to auth with FCM with the current data Logger.info('Authenticating with FCM', tag: 'FCM-Auth'); - result = await mcs.invokeMethod('auth', ss.fcmData.toMap()); + result = await mcs.invokeMethod('firebase-auth', ss.fcmData.toMap()); } on PlatformException catch (ex) { Logger.error('Failed to perform initial FCM authentication: ${ex.toString()}', tag: 'FCM-Auth'); @@ -103,7 +103,7 @@ class CloudMessagingService extends GetxService { // Parse and save new FCM data, then retry auth with FCM FCMData fcmData = FCMData.fromMap(fcmMeta); ss.saveFCMData(fcmData); - result = await mcs.invokeMethod('auth', fcmData.toMap()); + result = await mcs.invokeMethod('firebase-auth', fcmData.toMap()); } on PlatformException catch (e) { // If we fail a second time, error out Logger.error("Failed to register with FCM: $e", tag: 'FCM-Auth'); diff --git a/lib/services/network/firebase/database_service.dart b/lib/services/network/firebase/database_service.dart index 7e204b4d7..e523fb2d5 100644 --- a/lib/services/network/firebase/database_service.dart +++ b/lib/services/network/firebase/database_service.dart @@ -93,7 +93,7 @@ class DatabaseService extends GetxService { } else { // First, try to auth with FCM with the current data Logger.info('Authenticating with FCM', tag: 'FCM-Auth'); - await mcs.invokeMethod('auth', ss.fcmData.toMap()); + await mcs.invokeMethod('firebase-auth', ss.fcmData.toMap()); url = sanitizeServerAddress(address: await mcs.invokeMethod("get-server-url")); } // Update the address of the copied settings diff --git a/lib/services/ui/chat/chats_service.dart b/lib/services/ui/chat/chats_service.dart index 2eb022ce5..f407387c0 100644 --- a/lib/services/ui/chat/chats_service.dart +++ b/lib/services/ui/chat/chats_service.dart @@ -177,7 +177,7 @@ class ChatsService extends GetxService { final _chats = chatBox.query(Chat_.hasUnreadMessage.equals(true)).build().find(); for (Chat c in _chats) { c.hasUnreadMessage = false; - mcs.invokeMethod("clear-chat-notifs", {"chatGuid": c.guid}); + mcs.invokeMethod("delete-notification", {"notification_id": c.id}); if (ss.settings.enablePrivateAPI.value && ss.settings.privateMarkChatAsRead.value) { http.markChatRead(c.guid); } diff --git a/lib/services/ui/theme/themes_service.dart b/lib/services/ui/theme/themes_service.dart index 16d0d5e85..44bf1bec9 100644 --- a/lib/services/ui/theme/themes_service.dart +++ b/lib/services/ui/theme/themes_service.dart @@ -195,103 +195,17 @@ class ThemesService extends GetxService { _loadTheme(context); } - void updateMusicTheme(BuildContext context, Color primary, Color lightBg, Color darkBg, double primaryPercent, double lightBgPercent, double darkBgPercent) async { + void updateMusicTheme(BuildContext context, Color primary) async { final darkTheme = ThemeStruct.getThemes().firstWhere((e) => e.name == "Music Theme 🌙"); final lightTheme = ThemeStruct.getThemes().firstWhere((e) => e.name == "Music Theme ☀"); - final engine.ColorScheme scheme = engine.DynamicColorScheme( - targetColors: const engine.TargetColors(), - primaryColor: engine.Srgb.fromColor(primary), - ); - final engine.MonetColors colors = scheme.asColors; + final lightScheme = ColorScheme.fromSeed(seedColor: primary, brightness: Brightness.light); + final darkScheme = ColorScheme.fromSeed(seedColor: primary, brightness: Brightness.dark); lightTheme.data = lightTheme.data.copyWith( - colorScheme: lightTheme.data.colorScheme.copyWith( - primary: colors.accent1.shade700, - onPrimary: colors.accent1.shade100, - primaryContainer: colors.accent1.shade100, - onPrimaryContainer: colors.accent1.shade900, - secondary: colors.accent2.shade600, - onSecondary: colors.accent2.shade50, - secondaryContainer: colors.accent2.shade100, - onSecondaryContainer: colors.accent2.shade900, - tertiary: colors.accent3.shade600, - onTertiary: colors.accent3.shade50, - tertiaryContainer: colors.accent3.shade100, - onTertiaryContainer: colors.accent3.shade900, - background: colors.neutral1.shade10, - onBackground: colors.neutral1.shade900, - surface: colors.neutral1.shade10, - onSurface: colors.neutral1.shade900, - surfaceVariant: colors.neutral2.shade100, - onSurfaceVariant: colors.neutral2.shade700, - outline: colors.neutral1.shade500, - shadow: colors.neutral1.shade1000, - inverseSurface: colors.neutral1.shade800, - onInverseSurface: colors.neutral1.shade50, - inversePrimary: colors.accent1.shade200, - ), + colorScheme: lightScheme ); darkTheme.data = darkTheme.data.copyWith( - colorScheme: darkTheme.data.colorScheme.copyWith( - primary: colors.accent1.shade800, - onPrimary: colors.accent1.shade200, - primaryContainer: colors.accent1.shade700, - onPrimaryContainer: colors.accent1.shade100, - secondary: colors.accent2.shade200, - onSecondary: colors.accent2.shade800, - secondaryContainer: colors.accent2.shade700, - onSecondaryContainer: colors.accent2.shade100, - tertiary: colors.accent3.shade200, - onTertiary: colors.accent3.shade800, - tertiaryContainer: colors.accent3.shade700, - onTertiaryContainer: colors.accent3.shade100, - background: colors.neutral1.shade900, - onBackground: colors.neutral1.shade100, - surface: colors.neutral1.shade900, - onSurface: colors.neutral1.shade100, - surfaceVariant: colors.neutral2.shade700, - onSurfaceVariant: colors.neutral2.shade200, - outline: colors.neutral1.shade400, - shadow: colors.neutral1.shade1000, - inverseSurface: colors.neutral1.shade100, - onInverseSurface: colors.neutral1.shade800, - inversePrimary: colors.accent1.shade600, - ), + colorScheme: darkScheme ); - if (inDarkMode(context)) { - if (primaryPercent != 0.5 && darkBgPercent != 0.5) { - double difference = min((primaryPercent / (primaryPercent + darkBgPercent)), 1 - (primaryPercent / (primaryPercent + darkBgPercent))); - Tween color1 = Tween(begin: 0, end: difference); - Tween color2 = Tween(begin: 1 - difference, end: 1); - gradientTween.value = MovieTween() - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color1", color1) - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color2", color2); - } else { - gradientTween.value = MovieTween() - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color1", Tween(begin: 0, end: 0.2)) - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color2", Tween(begin: 0.8, end: 1)); - } - } else { - if (primaryPercent != 0.5 && lightBgPercent != 0.5) { - double difference = min((primaryPercent / (primaryPercent + lightBgPercent)), 1 - (primaryPercent / (primaryPercent + lightBgPercent))); - Tween color1 = Tween(begin: 0.0, end: difference); - Tween color2 = Tween(begin: 1.0 - difference, end: 1.0); - gradientTween.value = MovieTween() - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color1", color1) - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color2", color2); - } else { - gradientTween.value = MovieTween() - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color1", Tween(begin: 0, end: 0.2)) - ..scene(begin: Duration.zero, duration: const Duration(seconds: 3)) - .tween("color2", Tween(begin: 0.8, end: 1)); - } - } changeTheme(Get.context!, light: lightTheme, dark: darkTheme); } From c67c49afd2bd16fdc97b6401bda1b89934cc7e57 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sun, 21 Jan 2024 17:38:33 -0500 Subject: [PATCH 018/118] Use Dart APIs to save file on Android --- lib/services/network/downloads_service.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/services/network/downloads_service.dart b/lib/services/network/downloads_service.dart index 134835bce..5f87bcc20 100644 --- a/lib/services/network/downloads_service.dart +++ b/lib/services/network/downloads_service.dart @@ -120,10 +120,8 @@ class AttachmentDownloadController extends GetxController { bytes = response.data; } if (!kIsWeb && !kIsDesktop) { - await mcs.invokeMethod("download-file", { - "data": bytes, - "path": attachment.path, - }); + File _file = await File(attachment.path).create(recursive: true); + await _file.writeAsBytes(bytes); } attachment.webUrl = response.requestOptions.path; Logger.info("Finished fetching attachment"); From b12e2529ea0ddebc808bc4441d029c45e58f77be Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sun, 21 Jan 2024 17:39:26 -0500 Subject: [PATCH 019/118] Fix bubble detection to use Boolean type --- lib/services/backend/java_dart_interop/intents_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/backend/java_dart_interop/intents_service.dart b/lib/services/backend/java_dart_interop/intents_service.dart index e69a243af..7c4d1b8f3 100644 --- a/lib/services/backend/java_dart_interop/intents_service.dart +++ b/lib/services/backend/java_dart_interop/intents_service.dart @@ -97,7 +97,7 @@ class IntentsService extends GetxService { } } else if (intent.extra?["chatGuid"] != null) { final guid = intent.extra!["chatGuid"]!; - final bubble = intent.extra!["bubble"] == "true"; + final bubble = intent.extra!["bubble"] == true; ls.isBubble = bubble; await openChat(guid); } else if (intent.extra?["callUuid"] != null) { From 542acf0a3c44a96f1c73c9590ace42eabae2d707 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sun, 21 Jan 2024 17:54:06 -0500 Subject: [PATCH 020/118] Fix bubble intent sending wrong Boolean --- .../services/notifications/CreateIncomingMessageNotification.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt index 18914ae9d..324f654ed 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt @@ -148,7 +148,7 @@ class CreateIncomingMessageNotification: MethodCallHandlerImpl() { Intent(context, BubbleActivity::class.java) .putExtras(extras) .putExtra("notificationId", notificationId) - .putExtra("bubble", false) + .putExtra("bubble", true) .setType("OpenChat"), PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT ) From f3a4ece1be6afd593dbf3ea67227d45f560df25d Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sun, 21 Jan 2024 17:54:24 -0500 Subject: [PATCH 021/118] Re-add FCM support --- android/app/src/main/AndroidManifest.xml | 9 +-- .../backend_ui_interop/DartWorkManager.kt | 12 +++- .../services/backend_ui_interop/DartWorker.kt | 35 ++++++++--- .../backend_ui_interop/MethodCallHandler.kt | 5 +- .../BlueBubblesFirebaseMessagingService.kt | 44 +++++++++++++ .../services/firebase/FirebaseAuthHandler.kt | 8 +++ .../method_channel_service.dart | 63 ++++++++++--------- 7 files changed, 123 insertions(+), 53 deletions(-) create mode 100644 android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3a7984c8b..6c654e29e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -92,8 +92,8 @@ android:resource="@xml/filepaths" /> - - diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt index 65d47535c..fb3a799a0 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt @@ -9,6 +9,9 @@ import androidx.work.OutOfQuotaPolicy import androidx.work.WorkInfo import androidx.work.WorkManager import com.bluebubbles.messaging.Constants +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch object DartWorkManager { fun createWorker(context: Context, method: String, arguments: HashMap, callback: () -> (Unit)) { @@ -28,9 +31,14 @@ object DartWorkManager { if (workInfo.state.isFinished) { Log.d(Constants.logTag, "Running callback after worker with method $method completed") callback() - WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).removeObserver(observer) + CoroutineScope(Dispatchers.Main).launch { + WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).removeObserver(observer) + } } } - WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).observeForever(observer) + // Cannot observe unless running on main thread + CoroutineScope(Dispatchers.Main).launch { + WorkManager.getInstance(context).getWorkInfoByIdLiveData(work.id).observeForever(observer) + } } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt index df253a615..af365c307 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -12,10 +12,15 @@ import com.google.common.util.concurrent.ListenableFuture import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.loader.ApplicationInfoLoader -import io.flutter.embedding.engine.loader.FlutterLoader +import io.flutter.view.FlutterMain; import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation import kotlinx.coroutines.runBlocking +import java.util.Timer +import kotlin.concurrent.schedule +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWorker(context, workerParams) { @@ -60,12 +65,16 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo /// Code idea taken from https://github.com/flutter/flutter/wiki/Experimental:-Reuse-FlutterEngine-across-screens private fun initNewEngine() { Log.d(Constants.logTag, "Ensuring Flutter is initialized before creating engine") - FlutterLoader().startInitialization(applicationContext) - FlutterLoader().ensureInitializationComplete(applicationContext.applicationContext, null) + FlutterMain.startInitialization(applicationContext) + FlutterMain.ensureInitializationComplete(applicationContext, null) Log.d(Constants.logTag, "Loading callback info") - val info = ApplicationInfoLoader.load(applicationContext.applicationContext) + val info = ApplicationInfoLoader.load(applicationContext) workerEngine = FlutterEngine(applicationContext) + // set up the method channel to receive events from Dart + MethodChannel(workerEngine!!.dartExecutor.binaryMessenger, Constants.methodChannel).setMethodCallHandler { + call, result -> MethodCallHandler().methodCallHandler(call, result, applicationContext) + } val callbackInfo = FlutterCallbackInformation.lookupCallbackInformation(applicationContext.getSharedPreferences("FlutterSharedPreferences", 0).getLong("flutter.backgroundCallbackHandle", -1)) val callback = DartExecutor.DartCallback(applicationContext.assets, info.flutterAssetsDir, callbackInfo) @@ -74,12 +83,18 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo } private fun closeEngineIfNeeded() { - val currentWork = WorkManager.getInstance(applicationContext).getWorkInfosByTag(Constants.dartWorkerTag).get().filter { element -> !element.state.isFinished } - Log.d(Constants.logTag, "${currentWork.size} worker(s) still queued") - if (currentWork.size <= 1 && workerEngine != null) { - Log.d(Constants.logTag, "Closing ${Constants.dartWorkerTag} engine") - workerEngine?.destroy() - workerEngine = null + // Delay 5 seconds so Dart has a chance to complete everything and in case new work comes in shortly after + Timer().schedule(5000) { + val currentWork = WorkManager.getInstance(applicationContext).getWorkInfosByTag(Constants.dartWorkerTag).get().filter { element -> !element.state.isFinished } + Log.d(Constants.logTag, "${currentWork.size} worker(s) still queued") + if (currentWork.size == 0 && workerEngine != null) { + Log.d(Constants.logTag, "Closing ${Constants.dartWorkerTag} engine") + // This must be run on main thread + CoroutineScope(Dispatchers.Main).launch { + workerEngine?.destroy() + } + workerEngine = null + } } } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt index 551926a89..e633dc7e0 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt @@ -2,9 +2,6 @@ package com.bluebubbles.messaging.services.backend_ui_interop import android.content.Context import android.util.Log -import androidx.activity.result.ActivityResultLauncher -import androidx.activity.result.ActivityResultRegistry -import androidx.activity.result.contract.ActivityResultContracts import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.MainActivity.Companion.engine import com.bluebubbles.messaging.services.filesystem.GetContentUriPathHandler @@ -28,7 +25,7 @@ import com.bluebubbles.messaging.services.system.StartGoogleDuoRequestHandler import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -class MethodCallHandler() { +class MethodCallHandler { companion object { var getNotificationListenerResult: MethodChannel.Result? = null diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt new file mode 100644 index 000000000..8ddf6a821 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt @@ -0,0 +1,44 @@ +package com.bluebubbles.messaging.services.firebase + +import android.content.Intent +import android.util.Log +import androidx.core.os.bundleOf +import com.bluebubbles.messaging.Constants +import com.bluebubbles.messaging.services.backend_ui_interop.DartWorkManager +import com.bluebubbles.messaging.utils.Utils +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import io.flutter.plugin.common.MethodChannel + +class BlueBubblesFirebaseMessagingService: FirebaseMessagingService() { + override fun onCreate() { + super.onCreate() + Log.d(Constants.logTag, "FCM service created") + } + + override fun onMessageReceived(message: RemoteMessage) { + super.onMessageReceived(message) + val type = message.data["type"] ?: return + Log.d(Constants.logTag, "Received new message of type $type from FCM...") + DartWorkManager.createWorker(applicationContext, type, HashMap(message.data)) {} + + // check if the user configured "Send Events to Tasker" + val prefs = applicationContext.getSharedPreferences("FlutterSharedPreferences", 0) + if (prefs.getBoolean("flutter.sendEventsToTasker", false)) { + Utils.getServerUrl(applicationContext, prefs.getString("flutter.guidAuthKey", "")!!, object : MethodChannel.Result { + override fun success(result: Any?) { + Log.d(Constants.logTag, "Got URL: $result - sending to Tasker...") + val intent = Intent() + intent.setAction("net.dinglisch.android.taskerm.BB_SERVER_URL") + intent.putExtra("url", result.toString()) + intent.putExtra("event", type) + intent.putExtras(bundleOf(*message.data.toList().toTypedArray())) + applicationContext.sendBroadcast(intent) + } + + override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {} + override fun notImplemented() {} + }) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt index e701591c8..097a83c92 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt @@ -4,6 +4,8 @@ import android.content.Context import android.util.Log import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.models.MethodCallHandlerImpl +import com.google.android.gms.common.ConnectionResult +import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.tasks.Task import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseOptions @@ -30,6 +32,12 @@ class FirebaseAuthHandler: MethodCallHandlerImpl() { ) { // Don't auth multiple times if (firebaseApp != null) result.success(null) + if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) != ConnectionResult.SUCCESS) { + val error = "Google Play Services is not available!" + Log.e(Constants.logTag, error) + result.error("500", error, null) + return + } val projectId: String? = call.argument("project_id") val storageBucket: String? = call.argument("storage_bucket") diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index c26e64401..97033c9c1 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -26,11 +26,6 @@ class MethodChannelService extends GetxService { background = headless; channel = const MethodChannel('com.bluebubbles.messaging'); channel.setMethodCallHandler(_callHandler); - if (!kIsWeb && !kIsDesktop && headless) { - try { - await channel.invokeMethod('MessagingBackground#initialized'); - } catch (_) {} - } if (!kIsWeb && !kIsDesktop && !headless) { try { if (ss.settings.colorsFromMedia.value) { @@ -63,28 +58,28 @@ class MethodChannelService extends GetxService { case "new-message": await storeStartup.future; Logger.info("Received new message from FCM"); - Map? data = jsonDecode(call.arguments); + Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final item = IncomingItem.fromMap(QueueType.newMessage, payload.data); if (ls.isAlive) { - inq.queue(item); + await inq.queue(item); } else { - ah.handleNewMessage(item.chat, item.message, item.tempGuid); + await ah.handleNewMessage(item.chat, item.message, item.tempGuid); } } return true; case "updated-message": await storeStartup.future; Logger.info("Received updated message from FCM"); - Map? data = jsonDecode(call.arguments); + Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); if (ls.isAlive) { - inq.queue(item); + await inq.queue(item); } else { - ah.handleUpdatedMessage(item.chat, item.message, item.tempGuid); + await ah.handleUpdatedMessage(item.chat, item.message, item.tempGuid); } } return true; @@ -94,35 +89,35 @@ class MethodChannelService extends GetxService { case "participant-left": await storeStartup.future; Logger.info("Received ${call.method} from FCM"); - Map? data = jsonDecode(call.arguments); + Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { final item = IncomingItem.fromMap(QueueType.updatedMessage, data!); - ah.handleNewOrUpdatedChat(item.chat); + await ah.handleNewOrUpdatedChat(item.chat); } return true; case "group-icon-changed": await storeStartup.future; Logger.info("Received group icon change from FCM"); - Map? data = jsonDecode(call.arguments); + Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { final guid = data!["chats"].first["guid"]; final chat = Chat.findOne(guid: guid); if (chat != null) { - Chat.getIcon(chat); + await Chat.getIcon(chat); } } return true; case "scheduled-message-error": Logger.info("Received scheduled message error from FCM"); - Map data = jsonDecode(call.arguments) ?? {}; + Map data = call.arguments?.cast() ?? {}; Chat? chat = Chat.findOne(guid: data["payload"]["chatGuid"]); if (chat != null) { - notif.createFailedToSend(chat, scheduled: true); + await notif.createFailedToSend(chat, scheduled: true); } return true; case "ReplyChat": await storeStartup.future; - Logger.info("Received reply to message from FCM"); + Logger.info("Received reply to message from Kotlin"); final data = call.arguments as Map?; if (data == null) return false; // check and make sure that we aren't sending a duplicate reply @@ -155,7 +150,7 @@ class MethodChannelService extends GetxService { case "MarkChatRead": if (ls.isAlive) return true; await storeStartup.future; - Logger.info("Received markAsRead from Java"); + Logger.info("Received markAsRead from Kotlin"); final data = call.arguments as Map?; if (data != null) { Chat? chat = Chat.findOne(guid: data["chatGuid"]); @@ -169,13 +164,17 @@ class MethodChannelService extends GetxService { if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received chat status change from FCM"); - Map data = jsonDecode(call.arguments); - Chat? chat = Chat.findOne(guid: data["chatGuid"]); - if (chat == null || (data["read"] != true && data["read"] != false)) { - return false; + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + Chat? chat = Chat.findOne(guid: data!["chatGuid"]); + if (chat == null || (data["read"] != true && data["read"] != false)) { + return false; + } else { + chat.toggleHasUnread(!data["read"]!, privateMark: false); + return true; + } } else { - chat.toggleHasUnread(!data["read"]!, privateMark: false); - return true; + return false; } case "MediaColors": await storeStartup.future; @@ -189,15 +188,19 @@ class MethodChannelService extends GetxService { case "incoming-facetime": await storeStartup.future; Logger.info("Received legacy incoming facetime from FCM"); - Map data = jsonDecode(call.arguments.toString().replaceAll('\\"', '<').replaceAll('"', '').replaceAll('<', '"')); - await ActionHandler().handleIncomingFaceTimeCallLegacy(data); + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + await ActionHandler().handleIncomingFaceTimeCallLegacy(data!); + } return true; case "ft-call-status-changed": if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received facetime call status change from FCM"); - Map data = jsonDecode(call.arguments); - await ActionHandler().handleFaceTimeStatusChange(data); + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + await ActionHandler().handleFaceTimeStatusChange(data!); + } return true; case "answer-facetime": Logger.info("Answering FaceTime call"); @@ -210,7 +213,7 @@ class MethodChannelService extends GetxService { Future invokeMethod(String method, [dynamic arguments]) async { if (kIsWeb || kIsDesktop) return; - + Logger.info("Sending method $method to Kotlin"); return await channel.invokeMethod(method, arguments); } } \ No newline at end of file From f307e14838f1aa8e13add8f84ba558d974f0c79e Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 10:10:53 -0500 Subject: [PATCH 022/118] Launch coordinates from FindMy instead of address --- lib/app/layouts/findmy/findmy_page.dart | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index e7d95a8ba..95ed7059d 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -335,10 +335,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi backgroundColor: context.theme.colorScheme.primaryContainer, ), onPressed: () async { - if ((item.address?.label ?? item.address?.mapItemFullAddress) == null) { - return showSnackbar("Error", "Could not find an address to launch!"); - } - await MapsLauncher.launchQuery((item.address?.label ?? item.address?.mapItemFullAddress)!); + await MapsLauncher.launchCoordinates(item.location!.latitude!, item.location!.longitude!); }, child: const Icon( Icons.directions, @@ -415,10 +412,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi backgroundColor: context.theme.colorScheme.primaryContainer, ), onPressed: () async { - if ((item.address?.label ?? item.address?.mapItemFullAddress) == null) { - return showSnackbar("Error", "Could not find an address to launch!"); - } - await MapsLauncher.launchQuery((item.address?.label ?? item.address?.mapItemFullAddress)!); + await MapsLauncher.launchCoordinates(item.location!.latitude!, item.location!.longitude!); }, child: const Icon( Icons.directions, @@ -603,7 +597,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi leading: ContactAvatarWidget(handle: item.handle), title: Text(item.handle?.displayName ?? item.title ?? "Unknown Friend"), subtitle: Text(item.longAddress ?? "No location found"), - trailing: ButtonTheme( + trailing: item.latitude != null && item.longitude != null ? ButtonTheme( minWidth: 1, child: TextButton( style: TextButton.styleFrom( @@ -611,17 +605,14 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi backgroundColor: context.theme.colorScheme.primaryContainer, ), onPressed: () async { - if (item.longAddress == null) { - return showSnackbar("Error", "Could not find an address to launch!"); - } - await MapsLauncher.launchQuery(item.longAddress!); + await MapsLauncher.launchCoordinates(item.latitude!, item.longitude!); }, child: const Icon( Icons.directions, size: 20 ), ), - ), + ) : null, onTap: () async { if (context.isPhone) { await panelController.close(); From bd5182aad3c424b76a3a6dee2dea724d3d194102 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 12:32:54 -0500 Subject: [PATCH 023/118] Change music theme to generate palette directly from album art --- .../notifications/NotificationListener.kt | 22 +++++++++---------- .../settings/pages/theming/theming_panel.dart | 2 +- .../method_channel_service.dart | 8 +++---- lib/services/ui/theme/themes_service.dart | 6 ++--- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt index c9eddcb1c..377188444 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationListener.kt @@ -2,19 +2,21 @@ package com.bluebubbles.messaging.services.notifications import android.content.ComponentName import android.content.Context +import android.graphics.Bitmap import android.media.MediaMetadata import android.media.session.MediaController import android.media.session.MediaSessionManager import android.service.notification.NotificationListenerService import android.util.Log -import androidx.palette.graphics.Palette import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler +import java.io.ByteArrayOutputStream + /// Class used to listen for media notifications and fetch album art to update app theming class NotificationListener: NotificationListenerService() { companion object { - private var hasInit: Boolean = false; + private var hasInit: Boolean = false fun init(context: Context) { if (hasInit) return @@ -22,7 +24,7 @@ class NotificationListener: NotificationListenerService() { val sessionListener = MediaSessionListener() sessionListener.init(context) manager.addOnActiveSessionsChangedListener(sessionListener, ComponentName(context, this::class.java)) - hasInit = true; + hasInit = true } } } @@ -65,14 +67,12 @@ class MediaControllerCallback: MediaController.Callback() { val albumArt = metadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART) if (art != null || albumArt != null) { - Log.d(Constants.logTag, "Fetching palette for new media") - Palette.from((art ?: albumArt)!!).generate {palette -> - val vibrant = palette?.vibrantSwatch?.rgb; - if (vibrant != null) { - Log.d(Constants.logTag, "Sending primary color to Dart") - MethodCallHandler.invokeMethod("MediaColors", hashMapOf("primary" to vibrant)) - } - } + Log.d(Constants.logTag, "Sending album art to Dart") + val stream = ByteArrayOutputStream() + (art ?: albumArt)!!.compress(Bitmap.CompressFormat.PNG, 100, stream) + val byteArray = stream.toByteArray() + MethodCallHandler.invokeMethod("MediaColors", hashMapOf("albumArt" to byteArray)) + stream.flush() } } } \ No newline at end of file diff --git a/lib/app/layouts/settings/pages/theming/theming_panel.dart b/lib/app/layouts/settings/pages/theming/theming_panel.dart index d29dc000d..abca8f5ea 100644 --- a/lib/app/layouts/settings/pages/theming/theming_panel.dart +++ b/lib/app/layouts/settings/pages/theming/theming_panel.dart @@ -402,7 +402,7 @@ class _ThemingPanelState extends CustomState SettingsSwitch( onChanged: (bool val) async { - await mcs.invokeMethod("request-notif-permission"); + await mcs.invokeMethod("request-notification-listener-permission"); if (val) { try { await mcs.invokeMethod("start-notification-listener"); diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 97033c9c1..bf242b69b 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -18,7 +18,7 @@ class MethodChannelService extends GetxService { // music theme bool isRunning = false; - Color? previousPrimary; + Uint8List? previousArt; Future init({bool headless = false}) async { if (kIsWeb || kIsDesktop) return; @@ -179,9 +179,9 @@ class MethodChannelService extends GetxService { case "MediaColors": await storeStartup.future; if (!ss.settings.colorsFromMedia.value) return false; - final Color primary = Color(call.arguments['primary']); - if (Get.context != null && (!isRunning || primary != previousPrimary)) { - ts.updateMusicTheme(Get.context!, primary); + final Uint8List art = call.arguments["albumArt"]; + if (Get.context != null && (!isRunning || art != previousArt)) { + ts.updateMusicTheme(Get.context!, art); isRunning = false; } return true; diff --git a/lib/services/ui/theme/themes_service.dart b/lib/services/ui/theme/themes_service.dart index 44bf1bec9..147f65357 100644 --- a/lib/services/ui/theme/themes_service.dart +++ b/lib/services/ui/theme/themes_service.dart @@ -195,11 +195,11 @@ class ThemesService extends GetxService { _loadTheme(context); } - void updateMusicTheme(BuildContext context, Color primary) async { + void updateMusicTheme(BuildContext context, Uint8List art) async { final darkTheme = ThemeStruct.getThemes().firstWhere((e) => e.name == "Music Theme 🌙"); final lightTheme = ThemeStruct.getThemes().firstWhere((e) => e.name == "Music Theme ☀"); - final lightScheme = ColorScheme.fromSeed(seedColor: primary, brightness: Brightness.light); - final darkScheme = ColorScheme.fromSeed(seedColor: primary, brightness: Brightness.dark); + final lightScheme = await ColorScheme.fromImageProvider(provider: MemoryImage(art), brightness: Brightness.light); + final darkScheme = await ColorScheme.fromImageProvider(provider: MemoryImage(art), brightness: Brightness.dark); lightTheme.data = lightTheme.data.copyWith( colorScheme: lightScheme ); From 5c3901e42c5c5cea9d74fdbad1922178066b4fd3 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 13:18:19 -0500 Subject: [PATCH 024/118] Improve error handling for method channel requests --- .../com/bluebubbles/messaging/MainActivity.kt | 3 ++- .../dialogs/address_picker.dart | 6 +++++- .../widgets/chat_info.dart | 9 ++++++--- .../widgets/contact_tile.dart | 9 ++++++--- .../widgets/header/material_header.dart | 9 ++++++--- .../pages/server/server_management_panel.dart | 19 ++++++++++++------- .../advanced/advanced_theming_content.dart | 3 +-- .../settings/pages/theming/theming_panel.dart | 5 ++--- lib/helpers/ui/message_widget_helpers.dart | 18 ++++++++++++------ .../firebase/cloud_messaging_service.dart | 2 ++ 10 files changed, 54 insertions(+), 29 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt index 1f7c57aa1..1d1bb7920 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/MainActivity.kt @@ -1,5 +1,6 @@ package com.bluebubbles.messaging +import android.app.Activity import android.content.Intent import androidx.activity.ComponentActivity import com.bluebubbles.messaging.services.backend_ui_interop.MethodCallHandler @@ -28,7 +29,7 @@ class MainActivity : FlutterFragmentActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == Constants.notificationListenerRequestCode) { - MethodCallHandler.getNotificationListenerResult?.success(null) + MethodCallHandler.getNotificationListenerResult?.success(resultCode == Activity.RESULT_OK) } } } \ No newline at end of file diff --git a/lib/app/layouts/conversation_details/dialogs/address_picker.dart b/lib/app/layouts/conversation_details/dialogs/address_picker.dart index 79f8e269b..056ad6fbd 100644 --- a/lib/app/layouts/conversation_details/dialogs/address_picker.dart +++ b/lib/app/layouts/conversation_details/dialogs/address_picker.dart @@ -11,7 +11,11 @@ void launchIntent(bool video, String address) async { launchUrl(Uri(scheme: "mailto", path: address)); } else if (await Permission.phone.request().isGranted) { if (video) { - await mcs.invokeMethod("google-duo", {"number": address}); + try { + await mcs.invokeMethod("google-duo", {"number": address}); + } catch (_) { + showSnackbar("Error", "Something went wrong, Google Duo may not be installed!"); + } } else { launchUrl(Uri(scheme: "tel", path: address)); } diff --git a/lib/app/layouts/conversation_details/widgets/chat_info.dart b/lib/app/layouts/conversation_details/widgets/chat_info.dart index 019a75c86..24af05d78 100644 --- a/lib/app/layouts/conversation_details/widgets/chat_info.dart +++ b/lib/app/layouts/conversation_details/widgets/chat_info.dart @@ -448,10 +448,13 @@ class _ChatInfoState extends OptimizedState { final contact = chat.participants.first.contact; final handle = chat.participants.first; if (contact == null) { - await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { - await mcs.invokeMethod("view-contact-form", {'id': contact.id}); + try { + await mcs.invokeMethod("view-contact-form", {'id': contact.id}); + } catch (_) { + showSnackbar("Error", "Failed to find contact on device!"); + } } }, borderRadius: BorderRadius.circular(15), diff --git a/lib/app/layouts/conversation_details/widgets/contact_tile.dart b/lib/app/layouts/conversation_details/widgets/contact_tile.dart index 24e0e6237..cc5568d9c 100644 --- a/lib/app/layouts/conversation_details/widgets/contact_tile.dart +++ b/lib/app/layouts/conversation_details/widgets/contact_tile.dart @@ -41,10 +41,13 @@ class ContactTile extends StatelessWidget { }, onTap: () async { if (contact == null) { - await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { - await mcs.invokeMethod("view-contact-form", {'id': contact!.id}); + try { + await mcs.invokeMethod("view-contact-form", {'id': contact!.id}); + } catch (_) { + showSnackbar("Error", "Failed to find contact on device!"); + } } }, child: ListTile( diff --git a/lib/app/layouts/conversation_view/widgets/header/material_header.dart b/lib/app/layouts/conversation_view/widgets/header/material_header.dart index 195368368..cd5e6beb1 100644 --- a/lib/app/layouts/conversation_view/widgets/header/material_header.dart +++ b/lib/app/layouts/conversation_view/widgets/header/material_header.dart @@ -70,10 +70,13 @@ class MaterialHeader extends StatelessWidget implements PreferredSizeWidget { final handle = controller.chat.participants.first; final contact = handle.contact; if (contact == null) { - await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else { - await mcs.invokeMethod("view-contact-form", {'id': contact.id}); + try { + await mcs.invokeMethod("view-contact-form", {'id': contact.id}); + } catch (_) { + showSnackbar("Error", "Failed to find contact on device!"); + } } }, child: Padding( diff --git a/lib/app/layouts/settings/pages/server/server_management_panel.dart b/lib/app/layouts/settings/pages/server/server_management_panel.dart index 8ee860617..09c79033d 100644 --- a/lib/app/layouts/settings/pages/server/server_management_panel.dart +++ b/lib/app/layouts/settings/pages/server/server_management_panel.dart @@ -6,6 +6,7 @@ import 'package:bluebubbles/app/layouts/settings/dialogs/custom_headers_dialog.d import 'package:bluebubbles/app/layouts/settings/pages/server/oauth_panel.dart'; import 'package:bluebubbles/app/wrappers/theme_switcher.dart'; import 'package:bluebubbles/main.dart'; +import 'package:bluebubbles/utils/logger.dart'; import 'package:bluebubbles/utils/share.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/app/layouts/settings/dialogs/sync_dialog.dart'; @@ -919,28 +920,32 @@ class _ServerManagementPanelState extends CustomState SettingsSwitch( + Obx(() => SettingsSwitch( onChanged: (bool val) async { - await mcs.invokeMethod("request-notification-listener-permission"); if (val) { + await mcs.invokeMethod("request-notification-listener-permission"); try { await mcs.invokeMethod("start-notification-listener"); // disable monet theming if music theme enabled diff --git a/lib/helpers/ui/message_widget_helpers.dart b/lib/helpers/ui/message_widget_helpers.dart index 40a41fb19..9bb8c91ea 100644 --- a/lib/helpers/ui/message_widget_helpers.dart +++ b/lib/helpers/ui/message_widget_helpers.dart @@ -46,10 +46,13 @@ List buildMessageSpans(BuildContext context, MessagePart part, Messa if (kIsDesktop || kIsWeb) return; final handle = cm.activeChat!.chat.participants.firstWhereOrNull((e) => e.address == part.mentions[i].mentionedAddress); if (handle?.contact == null && handle != null) { - await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else if (handle?.contact != null) { - await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); + try { + await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); + } catch (_) { + showSnackbar("Error", "Failed to find contact on device!"); + } } } )); @@ -169,10 +172,13 @@ Future> buildEnrichedMessageSpans(BuildContext context, Message if (kIsDesktop || kIsWeb) return; final handle = cm.activeChat!.chat.participants.firstWhereOrNull((e) => e.address == data!.first); if (handle?.contact == null && handle != null) { - await mcs.invokeMethod("open-contact-form", - {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); + await mcs.invokeMethod("open-contact-form", {'address': handle.address, 'address_type': handle.address.isEmail ? 'email' : 'phone'}); } else if (handle?.contact != null) { - await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); + try { + await mcs.invokeMethod("view-contact-form", {'id': handle!.contact!.id}); + } catch (_) { + showSnackbar("Error", "Failed to find contact on device!"); + } } } )); diff --git a/lib/services/network/firebase/cloud_messaging_service.dart b/lib/services/network/firebase/cloud_messaging_service.dart index b50ffd457..424187117 100644 --- a/lib/services/network/firebase/cloud_messaging_service.dart +++ b/lib/services/network/firebase/cloud_messaging_service.dart @@ -82,6 +82,8 @@ class CloudMessagingService extends GetxService { Logger.info('Authenticating with FCM', tag: 'FCM-Auth'); result = await mcs.invokeMethod('firebase-auth', ss.fcmData.toMap()); } on PlatformException catch (ex) { + // Don't try to re-auth if device is de-Googled + if (ex.toString().contains("Google Play Services is not available")) return; Logger.error('Failed to perform initial FCM authentication: ${ex.toString()}', tag: 'FCM-Auth'); // If the first try fails, let's try again with new FCM data from the server From 6695ff2373f68206a6b17efc750afc20d29c9503 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 13:30:38 -0500 Subject: [PATCH 025/118] Fix send volume not getting used #2639 --- lib/app/layouts/conversation_view/pages/messages_view.dart | 7 ++++--- .../conversation_view/widgets/message/send_animation.dart | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/app/layouts/conversation_view/pages/messages_view.dart b/lib/app/layouts/conversation_view/pages/messages_view.dart index 72312f980..588277b60 100644 --- a/lib/app/layouts/conversation_view/pages/messages_view.dart +++ b/lib/app/layouts/conversation_view/pages/messages_view.dart @@ -241,7 +241,7 @@ class MessagesViewState extends OptimizedState { } } - void handleNewMessage(Message message) { + void handleNewMessage(Message message) async { _messages.add(message); _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); final insertIndex = _messages.indexOf(message); @@ -268,10 +268,11 @@ class MessagesViewState extends OptimizedState { player.stream.completed .firstWhere((completed) => completed) .then((_) async => Future.delayed(const Duration(milliseconds: 500), () async => await player.dispose())); - player.open(Media(ss.settings.receiveSoundPath.value!)); + await player.setVolume(ss.settings.soundVolume.value.toDouble()); + await player.open(Media(ss.settings.receiveSoundPath.value!)); } else { PlayerController controller = PlayerController(); - controller.preparePlayer(path: ss.settings.receiveSoundPath.value!, volume: 1.0).then((_) => controller.startPlayer()); + await controller.preparePlayer(path: ss.settings.receiveSoundPath.value!, volume: ss.settings.soundVolume.value / 100).then((_) => controller.startPlayer()); } } } diff --git a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart index 0bed15ddd..e93b11af1 100644 --- a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart +++ b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart @@ -54,13 +54,14 @@ class _SendAnimationState if (ss.settings.sendSoundPath.value != null && !(isNullOrEmptyString(text) && isNullOrEmptyString(subject) && controller.pickedAttachments.isEmpty)) { if (kIsDesktop) { Player player = Player(); + await player.setVolume(ss.settings.soundVolume.value.toDouble()); await player.open(Media(ss.settings.sendSoundPath.value!)); player.stream.completed .firstWhere((completed) => completed) .then((_) async => Future.delayed(const Duration(milliseconds: 500), () async => await player.dispose())); } else { PlayerController controller = PlayerController(); - controller.preparePlayer(path: ss.settings.sendSoundPath.value!, volume: 1.0).then((_) => controller.startPlayer()); + controller.preparePlayer(path: ss.settings.sendSoundPath.value!, volume: ss.settings.soundVolume.value / 100).then((_) => controller.startPlayer()); } } for (int i = 0; i < attachments.length; i++) { From 1f67f9f68d3983b9c0bbfe206d3eea6f2243f309 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Mon, 22 Jan 2024 12:39:06 -0600 Subject: [PATCH 026/118] Fix #2647 Signed-off-by: Joel Jothiprakasam --- lib/main.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/main.dart b/lib/main.dart index 882b71900..dced20e7f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -647,6 +647,12 @@ class Main extends StatelessWidget { options: const AuthenticationOptions(stickyAuth: true)); if (didAuthenticate) { controller!.authSuccess(unlock: true); + if (kIsDesktop) { + Future.delayed(Duration.zero, () { + chats.init(); + socket; + }); + } } }, ), From f542448856d93a3e7932803bd4cbde4a8099af87 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Mon, 22 Jan 2024 12:47:31 -0600 Subject: [PATCH 027/118] Remove Windows store/non-store appdata copying Signed-off-by: Joel Jothiprakasam --- lib/main.dart | 51 +-------------------------------------------------- 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index dced20e7f..f1eb9d53b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,7 +36,7 @@ import 'package:local_auth/local_auth.dart'; import 'package:local_notifier/local_notifier.dart'; import 'package:network_tools/network_tools.dart'; import 'package:on_exit/init.dart'; -import 'package:path/path.dart' show basename, dirname, join; +import 'package:path/path.dart' show basename, join; import 'package:path/path.dart' as p; import 'package:permission_handler/permission_handler.dart'; import 'package:screen_retriever/screen_retriever.dart'; @@ -152,55 +152,6 @@ Future initApp(bool bubble, List arguments) async { StackTrace? stacktrace; await configureNetworkTools(fs.appDocDir.path, enableDebugging: kDebugMode); - /* ----- APPDATA MIGRATION ----- */ - if ((Platform.isLinux || Platform.isWindows) && kIsDesktop) { - //ignore: unnecessary_cast, we need this as a workaround - Directory appData = fs.appDocDir as Directory; - if (!await Directory(join(appData.path, "objectbox")).exists()) { - // Migrate to new appdata location if this function returns the new place and we still have the old place - if (basename(appData.absolute.path) == "bluebubbles") { - Directory oldAppData = Platform.isWindows - ? Directory(join(dirname(dirname(appData.absolute.path)), "com.bluebubbles\\bluebubbles_app")) - : Directory(join(dirname(appData.absolute.path), "bluebubbles_app")); - bool storeApp = basename(dirname(dirname(appData.absolute.path))) != "Roaming"; - if (await oldAppData.exists()) { - Logger.info("Copying appData to new directory"); - copyDirectory(oldAppData, appData); - Logger.info("Finished migrating appData"); - } else if (Platform.isWindows) { - // Find the other appdata. - String appDataRoot = p.joinAll(p.split(appData.absolute.path).slice(0, 4)); - if (storeApp) { - // If current app is store, we first look for new location nonstore appdata in case people are installing - // diff versions - oldAppData = Directory(join(appDataRoot, "Roaming", "BlueBubbles", "bluebubbles")); - // If that doesn't exist, we look in the old non-store location - if (!await oldAppData.exists()) { - oldAppData = Directory(join(appDataRoot, "Roaming", "com.bluebubbles", "bluebubbles_app")); - } - if (await oldAppData.exists()) { - Logger.info("Copying appData from NONSTORE location to new directory"); - copyDirectory(oldAppData, appData); - Logger.info("Finished migrating appData"); - } - } else { - oldAppData = Directory(join(appDataRoot, "Local", "Packages", "23344BlueBubbles.BlueBubbles_2fva2ntdzvhtw", "LocalCache", "Roaming", - "BlueBubbles", "bluebubbles")); - if (!await oldAppData.exists()) { - oldAppData = Directory(join(appDataRoot, "Local", "Packages", "23344BlueBubbles.BlueBubbles_2fva2ntdzvhtw", "LocalCache", "Roaming", - "com.bluebubbles", "bluebubbles_app")); - } - if (await oldAppData.exists()) { - Logger.info("Copying appData from STORE location to new directory"); - copyDirectory(oldAppData, appData); - Logger.info("Finished migrating appData"); - } - } - } - } - } - } - try { /* ----- OBJECTBOX DB INITIALIZATION ----- */ if (!kIsWeb) { From dafbbffc0967661d92b2a7053fc7b0e7257b9ec0 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 13:58:05 -0500 Subject: [PATCH 028/118] Hardcode to not allow "www" as preview title (#2627) --- .../widgets/message/interactive/url_preview.legacy.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart index d478c92f1..6d580cff0 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart @@ -31,7 +31,7 @@ class _LegacyUrlPreviewState extends OptimizedState with Autom void initState() { super.initState(); updateObx(() async { - if (metadata == null) { + if (metadata != null) { try { metadata = await MetadataHelper.fetchMetadata(message); } catch (ex) { @@ -101,7 +101,7 @@ class _LegacyUrlPreviewState extends OptimizedState with Autom crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - !isNullOrEmpty(metadata?.title)! + !isNullOrEmpty(metadata?.title)! && metadata?.title != "www" ? metadata!.title! : !isNullOrEmpty(siteText)! ? siteText! : message.text!, From d2e3531b7d773f1347691e8c04d5bf8c3a2d1368 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 14:09:00 -0500 Subject: [PATCH 029/118] Fix really thin images hard to click and open fullscreen --- .../message/attachment/attachment_holder.dart | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart index cb49f8799..66b207cf0 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/attachment_holder.dart @@ -274,11 +274,22 @@ class _AttachmentHolderState extends CustomState Date: Mon, 22 Jan 2024 14:12:08 -0500 Subject: [PATCH 030/118] Add tooltip for manual mark buttons (#2622) --- .../conversation_view/widgets/header/header_widgets.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart b/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart index e4c820527..3b4d2b338 100644 --- a/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart +++ b/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart @@ -45,6 +45,10 @@ class ManualMarkState extends OptimizedState { ? context.theme.colorScheme.primary : context.theme.colorScheme.outline, ), + tooltip: widget.controller.inSelectMode.value ? "Delete" + : marking ? null + : marked ? "Mark Unread" + : "Mark Read", onPressed: () async { if (widget.controller.inSelectMode.value) { for (Message m in widget.controller.selected) { From 1742becc28189815b9993feab3f7a794a89f3c67 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 14:36:28 -0500 Subject: [PATCH 031/118] Allow putting newlines in scheduled message creator (#2616) --- .../settings/pages/scheduling/create_scheduled_panel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart b/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart index 31ec266c6..9e39b77c5 100644 --- a/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart +++ b/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart @@ -209,7 +209,7 @@ class _CreateScheduledMessageState extends OptimizedState()!.bubbleText.fontSize! * 1.25, decoration: InputDecoration( From 36f7e810fde0c0142504474a7247c441a6737b14 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 14:45:05 -0500 Subject: [PATCH 032/118] Allow link previews to extend a little bit farther in tablet mode (#2614) --- .../widgets/message/interactive/interactive_holder.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart index 530ffe6de..369e17e4a 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/interactive_holder.dart @@ -88,7 +88,7 @@ class _InteractiveHolderState extends CustomState Date: Mon, 22 Jan 2024 15:03:43 -0500 Subject: [PATCH 033/118] Fix URLs with port provided not working in manual entry --- .../setup/dialogs/manual_entry_dialog.dart | 27 +++++-------------- .../setup/pages/sync/server_credentials.dart | 5 ++-- 2 files changed, 10 insertions(+), 22 deletions(-) diff --git a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart index 08eb40943..6f46681ce 100644 --- a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart +++ b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart @@ -37,32 +37,19 @@ class _ManualEntryDialogState extends OptimizedState { // Check if the URL is valid bool isValid = url.isURL; if (url.contains(":") && !isValid) { - if (":" - .allMatches(url) - .length == 2) { - final newUrl = url.split(":")[1] - .split("/") - .last; - isValid = newUrl.isIPv6 || newUrl.isIPv4; + // port applied to URL + if (":".allMatches(url).length == 2) { + final newUrl = url.split(":")[1].split("/").last; + isValid = "https://${(newUrl.split(".")..removeLast()).join(".")}.com".isURL || newUrl.isIPv6 || newUrl.isIPv4; } else { - final newUrl = url - .split(":") - .first; + final newUrl = url.split(":").first; isValid = newUrl.isIPv6 || newUrl.isIPv4; } } // the getx regex only allows extensions up to 6 characters in length // this is a workaround for that - if (!isValid && url - .split(".") - .last - .isAlphabetOnly && url - .split(".") - .last - .length > 6) { - final newUrl = url.split(".").sublist(0, url - .split(".") - .length - 1).join("."); + if (!isValid && url.split(".").last.isAlphabetOnly && url.split(".").last.length > 6) { + final newUrl = (url.split(".")..removeLast()).join("."); isValid = ("$newUrl.com").isURL; } diff --git a/lib/app/layouts/setup/pages/sync/server_credentials.dart b/lib/app/layouts/setup/pages/sync/server_credentials.dart index 5199ea60f..7b2fe3d39 100644 --- a/lib/app/layouts/setup/pages/sync/server_credentials.dart +++ b/lib/app/layouts/setup/pages/sync/server_credentials.dart @@ -609,9 +609,10 @@ class _ServerCredentialsState extends OptimizedState { // Check if the URL is valid bool isValid = url.isURL; if (url.contains(":") && !isValid) { + // port applied to URL if (":".allMatches(url).length == 2) { final newUrl = url.split(":")[1].split("/").last; - isValid = newUrl.isIPv6 || newUrl.isIPv4; + isValid = "https://${(newUrl.split(".")..removeLast()).join(".")}.com".isURL || newUrl.isIPv6 || newUrl.isIPv4; } else { final newUrl = url.split(":").first; isValid = newUrl.isIPv6 || newUrl.isIPv4; @@ -620,7 +621,7 @@ class _ServerCredentialsState extends OptimizedState { // the getx regex only allows extensions up to 6 characters in length // this is a workaround for that if (!isValid && url.split(".").last.isAlphabetOnly && url.split(".").last.length > 6) { - final newUrl = url.split(".").sublist(0, url.split(".").length - 1).join("."); + final newUrl = (url.split(".")..removeLast()).join("."); isValid = ("$newUrl.com").isURL; } From f6ccac7c1de22c38355fcb76c95d17b05fafe0e1 Mon Sep 17 00:00:00 2001 From: Sean Regan Date: Sun, 21 Jan 2024 22:46:16 -0500 Subject: [PATCH 034/118] Notification when an imessage alias is removed #2581 --- .../method_channel_service.dart | 9 +++++ .../notifications/notifications_service.dart | 38 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index bf242b69b..3733cc2ea 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -206,6 +206,15 @@ class MethodChannelService extends GetxService { Logger.info("Answering FaceTime call"); await intents.answerFaceTime(call.arguments["callUuid"]); return true; + case "imessage-alias-removed": + Map data = jsonDecode(call.arguments); + final addrLst = ((data['address'] ?? []) as List).map((a) => a as String).toList(); + Logger.info("Alias(es) removed $addrLst"); + + await notif.createAliasesRemovedNotification(addrLst); + + return true; + default: return true; } diff --git a/lib/services/backend/notifications/notifications_service.dart b/lib/services/backend/notifications/notifications_service.dart index 8ade606ed..2e09872f9 100644 --- a/lib/services/backend/notifications/notifications_service.dart +++ b/lib/services/backend/notifications/notifications_service.dart @@ -649,6 +649,44 @@ class NotificationsService extends GetxService { } } + Future createAliasesRemovedNotification(List aliases) async { + const title = "iMessage alias deregistered!"; + final text = aliases.length == 1 ? "${aliases[0]} has been deregistered!" : "The following aliases have been deregistered:\n${aliases.join("\n")}"; + + if (kIsDesktop) { + final aliasesToast = LocalNotification( + title: title, + body: text, + actions: [], + ); + + aliasesToast.onClick = () async { + await windowManager.show(); + }; + + await aliasesToast.show(); + } else { + await flnp.show( + -3, + title, + text, + NotificationDetails( + android: AndroidNotificationDetails( + ERROR_CHANNEL, + 'Errors', + channelDescription: 'Displays message send failures, connection failures, and more', + priority: Priority.max, + importance: Importance.max, + color: HexColor("4990de"), + ongoing: false, + onlyAlertOnce: true, + styleInformation: const BigTextStyleInformation('') + ), + ), + ); + } + } + Future createFailedToSend(Chat chat, {bool scheduled = false}) async { final title = 'Failed to send${scheduled ? " scheduled" : ""} message'; final subtitle = scheduled ? 'Tap to open scheduled messages list' : 'Tap to see more details or retry'; From beb7a427092132016386ab7d385c9b99fcb1c9af Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 19:51:04 -0500 Subject: [PATCH 035/118] Add notification for DartWorker on Android 11 and under --- .../com/bluebubbles/messaging/Constants.kt | 1 + .../services/backend_ui_interop/DartWorker.kt | 30 +++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt index 0a99163c2..0f0cbd3c0 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/Constants.kt @@ -17,6 +17,7 @@ class Constants { const val pendingIntentAnswerFaceTimeOffset = -100000 const val pendingIntentDeclineFaceTimeOffset = -200000 const val notificationListenerRequestCode = 1000 + const val dartWorkerNotificationId = 1000000 } } diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt index af365c307..72430cb84 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -3,24 +3,28 @@ package com.bluebubbles.messaging.services.backend_ui_interop import android.content.Context import android.util.Log import androidx.concurrent.futures.CallbackToFutureAdapter +import androidx.core.app.NotificationCompat +import androidx.work.ForegroundInfo import androidx.work.ListenableWorker import androidx.work.WorkManager import androidx.work.WorkerParameters import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.MainActivity.Companion.engine +import com.bluebubbles.messaging.R +import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.loader.ApplicationInfoLoader -import io.flutter.view.FlutterMain; import io.flutter.plugin.common.MethodChannel import io.flutter.view.FlutterCallbackInformation -import kotlinx.coroutines.runBlocking -import java.util.Timer -import kotlin.concurrent.schedule +import io.flutter.view.FlutterMain import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.util.Timer +import kotlin.concurrent.schedule class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWorker(context, workerParams) { @@ -65,6 +69,7 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo /// Code idea taken from https://github.com/flutter/flutter/wiki/Experimental:-Reuse-FlutterEngine-across-screens private fun initNewEngine() { Log.d(Constants.logTag, "Ensuring Flutter is initialized before creating engine") + // We use the deprecated class here anyways, the new one doesn't work correctly using the same code FlutterMain.startInitialization(applicationContext) FlutterMain.ensureInitializationComplete(applicationContext, null) @@ -87,7 +92,7 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo Timer().schedule(5000) { val currentWork = WorkManager.getInstance(applicationContext).getWorkInfosByTag(Constants.dartWorkerTag).get().filter { element -> !element.state.isFinished } Log.d(Constants.logTag, "${currentWork.size} worker(s) still queued") - if (currentWork.size == 0 && workerEngine != null) { + if (currentWork.isEmpty() && workerEngine != null) { Log.d(Constants.logTag, "Closing ${Constants.dartWorkerTag} engine") // This must be run on main thread CoroutineScope(Dispatchers.Main).launch { @@ -97,4 +102,19 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo } } } + + // Dumb thing that appears to be necessary for Android 11 and under (see https://stackoverflow.com/questions/69684656/upgrading-to-workmanager-2-7-0-how-to-implement-getforegroundinfoasync-for-rxwo) + override fun getForegroundInfoAsync(): ListenableFuture { + val notification = NotificationCompat.Builder(applicationContext, "com.bluebubbles.foreground_service") + .setSmallIcon(R.mipmap.ic_stat_icon) + .setOnlyAlertOnce(true) + .setAutoCancel(true) + .setCategory(NotificationCompat.CATEGORY_SERVICE) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setContentTitle("BlueBubbles DartWorker") + .setContentText("BlueBubbles is performing short work in the background") + .setColor(4888294) + .build() + return Futures.immediateFuture(ForegroundInfo(Constants.dartWorkerNotificationId, notification)) + } } \ No newline at end of file From fd268a8dab7f9665870fc97f81b021d379de34eb Mon Sep 17 00:00:00 2001 From: Sean Regan Date: Mon, 22 Jan 2024 20:37:53 -0500 Subject: [PATCH 036/118] Update for new MethodChannel mechanism --- .../java_dart_interop/method_channel_service.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 3733cc2ea..0926c4940 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -207,11 +207,14 @@ class MethodChannelService extends GetxService { await intents.answerFaceTime(call.arguments["callUuid"]); return true; case "imessage-alias-removed": - Map data = jsonDecode(call.arguments); - final addrLst = ((data['address'] ?? []) as List).map((a) => a as String).toList(); - Logger.info("Alias(es) removed $addrLst"); - - await notif.createAliasesRemovedNotification(addrLst); + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + Logger.info("Alias(es) removed ${payload.data["address"]}"); + await notif.createAliasesRemovedNotification((payload.data["address"] as List).cast()); + } else { + Logger.warn("Aliases removed data empty or null"); + } return true; From 129bde5c09cbc488845bd535bc65ab3209f5ddde Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 20:59:30 -0500 Subject: [PATCH 037/118] Make foreground service channel low importance --- .../services/notifications/NotificationChannelHandler.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt index b48971c6a..9eb982a08 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/NotificationChannelHandler.kt @@ -46,6 +46,9 @@ class NotificationChannelHandler: MethodCallHandlerImpl() { } channel.setBypassDnd(true) channel.setShowBadge(true) + // set 'Foreground Service' channel to low importance (avoid heads-up notification) + } else if (channelId == "com.bluebubbles.foreground_service") { + channel.importance = NotificationManager.IMPORTANCE_LOW } // create the channel notificationManager.createNotificationChannel(channel) From a07a5196e4f0969e45e326907f09d7881d184b4c Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 22 Jan 2024 23:03:15 -0500 Subject: [PATCH 038/118] Use new ServerPayload parser with all FCM messages --- .../method_channel_service.dart | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 0926c4940..1f1d63dc0 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -91,7 +91,8 @@ class MethodChannelService extends GetxService { Logger.info("Received ${call.method} from FCM"); Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { - final item = IncomingItem.fromMap(QueueType.updatedMessage, data!); + final payload = ServerPayload.fromJson(data!); + final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); await ah.handleNewOrUpdatedChat(item.chat); } return true; @@ -100,7 +101,8 @@ class MethodChannelService extends GetxService { Logger.info("Received group icon change from FCM"); Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { - final guid = data!["chats"].first["guid"]; + final payload = ServerPayload.fromJson(data!); + final guid = payload.data["chats"].first["guid"]; final chat = Chat.findOne(guid: guid); if (chat != null) { await Chat.getIcon(chat); @@ -109,8 +111,10 @@ class MethodChannelService extends GetxService { return true; case "scheduled-message-error": Logger.info("Received scheduled message error from FCM"); - Map data = call.arguments?.cast() ?? {}; - Chat? chat = Chat.findOne(guid: data["payload"]["chatGuid"]); + Map? data = call.arguments?.cast(); + if (data == null) return true; + final payload = ServerPayload.fromJson(data); + Chat? chat = Chat.findOne(guid: payload.data["payload"]["chatGuid"]); if (chat != null) { await notif.createFailedToSend(chat, scheduled: true); } @@ -166,11 +170,12 @@ class MethodChannelService extends GetxService { Logger.info("Received chat status change from FCM"); Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { - Chat? chat = Chat.findOne(guid: data!["chatGuid"]); - if (chat == null || (data["read"] != true && data["read"] != false)) { + final payload = ServerPayload.fromJson(data!); + Chat? chat = Chat.findOne(guid: payload.data["chatGuid"]); + if (chat == null || (payload.data["read"] != true && payload.data["read"] != false)) { return false; } else { - chat.toggleHasUnread(!data["read"]!, privateMark: false); + chat.toggleHasUnread(!payload.data["read"]!, privateMark: false); return true; } } else { @@ -190,7 +195,8 @@ class MethodChannelService extends GetxService { Logger.info("Received legacy incoming facetime from FCM"); Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { - await ActionHandler().handleIncomingFaceTimeCallLegacy(data!); + final payload = ServerPayload.fromJson(data!); + await ActionHandler().handleIncomingFaceTimeCallLegacy(payload.data); } return true; case "ft-call-status-changed": @@ -199,7 +205,8 @@ class MethodChannelService extends GetxService { Logger.info("Received facetime call status change from FCM"); Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { - await ActionHandler().handleFaceTimeStatusChange(data!); + final payload = ServerPayload.fromJson(data!); + await ActionHandler().handleFaceTimeStatusChange(payload.data); } return true; case "answer-facetime": @@ -217,7 +224,6 @@ class MethodChannelService extends GetxService { } return true; - default: return true; } From d85b845a63ea35faa665c703ab38f8e9cbf3ccef Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 23 Jan 2024 16:01:47 -0500 Subject: [PATCH 039/118] Remove unneeded deps and update existing deps --- android/app/build.gradle | 48 +++++++--------------------------------- 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index d97667cb4..3c800af7b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -33,7 +33,7 @@ apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { namespace "com.bluebubbles.messaging" - compileSdkVersion 34 + compileSdk 34 lintOptions { checkReleaseBuilds false @@ -70,7 +70,7 @@ android { } } - flavorDimensions "app" + flavorDimensions = ["app"] productFlavors { joel { @@ -135,54 +135,22 @@ flutter { source '../..' } -// for cloud firestore okio error -configurations.all { - resolutionStrategy { - force 'com.squareup.okhttp:okhttp:2.7.5' - force 'com.squareup.okio:okio:1.17.5' - } -} - dependencies { - implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test:runner:1.5.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - implementation 'com.google.firebase:firebase-analytics:21.3.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation "androidx.core:core:1.10.1" - implementation 'androidx.core:core-google-shortcuts:1.1.0' + implementation "androidx.core:core-ktx:1.12.0" implementation "androidx.sharetarget:sharetarget:1.2.0" implementation 'androidx.browser:browser:1.7.0' implementation 'androidx.activity:activity-ktx:1.8.2' - implementation 'androidx.fragment:fragment-ktx:1.6.2' - - //for location sending - implementation "com.google.android.gms:play-services-location:21.0.1" - - // for album art color - implementation 'androidx.palette:palette:1.0.0' // Add the SDK for Firebase Cloud Messaging - implementation 'com.google.firebase:firebase-messaging:23.2.1' - implementation 'com.google.firebase:firebase-analytics:21.3.0' - implementation 'com.google.firebase:firebase-database:20.2.2' - implementation 'com.google.firebase:firebase-messaging-directboot:23.2.1' + implementation 'com.google.firebase:firebase-messaging:23.4.0' + implementation 'com.google.firebase:firebase-database:20.3.0' + implementation 'com.google.firebase:firebase-messaging-directboot:23.4.0' implementation 'com.google.firebase:firebase-iid:21.1.0' - implementation 'com.google.firebase:firebase-firestore:24.7.0' - - //for json string to map - implementation 'com.google.code.gson:gson:2.9.0' - - implementation 'com.google.mlkit:smart-reply:17.0.2' - implementation 'com.google.mlkit:entity-extraction:16.0.0-beta4' + implementation 'com.google.firebase:firebase-firestore:24.10.1' // for workmanager - implementation "androidx.work:work-runtime:2.7.1" - - // Why won't it fucking compile - implementation 'com.google.guava:guava:27.0.1-android' + implementation "androidx.work:work-runtime:2.9.0" // kotlin coroutines implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" From 9e089a4f6d89051f9e196114d1b10eff97e4c315 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 23 Jan 2024 17:38:51 -0500 Subject: [PATCH 040/118] Give summary notification a tag --- .../notifications/CreateIncomingMessageNotification.kt | 2 +- .../services/notifications/DeleteNotificationHandler.kt | 2 +- lib/app/layouts/settings/pages/misc/misc_panel.dart | 3 +++ lib/main.dart | 7 ++++++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt index 324f654ed..9d9ce2bbe 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt @@ -202,7 +202,7 @@ class CreateIncomingMessageNotification: MethodCallHandlerImpl() { .setColor(4888294) notificationManager.notify(Constants.newMessageNotificationTag, notificationId, notificationBuilder.build()) - notificationManager.notify(0, summaryNotificationBuilder.build()) + notificationManager.notify(Constants.newMessageNotificationTag, 0, summaryNotificationBuilder.build()) result.success(null) } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt index 1719d2079..fc82258fe 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/DeleteNotificationHandler.kt @@ -37,7 +37,7 @@ class DeleteNotificationHandler: MethodCallHandlerImpl() { // cancel the summary if needed if (notificationManager.activeNotifications.size == 1 && notificationManager.activeNotifications.first().id == 0) { Log.d(Constants.logTag, "Cancelling notification summary") - notificationManager.cancel(0) + notificationManager.cancel(Constants.newMessageNotificationTag, 0) } true } catch (exception: Exception) { diff --git a/lib/app/layouts/settings/pages/misc/misc_panel.dart b/lib/app/layouts/settings/pages/misc/misc_panel.dart index 75a7beaa3..ce44f2e00 100644 --- a/lib/app/layouts/settings/pages/misc/misc_panel.dart +++ b/lib/app/layouts/settings/pages/misc/misc_panel.dart @@ -167,7 +167,10 @@ class _MiscPanelState extends OptimizedState { ss.settings.keepAppAlive.value = val; saveSettings(); if (!val) { + await mcs.invokeMethod("stop-socket-service"); FlutterForegroundTask.stopService(); + } else { + await mcs.invokeMethod("start-socket-service"); } }, initialVal: ss.settings.keepAppAlive.value, diff --git a/lib/main.dart b/lib/main.dart index f1eb9d53b..8bc81558d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -426,7 +426,12 @@ class BadCertOverride extends HttpOverrides { // your server URL ..badCertificateCallback = (X509Certificate cert, String host, int port) { String serverUrl = sanitizeServerAddress() ?? ""; - hasBadCert = serverUrl.contains(host); + if (host.startsWith("*")) { + final regex = RegExp("^((\\*|[\\w\\d]+(-[\\w\\d]+)*)\\.)*(${host.split(".").reversed.take(2).toList().reversed.join(".")})\$"); + hasBadCert = regex.hasMatch(serverUrl); + } else { + hasBadCert = serverUrl.endsWith(host); + } return hasBadCert; }; } From 44c5782f5d40f6c58d82edc16bfa9ea2dbfe03a2 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 23 Jan 2024 17:41:12 -0500 Subject: [PATCH 041/118] Rearrange FCM generation and allow deleting FCM token Make server password check happen outside of the Utils.getServerUrl to be more flexible --- .../BlueBubblesFirebaseMessagingService.kt | 2 +- .../services/firebase/FirebaseAuthHandler.kt | 50 +++++++------------ .../FirebaseCloudMessagingTokenHandler.kt | 44 ++++++++++++++++ .../intents/ExternalIntentReceiver.kt | 6 ++- .../com/bluebubbles/messaging/utils/Utils.kt | 16 +----- 5 files changed, 68 insertions(+), 50 deletions(-) create mode 100644 android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseCloudMessagingTokenHandler.kt diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt index 8ddf6a821..89f0f2763 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/BlueBubblesFirebaseMessagingService.kt @@ -25,7 +25,7 @@ class BlueBubblesFirebaseMessagingService: FirebaseMessagingService() { // check if the user configured "Send Events to Tasker" val prefs = applicationContext.getSharedPreferences("FlutterSharedPreferences", 0) if (prefs.getBoolean("flutter.sendEventsToTasker", false)) { - Utils.getServerUrl(applicationContext, prefs.getString("flutter.guidAuthKey", "")!!, object : MethodChannel.Result { + Utils.getServerUrl(applicationContext, object : MethodChannel.Result { override fun success(result: Any?) { Log.d(Constants.logTag, "Got URL: $result - sending to Tasker...") val intent = Intent() diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt index 097a83c92..709f8e369 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt @@ -6,18 +6,12 @@ import com.bluebubbles.messaging.Constants import com.bluebubbles.messaging.models.MethodCallHandlerImpl import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability -import com.google.android.gms.tasks.Task import com.google.firebase.FirebaseApp import com.google.firebase.FirebaseOptions import com.google.firebase.database.FirebaseDatabase import com.google.firebase.firestore.FirebaseFirestore -import com.google.firebase.messaging.FirebaseMessaging import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.tasks.await class FirebaseAuthHandler: MethodCallHandlerImpl() { companion object { @@ -39,12 +33,14 @@ class FirebaseAuthHandler: MethodCallHandlerImpl() { return } - val projectId: String? = call.argument("project_id") - val storageBucket: String? = call.argument("storage_bucket") - val apiKey: String = call.argument("api_key")!! - val databaseUrl: String? = call.argument("firebase_url") - val gcmSenderId: String? = call.argument("client_id") - val applicationId: String = call.argument("application_id")!! + // Fetch Firebase details directly from preferences + val prefs = context.getSharedPreferences("FlutterSharedPreferences", 0) + val projectId: String? = prefs.getString("flutter.projectID", null) + val storageBucket: String? = prefs.getString("flutter.storageBucket", null) + val apiKey: String = prefs.getString("flutter.apiKey", null)!! + val databaseUrl: String? = prefs.getString("flutter.firebaseURL", null) + val gcmSenderId: String? = prefs.getString("flutter.clientID", null) + val applicationId: String = prefs.getString("flutter.applicationID", null)!! Log.d(Constants.logTag, "Authenticating client $applicationId with Firebase...") // Get a FirebaseApp (manually provide config since we fetch it dynamically) @@ -58,27 +54,15 @@ class FirebaseAuthHandler: MethodCallHandlerImpl() { .build() ) - Log.d(Constants.logTag, "Fetching FCM token...") - // Attempt to get an FCM registration token to pass to the server - val tokenTask: Task = FirebaseMessaging.getInstance().token; - CoroutineScope(Dispatchers.Main).launch { - try { - val fcmToken: String = tokenTask.await() - result.success(fcmToken) - } catch (exception: Exception) { - val error = "Failed to get FCM token!" - Log.e(Constants.logTag, error) - result.error("500", error, exception) - } - - // Set up Firestore / Realtime DB listeners for server URL changes - // databaseUrl null indicates Cloud Firestore setup - Log.d(Constants.logTag, "Setting Firebase database listeners...") - if (databaseUrl == null) { - FirebaseFirestore.getInstance().collection("server").document("config").addSnapshotListener(FirestoreDatabaseListener()) - } else { - FirebaseDatabase.getInstance().getReference("config").addValueEventListener(RealtimeDatabaseListener()) - } + // Set up Firestore / Realtime DB listeners for server URL changes + // databaseUrl null indicates Cloud Firestore setup + Log.d(Constants.logTag, "Setting Firebase database listeners...") + if (databaseUrl == null) { + FirebaseFirestore.getInstance().collection("server").document("config").addSnapshotListener(FirestoreDatabaseListener()) + } else { + FirebaseDatabase.getInstance().getReference("config").addValueEventListener(RealtimeDatabaseListener()) } + + FirebaseCloudMessagingTokenHandler().getToken(result) } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseCloudMessagingTokenHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseCloudMessagingTokenHandler.kt new file mode 100644 index 000000000..85f633832 --- /dev/null +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseCloudMessagingTokenHandler.kt @@ -0,0 +1,44 @@ +package com.bluebubbles.messaging.services.firebase + +import android.util.Log +import com.bluebubbles.messaging.Constants +import com.google.android.gms.tasks.Task +import com.google.firebase.messaging.FirebaseMessaging +import io.flutter.plugin.common.MethodChannel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.tasks.await + +class FirebaseCloudMessagingTokenHandler { + fun getToken(result: MethodChannel.Result?) { + Log.d(Constants.logTag, "Fetching FCM token...") + // Attempt to get an FCM registration token to pass to the server + val tokenTask: Task = FirebaseMessaging.getInstance().token; + CoroutineScope(Dispatchers.Main).launch { + try { + val fcmToken: String = tokenTask.await() + result?.success(fcmToken) + } catch (exception: Exception) { + val error = "Failed to get FCM token!" + Log.e(Constants.logTag, error) + result?.error("500", error, exception) + } + } + } + + fun deleteToken(result: MethodChannel.Result?) { + Log.d(Constants.logTag, "Deleting FCM token...") + // Attempt to delete FCM registration token + CoroutineScope(Dispatchers.Main).launch { + try { + FirebaseMessaging.getInstance().deleteToken().await() + result?.success(null) + } catch (exception: Exception) { + val error = "Failed to delete FCM token!" + Log.e(Constants.logTag, error) + result?.error("500", error, exception) + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt index 891306d28..fca535253 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/intents/ExternalIntentReceiver.kt @@ -18,9 +18,11 @@ class ExternalIntentReceiver: BroadcastReceiver() { "com.bluebubbles.external.GET_SERVER_URL" -> { val password = intent.extras?.getString("password") val identifier = intent.extras?.getString("id") + val prefs = context.getSharedPreferences("FlutterSharedPreferences", 0) + val storedPassword = prefs.getString("flutter.guidAuthKey", "") - if (password != null) { - Utils.getServerUrl(context, password, object : MethodChannel.Result { + if (password == storedPassword) { + Utils.getServerUrl(context, object : MethodChannel.Result { override fun success(result: Any?) { Log.d(Constants.logTag, "Got URL: $result - sending to Tasker...") val intent = Intent() diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt index d01706063..9d484c1c3 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/utils/Utils.kt @@ -35,20 +35,8 @@ object Utils { return IconCompat.createWithAdaptiveBitmap(adaptiveBitmap) } - fun getServerUrl(context: Context, password: String, result: MethodChannel.Result) { - val prefs = context.getSharedPreferences("FlutterSharedPreferences", 0) - val storedPassword = prefs.getString("flutter.guidAuthKey", "") - if (password != storedPassword) return - - val fcmData = HashMap() - fcmData["project_id"] = prefs.getString("flutter.projectID", "") - fcmData["storage_bucket"] = prefs.getString("flutter.storageBucket", "") - fcmData["api_key"] = prefs.getString("flutter.apiKey", "") - fcmData["firebase_url"] = prefs.getString("flutter.firebaseURL", "") - fcmData["client_id"] = prefs.getString("flutter.clientID", "") - fcmData["application_id"] = prefs.getString("flutter.applicationID", "") - val map: Map = HashMap(fcmData) - FirebaseAuthHandler().handleMethodCall(MethodCall("", map), object : MethodChannel.Result { + fun getServerUrl(context: Context, result: MethodChannel.Result) { + FirebaseAuthHandler().handleMethodCall(MethodCall("", null), object : MethodChannel.Result { override fun success(temp: Any?) { ServerUrlRequestHandler().handleMethodCall(MethodCall("", null), result, context) } From 9948b1601dfc0668b8e34be3756c7e0894929728 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 23 Jan 2024 17:53:04 -0500 Subject: [PATCH 042/118] Don't throw if engine not initialized to avoid app crashes --- .../messaging/services/backend_ui_interop/MethodCallHandler.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt index e633dc7e0..d5ab81ff0 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/MethodCallHandler.kt @@ -33,8 +33,6 @@ class MethodCallHandler { fun invokeMethod(method: String, arguments: Map) { if (engine != null) { MethodChannel(engine!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, arguments) - } else { - throw Exception("Engine not initialized!") } } } From bdb8ab6e73e910f2c492b9693b66ece2fbee947e Mon Sep 17 00:00:00 2001 From: Sean Regan Date: Tue, 23 Jan 2024 19:33:54 -0500 Subject: [PATCH 043/118] Use new event type string and support over socket --- .../method_channel_service.dart | 6 ++--- .../notifications/notifications_service.dart | 24 +++++++++++++++---- lib/services/network/socket_service.dart | 5 ++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 1f1d63dc0..c2f285978 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -213,12 +213,12 @@ class MethodChannelService extends GetxService { Logger.info("Answering FaceTime call"); await intents.answerFaceTime(call.arguments["callUuid"]); return true; - case "imessage-alias-removed": + case "imessage-aliases-removed": Map? data = call.arguments?.cast(); if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); - Logger.info("Alias(es) removed ${payload.data["address"]}"); - await notif.createAliasesRemovedNotification((payload.data["address"] as List).cast()); + Logger.info("Alias(es) removed ${payload.data["aliases"]}"); + await notif.createAliasesRemovedNotification((payload.data["aliases"] as List).cast()); } else { Logger.warn("Aliases removed data empty or null"); } diff --git a/lib/services/backend/notifications/notifications_service.dart b/lib/services/backend/notifications/notifications_service.dart index 2e09872f9..626479db6 100644 --- a/lib/services/backend/notifications/notifications_service.dart +++ b/lib/services/backend/notifications/notifications_service.dart @@ -41,6 +41,7 @@ class NotificationsService extends GetxService { static LocalNotification? allToast; static LocalNotification? failedToast; static LocalNotification? socketToast; + static LocalNotification? aliasesToast; static Map> notifications = {}; static Map facetimeNotifications = {}; static Map notificationCounts = {}; @@ -651,21 +652,36 @@ class NotificationsService extends GetxService { Future createAliasesRemovedNotification(List aliases) async { const title = "iMessage alias deregistered!"; + const notifId = -3; final text = aliases.length == 1 ? "${aliases[0]} has been deregistered!" : "The following aliases have been deregistered:\n${aliases.join("\n")}"; if (kIsDesktop) { - final aliasesToast = LocalNotification( + if (aliasesToast?.body == text) { + return; + } else { + await aliasesToast?.close(); + } + + aliasesToast = LocalNotification( title: title, body: text, actions: [], ); - aliasesToast.onClick = () async { + aliasesToast!.onClick = () async { + aliasesToast = null; await windowManager.show(); }; - await aliasesToast.show(); + await aliasesToast!.show(); } else { + final notifs = await flnp.getActiveNotifications(); + + //Already have this notification + if (notifs.firstWhereOrNull((n) => n.id == notifId && n.body == text) != null) { + return; + } + await flnp.show( -3, title, @@ -679,7 +695,7 @@ class NotificationsService extends GetxService { importance: Importance.max, color: HexColor("4990de"), ongoing: false, - onlyAlertOnce: true, + onlyAlertOnce: false, styleInformation: const BigTextStyleInformation('') ), ), diff --git a/lib/services/network/socket_service.dart b/lib/services/network/socket_service.dart index ca2b605f2..8e588d9d1 100644 --- a/lib/services/network/socket_service.dart +++ b/lib/services/network/socket_service.dart @@ -88,6 +88,7 @@ class SocketService extends GetxService { socket.on("updated-message", (data) => handleCustomEvent("updated-message", data)); socket.on("typing-indicator", (data) => handleCustomEvent("typing-indicator", data)); socket.on("chat-read-status-changed", (data) => handleCustomEvent("chat-read-status-changed", data)); + socket.on("imessage-aliases-removed", (data) => handleCustomEvent("imessage-aliases-removed", data)); socket.connect(); } @@ -246,6 +247,10 @@ class SocketService extends GetxService { Logger.info("Received FaceTime call status change"); await ActionHandler().handleFaceTimeStatusChange(data); return; + case "imessage-aliases-removed": + Logger.info("Alias(es) removed ${data["aliases"]}"); + await notif.createAliasesRemovedNotification((data["aliases"] as List).cast()); + return; default: return; } From e8f9400b70abcfd3211268c958287342142ae2db Mon Sep 17 00:00:00 2001 From: Sean Regan Date: Tue, 23 Jan 2024 22:00:41 -0500 Subject: [PATCH 044/118] variable reuse --- lib/services/backend/notifications/notifications_service.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/backend/notifications/notifications_service.dart b/lib/services/backend/notifications/notifications_service.dart index 626479db6..e143c01e2 100644 --- a/lib/services/backend/notifications/notifications_service.dart +++ b/lib/services/backend/notifications/notifications_service.dart @@ -683,7 +683,7 @@ class NotificationsService extends GetxService { } await flnp.show( - -3, + notifId, title, text, NotificationDetails( From 988e8de4938a709a3f45a8c35cfc24bc99bf9bb2 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 24 Jan 2024 11:46:46 -0500 Subject: [PATCH 045/118] Limit theme backup names to 50 chars --- .../layouts/settings/pages/server/backup_restore_panel.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart index 68c3fde8c..c3def3c3f 100644 --- a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart +++ b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart @@ -78,7 +78,7 @@ class _BackupRestorePanelState extends OptimizedState { setState(() { themes.removeWhere((element) => element["name"] == name); }); - http.deleteTheme("BlueBubbles Custom Theme - $name"); + http.deleteTheme(name); } Future defaultName() async { @@ -802,8 +802,7 @@ class _BackupRestorePanelState extends OptimizedState { if (method) { bool errored = false; for (ThemeStruct e in allThemes) { - String name = "BlueBubbles Custom Theme - ${e.name}"; - var response = await http.setTheme(name, e.toMap()); + var response = await http.setTheme(e.name.characters.take(50), e.toMap()); if (response.statusCode != 200) { errored = true; } From 1bd4888ec3902121187d140d37c1e147d4ce66b0 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Wed, 24 Jan 2024 11:48:28 -0500 Subject: [PATCH 046/118] Convert messages to string and back to prevent crashes --- .../backend_ui_interop/DartWorkManager.kt | 7 ++++++- .../services/backend_ui_interop/DartWorker.kt | 10 +++++++++- lib/models/global/attributed_body.dart | 4 ++-- lib/models/global/queue_items.dart | 2 +- lib/models/global/server_payload.dart | 2 +- lib/models/io/chat.dart | 4 ++-- lib/models/io/message.dart | 16 ++++++++-------- 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt index fb3a799a0..9137efc0c 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorkManager.kt @@ -9,6 +9,8 @@ import androidx.work.OutOfQuotaPolicy import androidx.work.WorkInfo import androidx.work.WorkManager import com.bluebubbles.messaging.Constants +import com.google.gson.GsonBuilder +import com.google.gson.ToNumberPolicy import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -16,11 +18,14 @@ import kotlinx.coroutines.launch object DartWorkManager { fun createWorker(context: Context, method: String, arguments: HashMap, callback: () -> (Unit)) { Log.d(Constants.logTag, "Creating new ${Constants.dartWorkerTag} for method $method") + val gson = GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create() val work = OneTimeWorkRequest.Builder(DartWorker::class.java) .setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST) .setInputData(Data.Builder() .putString("method", method) - .putAll(arguments).build()) + .putString("data", gson.toJson(arguments).toString()).build()) .addTag(Constants.dartWorkerTag) .build() WorkManager.getInstance(context).enqueue(work) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt index 72430cb84..573276bbd 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -13,6 +13,10 @@ import com.bluebubbles.messaging.MainActivity.Companion.engine import com.bluebubbles.messaging.R import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.ToNumberPolicy +import com.google.gson.reflect.TypeToken import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.dart.DartExecutor import io.flutter.embedding.engine.loader.ApplicationInfoLoader @@ -34,6 +38,7 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo override fun startWork(): ListenableFuture { val method = inputData.getString("method")!! + val data = inputData.getString("data")!! if (engine == null && workerEngine == null) { Log.d(Constants.logTag, "Initializing engine for worker with method $method") initNewEngine() @@ -47,7 +52,10 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo return CallbackToFutureAdapter.getFuture { completer -> runBlocking { Log.d(Constants.logTag, "Sending method $method to Dart") - MethodChannel((engine ?: workerEngine)!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, inputData.keyValueMap, object : MethodChannel.Result { + val gson = GsonBuilder() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) + .create() + MethodChannel((engine ?: workerEngine)!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, gson.fromJson(data, TypeToken.get(HashMap::class.java)), object : MethodChannel.Result { override fun success(result: Any?) { Log.d(Constants.logTag, "Worker with method $method completed successfully") completer.set(Result.success()) diff --git a/lib/models/global/attributed_body.dart b/lib/models/global/attributed_body.dart index 14f5872f6..7e4a2a437 100644 --- a/lib/models/global/attributed_body.dart +++ b/lib/models/global/attributed_body.dart @@ -9,7 +9,7 @@ class AttributedBody { factory AttributedBody.fromMap(Map json) => AttributedBody( string: json["string"], - runs: json["runs"] == null ? [] : List.from(json["runs"].map((x) => Run.fromMap(x))), + runs: json["runs"] == null ? [] : List.from(json["runs"].map((x) => Run.fromMap(x!.cast()))), ); Map toMap() => { @@ -32,7 +32,7 @@ class Run { factory Run.fromMap(Map json) => Run( range: json["range"] == null ? [] : List.from(json["range"].map((x) => x)), - attributes: json["attributes"] == null ? null : Attributes.fromMap(json["attributes"]), + attributes: json["attributes"] == null ? null : Attributes.fromMap(json["attributes"]!.cast()), ); Map toMap() => { diff --git a/lib/models/global/queue_items.dart b/lib/models/global/queue_items.dart index f2d278989..c507156e0 100644 --- a/lib/models/global/queue_items.dart +++ b/lib/models/global/queue_items.dart @@ -28,7 +28,7 @@ class IncomingItem extends QueueItem { return IncomingItem._( type: t, completer: c, - chat: Chat.fromMap(m['chats'].first), + chat: Chat.fromMap(m['chats'].first.cast()), message: Message.fromMap(m), tempGuid: m['tempGuid'], ); diff --git a/lib/models/global/server_payload.dart b/lib/models/global/server_payload.dart index 000dd38f5..fe3769640 100644 --- a/lib/models/global/server_payload.dart +++ b/lib/models/global/server_payload.dart @@ -63,7 +63,7 @@ class ServerPayload { factory ServerPayload.fromJson(Map json) => ServerPayload( originalJson: json, - data: json["data"] ?? json, + data: (json["data"] ?? json)?.cast(), isLegacy: json.containsKey("type"), type: PayloadType.values.firstWhereOrNull((element) => element.name == json["type"]) ?? PayloadType.OTHER, subtype: json["subtype"], diff --git a/lib/models/io/chat.dart b/lib/models/io/chat.dart index 04c5eb70a..1c07ef980 100644 --- a/lib/models/io/chat.dart +++ b/lib/models/io/chat.dart @@ -375,7 +375,7 @@ class Chat { } factory Chat.fromMap(Map json) { - final message = json['lastMessage'] != null ? Message.fromMap(json['lastMessage']) : null; + final message = json['lastMessage'] != null ? Message.fromMap(json['lastMessage']!.cast()) : null; return Chat( id: json["ROWID"] ?? json["id"], guid: json["guid"], @@ -389,7 +389,7 @@ class Chat { displayName: json["displayName"], customAvatar: json['_customAvatarPath'], pinnedIndex: json['_pinIndex'], - participants: (json['participants'] as List? ?? []).map((e) => Handle.fromMap(e)).toList(), + participants: (json['participants'] as List? ?? []).map((e) => Handle.fromMap(e!.cast())).toList(), autoSendReadReceipts: json["autoSendReadReceipts"], autoSendTypingIndicators: json["autoSendTypingIndicators"], dateDeleted: parseDate(json["dateDeleted"]), diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 58c6822f9..a2e7f6fa6 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -361,15 +361,15 @@ class Message { } factory Message.fromMap(Map json) { - final attachments = (json['attachments'] as List? ?? []).map((a) => Attachment.fromMap(a)).toList(); + final attachments = (json['attachments'] as List? ?? []).map((a) => Attachment.fromMap(a!.cast())).toList(); List attributedBody = []; if (json["attributedBody"] != null) { if (json['attributedBody'] is Map) { - json['attributedBody'] = [json['attributedBody']]; + json['attributedBody'] = [json['attributedBody']!.cast()]; } try { - attributedBody = (json['attributedBody'] as List).map((a) => AttributedBody.fromMap(a)).toList(); + attributedBody = (json['attributedBody'] as List).map((a) => AttributedBody.fromMap(a!.cast())).toList(); } catch (e) { Logger.error('Failed to parse attributed body! $e'); } @@ -382,20 +382,20 @@ class Message { metadata = jsonDecode(json["metadata"]); } catch (_) {} } else { - metadata = json["metadata"]; + metadata = json["metadata"]?.cast(); } } List msi = []; try { - msi = (json['messageSummaryInfo'] as List? ?? []).map((e) => MessageSummaryInfo.fromJson(e)).toList(); + msi = (json['messageSummaryInfo'] as List? ?? []).map((e) => MessageSummaryInfo.fromJson(e!.cast())).toList(); } catch (e) { Logger.error('Failed to parse summary info! $e'); } PayloadData? payloadData; try { - payloadData = json['payloadData'] == null ? null : PayloadData.fromJson(json['payloadData']); + payloadData = json['payloadData'] == null ? null : PayloadData.fromJson(json['payloadData']!.cast()); } catch (e) { Logger.error('Failed to parse payload data! $e'); } @@ -424,9 +424,9 @@ class Message { associatedMessagePart: json["associatedMessagePart"] ?? int.tryParse(json["associatedMessageGuid"].toString().replaceAll("p:", "").split("/").first), associatedMessageType: json["associatedMessageType"], expressiveSendStyleId: json["expressiveSendStyleId"], - handle: json['handle'] != null ? Handle.fromMap(json['handle']) : null, + handle: json['handle'] != null ? Handle.fromMap(json['handle']!.cast()) : null, hasAttachments: attachments.isNotEmpty || json['hasAttachments'] == true, - attachments: (json['attachments'] as List? ?? []).map((a) => Attachment.fromMap(a)).toList(), + attachments: (json['attachments'] as List? ?? []).map((a) => Attachment.fromMap(a!.cast())).toList(), hasReactions: json['hasReactions'] == true, dateDeleted: parseDate(json["dateDeleted"]), metadata: metadata is String ? null : metadata, From 01a6e587812c385171ba3ea95cc2e9ba141b5890 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 25 Jan 2024 12:10:35 -0500 Subject: [PATCH 047/118] Oopsie --- lib/app/layouts/settings/pages/server/backup_restore_panel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart index c3def3c3f..19f63a6a5 100644 --- a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart +++ b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart @@ -802,7 +802,7 @@ class _BackupRestorePanelState extends OptimizedState { if (method) { bool errored = false; for (ThemeStruct e in allThemes) { - var response = await http.setTheme(e.name.characters.take(50), e.toMap()); + var response = await http.setTheme(e.name.characters.take(50).string, e.toMap()); if (response.statusCode != 200) { errored = true; } From 83185416b6fec4c93dc2fb2e428d4820a40527f8 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 25 Jan 2024 12:34:49 -0500 Subject: [PATCH 048/118] Fix issues with loading handles/attachments/sorting in bookmarks view --- .../widgets/message/reply/reply_thread_popup.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart index b64ae80d7..3c49ed723 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart @@ -27,6 +27,12 @@ void showBookmarksThread(ConversationViewController cvController, BuildContext c if (_messages.isEmpty) { return showSnackbar("Error", "There are no bookmarked messages in this chat!"); } + for (Message m in _messages) { + m.realAttachments; + m.fetchAssociatedMessages(); + m.handle = m.getHandle(); + } + _messages.sort((a, b) => a.dateCreated!.compareTo(b.dateCreated!)); _buildThreadView(_messages, null, cvController, context); } From 66fae3244d7bde50e4916e7c13b341f661b2e017 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 25 Jan 2024 12:45:40 -0500 Subject: [PATCH 049/118] Open contact form when tapping on avatar and open color wheel when long pressing --- .../avatars/contact_avatar_group_widget.dart | 6 ------ .../avatars/contact_avatar_widget.dart | 20 +++++++++---------- .../pages/search/search_view.dart | 1 - .../widgets/tile/conversation_tile.dart | 1 - .../tile/pinned_conversation_tile.dart | 1 - .../scheduling/create_scheduled_panel.dart | 1 - .../pages/unfinished/theme_selector.dart | 2 +- 7 files changed, 10 insertions(+), 22 deletions(-) diff --git a/lib/app/components/avatars/contact_avatar_group_widget.dart b/lib/app/components/avatars/contact_avatar_group_widget.dart index 9c66d4c4a..202ca76b3 100644 --- a/lib/app/components/avatars/contact_avatar_group_widget.dart +++ b/lib/app/components/avatars/contact_avatar_group_widget.dart @@ -19,12 +19,10 @@ class ContactAvatarGroupWidget extends StatefulWidget { required this.chat, this.size = 40, this.editable = true, - this.onTap, }); final Chat chat; final double size; final bool editable; - final Function()? onTap; @override State createState() => _ContactAvatarGroupWidgetState(); @@ -57,7 +55,6 @@ class _ContactAvatarGroupWidgetState extends OptimizedState { } void onAvatarTap() async { - if (widget.onTap != null) { - widget.onTap!.call(); - return; - } - - if (!widget.editable - || (!ss.settings.colorfulAvatars.value && !ss.settings.colorfulBubbles.value) - || widget.handle == null) return; + if (!ss.settings.colorfulAvatars.value && !ss.settings.colorfulBubbles.value) return; bool didReset = false; final Color color = await showColorPickerDialog( @@ -146,7 +137,14 @@ class _ContactAvatarWidgetState extends OptimizedState { || !ss.settings.colorfulAvatars.value || widget.handle == null ? MouseCursor.defer : SystemMouseCursors.click, child: GestureDetector( - onTap: !widget.editable && widget.onTap == null ? null : onAvatarTap, + onTap: !widget.editable || (widget.handle == null && contact == null) ? null : () async { + if (contact != null) { + await mcs.invokeMethod("view-contact-form", {'id': contact!.id}); + } else { + await mcs.invokeMethod("open-contact-form", {'address': widget.handle!.address, 'address_type': widget.handle!.address.isEmail ? 'email' : 'phone'}); + } + }, + onLongPress: !widget.editable || widget.handle == null ? null : onAvatarTap, child: Container( key: Key("$keyPrefix-avatar-container"), width: size, diff --git a/lib/app/layouts/conversation_list/pages/search/search_view.dart b/lib/app/layouts/conversation_list/pages/search/search_view.dart index a866eb466..75a6f5450 100644 --- a/lib/app/layouts/conversation_list/pages/search/search_view.dart +++ b/lib/app/layouts/conversation_list/pages/search/search_view.dart @@ -390,7 +390,6 @@ class SearchViewState extends OptimizedState { chat: chat, size: 40, editable: false, - onTap: () {}, ), trailing: Text( buildDate(message.dateCreated), diff --git a/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart index 8343a0cb7..6e82e4a0a 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/conversation_tile.dart @@ -471,7 +471,6 @@ class ChatLeadingState extends OptimizedState { chat: widget.controller.chat, size: 40, editable: false, - onTap: () => widget.controller.onTap(context), ), ), if (showTypingIndicator) diff --git a/lib/app/layouts/conversation_list/widgets/tile/pinned_conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/pinned_conversation_tile.dart index 52d46935a..da907c871 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/pinned_conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/pinned_conversation_tile.dart @@ -131,7 +131,6 @@ class _PinnedConversationTileState extends CustomState controller.onTap(context), ), UnreadIcon(width: maxWidth, parentController: controller), MuteIcon(width: maxWidth, parentController: controller), diff --git a/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart b/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart index 9e39b77c5..b5597e5ba 100644 --- a/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart +++ b/lib/app/layouts/settings/pages/scheduling/create_scheduled_panel.dart @@ -180,7 +180,6 @@ class _CreateScheduledMessageState extends OptimizedState Date: Thu, 25 Jan 2024 14:04:38 -0500 Subject: [PATCH 050/118] Fix samsung skin not jumping to chat --- .../widgets/message/reply/reply_thread_popup.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart index 3c49ed723..84239dcff 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart @@ -101,7 +101,7 @@ void _buildThreadView(List _messages, int? originatorPart, Conversation children: _messages.mapIndexed((index, e) => GestureDetector( onTap: () { Navigator.of(context).pop(); - if (originatorPart == null && ss.settings.skin.value != Skins.Material) { + if (originatorPart == null && ss.settings.skin.value == Skins.iOS) { // pop twice to remove convo details page Navigator.of(context).pop(); } From 089c0faafadeb02c8f1cab6b20ec7ffdea45a1be Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 25 Jan 2024 21:32:26 -0500 Subject: [PATCH 051/118] Add new profile screen to view account details --- .../settings/pages/profile/profile_panel.dart | 385 ++++++++++++++++++ .../pages/server/server_management_panel.dart | 66 --- lib/app/layouts/settings/settings_page.dart | 130 +----- lib/services/network/http_service.dart | 22 + 4 files changed, 420 insertions(+), 183 deletions(-) create mode 100644 lib/app/layouts/settings/pages/profile/profile_panel.dart diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart new file mode 100644 index 000000000..f34060091 --- /dev/null +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -0,0 +1,385 @@ + +import 'dart:convert'; + +import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; +import 'package:bluebubbles/app/layouts/settings/pages/theming/avatar/avatar_crop.dart'; +import 'package:bluebubbles/app/wrappers/theme_switcher.dart'; +import 'package:bluebubbles/helpers/helpers.dart'; +import 'package:bluebubbles/app/layouts/settings/widgets/settings_widgets.dart'; +import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; +import 'package:bluebubbles/models/models.dart'; +import 'package:bluebubbles/services/services.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:universal_io/io.dart'; + +class ProfilePanel extends StatefulWidget { + + ProfilePanel({super.key}); + + @override + State createState() => _ProfilePanelState(); +} + +class _ProfilePanelState extends OptimizedState with WidgetsBindingObserver { + final RxDouble opacity = 1.0.obs; + final RxMap accountInfo = RxMap({}); + final RxMap accountContact = RxMap({}); + + @override + void initState() { + super.initState(); + getDetails(); + } + + void getDetails() async { + try { + final result = await http.getAccountInfo(); + if (!isNullOrEmpty(result.data.isNotEmpty)!) { + accountInfo.addAll(result.data['data']); + } + opacity.value = 1.0; + if (ss.isMinBigSurSync) { + final result2 = await http.getAccountContact(); + if (!isNullOrEmpty(result2.data.isNotEmpty)!) { + accountContact.addAll(result2.data['data']); + } + } + } catch (_) { + + } + setState(() {}); + } + + void updateName() async { + final nameController = TextEditingController(text: ss.settings.userName.value); + done() { + if (nameController.text.isEmpty) { + showSnackbar("Error", "Enter a name!"); + return; + } + Get.back(); + ss.settings.userName.value = nameController.text; + ss.settings.save(); + setState(() {}); + } + await showDialog( + context: context, + builder: (_) { + return AlertDialog( + actions: [ + TextButton( + child: Text("Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), + onPressed: () => Get.back(), + ), + TextButton( + child: Text("OK", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), + onPressed: () async { + done.call(); + }, + ), + ], + content: TextField( + controller: nameController, + onSubmitted: (_) => done.call(), + autofocus: true, + decoration: const InputDecoration( + labelText: "Name", + border: OutlineInputBorder(), + ), + ), + title: Text("User Profile Name", style: context.theme.textTheme.titleLarge), + backgroundColor: context.theme.colorScheme.properSurface, + ); + } + ); + } + + void updatePhoto() async { + Navigator.of(context).push( + ThemeSwitcher.buildPageRoute( + builder: (context) => AvatarCrop(), + ), + ); + } + + void removePhoto() { + File file = File(ss.settings.userAvatarPath.value!); + file.delete(); + ss.settings.userAvatarPath.value = null; + ss.saveSettings(); + } + + @override + Widget build(BuildContext context) { + return SettingsScaffold( + headerColor: headerColor, + title: "iMessage Profile", + tileColor: tileColor, + initialHeader: null, + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + bodySlivers: [ + SliverToBoxAdapter( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 10), + if (iOS) + Center( + child: Stack( + clipBehavior: Clip.none, + children: [ + GestureDetector( + onTap: () async { + updatePhoto(); + }, + child: ContactAvatarWidget( + handle: null, + borderThickness: 0.1, + editable: false, + fontSize: 22, + size: 100, + ), + ), + Obx(() => ss.settings.userAvatarPath.value != null ? Positioned( + right: -5, + top: -5, + child: InkWell( + onTap: () async { + removePhoto(); + }, + child: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + border: Border.all(color: context.theme.colorScheme.background, width: 1), + shape: BoxShape.circle, + color: context.theme.colorScheme.tertiaryContainer, + ), + child: Icon( + Icons.close, + color: context.theme.colorScheme.onTertiaryContainer, + size: 20, + ), + ), + ), + ) : const SizedBox.shrink()), + ], + ), + ), + if (iOS) + Padding( + padding: const EdgeInsets.only(top: 12.0), + child: Center( + child: RichText( + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + text: TextSpan( + style: context.theme.textTheme.headlineMedium!.copyWith( + fontWeight: FontWeight.bold, + color: context.theme.colorScheme.onBackground, + ), + children: MessageHelper.buildEmojiText( + ss.settings.redactedMode.value && ss.settings.hideContactInfo.value + ? "User Name" : ss.settings.userName.value, + context.theme.textTheme.headlineMedium!.copyWith( + fontWeight: FontWeight.bold, + color: context.theme.colorScheme.onBackground, + ), + ), + ), + ), + ), + ), + if (iOS) + Padding( + padding: const EdgeInsets.only(top: 2.0), + child: Center( + child: RichText( + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + text: TextSpan( + style: context.theme.textTheme.bodyMedium!.apply(color: context.theme.colorScheme.outline), + children: MessageHelper.buildEmojiText( + ss.settings.redactedMode.value && ss.settings.hideContactInfo.value + ? "User iCloud" + : ss.settings.iCloudAccount.isEmpty + ? "Unknown iCloud account" + : ss.settings.iCloudAccount.value, + context.theme.textTheme.bodyMedium!.apply(color: context.theme.colorScheme.outline) + ), + ), + ), + ), + ), + if (iOS) + Center( + child: TextButton( + child: Text( + "Change Name", + style: context.theme.textTheme.bodyMedium!.apply(color: context.theme.colorScheme.primary), + textScaler: const TextScaler.linear(1.15), + ), + onPressed: () async { + updateName(); + }, + ), + ), + if (!iOS) + Padding( + padding: const EdgeInsets.only(left: 15.0, bottom: 5.0), + child: Text( + "YOUR NAME AND PHOTO", + style: context.theme.textTheme.bodyMedium!.copyWith(color: context.theme.colorScheme.outline) + ), + ), + if (!iOS) + Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: Material( + color: Colors.transparent, + child: ListTile( + mouseCursor: MouseCursor.defer, + leading: ContactAvatarWidget( + handle: null, + borderThickness: 0.1, + editable: false, + fontSize: 22, + size: 50, + ), + onTap: () async { + updateName(); + }, + title: RichText( + text: TextSpan( + style: context.theme.textTheme.bodyLarge, + children: MessageHelper.buildEmojiText( + ss.settings.redactedMode.value && ss.settings.hideContactInfo.value + ? "User Name" : ss.settings.userName.value, + context.theme.textTheme.bodyLarge!, + ), + ), + ), + subtitle: Text(ss.settings.redactedMode.value && ss.settings.hideContactInfo.value + ? "User iCloud" + : ss.settings.iCloudAccount.isEmpty + ? "Unknown iCloud account" + : ss.settings.iCloudAccount.value, style: context.theme.textTheme.bodyMedium!.apply(color: context.theme.colorScheme.outline)), + trailing: Icon(Icons.edit_outlined, color: context.theme.colorScheme.onBackground), + ), + ), + ), + if (!iOS) + Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: Material( + color: Colors.transparent, + child: ListTile( + mouseCursor: MouseCursor.defer, + onTap: () async { + updatePhoto(); + }, + title: Text("Update your photo", style: context.theme.textTheme.bodyLarge!), + trailing: Icon(Icons.edit_outlined, color: context.theme.colorScheme.onBackground), + ), + ), + ), + if (!iOS) + Obx(() => ss.settings.userAvatarPath.value != null ? Padding( + padding: const EdgeInsets.only(bottom: 5.0), + child: Material( + color: Colors.transparent, + child: ListTile( + mouseCursor: MouseCursor.defer, + onTap: () async { + removePhoto(); + }, + title: Text("Remove your photo", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.error)), + trailing: Icon(Icons.close, color: context.theme.colorScheme.error), + ), + ), + ) : const SizedBox.shrink()), + if (accountInfo.isNotEmpty) + SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "iCloud Account Info"), + if (accountInfo.isNotEmpty) + SettingsSection( + backgroundColor: tileColor, + children: [ + Obx(() { + bool redact = ss.settings.redactedMode.value; + return Container( + child: Padding( + padding: const EdgeInsets.only(bottom: 8.0, left: 15, top: 8.0, right: 15), + child: AnimatedOpacity( + duration: const Duration(milliseconds: 300), + opacity: opacity.value, + child: SelectableText.rich( + TextSpan(children: [ + TextSpan(text: redact ? "Account Name - Apple ID" : "${accountInfo['account_name']} - ${accountInfo['apple_id']}"), + const TextSpan(text: "\n\n"), + const TextSpan(text: "iMessage Status: "), + TextSpan( + text: accountInfo['login_status_message'].toUpperCase(), + style: TextStyle(color: getIndicatorColor(accountInfo['login_status_message'] == "Connected" ? SocketState.connected : SocketState.disconnected))), + const TextSpan(text: "\n\n"), + const TextSpan(text: "SMS Forwarding Status: "), + TextSpan( + text: accountInfo['sms_forwarding_enabled'] == true ? "ENABLED" : "DISABLED", + style: TextStyle(color: getIndicatorColor(accountInfo['sms_forwarding_enabled'] == true ? SocketState.connected : SocketState.disconnected))), + const TextSpan(text: " | "), + TextSpan( + text: accountInfo['sms_forwarding_capable'] == true ? "CAPABLE" : "INCAPABLE", + style: TextStyle(color: getIndicatorColor(accountInfo['sms_forwarding_capable'] == true ? SocketState.connected : SocketState.disconnected))), + const TextSpan(text: "\n\n"), + const TextSpan(text: "VETTED ALIASES\n", style: TextStyle(fontWeight: FontWeight.w700)), + ...accountInfo['vetted_aliases'].map((e) => TextSpan(text: redact ? "Alias" : "${e['Alias']}${e['Status'] == 3 ? " - Active" : ""}\n")), + const TextSpan(text: "\n"), + const TextSpan(text: "Tap to update values...", style: TextStyle(fontStyle: FontStyle.italic)), + ]), + onTap: () { + opacity.value = 0.0; + getDetails(); + }, + ), + ), + )); + }), + ], + ), + if (accountContact.isNotEmpty) + SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "iMessage Contact Card"), + if (accountContact.isNotEmpty) + SettingsSection( + backgroundColor: tileColor, + children: [ + SettingsTile( + leading: ContactAvatarWidget( + handle: null, + contact: Contact(id: randomString(9), displayName: "", avatar: base64Decode(accountContact['avatar'])), + ), + title: accountContact['name'], + subtitle: "Your sharable iMessage contact card", + ), + const SettingsSubtitle(subtitle: "Visit iMessage settings on your Mac to update.") + ], + ), + ], + ), + ), + const SliverPadding( + padding: EdgeInsets.only(top: 50), + ), + ], + ); + } +} diff --git a/lib/app/layouts/settings/pages/server/server_management_panel.dart b/lib/app/layouts/settings/pages/server/server_management_panel.dart index 5648bbb64..927f44940 100644 --- a/lib/app/layouts/settings/pages/server/server_management_panel.dart +++ b/lib/app/layouts/settings/pages/server/server_management_panel.dart @@ -29,7 +29,6 @@ import 'package:qr_flutter/qr_flutter.dart'; import 'package:universal_html/html.dart' as html; import 'package:universal_io/io.dart'; import 'package:version/version.dart'; -import 'package:bluebubbles/utils/logger.dart'; class ServerManagementPanelController extends StatefulController { final RxnInt latency = RxnInt(); @@ -43,7 +42,6 @@ class ServerManagementPanelController extends StatefulController { final RxnString proxyService = RxnString(); final RxnDouble timeSync = RxnDouble(); final RxMap stats = RxMap({}); - final RxList accountAliases = RxList(); final RxBool hasAccountInfo = RxBool(false); // Restart trackers @@ -98,21 +96,6 @@ class ServerManagementPanelController extends StatefulController { }) ); - if (privateAPIStatus.value) { - subsequentRequests.add( - http.getAccountInfo().then((response) { - if (response.data['status'] == 200) { - accountAliases.clear(); - final aliases = ((response.data['data']['vetted_aliases'] ?? []) as List).map((a) => a['Alias'] as String); - accountAliases.addAll(aliases); - - hasAccountInfo.value = true; - } - }) - .catchError((e) { Logger.debug("Failed to get account info $e"); }) - ); - } - Future.wait(subsequentRequests) .whenComplete(() => opacity.value = 1.0); }).catchError((_) { @@ -301,55 +284,6 @@ class _ServerManagementPanelState extends CustomState AnimatedSizeAndFade.showHide( - show: controller.hasAccountInfo.value, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - SettingsTile( - title: "Show Account Info", - subtitle: "View iMessage account info", - leading: const SettingsLeadingIcon( - iosIcon: CupertinoIcons.person, - materialIcon: Icons.person, - ), - onTap: () { - showDialog( - context: context, - builder: (context) => AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - content: Padding( - padding: const EdgeInsets.only(bottom: 8.0, left: 15, top: 8.0, right: 15), - child: SelectableText.rich( - TextSpan(children: [ - TextSpan(text: "Vetted Aliases (${controller.accountAliases.length}):\n\t ${ss.settings.redactedMode.value ? "Redacted" : controller.accountAliases.join("\n\t")}"), - ]), - style: context.theme.textTheme.bodyLarge, - ), - ), - title: Text("Account Info", style: context.theme.textTheme.titleLarge), - actions: [ - TextButton( - child: Text("Dismiss", - style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - ], - ) - ); - }, - ), - Container( - color: tileColor, - child: Padding( - padding: const EdgeInsets.only(left: 65.0), - child: SettingsDivider(color: context.theme.colorScheme.surfaceVariant), - ), - ) - ], - ))), if (!ss.fcmData.isNull) SettingsTile( title: "Show QR Code", diff --git a/lib/app/layouts/settings/settings_page.dart b/lib/app/layouts/settings/settings_page.dart index 153088798..18051ef14 100644 --- a/lib/app/layouts/settings/settings_page.dart +++ b/lib/app/layouts/settings/settings_page.dart @@ -1,10 +1,9 @@ import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; import 'package:bluebubbles/app/layouts/settings/pages/advanced/tasker_panel.dart'; +import 'package:bluebubbles/app/layouts/settings/pages/profile/profile_panel.dart'; import 'package:bluebubbles/app/layouts/settings/pages/scheduling/message_reminders_panel.dart'; import 'package:bluebubbles/app/layouts/settings/pages/server/backup_restore_panel.dart'; -import 'package:bluebubbles/app/layouts/settings/pages/theming/avatar/avatar_crop.dart'; -import 'package:bluebubbles/app/wrappers/theme_switcher.dart'; import 'package:bluebubbles/utils/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/app/layouts/settings/pages/misc/about_panel.dart'; @@ -120,125 +119,22 @@ class _SettingsPageState extends OptimizedState { backgroundColor: tileColor, title: ss.settings.redactedMode.value && ss.settings.hideContactInfo.value ? "User Name" : ss.settings.userName.value, - subtitle: ss.settings.redactedMode.value && ss.settings.hideContactInfo.value - ? "User iCloud" - : ss.settings.iCloudAccount.isEmpty - ? "Unknown iCloud account" - : ss.settings.iCloudAccount.value, + subtitle: "Tap to view more details", onTap: () { - final nameController = TextEditingController(text: ss.settings.userName.value); - done() { - if (nameController.text.isEmpty) { - showSnackbar("Error", "Enter a name!"); - return; - } - Get.back(); - ss.settings.userName.value = nameController.text; - ss.settings.save(); - } - showDialog( - context: context, - builder: (_) { - return AlertDialog( - actions: [ - TextButton( - child: Text("Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () => Get.back(), - ), - TextButton( - child: Text("OK", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () async { - done.call(); - }, - ), - ], - content: TextField( - controller: nameController, - onSubmitted: (_) => done.call(), - autofocus: true, - decoration: const InputDecoration( - labelText: "Name", - border: OutlineInputBorder(), - ), - ), - title: Text("User Profile Name", style: context.theme.textTheme.titleLarge), - backgroundColor: context.theme.colorScheme.properSurface, - ); - } + ns.pushAndRemoveSettingsUntil( + context, + ProfilePanel(), + (route) => route.isFirst, ); }, - leading: GestureDetector( - onTap: () { - final path = ss.settings.userAvatarPath.value; - if (path != null) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: context.theme.colorScheme.properSurface, - title: Text( - "Profile Avatar", - style: context.theme.textTheme.titleLarge - ), - content: Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "You already have a profile avatar set. What would you like to do?", - style: context.theme.textTheme.bodyLarge, - ), - ], - ), - actions: [ - TextButton( - child: Text("Cancel", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - TextButton( - child: Text("Reset", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - File file = File(path); - file.delete(); - ss.settings.userAvatarPath.value = null; - ss.saveSettings(); - Get.back(); - }, - ), - TextButton( - child: Text("Set New", style: context.theme.textTheme.bodyLarge!.copyWith(color: context.theme.colorScheme.primary)), - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).push( - ThemeSwitcher.buildPageRoute( - builder: (context) => AvatarCrop(), - ), - ); - }, - ), - ] - ); - }, - ); - } else { - Navigator.of(context).push( - ThemeSwitcher.buildPageRoute( - builder: (context) => AvatarCrop(), - ), - ); - } - }, - child: ContactAvatarWidget( - handle: null, - borderThickness: 0.1, - editable: false, - fontSize: 22, - size: 50, - ), + leading: ContactAvatarWidget( + handle: null, + borderThickness: 0.1, + editable: false, + fontSize: 22, + size: 50, ), + trailing: nextIcon, ), ], ), diff --git a/lib/services/network/http_service.dart b/lib/services/network/http_service.dart index 6c172d8e7..169127354 100644 --- a/lib/services/network/http_service.dart +++ b/lib/services/network/http_service.dart @@ -1104,6 +1104,28 @@ class HttpService extends GetxService { }); } + Future getAccountContact({CancelToken? cancelToken}) async { + return runApiGuarded(() async { + final response = await dio.get( + "$apiRoot/icloud/contact", + queryParameters: buildQueryParams(), + cancelToken: cancelToken, + ); + return returnSuccessOrError(response); + }); + } + + Future setAccountAlias({CancelToken? cancelToken}) async { + return runApiGuarded(() async { + final response = await dio.post( + "$apiRoot/icloud/account/alias", + queryParameters: buildQueryParams(), + cancelToken: cancelToken, + ); + return returnSuccessOrError(response); + }); + } + Future downloadFromUrl(String url, {Function(int, int)? progress, CancelToken? cancelToken}) async { return runApiGuarded(() async { final response = await dio.get( From 1a058c072460f2784bd1257f3c24579b9f6668ee Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 00:06:52 -0500 Subject: [PATCH 052/118] Support setting default alias to use --- .../settings/pages/profile/profile_panel.dart | 26 +++++++++++++++++++ lib/services/network/http_service.dart | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index f34060091..ddbfc16eb 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -351,6 +351,32 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin ), )); }), + if (accountInfo['active_alias'] != null) + Container( + color: tileColor, + child: Padding( + padding: const EdgeInsets.only(left: 15.0), + child: SettingsDivider(color: context.theme.colorScheme.surfaceVariant), + ), + ), + if (accountInfo['active_alias'] != null) + SettingsOptions( + title: "Start Chats Using", + initial: accountInfo['active_alias'], + clampWidth: false, + options: accountInfo['vetted_aliases'].map((e) => e['Alias'].toString()).toList().cast(), + secondaryColor: headerColor, + useCupertino: false, + textProcessing: (str) => str, + capitalize: false, + onChanged: (value) async { + if (value == null) return; + accountInfo['active_alias'] = value; + setState(() {}); + await http.setAccountAlias(value); + + }, + ), ], ), if (accountContact.isNotEmpty) diff --git a/lib/services/network/http_service.dart b/lib/services/network/http_service.dart index 169127354..ed7733e28 100644 --- a/lib/services/network/http_service.dart +++ b/lib/services/network/http_service.dart @@ -1115,10 +1115,11 @@ class HttpService extends GetxService { }); } - Future setAccountAlias({CancelToken? cancelToken}) async { + Future setAccountAlias(String alias, {CancelToken? cancelToken}) async { return runApiGuarded(() async { final response = await dio.post( "$apiRoot/icloud/account/alias", + data: {"alias": alias}, queryParameters: buildQueryParams(), cancelToken: cancelToken, ); From 9adc773c069625fbb729d9cdac450c1e70c8548f Mon Sep 17 00:00:00 2001 From: Zach Shames Date: Fri, 26 Jan 2024 11:05:37 -0500 Subject: [PATCH 053/118] removes unused import --- .../backend/java_dart_interop/method_channel_service.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index c2f285978..e5ba452a5 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:convert'; import 'package:bluebubbles/utils/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; From a64694e10e813504914993660ecaf918fe509c97 Mon Sep 17 00:00:00 2001 From: Zach Shames Date: Fri, 26 Jan 2024 11:09:58 -0500 Subject: [PATCH 054/118] removes more unused dependencies --- lib/services/ui/theme/themes_service.dart | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/services/ui/theme/themes_service.dart b/lib/services/ui/theme/themes_service.dart index 147f65357..51c97b34d 100644 --- a/lib/services/ui/theme/themes_service.dart +++ b/lib/services/ui/theme/themes_service.dart @@ -1,12 +1,9 @@ -import 'dart:math'; - import 'package:adaptive_theme/adaptive_theme.dart'; import 'package:bluebubbles/helpers/types/constants.dart'; import 'package:bluebubbles/helpers/ui/theme_helpers.dart'; import 'package:bluebubbles/app/components/custom/custom_bouncing_scroll_physics.dart'; import 'package:bluebubbles/models/models.dart'; import 'package:bluebubbles/services/services.dart'; -import 'package:bluebubbles/utils/color_engine/engine.dart' as engine; import 'package:collection/collection.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:flex_color_scheme/flex_color_scheme.dart'; From b37ac2bce2808975ef1137734e57edc405c5fb74 Mon Sep 17 00:00:00 2001 From: Zach Shames Date: Fri, 26 Jan 2024 11:11:32 -0500 Subject: [PATCH 055/118] adds extractNativeLibs to reduce apk size --- android/app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 6c654e29e..7e9971076 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -59,7 +59,8 @@ android:appCategory="social" android:requestLegacyExternalStorage="true" android:debuggable="false" - android:usesCleartextTraffic="true"> + android:usesCleartextTraffic="true" + android:extractNativeLibs="true"> From 82eda6984146124b53dd40baced00f3a1bfe8386 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 11:13:44 -0500 Subject: [PATCH 056/118] Add dependencies to fix build --- android/app/build.gradle | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 3c800af7b..256a4d998 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -136,24 +136,31 @@ flutter { } dependencies { + // Android native functions implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "androidx.core:core-ktx:1.12.0" implementation "androidx.sharetarget:sharetarget:1.2.0" implementation 'androidx.browser:browser:1.7.0' implementation 'androidx.activity:activity-ktx:1.8.2' + implementation "androidx.work:work-runtime:2.9.0" - // Add the SDK for Firebase Cloud Messaging + // Firebase items implementation 'com.google.firebase:firebase-messaging:23.4.0' implementation 'com.google.firebase:firebase-database:20.3.0' implementation 'com.google.firebase:firebase-messaging-directboot:23.4.0' implementation 'com.google.firebase:firebase-iid:21.1.0' implementation 'com.google.firebase:firebase-firestore:24.10.1' - // for workmanager - implementation "androidx.work:work-runtime:2.9.0" - - // kotlin coroutines + // Kotlin Coroutines (async) implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3" + + // Socket IO + implementation ('io.socket:socket.io-client:2.0.0') { + exclude group: 'org.json', module: 'json' + } + + // JSON parsing + implementation 'com.google.code.gson:gson:2.10.1' } From d19ddca3fbdbfb92f9451cc2359147a0236f85e6 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 11:21:40 -0500 Subject: [PATCH 057/118] Use dots to indicate vetted alias status --- lib/app/layouts/settings/pages/profile/profile_panel.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index ddbfc16eb..d0fdf5b1b 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -9,6 +9,7 @@ import 'package:bluebubbles/app/layouts/settings/widgets/settings_widgets.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/models/models.dart'; import 'package:bluebubbles/services/services.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:universal_io/io.dart'; @@ -339,7 +340,10 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin style: TextStyle(color: getIndicatorColor(accountInfo['sms_forwarding_capable'] == true ? SocketState.connected : SocketState.disconnected))), const TextSpan(text: "\n\n"), const TextSpan(text: "VETTED ALIASES\n", style: TextStyle(fontWeight: FontWeight.w700)), - ...accountInfo['vetted_aliases'].map((e) => TextSpan(text: redact ? "Alias" : "${e['Alias']}${e['Status'] == 3 ? " - Active" : ""}\n")), + ...(accountInfo['vetted_aliases'] as List).map((e) => [ + TextSpan(text: "⬤ ", style: TextStyle(color: getIndicatorColor(e['Status'] == 3 ? SocketState.connected : SocketState.disconnected))), + TextSpan(text: redact ? "Alias" : "${e['Alias']}\n") + ]).toList().flattened, const TextSpan(text: "\n"), const TextSpan(text: "Tap to update values...", style: TextStyle(fontStyle: FontStyle.italic)), ]), @@ -374,7 +378,6 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin accountInfo['active_alias'] = value; setState(() {}); await http.setAccountAlias(value); - }, ), ], From 2492ad3f56a2573ac3964c1d07cc35d1f38ca6ff Mon Sep 17 00:00:00 2001 From: Zach Shames Date: Fri, 26 Jan 2024 12:09:17 -0500 Subject: [PATCH 058/118] adds skeleton loader for profile panel --- .../settings/pages/profile/profile_panel.dart | 51 ++++++++++--------- pubspec.lock | 8 +++ pubspec.yaml | 1 + 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index d0fdf5b1b..78fa245a4 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'dart:typed_data'; import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; import 'package:bluebubbles/app/layouts/settings/pages/theming/avatar/avatar_crop.dart'; @@ -12,6 +13,7 @@ import 'package:bluebubbles/services/services.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:skeletonizer/skeletonizer.dart'; import 'package:universal_io/io.dart'; class ProfilePanel extends StatefulWidget { @@ -304,13 +306,13 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin ), ), ) : const SizedBox.shrink()), - if (accountInfo.isNotEmpty) - SettingsHeader( - iosSubtitle: iosSubtitle, - materialSubtitle: materialSubtitle, - text: "iCloud Account Info"), - if (accountInfo.isNotEmpty) - SettingsSection( + SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "iCloud Account Info"), + Skeletonizer( + enabled: accountInfo.isEmpty, + child: SettingsSection( backgroundColor: tileColor, children: [ Obx(() { @@ -324,12 +326,12 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin child: SelectableText.rich( TextSpan(children: [ TextSpan(text: redact ? "Account Name - Apple ID" : "${accountInfo['account_name']} - ${accountInfo['apple_id']}"), - const TextSpan(text: "\n\n"), - const TextSpan(text: "iMessage Status: "), + const TextSpan(text: "\n"), + const TextSpan(text: "iMessage Status: ", style: TextStyle(height: 3.0)), TextSpan( - text: accountInfo['login_status_message'].toUpperCase(), + text: accountInfo['login_status_message']?.toUpperCase(), style: TextStyle(color: getIndicatorColor(accountInfo['login_status_message'] == "Connected" ? SocketState.connected : SocketState.disconnected))), - const TextSpan(text: "\n\n"), + const TextSpan(text: "\n"), const TextSpan(text: "SMS Forwarding Status: "), TextSpan( text: accountInfo['sms_forwarding_enabled'] == true ? "ENABLED" : "DISABLED", @@ -338,9 +340,9 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin TextSpan( text: accountInfo['sms_forwarding_capable'] == true ? "CAPABLE" : "INCAPABLE", style: TextStyle(color: getIndicatorColor(accountInfo['sms_forwarding_capable'] == true ? SocketState.connected : SocketState.disconnected))), - const TextSpan(text: "\n\n"), - const TextSpan(text: "VETTED ALIASES\n", style: TextStyle(fontWeight: FontWeight.w700)), - ...(accountInfo['vetted_aliases'] as List).map((e) => [ + const TextSpan(text: "\n"), + const TextSpan(text: "VETTED ALIASES\n", style: TextStyle(fontWeight: FontWeight.w700, height: 3.0)), + ...((accountInfo['vetted_aliases'] as List? ?? [])).map((e) => [ TextSpan(text: "⬤ ", style: TextStyle(color: getIndicatorColor(e['Status'] == 3 ? SocketState.connected : SocketState.disconnected))), TextSpan(text: redact ? "Alias" : "${e['Alias']}\n") ]).toList().flattened, @@ -382,19 +384,21 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin ), ], ), - if (accountContact.isNotEmpty) - SettingsHeader( - iosSubtitle: iosSubtitle, - materialSubtitle: materialSubtitle, - text: "iMessage Contact Card"), - if (accountContact.isNotEmpty) - SettingsSection( + ), + SettingsHeader( + iosSubtitle: iosSubtitle, + materialSubtitle: materialSubtitle, + text: "iMessage Contact Card"), + Skeletonizer( + enabled: accountContact.isEmpty, + + child: SettingsSection( backgroundColor: tileColor, children: [ SettingsTile( - leading: ContactAvatarWidget( + leading: (accountContact['avatar'] == null) ? const CircleAvatar() : ContactAvatarWidget( handle: null, - contact: Contact(id: randomString(9), displayName: "", avatar: base64Decode(accountContact['avatar'])), + contact: Contact(id: randomString(9), displayName: "", avatar: (accountContact['avatar'] == null) ? Uint8List(0) : base64Decode(accountContact['avatar'])), ), title: accountContact['name'], subtitle: "Your sharable iMessage contact card", @@ -402,6 +406,7 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin const SettingsSubtitle(subtitle: "Visit iMessage settings on your Mac to update.") ], ), + ) ], ), ), diff --git a/pubspec.lock b/pubspec.lock index 32cc52b72..5f09dc707 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2524,6 +2524,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.2" + skeletonizer: + dependency: "direct main" + description: + name: skeletonizer + sha256: "86f373126d9a887a2d63f2463a9913a973ce7f282efa7f0d9d06a17e3f19838c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" sky_engine: dependency: transitive description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 04a61802d..8161ed7eb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -148,6 +148,7 @@ dependencies: shared_preferences: ^2.2.2 shimmer: ^3.0.0 simple_animations: ^5.0.2 + skeletonizer: ^1.0.1 sliding_up_panel2: ^3.2.0+2 slugify: ^2.0.0 smooth_page_indicator: ^1.0.1 From 13e0a39c618b63ecaad38c6c7e369088781f3620 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 17:22:19 -0500 Subject: [PATCH 059/118] Better handling of null contact card --- lib/app/layouts/settings/pages/profile/profile_panel.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index d0fdf5b1b..b7a020030 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -382,19 +382,19 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin ), ], ), - if (accountContact.isNotEmpty) + if (!isNullOrEmpty(accountContact['name'])!) SettingsHeader( iosSubtitle: iosSubtitle, materialSubtitle: materialSubtitle, text: "iMessage Contact Card"), - if (accountContact.isNotEmpty) + if (!isNullOrEmpty(accountContact['name'])!) SettingsSection( backgroundColor: tileColor, children: [ SettingsTile( leading: ContactAvatarWidget( handle: null, - contact: Contact(id: randomString(9), displayName: "", avatar: base64Decode(accountContact['avatar'])), + contact: isNullOrEmpty(accountContact['avatar'])! ? null : Contact(id: randomString(9), displayName: "", avatar: base64Decode(accountContact['avatar'])), ), title: accountContact['name'], subtitle: "Your sharable iMessage contact card", From ee6e137048f9d5e988ba076b9127e2136c7857d5 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 17:48:24 -0500 Subject: [PATCH 060/118] Improve reply bubble display with a huge message --- .../widgets/message/reply/reply_bubble.dart | 203 +++++++++--------- 1 file changed, 105 insertions(+), 98 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart b/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart index 81d6dd180..593f54a36 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reply/reply_bubble.dart @@ -92,115 +92,122 @@ class _ReplyBubbleState extends CustomState(0.8), + axisAlignment: 0, + child: Align( + alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + alignment: message.isFromMe! ? Alignment.centerRight : Alignment.centerLeft, + child: MouseRegion( + cursor: SystemMouseCursors.click, + child: GestureDetector( + onTap: () { + showReplyThread(context, message, part, ms(controller.cvController?.chat.guid ?? cm.activeChat!.chat.guid), widget.cvController); + }, + behavior: HitTestBehavior.opaque, + child: IgnorePointer( + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + if (widget.showAvatar) + ContactAvatarWidget( + handle: message.handle, + size: 30, + fontSize: context.theme.textTheme.bodyLarge!.fontSize!, + borderThickness: 0.1, + ), + ClipPath( + clipper: TailClipper( isFromMe: message.isFromMe!, showTail: true, - color: context.theme.colorScheme.errorContainer, + connectUpper: false, + connectLower: false, ), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15).add(EdgeInsets.only(left: message.isFromMe! ? 0 : 10, right: message.isFromMe! ? 10 : 0)), - child: Text( - "Failed to parse thread parts!", - style: (context.theme.extensions[BubbleText] as BubbleText).bubbleText.apply( - color: context.theme.colorScheme.onErrorContainer, + child: controller.parts.length <= widget.part ? Container( + constraints: BoxConstraints( + maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 30, + minHeight: 30, + ), + child: CustomPaint( + painter: TailPainter( + isFromMe: message.isFromMe!, + showTail: true, + color: context.theme.colorScheme.errorContainer, + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15).add(EdgeInsets.only(left: message.isFromMe! ? 0 : 10, right: message.isFromMe! ? 10 : 0)), + child: Text( + "Failed to parse thread parts!", + style: (context.theme.extensions[BubbleText] as BubbleText).bubbleText.apply( + color: context.theme.colorScheme.onErrorContainer, + ), + ), ), ), - ), - ), - ) : message.hasApplePayloadData || message.isLegacyUrlPreview || message.isInteractive ? ConstrainedBox( - constraints: const BoxConstraints(maxHeight: 100), - child: ReplyScope( - child: InteractiveHolder( - parentController: controller, - message: part, - ), - ), - ) : part.attachments.isEmpty ? Container( - constraints: BoxConstraints( - maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 30, - minHeight: 30, - ), - child: CustomPaint( - painter: TailPainter( - isFromMe: message.isFromMe!, - showTail: true, - color: message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor(), - ), - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15).add(EdgeInsets.only(left: message.isFromMe! ? 0 : 10, right: message.isFromMe! ? 10 : 0)), - child: FutureBuilder>( - future: buildEnrichedMessageSpans( - context, - part, - message, - colorOverride: (message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor()).themeLightenOrDarken(context, 30), + ) : message.hasApplePayloadData || message.isLegacyUrlPreview || message.isInteractive ? ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 100), + child: ReplyScope( + child: InteractiveHolder( + parentController: controller, + message: part, ), - initialData: buildMessageSpans( - context, - part, - message, - colorOverride: (message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor()).themeLightenOrDarken(context, 30), + ), + ) : part.attachments.isEmpty ? Container( + constraints: BoxConstraints( + maxWidth: ns.width(context) * MessageWidgetController.maxBubbleSizeFactor - 30, + minHeight: 30, + ), + child: CustomPaint( + painter: TailPainter( + isFromMe: message.isFromMe!, + showTail: true, + color: message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor(), + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15).add(EdgeInsets.only(left: message.isFromMe! ? 0 : 10, right: message.isFromMe! ? 10 : 0)), + child: FutureBuilder>( + future: buildEnrichedMessageSpans( + context, + part, + message, + colorOverride: (message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor()).themeLightenOrDarken(context, 30), + ), + initialData: buildMessageSpans( + context, + part, + message, + colorOverride: (message.isFromMe! ? context.theme.colorScheme.primary : getBubbleColor()).themeLightenOrDarken(context, 30), + ), + builder: (context, snapshot) { + if (snapshot.data != null) { + return RichText( + text: TextSpan( + children: snapshot.data!, + ), + ); + } + return const SizedBox.shrink(); + } + ), + ), + ), + ) : ConstrainedBox( + constraints: const BoxConstraints(maxHeight: 100), + child: ReplyScope( + child: AttachmentHolder( + parentController: controller, + message: part, ), - builder: (context, snapshot) { - if (snapshot.data != null) { - return RichText( - text: TextSpan( - children: snapshot.data!, - ), - ); - } - return const SizedBox.shrink(); - } ), ), ), - ) : ConstrainedBox( - constraints: const BoxConstraints(maxHeight: 100), - child: ReplyScope( - child: AttachmentHolder( - parentController: controller, - message: part, - ), - ), - ), + ], ), - ], + ), ), ), ), From 2e520cb4746622e9d4b175ac40455c74cc077c62 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Fri, 26 Jan 2024 17:48:46 -0500 Subject: [PATCH 061/118] Remove contact card section if the user does not have one configured --- lib/app/layouts/settings/pages/profile/profile_panel.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index 50d322208..c95c20a63 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -1,6 +1,4 @@ - import 'dart:convert'; -import 'dart:typed_data'; import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; import 'package:bluebubbles/app/layouts/settings/pages/theming/avatar/avatar_crop.dart'; @@ -383,7 +381,7 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin }, ), ], - ), + )), if (!isNullOrEmpty(accountContact['name'])!) SettingsHeader( iosSubtitle: iosSubtitle, @@ -404,7 +402,6 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin const SettingsSubtitle(subtitle: "Visit iMessage settings on your Mac to update.") ], ), - ) ], ), ), From 58eda0107094dc452fea06ce08c5773c39e17328 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sat, 27 Jan 2024 14:42:33 -0500 Subject: [PATCH 062/118] try/catch all FCM handlers --- .../method_channel_service.dart | 193 ++++++++++++------ 1 file changed, 126 insertions(+), 67 deletions(-) diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index e5ba452a5..95490dd1c 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -57,29 +57,41 @@ class MethodChannelService extends GetxService { case "new-message": await storeStartup.future; Logger.info("Received new message from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - final item = IncomingItem.fromMap(QueueType.newMessage, payload.data); - if (ls.isAlive) { - await inq.queue(item); - } else { - await ah.handleNewMessage(item.chat, item.message, item.tempGuid); + try { + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + final item = IncomingItem.fromMap(QueueType.newMessage, payload.data); + if (ls.isAlive) { + await inq.queue(item); + } else { + await ah.handleNewMessage(item.chat, item.message, item.tempGuid); + } } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "updated-message": await storeStartup.future; Logger.info("Received updated message from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); - if (ls.isAlive) { - await inq.queue(item); - } else { - await ah.handleUpdatedMessage(item.chat, item.message, item.tempGuid); + try { + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); + if (ls.isAlive) { + await inq.queue(item); + } else { + await ah.handleUpdatedMessage(item.chat, item.message, item.tempGuid); + } } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "group-name-change": @@ -87,35 +99,53 @@ class MethodChannelService extends GetxService { case "participant-added": case "participant-left": await storeStartup.future; - Logger.info("Received ${call.method} from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); - await ah.handleNewOrUpdatedChat(item.chat); + try { + Logger.info("Received ${call.method} from FCM"); + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); + await ah.handleNewOrUpdatedChat(item.chat); + } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "group-icon-changed": await storeStartup.future; - Logger.info("Received group icon change from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - final guid = payload.data["chats"].first["guid"]; - final chat = Chat.findOne(guid: guid); - if (chat != null) { - await Chat.getIcon(chat); + try { + Logger.info("Received group icon change from FCM"); + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + final guid = payload.data["chats"].first["guid"]; + final chat = Chat.findOne(guid: guid); + if (chat != null) { + await Chat.getIcon(chat); + } } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "scheduled-message-error": Logger.info("Received scheduled message error from FCM"); - Map? data = call.arguments?.cast(); - if (data == null) return true; - final payload = ServerPayload.fromJson(data); - Chat? chat = Chat.findOne(guid: payload.data["payload"]["chatGuid"]); - if (chat != null) { - await notif.createFailedToSend(chat, scheduled: true); + try { + Map? data = call.arguments?.cast(); + if (data == null) return true; + final payload = ServerPayload.fromJson(data); + Chat? chat = Chat.findOne(guid: payload.data["payload"]["chatGuid"]); + if (chat != null) { + await notif.createFailedToSend(chat, scheduled: true); + } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "ReplyChat": @@ -154,31 +184,43 @@ class MethodChannelService extends GetxService { if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received markAsRead from Kotlin"); - final data = call.arguments as Map?; - if (data != null) { - Chat? chat = Chat.findOne(guid: data["chatGuid"]); - if (chat != null) { - chat.toggleHasUnread(false); - return true; + try { + final data = call.arguments as Map?; + if (data != null) { + Chat? chat = Chat.findOne(guid: data["chatGuid"]); + if (chat != null) { + chat.toggleHasUnread(false); + return true; + } } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return false; case "chat-read-status-changed": if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received chat status change from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - Chat? chat = Chat.findOne(guid: payload.data["chatGuid"]); - if (chat == null || (payload.data["read"] != true && payload.data["read"] != false)) { - return false; + try { + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + Chat? chat = Chat.findOne(guid: payload.data["chatGuid"]); + if (chat == null || (payload.data["read"] != true && payload.data["read"] != false)) { + return false; + } else { + chat.toggleHasUnread(!payload.data["read"]!, privateMark: false); + return true; + } } else { - chat.toggleHasUnread(!payload.data["read"]!, privateMark: false); - return true; + return false; } - } else { - return false; + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } case "MediaColors": await storeStartup.future; @@ -192,20 +234,32 @@ class MethodChannelService extends GetxService { case "incoming-facetime": await storeStartup.future; Logger.info("Received legacy incoming facetime from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - await ActionHandler().handleIncomingFaceTimeCallLegacy(payload.data); + try { + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + await ActionHandler().handleIncomingFaceTimeCallLegacy(payload.data); + } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "ft-call-status-changed": if (ls.isAlive) return true; await storeStartup.future; Logger.info("Received facetime call status change from FCM"); - Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - await ActionHandler().handleFaceTimeStatusChange(payload.data); + try { + Map? data = call.arguments?.cast(); + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + await ActionHandler().handleFaceTimeStatusChange(payload.data); + } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } return true; case "answer-facetime": @@ -214,14 +268,19 @@ class MethodChannelService extends GetxService { return true; case "imessage-aliases-removed": Map? data = call.arguments?.cast(); - if (!isNullOrEmpty(data)!) { - final payload = ServerPayload.fromJson(data!); - Logger.info("Alias(es) removed ${payload.data["aliases"]}"); - await notif.createAliasesRemovedNotification((payload.data["aliases"] as List).cast()); - } else { - Logger.warn("Aliases removed data empty or null"); + try { + if (!isNullOrEmpty(data)!) { + final payload = ServerPayload.fromJson(data!); + Logger.info("Alias(es) removed ${payload.data["aliases"]}"); + await notif.createAliasesRemovedNotification((payload.data["aliases"] as List).cast()); + } else { + Logger.warn("Aliases removed data empty or null"); + } + } catch (e, s) { + Logger.error(e); + Logger.error(s); + return Future.error(PlatformException(code: "500", message: e.toString()), s); } - return true; default: return true; From 03ba84250d61963648bd621562b6d8333b0a7a99 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sat, 27 Jan 2024 15:25:48 -0500 Subject: [PATCH 063/118] Clear auth cache whenever using Google Sign In --- lib/helpers/ui/oauth_helpers.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/helpers/ui/oauth_helpers.dart b/lib/helpers/ui/oauth_helpers.dart index 87b41582f..b953f1428 100644 --- a/lib/helpers/ui/oauth_helpers.dart +++ b/lib/helpers/ui/oauth_helpers.dart @@ -53,6 +53,7 @@ Future googleOAuth(BuildContext context) async { final account = await gsi.signIn(); if (account != null) { // get access token + await account.clearAuthCache(); final auth = await account.authentication; token = auth.accessToken; // make sure scopes were granted on web From fed52ed8ba9c55112020ca33ca9fe94c5ae9afd9 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sat, 27 Jan 2024 16:01:59 -0500 Subject: [PATCH 064/118] Fix cloud firestore URL request issues --- android/app/build.gradle | 8 ++++++++ .../services/firebase/ServerUrlRequestHandler.kt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 256a4d998..6fe6632bc 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -135,6 +135,14 @@ flutter { source '../..' } +// For Cloud Firestore okio error +configurations.all { + resolutionStrategy { + force 'com.squareup.okhttp:okhttp:2.7.5' + force 'com.squareup.okio:okio:1.17.5' + } +} + dependencies { // Android native functions implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt index 46626e5c7..c105cbe96 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/ServerUrlRequestHandler.kt @@ -42,7 +42,7 @@ class ServerUrlRequestHandler: MethodCallHandlerImpl() { if (firebaseApp.options.databaseUrl == null) { CoroutineScope(Dispatchers.Main).launch { val serverUrlTask: Task = FirebaseFirestore.getInstance().collection("server").document("config").get() - val serverUrl: String? = serverUrlTask.await().get("serverUrl", String::class.java) + val serverUrl: String? = serverUrlTask.await().data?.get("serverUrl") as String? submitData(serverUrl, result) } } else { From e6894f91f725119d94cdb222c3dc61f6e493f665 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Sun, 28 Jan 2024 13:15:28 -0500 Subject: [PATCH 065/118] Fix broken notifications --- .../services/backend_ui_interop/DartWorker.kt | 3 +- lib/models/global/server_payload.dart | 2 +- .../method_channel_service.dart | 31 +++++++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt index 573276bbd..f53ee2e28 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/backend_ui_interop/DartWorker.kt @@ -13,7 +13,6 @@ import com.bluebubbles.messaging.MainActivity.Companion.engine import com.bluebubbles.messaging.R import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture -import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.ToNumberPolicy import com.google.gson.reflect.TypeToken @@ -55,7 +54,7 @@ class DartWorker(context: Context, workerParams: WorkerParameters): ListenableWo val gson = GsonBuilder() .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .create() - MethodChannel((engine ?: workerEngine)!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, gson.fromJson(data, TypeToken.get(HashMap::class.java)), object : MethodChannel.Result { + MethodChannel((engine ?: workerEngine)!!.dartExecutor.binaryMessenger, Constants.methodChannel).invokeMethod(method, gson.fromJson(data, TypeToken.getParameterized(HashMap::class.java, String::class.java, Any::class.java).type), object : MethodChannel.Result { override fun success(result: Any?) { Log.d(Constants.logTag, "Worker with method $method completed successfully") completer.set(Result.success()) diff --git a/lib/models/global/server_payload.dart b/lib/models/global/server_payload.dart index fe3769640..5529929b6 100644 --- a/lib/models/global/server_payload.dart +++ b/lib/models/global/server_payload.dart @@ -63,7 +63,7 @@ class ServerPayload { factory ServerPayload.fromJson(Map json) => ServerPayload( originalJson: json, - data: (json["data"] ?? json)?.cast(), + data: ((json["data"] ?? json) is String ? jsonDecode(json["data"] ?? json) : (json["data"] ?? json)).cast(), isLegacy: json.containsKey("type"), type: PayloadType.values.firstWhereOrNull((element) => element.name == json["type"]) ?? PayloadType.OTHER, subtype: json["subtype"], diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 95490dd1c..73f13e650 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:convert'; import 'package:bluebubbles/utils/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; @@ -39,11 +40,13 @@ class MethodChannelService extends GetxService { } Future _callHandler(MethodCall call) async { + final Map? arguments = call.arguments is String ? jsonDecode(call.arguments) : call.arguments?.cast(); switch (call.method) { case "NewServerUrl": + if (arguments == null) return false; await storeStartup.future; // remove brackets from URL - String address = call.arguments["server_url"]; + String address = arguments["server_url"]; String sanitized = sanitizeServerAddress(address: address)!; if (sanitized != ss.settings.serverAddress.value) { ss.settings.serverAddress.value = sanitizeServerAddress(address: address)!; @@ -58,7 +61,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received new message from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final item = IncomingItem.fromMap(QueueType.newMessage, payload.data); @@ -78,7 +81,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received updated message from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); @@ -101,7 +104,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; try { Logger.info("Received ${call.method} from FCM"); - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final item = IncomingItem.fromMap(QueueType.updatedMessage, payload.data); @@ -117,7 +120,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; try { Logger.info("Received group icon change from FCM"); - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); final guid = payload.data["chats"].first["guid"]; @@ -135,7 +138,7 @@ class MethodChannelService extends GetxService { case "scheduled-message-error": Logger.info("Received scheduled message error from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (data == null) return true; final payload = ServerPayload.fromJson(data); Chat? chat = Chat.findOne(guid: payload.data["payload"]["chatGuid"]); @@ -151,7 +154,7 @@ class MethodChannelService extends GetxService { case "ReplyChat": await storeStartup.future; Logger.info("Received reply to message from Kotlin"); - final data = call.arguments as Map?; + final Map? data = arguments; if (data == null) return false; // check and make sure that we aren't sending a duplicate reply final recentReplyGuid = ss.prefs.getString("recent-reply")?.split("/").first; @@ -185,7 +188,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received markAsRead from Kotlin"); try { - final data = call.arguments as Map?; + final Map? data = arguments; if (data != null) { Chat? chat = Chat.findOne(guid: data["chatGuid"]); if (chat != null) { @@ -204,7 +207,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received chat status change from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); Chat? chat = Chat.findOne(guid: payload.data["chatGuid"]); @@ -235,7 +238,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received legacy incoming facetime from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); await ActionHandler().handleIncomingFaceTimeCallLegacy(payload.data); @@ -251,7 +254,7 @@ class MethodChannelService extends GetxService { await storeStartup.future; Logger.info("Received facetime call status change from FCM"); try { - Map? data = call.arguments?.cast(); + Map? data = arguments; if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); await ActionHandler().handleFaceTimeStatusChange(payload.data); @@ -264,10 +267,12 @@ class MethodChannelService extends GetxService { return true; case "answer-facetime": Logger.info("Answering FaceTime call"); - await intents.answerFaceTime(call.arguments["callUuid"]); + final Map? data = arguments; + if (data == null) return false; + await intents.answerFaceTime(data["callUuid"]); return true; case "imessage-aliases-removed": - Map? data = call.arguments?.cast(); + Map? data = arguments; try { if (!isNullOrEmpty(data)!) { final payload = ServerPayload.fromJson(data!); From 3af0ca3d7f33d65d6bdaa47f688beda8ad3ba993 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 30 Jan 2024 11:41:52 -0500 Subject: [PATCH 066/118] Upgrade FindMy panel to support more granular Friends data and work with the new server system --- lib/app/layouts/findmy/findmy_page.dart | 316 +++++++++++++++--------- lib/models/global/findmy_friend.dart | 18 +- lib/services/network/http_service.dart | 12 + 3 files changed, 235 insertions(+), 111 deletions(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 95ed7059d..b7dfe0ace 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -55,20 +55,127 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi bool refreshing = false; bool? fetching2 = true; bool refreshing2 = false; + bool canRefresh = false; @override void initState() { super.initState(); getLocations(); + + socket.socket.on("new-findmy-location", (data) { + try { + final friend = FindMyFriend.fromJson(data); + Logger.info("Received new location for ${friend.handle?.address}"); + final existingFriendIndex = friends.indexWhere((e) => e.handle?.uniqueAddressAndService == friend.handle?.uniqueAddressAndService); + final existingFriend = existingFriendIndex == -1 ? null : friends[existingFriendIndex]; + if (existingFriend == null || existingFriend.status == null || friend.locatingInProgress || LocationStatus.values.indexOf(existingFriend.status!) <= LocationStatus.values.indexOf(friend.status ?? LocationStatus.legacy)) { + Logger.info("Updating map for ${friend.handle?.address}"); + friends[existingFriendIndex] = friend; + buildFriendMarker(friend); + setState(() {}); + } + } catch (_) {} + }); + + // Allow users to refresh after 30sec + Future.delayed(const Duration(seconds: 30), () { + if (mounted) { + setState(() { + canRefresh = true; + }); + } + }); } void getLocations({bool refresh = false}) async { + if (!(Platform.isLinux && !kIsWeb)) { + LocationPermission granted = await Geolocator.checkPermission(); + if (granted == LocationPermission.denied) { + granted = await Geolocator.requestPermission(); + } + if (granted == LocationPermission.whileInUse || granted == LocationPermission.always) { + Geolocator.getCurrentPosition().then((loc) { + location = loc; + buildLocationMarker(location!); + if (!kIsDesktop) { + locationSub = Geolocator.getPositionStream().listen((event) { + setState(() { + buildLocationMarker(event); + }); + }); + } + if (!refresh) { + mapController.move(LatLng(location!.latitude, location!.longitude), 10); + } + }); + } + } + + final response2 = refresh + ? await http.refreshFindMyFriends().catchError((_) async { + setState(() { + refreshing2 = false; + }); + showSnackbar("Error", "Something went wrong refreshing FindMy Friends data!"); + return Response(requestOptions: RequestOptions(path: '')); + }) + : await http.findMyFriends().catchError((_) async { + setState(() { + fetching2 = null; + }); + return Response(requestOptions: RequestOptions(path: '')); + }); + if (response2.statusCode == 200 && response2.data['data'] != null) { + try { + friends = (response2.data['data'] as List) + .map((e) => FindMyFriend.fromJson(e)) + .toList() + .cast(); + for (FindMyFriend e in friends.where((e) => (e.latitude ?? 0) != 0 && (e.longitude ?? 0) != 0)) { + markers[e.handle?.uniqueAddressAndService ?? randomString(6)] = Marker( + key: ValueKey('friend-${e.handle?.uniqueAddressAndService ?? randomString(6)}'), + point: LatLng(e.latitude!, e.longitude!), + width: 35, + height: 35, + child: Container( + decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), + child: Center( + child: Padding( + padding: const EdgeInsets.all(3), + child: + ContactAvatarWidget(editable: false, handle: e.handle ?? Handle(address: e.title ?? "Unknown")), + ), + ), + ), + alignment: Alignment.topCenter, + ); + } + setState(() { + fetching2 = false; + refreshing2 = false; + }); + } catch (e, s) { + Logger.error(e); + Logger.error(s); + setState(() { + fetching2 = null; + refreshing2 = false; + }); + return; + } + } else { + setState(() { + fetching2 = false; + refreshing2 = false; + }); + } + final response = refresh ? await http.refreshFindMyDevices().catchError((_) async { setState(() { refreshing = false; }); - showSnackbar("Error", "Something went wrong refreshing FindMy data!"); + showSnackbar("Error", "Something went wrong refreshing FindMy Devices data!"); return Response(requestOptions: RequestOptions(path: '')); }) : await http.findMyDevices().catchError((_) async { @@ -77,12 +184,6 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi }); return Response(requestOptions: RequestOptions(path: '')); }); - final response2 = await http.findMyFriends().catchError((_) async { - setState(() { - fetching2 = null; - }); - return Response(requestOptions: RequestOptions(path: '')); - }); if (response.statusCode == 200 && response.data['data'] != null) { try { devices = (response.data['data'] as List).map((e) => FindMyDevice.fromJson(e)).toList().cast(); @@ -122,26 +223,6 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi alignment: Alignment.topCenter, ); } - if (!(Platform.isLinux && !kIsWeb)) { - LocationPermission granted = await Geolocator.checkPermission(); - if (granted == LocationPermission.denied) { - granted = await Geolocator.requestPermission(); - } - if (granted == LocationPermission.whileInUse || granted == LocationPermission.always) { - location = await Geolocator.getCurrentPosition(); - buildLocationMarker(location!); - if (!kIsDesktop) { - locationSub = Geolocator.getPositionStream().listen((event) { - setState(() { - buildLocationMarker(event); - }); - }); - } - if (!refresh) { - mapController.move(LatLng(location!.latitude, location!.longitude), 10); - } - } - } setState(() { fetching = false; refreshing = false; @@ -162,52 +243,44 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi }); } - if (response2.statusCode == 200 && response2.data['data'] != null) { - try { - friends = (response2.data['data']['locations'] as List) - .map((e) => FindMyFriend.fromJson(e)) - .toList() - .cast(); - for (FindMyFriend e in friends.where((e) => (e.latitude ?? 0) != 0 && (e.longitude ?? 0) != 0)) { - markers[randomString(6)] = Marker( - key: ValueKey('friend-${randomString(6)}'), - point: LatLng(e.latitude!, e.longitude!), - width: 35, - height: 35, - child: Container( - decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), - child: Center( - child: Padding( - padding: const EdgeInsets.all(3), - child: - ContactAvatarWidget(editable: false, handle: e.handle ?? Handle(address: e.title ?? "Unknown")), - ), - ), - ), - alignment: Alignment.topCenter, - ); - } - setState(() { - fetching2 = false; - refreshing2 = false; - }); - } catch (e, s) { - Logger.error(e); - Logger.error(s); - setState(() { - fetching2 = null; - refreshing2 = false; - }); - return; - } + // Call the FindMy Friends refresh anyways so that new data comes through the socket + if (!refresh) { + http.refreshFindMyFriends(); } else { setState(() { - fetching2 = false; - refreshing2 = false; + canRefresh = false; + }); + // Allow users to refresh after 30sec + Future.delayed(const Duration(seconds: 30), () { + if (mounted) { + setState(() { + canRefresh = true; + }); + } }); } } + void buildFriendMarker(FindMyFriend friend) { + markers[friend.handle?.uniqueAddressAndService ?? randomString(6)] = Marker( + key: ValueKey('friend-${friend.handle?.uniqueAddressAndService ?? randomString(6)}'), + point: LatLng(friend.latitude!, friend.longitude!), + width: 35, + height: 35, + child: Container( + decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle), + child: Center( + child: Padding( + padding: const EdgeInsets.all(3), + child: + ContactAvatarWidget(editable: false, handle: friend.handle ?? Handle(address: friend.title ?? "Unknown")), + ), + ), + ), + alignment: Alignment.topCenter, + ); + } + void buildLocationMarker(Position pos) { markers['current'] = Marker( key: const ValueKey('current'), @@ -259,6 +332,10 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi @override void dispose() { locationSub?.cancel(); + mapController.dispose(); + popupController.dispose(); + tabController.dispose(); + socket.socket.off("new-findmy-location"); super.dispose(); } @@ -310,6 +387,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi child: ListView.builder( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, + padding: EdgeInsets.zero, itemBuilder: (context, i) { final item = devicesWithLocation[i]; return ListTile( @@ -399,6 +477,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi child: ListView.builder( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, + padding: EdgeInsets.zero, itemBuilder: (context, i) { final item = itemsWithLocation[i]; return ListTile( @@ -558,7 +637,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi final friendsBodySlivers = [ SliverList( delegate: SliverChildListDelegate([ - if (fetching == null || fetching == true || (fetching == false && devices.isEmpty)) + if (fetching2 == null || fetching2 == true || (fetching2 == false && friends.isEmpty)) Center( child: Padding( padding: const EdgeInsets.only(top: 100), @@ -567,15 +646,15 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi Padding( padding: const EdgeInsets.all(8.0), child: Text( - fetching == null + fetching2 == null ? "Something went wrong!" - : fetching == false + : fetching2 == false ? "You have no friends." : "Getting FindMy data...", style: context.theme.textTheme.labelLarge, ), ), - if (fetching == true) buildProgressIndicator(context, size: 15), + if (fetching2 == true) buildProgressIndicator(context, size: 15), ], ), ), @@ -591,27 +670,37 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi child: ListView.builder( physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, + padding: EdgeInsets.zero, itemBuilder: (context, i) { final item = friendsWithLocation[i]; return ListTile( leading: ContactAvatarWidget(handle: item.handle), title: Text(item.handle?.displayName ?? item.title ?? "Unknown Friend"), - subtitle: Text(item.longAddress ?? "No location found"), - trailing: item.latitude != null && item.longitude != null ? ButtonTheme( - minWidth: 1, - child: TextButton( - style: TextButton.styleFrom( - shape: const CircleBorder(), - backgroundColor: context.theme.colorScheme.primaryContainer, - ), - onPressed: () async { - await MapsLauncher.launchCoordinates(item.latitude!, item.longitude!); - }, - child: const Icon( - Icons.directions, - size: 20 + subtitle: Text("${item.shortAddress ?? "No location found"}${item.lastUpdated == null || item.status == LocationStatus.live ? "" : "\nLast updated ${buildDate(item.lastUpdated)}"}"), + trailing: item.latitude != null && item.longitude != null ? Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (item.status == LocationStatus.live) + const Icon(CupertinoIcons.largecircle_fill_circle), + if (item.locatingInProgress) + buildProgressIndicator(context), + ButtonTheme( + minWidth: 1, + child: TextButton( + style: TextButton.styleFrom( + shape: const CircleBorder(), + backgroundColor: context.theme.colorScheme.primaryContainer, + ), + onPressed: () async { + await MapsLauncher.launchCoordinates(item.latitude!, item.longitude!); + }, + child: const Icon( + Icons.directions, + size: 20 + ), + ), ), - ), + ], ) : null, onTap: () async { if (context.isPhone) { @@ -769,7 +858,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi child: Stack( children: [ buildMap(), - if (!samsung) + if (!samsung && canRefresh) Positioned( top: 10 + (kIsDesktop ? appWindow.titleBarHeight : MediaQuery.of(context).padding.top), right: 20, @@ -782,7 +871,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), child: Container( width: 48, - child: refreshing + child: refreshing || refreshing2 ? buildProgressIndicator(context) : IconButton( iconSize: 22, @@ -791,6 +880,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi onPressed: () { setState(() { refreshing = true; + refreshing2 = true; }); getLocations(refresh: true); }, @@ -1081,7 +1171,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi color: Theme.of(context).colorScheme.properSurface.withOpacity(0.9), ), )), - if (!samsung) + if (!samsung && canRefresh) Positioned( top: 10 + (kIsDesktop ? appWindow.titleBarHeight : MediaQuery.of(context).padding.top), right: 20, @@ -1094,7 +1184,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), child: Container( width: 48, - child: refreshing + child: refreshing || refreshing2 ? buildProgressIndicator(context) : IconButton( iconSize: 22, @@ -1103,6 +1193,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi onPressed: () { setState(() { refreshing = true; + refreshing2 = true; }); getLocations(refresh: true); }, @@ -1144,7 +1235,6 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), ], onDestinationSelected: (page) { - if (fetching != false) return; index.value = page; tabController.animateTo(page); panelController.open(); @@ -1156,27 +1246,29 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi Widget buildSamsungAppBar(BuildContext context, String title) { final actions = [ - Container( - width: 48, - height: 48, - child: Container( + if (canRefresh) + Container( width: 48, - margin: const EdgeInsets.only(right: 8), - child: refreshing - ? buildProgressIndicator(context) - : IconButton( - iconSize: 22, - icon: Icon(iOS ? CupertinoIcons.arrow_counterclockwise : Icons.refresh, - color: context.theme.colorScheme.onBackground, size: 22), - onPressed: () { - setState(() { - refreshing = true; - }); - getLocations(refresh: true); - }, - ), + height: 48, + child: Container( + width: 48, + margin: const EdgeInsets.only(right: 8), + child: refreshing || refreshing2 + ? buildProgressIndicator(context) + : IconButton( + iconSize: 22, + icon: Icon(iOS ? CupertinoIcons.arrow_counterclockwise : Icons.refresh, + color: context.theme.colorScheme.onBackground, size: 22), + onPressed: () { + setState(() { + refreshing = true; + refreshing2 = true; + }); + getLocations(refresh: true); + }, + ), + ), ), - ), ]; return SliverAppBar( @@ -1334,6 +1426,10 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi Text(item.handle?.displayName ?? item.title ?? "Unknown Friend", style: context.theme.textTheme.labelLarge), Text(item.longAddress ?? "No location found", style: context.theme.textTheme.bodySmall), + if (item.lastUpdated != null && item.status != LocationStatus.live) + Text("Last updated ${buildDate(item.lastUpdated)}", style: context.theme.textTheme.bodySmall), + if (item.status != null) + Text("${item.status!.name.capitalize!} Location", style: context.theme.textTheme.bodySmall), ], ), ), diff --git a/lib/models/global/findmy_friend.dart b/lib/models/global/findmy_friend.dart index 0ef3a958b..cded50cfb 100644 --- a/lib/models/global/findmy_friend.dart +++ b/lib/models/global/findmy_friend.dart @@ -1,6 +1,10 @@ import 'package:bluebubbles/models/models.dart'; +import 'package:collection/collection.dart'; +import 'package:intl/intl.dart'; import 'package:tuple/tuple.dart'; +enum LocationStatus {legacy, shallow, live} + class FindMyFriend { FindMyFriend({ required this.latitude, @@ -10,6 +14,9 @@ class FindMyFriend { required this.title, required this.subtitle, required this.handle, + required this.lastUpdated, + required this.status, + required this.locatingInProgress, }); final double? latitude; @@ -19,6 +26,9 @@ class FindMyFriend { final String? title; final String? subtitle; final Handle? handle; + final DateTime? lastUpdated; + final LocationStatus? status; + final bool locatingInProgress; factory FindMyFriend.fromJson(Map json) => FindMyFriend( latitude: json["coordinates"]?[0].toDouble(), @@ -28,6 +38,9 @@ class FindMyFriend { title: json["title"], subtitle: json["subtitle"], handle: json["handle"] == null ? null : Handle.findOne(addressAndService: Tuple2(json["handle"], "iMessage")), + lastUpdated: (json["last_updated"] ?? 0) == 0 ? null : DateTime.fromMillisecondsSinceEpoch(json["last_updated"]), + status: LocationStatus.values.firstWhereOrNull((e) => e.name == json["status"]), + locatingInProgress: json["is_locating_in_progress"] ?? false, ); Map toJson() => { @@ -36,7 +49,10 @@ class FindMyFriend { "short_address": shortAddress, "title": title, "subtitle": subtitle, - "handle": handle?.address, + "handle": handle?.toMap(), + "last_updated": lastUpdated == null ? null : DateFormat("MMMM d, yyyy h:mm:ss a").format(lastUpdated!), + "status": status?.name, + "locating_in_progress": locatingInProgress, }; } diff --git a/lib/services/network/http_service.dart b/lib/services/network/http_service.dart index ed7733e28..eb8f7f432 100644 --- a/lib/services/network/http_service.dart +++ b/lib/services/network/http_service.dart @@ -1093,6 +1093,18 @@ class HttpService extends GetxService { }); } + /// Refresh FindMy friends on server + Future refreshFindMyFriends({CancelToken? cancelToken}) async { + return runApiGuarded(() async { + final response = await dio.post( + "$apiRoot/icloud/findmy/friends/refresh", + queryParameters: buildQueryParams(), + cancelToken: cancelToken, + ); + return returnSuccessOrError(response); + }); + } + Future getAccountInfo({CancelToken? cancelToken}) async { return runApiGuarded(() async { final response = await dio.get( From 747c503203f5e4fc3f8fc45f38839961fc4351e8 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 1 Feb 2024 09:53:53 -0500 Subject: [PATCH 067/118] doc: changelog update --- assets/changelog/changelog.md | 52 +++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/assets/changelog/changelog.md b/assets/changelog/changelog.md index e249b3589..8c5d6562e 100644 --- a/assets/changelog/changelog.md +++ b/assets/changelog/changelog.md @@ -2,6 +2,58 @@ Below are the last few BlueBubbles App release changelogs +## v1.12.7 + +This update sgnificantly overhauls the underlying Java code for the Android app, bringing better stability, fixing bugs, and more features. + +### The Big Stuff + +**New Stuff** + +- Android backend is completely rewritten from Java to Kotlin, enabling some of the features and bug fixes in this list +- Notification when phone number deregisters + +**Important Bug Fixes** + +- Replying from the notification shade or in-car via Android Auto should now send much more reliably +- Firebase authentication detects if Google Services are available to avoid crashes on de-googled ROMs +- (Mostly) Fixes issue where the incorrect chat will be opened when opening from a notification + +### The Nitty Gritty + +#### Enhancements + +- Replying from a notification will now confirm the reply only once it has sent from the client side (otherwise the loading animation still shows) +- Media colors now generates a Material You theme based on the album art itself +- "Open In Browser" now opens links in Android's Custom Tabs, which supports all default browsers, not just Chrome +- Improved Kotlin worker process for processing incoming items when the app is backgrounded or closed - Dart VM should be correctly cleaned up and all processes should be killed which improves battery life +- Changed FindMy to open exact coordinates in Maps app rather than the address +- FindMy Friends shows last location update +- FindMy Friends shows location status +- Faster FindMy load and refresh +- Added tooltip to manual mark unread/read button to make it more clear +- Allow adding newlines in text when creating a scheduled message +- Notification when phone number deregisters +- New profile screen to view/manage all iMessage account related tasks + +#### Fixes + +- Fixed issues with opening a contact's page or creating a new contact +- Creating a new contact from an unknown number allows you to add the number to an existing contact first +- Firebase authentication detects if Google Services are available to avoid crashes on de-googled ROMs +- Fixed quick reply actions not consistently showing in notifications +- Fixed legacy URL preview titles showing just "www" +- Fixed URL previews too condensed in tablet mode +- Fixed app not accepting URLs with port in manual entry +- Fixed send and receive sound volume not following the preference set in settings +- Fixed chat list not loading on Windows if Secure App is enabled and initial authentication is canceled. +- Fixed custom themes with long names not uploading to server + +### For Developers + +- Upgraded to Flutter 3.16 +- Updated dependencies + ## v1.12.6 This is a hotfix update bringing bug fixes to recent issues, From 3a03849746debd1fe0617815182e50dadfcbdadd Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 1 Feb 2024 09:55:38 -0500 Subject: [PATCH 068/118] doc: changelog backfill for v1.12.7 --- assets/changelog/changelog.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/assets/changelog/changelog.md b/assets/changelog/changelog.md index 8c5d6562e..7818f0bec 100644 --- a/assets/changelog/changelog.md +++ b/assets/changelog/changelog.md @@ -2,7 +2,7 @@ Below are the last few BlueBubbles App release changelogs -## v1.12.7 +## v1.12.8 This update sgnificantly overhauls the underlying Java code for the Android app, bringing better stability, fixing bugs, and more features. @@ -54,6 +54,20 @@ This update sgnificantly overhauls the underlying Java code for the Android app, - Upgraded to Flutter 3.16 - Updated dependencies +## v1.12.7 + +This update brings a handful of bug fixes & improvements, as well as some experimental features around better supporting FaceTime (Monterey+)! + +### Changes + +- Implements (experimental) ability to answer FaceTime calls + - **This requires macOS Monterey+ and the Private API to be enabled for FaceTime.** + - **This also requires the BlueBubbles Server v1.9.2 update** +- Fixes some issues parsing mentions in messages +- Adds button to open a FindMy Friends location in Google Maps +- Adds notice when the Private API is enabled on the server, but not on the client side +- Fixes to FaceTime call notifications + ## v1.12.6 This is a hotfix update bringing bug fixes to recent issues, From afd0f86f4a2cbd72cf65d76882f1ed7fd4ce54c9 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 1 Feb 2024 09:55:50 -0500 Subject: [PATCH 069/118] version bump for beta v1.12.8+62 --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 8161ed7eb..9f413d4c9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.12.7+61 +version: 1.12.8+62 publish_to: none environment: From 4decdd6440c9aabf256e4f4a38ec3d55ccddb1d8 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 1 Feb 2024 09:56:39 -0500 Subject: [PATCH 070/118] fix: version -> 1.13.0 --- assets/changelog/changelog.md | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/changelog/changelog.md b/assets/changelog/changelog.md index 7818f0bec..83cec9e93 100644 --- a/assets/changelog/changelog.md +++ b/assets/changelog/changelog.md @@ -2,7 +2,7 @@ Below are the last few BlueBubbles App release changelogs -## v1.12.8 +## v1.13.0 This update sgnificantly overhauls the underlying Java code for the Android app, bringing better stability, fixing bugs, and more features. diff --git a/pubspec.yaml b/pubspec.yaml index 9f413d4c9..5a15c5c21 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.12.8+62 +version: 1.13.0+62 publish_to: none environment: From 89fd5dc42590885c069bde9c4b566048c5dbb9da Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 1 Feb 2024 12:22:13 -0500 Subject: [PATCH 071/118] Use a better method to check if Firebase is already initialized --- .../messaging/services/firebase/FirebaseAuthHandler.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt index 709f8e369..3c601faa2 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/FirebaseAuthHandler.kt @@ -25,7 +25,13 @@ class FirebaseAuthHandler: MethodCallHandlerImpl() { context: Context ) { // Don't auth multiple times - if (firebaseApp != null) result.success(null) + try { + FirebaseApp.getInstance() + Log.d(Constants.logTag, "Firebase has already been initialized!") + result.success(null) + return + } catch (_: IllegalStateException) {} + // Make sure Google Services are available if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) != ConnectionResult.SUCCESS) { val error = "Google Play Services is not available!" Log.e(Constants.logTag, error) From f3b12f5065bc6f7bbb7836180225b41705e56461 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 1 Feb 2024 12:28:34 -0500 Subject: [PATCH 072/118] removes AD_ID permission --- android/app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7e9971076..f16d94ffc 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -49,6 +49,7 @@ + Date: Thu, 1 Feb 2024 12:29:26 -0500 Subject: [PATCH 073/118] build number bump for hotfix --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5a15c5c21..47c0f66cf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.13.0+62 +version: 1.13.0+63 publish_to: none environment: From a500d6d952302e4be7f6eb09d9716d7b58508717 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 1 Feb 2024 11:54:26 -0600 Subject: [PATCH 074/118] Fix #2584 Signed-off-by: Joel Jothiprakasam --- .../widgets/header/cupertino_header.dart | 2 ++ lib/app/layouts/fullscreen_media/fullscreen_holder.dart | 1 + lib/helpers/ui/ui_helpers.dart | 2 ++ pubspec.lock | 9 +++++---- pubspec.yaml | 5 ++++- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart b/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart index c36d939a5..2ed4efc4b 100644 --- a/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart +++ b/lib/app/layouts/conversation_view/widgets/header/cupertino_header.dart @@ -43,6 +43,7 @@ class CupertinoHeader extends StatelessWidget implements PreferredSizeWidget { Align( alignment: Alignment.centerLeft, child: XGestureDetector( + supportTouch: true, onTap: !kIsDesktop ? null : (details) { if (controller.inSelectMode.value) { controller.inSelectMode.value = false; @@ -88,6 +89,7 @@ class CupertinoHeader extends StatelessWidget implements PreferredSizeWidget { Align( alignment: Alignment.center, child: XGestureDetector( + supportTouch: true, onTap: !kIsDesktop ? null : (details) { Navigator.of(context).push( ThemeSwitcher.buildPageRoute( diff --git a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart index 1b40e3715..8e335d60b 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart @@ -96,6 +96,7 @@ class FullscreenMediaHolderState extends OptimizedState { child: Scaffold( appBar: !iOS ? null : AppBar( leading: XGestureDetector( + supportTouch: true, onTap: !kIsDesktop ? null : (details) { Navigator.of(context).pop(); }, diff --git a/lib/helpers/ui/ui_helpers.dart b/lib/helpers/ui/ui_helpers.dart index 4e167c4a6..1c908126e 100644 --- a/lib/helpers/ui/ui_helpers.dart +++ b/lib/helpers/ui/ui_helpers.dart @@ -25,6 +25,7 @@ class BackButton extends StatelessWidget { @override Widget build(BuildContext context) { return XGestureDetector( + supportTouch: true, onTap: !kIsDesktop ? null : (details) { final result = onPressed?.call() ?? false; if (!result) { @@ -61,6 +62,7 @@ Widget buildBackButton(BuildContext context, {EdgeInsets padding = EdgeInsets.ze padding: padding, width: 48, child: XGestureDetector( + supportTouch: true, onTap: !kIsDesktop ? null : (details) { final result = callback?.call() ?? true; if (result) { diff --git a/pubspec.lock b/pubspec.lock index 5f09dc707..1da39f63e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1077,10 +1077,11 @@ packages: gesture_x_detector: dependency: "direct main" description: - name: gesture_x_detector - sha256: "777855ee4e1fa4d677c40d6a44b9106696ef6745879027c8871e334cee8cde1e" - url: "https://pub.dev" - source: hosted + path: "." + ref: "7de6e023ff68f67af1d83f7c1303d8b973f84944" + resolved-ref: "7de6e023ff68f67af1d83f7c1303d8b973f84944" + url: "https://github.com/BlueBubblesApp/xgesture_flutter.git" + source: git version: "1.1.1" get: dependency: "direct main" diff --git a/pubspec.yaml b/pubspec.yaml index 47c0f66cf..b32cc8b8a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -86,7 +86,10 @@ dependencies: url: https://github.com/BlueBubblesApp/flutter-geolocator.git path: geolocator ref: 223195b3746686790ca188deac6260d901d30c51 - gesture_x_detector: ^1.1.1 + gesture_x_detector: + git: + url: https://github.com/BlueBubblesApp/xgesture_flutter.git + ref: 7de6e023ff68f67af1d83f7c1303d8b973f84944 get: ^4.6.6 giphy_get: ^3.5.4 github: ^9.22.0 From 1063842ce0b4322d54f0acf27104249b5701b23b Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 1 Feb 2024 22:40:51 -0600 Subject: [PATCH 075/118] Fix alias newline when redacted mode enabled Signed-off-by: Joel Jothiprakasam --- lib/app/layouts/settings/pages/profile/profile_panel.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/settings/pages/profile/profile_panel.dart b/lib/app/layouts/settings/pages/profile/profile_panel.dart index c95c20a63..1f1bfd7a8 100644 --- a/lib/app/layouts/settings/pages/profile/profile_panel.dart +++ b/lib/app/layouts/settings/pages/profile/profile_panel.dart @@ -342,7 +342,7 @@ class _ProfilePanelState extends OptimizedState with WidgetsBindin const TextSpan(text: "VETTED ALIASES\n", style: TextStyle(fontWeight: FontWeight.w700, height: 3.0)), ...((accountInfo['vetted_aliases'] as List? ?? [])).map((e) => [ TextSpan(text: "⬤ ", style: TextStyle(color: getIndicatorColor(e['Status'] == 3 ? SocketState.connected : SocketState.disconnected))), - TextSpan(text: redact ? "Alias" : "${e['Alias']}\n") + TextSpan(text: redact ? "Alias\n" : "${e['Alias']}\n") ]).toList().flattened, const TextSpan(text: "\n"), const TextSpan(text: "Tap to update values...", style: TextStyle(fontStyle: FontStyle.italic)), From 5204ac2fe625b4df24b265fcb1efb170c5d40752 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 1 Feb 2024 23:29:49 -0600 Subject: [PATCH 076/118] Fix avatar-only chat tiles not doing anything Signed-off-by: Joel Jothiprakasam --- .../tile/cupertino_conversation_tile.dart | 25 ++- .../tile/material_conversation_tile.dart | 22 ++- .../tile/samsung_conversation_tile.dart | 157 +++++++++--------- 3 files changed, 116 insertions(+), 88 deletions(-) diff --git a/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart b/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart index aa13d2551..e3e0ca7ed 100644 --- a/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart +++ b/lib/app/layouts/conversation_list/widgets/tile/cupertino_conversation_tile.dart @@ -105,9 +105,22 @@ class _CupertinoConversationTileState extends CustomState controller.onTap(context), + onSecondaryTapUp: (details) => controller.onSecondaryTap(Get.context!, details), + onLongPress: kIsDesktop || kIsWeb + ? null + : () async { + await peekChat(context, controller.chat, longPressPosition ?? Offset.zero); + }, + onTapDown: (details) { + longPressPosition = details.globalPosition; + }, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10.0, horizontal: (ns.width(context) - 100) / 2).add(const EdgeInsets.only(right: 15)), + child: leading, + ), ) : child, ); @@ -150,9 +163,9 @@ class _CupertinoTrailingState extends CustomState controller.onTap(context), + onSecondaryTapUp: (details) => controller.onSecondaryTap(Get.context!, details), + onLongPress: controller.onLongPress, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + bottomLeft: Radius.circular(20), + ), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 15.0), + child: Center(child: leading), + ), ) : child, ); @@ -193,9 +203,9 @@ class _MaterialTrailingState extends CustomState class _SamsungConversationTileState extends CustomState { bool get shouldPartialHighlight => controller.shouldPartialHighlight.value; + bool get shouldHighlight => controller.shouldHighlight.value; + bool get hoverHighlight => controller.hoverHighlight.value; @override @@ -41,29 +43,27 @@ class _SamsungConversationTileState extends CustomState controller.onSecondaryTap(Get.context!, details), onLongPress: controller.onLongPress, child: Obx(() => ListTile( - mouseCursor: MouseCursor.defer, - dense: ss.settings.denseChatTiles.value, - visualDensity: ss.settings.denseChatTiles.value ? VisualDensity.compact : null, - minVerticalPadding: ss.settings.denseChatTiles.value ? 7.5 : 10, - title: Obx(() => ChatTitle( - parentController: controller, - style: context.theme.textTheme.bodyMedium!.copyWith( - fontWeight: controller.shouldHighlight.value - ? FontWeight.w600 - : null, - ), - )), - subtitle: controller.subtitle ?? Obx(() => ChatSubtitle( - parentController: controller, - style: context.theme.textTheme.bodySmall!.copyWith( - color: controller.shouldHighlight.value - ? context.theme.colorScheme.onBackground : context.theme.colorScheme.outline, - height: 1.5, - ), - )), - leading: leading, - trailing: SamsungTrailing(parentController: controller), - )), + mouseCursor: MouseCursor.defer, + dense: ss.settings.denseChatTiles.value, + visualDensity: ss.settings.denseChatTiles.value ? VisualDensity.compact : null, + minVerticalPadding: ss.settings.denseChatTiles.value ? 7.5 : 10, + title: Obx(() => ChatTitle( + parentController: controller, + style: context.theme.textTheme.bodyMedium!.copyWith( + fontWeight: controller.shouldHighlight.value ? FontWeight.w600 : null, + ), + )), + subtitle: controller.subtitle ?? + Obx(() => ChatSubtitle( + parentController: controller, + style: context.theme.textTheme.bodySmall!.copyWith( + color: controller.shouldHighlight.value ? context.theme.colorScheme.onBackground : context.theme.colorScheme.outline, + height: 1.5, + ), + )), + leading: leading, + trailing: SamsungTrailing(parentController: controller), + )), ), ); @@ -75,16 +75,26 @@ class _SamsungConversationTileState extends CustomState controller.onTap(context), + onSecondaryTapUp: (details) => controller.onSecondaryTap(Get.context!, details), + onLongPress: controller.onLongPress, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 15), + child: Center(child: leading), + ), + ) + : child, ); }); } @@ -120,17 +130,17 @@ class _SamsungTrailingState extends CustomState query) async { final message = await runAsync(() { return query.findFirst(); }); - if (message != null - && ss.settings.statusIndicatorsOnChats.value - && (message.dateDelivered != cachedLatestMessage?.dateDelivered || message.dateRead != cachedLatestMessage?.dateRead)) { + if (message != null && + ss.settings.statusIndicatorsOnChats.value && + (message.dateDelivered != cachedLatestMessage?.dateDelivered || message.dateRead != cachedLatestMessage?.dateRead)) { setState(() {}); } cachedLatestMessage = message; @@ -145,14 +155,15 @@ class _SamsungTrailingState extends CustomState query) async { - final chat = controller.chat.id == null ? null : await runAsync(() { - return chatBox.get(controller.chat.id!); - }); + final chat = controller.chat.id == null + ? null + : await runAsync(() { + return chatBox.get(controller.chat.id!); + }); final newUnread = chat?.hasUnreadMessage ?? false; final newMute = chat?.muteType ?? ""; if (chat != null && unread != newUnread) { @@ -224,37 +235,28 @@ class _SamsungTrailingState extends CustomState 0 - ? "Error" - : "${indicatorText.isNotEmpty ? "$indicatorText\n" : ""}${buildDate(dateCreated)}", + (cachedLatestMessage?.error ?? 0) > 0 ? "Error" : "${indicatorText.isNotEmpty ? "$indicatorText\n" : ""}${buildDate(dateCreated)}", textAlign: TextAlign.right, style: context.theme.textTheme.bodySmall!.copyWith( color: (cachedLatestMessage?.error ?? 0) > 0 ? context.theme.colorScheme.error : controller.shouldHighlight.value || unread - ? context.theme.colorScheme.onBackground : context.theme.colorScheme.outline, - fontWeight: controller.shouldHighlight.value - ? FontWeight.w500 : null, + ? context.theme.colorScheme.onBackground + : context.theme.colorScheme.outline, + fontWeight: controller.shouldHighlight.value ? FontWeight.w500 : null, ), overflow: TextOverflow.clip, ); }), - if (controller.chat.isPinned!) - const SizedBox(width: 5.0), - if (controller.chat.isPinned!) - Icon( - Icons.star, - size: 15, color: context.theme.colorScheme.tertiary - ), - if (muteType == "mute") - const SizedBox(width: 5.0), + if (controller.chat.isPinned!) const SizedBox(width: 5.0), + if (controller.chat.isPinned!) Icon(Icons.star, size: 15, color: context.theme.colorScheme.tertiary), + if (muteType == "mute") const SizedBox(width: 5.0), if (muteType == "mute") Obx(() => Icon( - Icons.notifications_off, - color: controller.shouldHighlight.value || unread - ? context.theme.colorScheme.onBackground : context.theme.colorScheme.outline, - size: 15, - )), + Icons.notifications_off, + color: controller.shouldHighlight.value || unread ? context.theme.colorScheme.onBackground : context.theme.colorScheme.outline, + size: 15, + )), ], ), ); @@ -282,12 +284,13 @@ class _UnreadIconState extends CustomState query) async { - final chat = controller.chat.id == null ? null : await runAsync(() { - return chatBox.get(controller.chat.id!); - }); + final chat = controller.chat.id == null + ? null + : await runAsync(() { + return chatBox.get(controller.chat.id!); + }); if (chat == null) return; if (chat.hasUnreadMessage != unread) { setState(() { @@ -317,13 +320,15 @@ class _UnreadIconState extends CustomState Date: Mon, 5 Feb 2024 11:14:42 -0500 Subject: [PATCH 077/118] Add stacktrace to failed to parse payload data message --- lib/models/io/message.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index a2e7f6fa6..0e2868192 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -396,8 +396,8 @@ class Message { PayloadData? payloadData; try { payloadData = json['payloadData'] == null ? null : PayloadData.fromJson(json['payloadData']!.cast()); - } catch (e) { - Logger.error('Failed to parse payload data! $e'); + } catch (e, s) { + Logger.error('Failed to parse payload data! $e\n$s'); } return Message( From 947897f04eab934cc432ce178bb5a8489fbd4040 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 5 Feb 2024 11:15:04 -0500 Subject: [PATCH 078/118] Fix URL preview parsing --- lib/helpers/network/metadata_helper.dart | 83 ++++-------------------- 1 file changed, 14 insertions(+), 69 deletions(-) diff --git a/lib/helpers/network/metadata_helper.dart b/lib/helpers/network/metadata_helper.dart index deb0ceb45..e368373d7 100644 --- a/lib/helpers/network/metadata_helper.dart +++ b/lib/helpers/network/metadata_helper.dart @@ -4,7 +4,7 @@ import 'package:bluebubbles/services/services.dart'; import 'package:bluebubbles/utils/logger.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; -import 'package:collection/collection.dart'; +import 'package:dio/dio.dart'; import 'package:html/parser.dart' as parser; import 'package:metadata_fetch/metadata_fetch.dart'; import 'package:universal_io/io.dart'; @@ -37,65 +37,14 @@ class MetadataHelper { if (!url.startsWith("http")) { url = "https://$url"; } - final newUrl = MetadataHelper._reformatUrl(url); - - // Handle specific cases - bool alreadyManual = false; - if (newUrl.contains('https://youtube.com/oembed')) { - final response = await http.dio.get(newUrl); - if (isNullOrEmpty(response.data)!) { - completer.complete(null); - return completer.future; - } - - data = Metadata(); - data.image = response.data["thumbnail_url"]; - data.title = response.data["title"]; - data.description = "User: ${response.data["author_name"] ?? "Unknown"}"; - data.url = url; - } else if (newUrl.contains("https://publish.twitter.com/oembed")) { - final response = await http.dio.get(newUrl); - if (isNullOrEmpty(response.data)!) { - completer.complete(null); - return completer.future; - } - - data = Metadata(); - data.title = response.data["author_name"]; - data.description = response.data["html"] != null - ? stripHtmlTags(response.data["html"].replaceAll("
", "\n")).trim() - : ""; - data.url = url; - } else if (newUrl.contains("redd.it/")) { - final response = await http.dio.get(newUrl); - if (isNullOrEmpty(response.data)!) { - completer.complete(null); - return completer.future; - } - final document = parser.parse(response.data); - - // Since this is a short-URL, we need to get the actual URL out - String? href = document.head?.children - .where((e) => e.localName == "link") - .map((e) => e.attributes.entries).flattened - .firstWhereOrNull((e) => e.key == "href" && e.value.contains("reddit.com") && !e.value.contains("amp"))?.value; - if (href != null) { - data = await MetadataHelper._manuallyGetMetadata(href); - alreadyManual = true; - } - } else if (url.contains("linkedin.com/posts/")) { - data = await MetadataHelper._manuallyGetMetadata(url); - alreadyManual = true; - } else { - try { - data = await MetadataFetch.extract(url); - } catch (ex) { - Logger.error('An error occurred while fetching URL Preview Metadata: ${ex.toString()}'); - } + try { + data = await MetadataFetch.extract(url); + } catch (ex) { + Logger.error('An error occurred while fetching URL Preview Metadata: ${ex.toString()}'); } - // If the data or title was null, try to manually parse - if (!alreadyManual && isNullOrEmpty(data?.title)!) { + // If the everything in the metadata is null or empty, try to manually parse + if (data?.toMap().values.where((e) => !isNullOrEmpty(e)!).isEmpty ?? true) { data = await MetadataHelper._manuallyGetMetadata(url); } @@ -112,6 +61,9 @@ class MetadataHelper { data?.image = null; } else if (imageData.startsWith('//')) { data?.image = 'https:$imageData'; + // In case the image is just a relative URL path + } else if (imageData.startsWith('/')) { + data?.image = '$url$imageData'; } // Remove title or description if either are the "null" string @@ -133,22 +85,15 @@ class MetadataHelper { return completer.future; } - static String _reformatUrl(String url) { - if (url.contains('youtube.com/') || url.contains("youtu.be/")) { - return "https://youtube.com/oembed?url=$url"; - } else if (url.contains("twitter.com") && url.contains("/status/")) { - return "https://publish.twitter.com/oembed?url=$url"; - } else { - return url; - } - } - /// Manually tries to parse out metadata from a given [url] static Future _manuallyGetMetadata(String url) async { Metadata meta = Metadata(); try { - final response = await http.dio.get(url); + final response = await http.dio.get(url, options: Options(headers: { + // pretend to be a social media crawler + "User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:6.0) Gecko/20110814 Firefox/6.0 Google (+https://developers.google.com/+/web/snippet/)" + })); if (response.headers.value('content-type')?.startsWith("image/") ?? false) { meta.image = url; } From d869fd5c91e1de6bfcd026a9ba0a358d9e0d4970 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 5 Feb 2024 11:23:47 -0500 Subject: [PATCH 079/118] Try to find FindMy friend handle off the title in case handle does not exist --- lib/models/global/findmy_friend.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/global/findmy_friend.dart b/lib/models/global/findmy_friend.dart index cded50cfb..d8bd6ace4 100644 --- a/lib/models/global/findmy_friend.dart +++ b/lib/models/global/findmy_friend.dart @@ -37,7 +37,7 @@ class FindMyFriend { shortAddress: json["short_address"], title: json["title"], subtitle: json["subtitle"], - handle: json["handle"] == null ? null : Handle.findOne(addressAndService: Tuple2(json["handle"], "iMessage")), + handle: json["handle"] == null && json["title"] == null ? null : Handle.findOne(addressAndService: Tuple2(json["handle"] ?? json["title"], "iMessage")), lastUpdated: (json["last_updated"] ?? 0) == 0 ? null : DateTime.fromMillisecondsSinceEpoch(json["last_updated"]), status: LocationStatus.values.firstWhereOrNull((e) => e.name == json["status"]), locatingInProgress: json["is_locating_in_progress"] ?? false, From d5ce86951d4202e09cd2fc0f63d77dd7f6d0cf74 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 15:19:29 -0500 Subject: [PATCH 080/118] Remove forehead on ChromeOS --- lib/app/wrappers/titlebar_wrapper.dart | 11 ----------- lib/helpers/types/helpers/misc_helpers.dart | 2 -- .../java_dart_interop/method_channel_service.dart | 2 +- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/lib/app/wrappers/titlebar_wrapper.dart b/lib/app/wrappers/titlebar_wrapper.dart index 1bec2654c..6c4a53a63 100644 --- a/lib/app/wrappers/titlebar_wrapper.dart +++ b/lib/app/wrappers/titlebar_wrapper.dart @@ -16,17 +16,6 @@ class TitleBarWrapper extends StatelessWidget { @override Widget build(BuildContext context) { - if (chromeOS) { - return Padding( - padding: const EdgeInsets.only(top: 50), - child: Stack( - children: [ - child, - if (ss.settings.showConnectionIndicator.value) const ConnectionIndicator(), - ], - ), - ); - } if (!kIsDesktop) { return Stack( children: [ diff --git a/lib/helpers/types/helpers/misc_helpers.dart b/lib/helpers/types/helpers/misc_helpers.dart index 3d395d741..882db74e3 100644 --- a/lib/helpers/types/helpers/misc_helpers.dart +++ b/lib/helpers/types/helpers/misc_helpers.dart @@ -81,8 +81,6 @@ bool get kIsDesktop => (Platform.isWindows || Platform.isLinux || Platform.isMac bool get isSnap => !kIsWeb && Platform.isLinux && Platform.environment['SNAP'] != null; -bool chromeOS = false; - /// From https://github.com/modulovalue/dart_intersperse/blob/master/lib/src/intersperse.dart Iterable intersperse(T element, Iterable iterable) sync* { final iterator = iterable.iterator; diff --git a/lib/services/backend/java_dart_interop/method_channel_service.dart b/lib/services/backend/java_dart_interop/method_channel_service.dart index 73f13e650..ad0b359a3 100644 --- a/lib/services/backend/java_dart_interop/method_channel_service.dart +++ b/lib/services/backend/java_dart_interop/method_channel_service.dart @@ -34,7 +34,7 @@ class MethodChannelService extends GetxService { if (!ls.isBubble) { BackgroundIsolate.initialize(); } - chromeOS = await mcs.invokeMethod("check-chromeos") ?? false; + // chromeOS = await mcs.invokeMethod("check-chromeos") ?? false; } catch (_) {} } } From 80f2df062b8f2e2f2c08a0766043cf19b37f3a83 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 15:40:35 -0500 Subject: [PATCH 081/118] Don't update smart replies if we aren't in the foreground --- lib/app/layouts/conversation_view/pages/messages_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/conversation_view/pages/messages_view.dart b/lib/app/layouts/conversation_view/pages/messages_view.dart index 588277b60..38f30a6b4 100644 --- a/lib/app/layouts/conversation_view/pages/messages_view.dart +++ b/lib/app/layouts/conversation_view/pages/messages_view.dart @@ -179,7 +179,7 @@ class MessagesViewState extends OptimizedState { } void updateReplies({bool updateConversation = true}) async { - if (!showSmartReplies || isNullOrEmpty(_messages)! || kIsWeb || kIsDesktop) return; + if (!showSmartReplies || isNullOrEmpty(_messages)! || kIsWeb || kIsDesktop || !mounted || !ls.isAlive) return; if (updateConversation) { _messages.reversed.where((e) => !isNullOrEmpty(e.fullText)! && e.dateCreated != null).skip(max(_messages.length - 5, 0)).forEach((message) { From 9c27ab75579f25b40f025419847c19db490cf850 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 15:49:27 -0500 Subject: [PATCH 082/118] Conditionally sort on dateCreated or dateDelivered whichever is earlier (#2660) --- .../pages/messages_view.dart | 6 +++--- .../widgets/header/header_widgets.dart | 2 +- .../message/reply/reply_thread_popup.dart | 4 ++-- .../timestamp/delivered_indicator.dart | 2 +- lib/helpers/ui/reaction_helpers.dart | 2 +- lib/models/global/chat_messages.dart | 2 +- lib/models/io/message.dart | 21 ++++++++++++++++++- .../ui/message/message_widget_controller.dart | 2 +- lib/services/ui/message/messages_service.dart | 10 ++++----- 9 files changed, 35 insertions(+), 16 deletions(-) diff --git a/lib/app/layouts/conversation_view/pages/messages_view.dart b/lib/app/layouts/conversation_view/pages/messages_view.dart index 38f30a6b4..9e7e46d4f 100644 --- a/lib/app/layouts/conversation_view/pages/messages_view.dart +++ b/lib/app/layouts/conversation_view/pages/messages_view.dart @@ -96,7 +96,7 @@ class MessagesViewState extends OptimizedState { await messageService.loadChunk(0, controller); } _messages = messageService.struct.messages; - _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + _messages.sort(Message.sort); setState(() {}); _messages.forEachIndexed((i, m) { final c = mwc(m); @@ -227,7 +227,7 @@ class MessagesViewState extends OptimizedState { final oldLength = _messages.length; _messages = messageService.struct.messages; - _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + _messages.sort(Message.sort); fetching = false; _messages.sublist(max(oldLength - 1, 0)).forEachIndexed((i, m) { if (!mounted) return; @@ -243,7 +243,7 @@ class MessagesViewState extends OptimizedState { void handleNewMessage(Message message) async { _messages.add(message); - _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + _messages.sort(Message.sort); final insertIndex = _messages.indexOf(message); if (listKey.currentState != null) { diff --git a/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart b/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart index 3b4d2b338..3d7936b22 100644 --- a/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart +++ b/lib/app/layouts/conversation_view/widgets/header/header_widgets.dart @@ -83,7 +83,7 @@ class ManualMarkState extends OptimizedState { onPressed: () async { List attachments = []; String text = ""; - widget.controller.selected.sort((a, b) => a.dateCreated!.compareTo(b.dateCreated!)); + widget.controller.selected.sort((a, b) => Message.sort(a, b, descending: false)); for (Message m in widget.controller.selected) { final _attachments = m.attachments .where((e) => as.getContent(e!, autoDownload: false) is PlatformFile) diff --git a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart index 84239dcff..2843d05eb 100644 --- a/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/reply/reply_thread_popup.dart @@ -16,7 +16,7 @@ import 'package:flutter_acrylic/flutter_acrylic.dart'; void showReplyThread(BuildContext context, Message message, MessagePart part, MessagesService service, ConversationViewController cvController) { final originatorPart = message.threadOriginatorGuid != null ? message.normalizedThreadPart : part.part; final _messages = service.struct.threads(message.threadOriginatorGuid ?? message.guid!, originatorPart); - _messages.sort((a, b) => a.dateCreated!.compareTo(b.dateCreated!)); + _messages.sort((a, b) => Message.sort(a, b, descending: false)); _buildThreadView(_messages, originatorPart, cvController, context); } @@ -32,7 +32,7 @@ void showBookmarksThread(ConversationViewController cvController, BuildContext c m.fetchAssociatedMessages(); m.handle = m.getHandle(); } - _messages.sort((a, b) => a.dateCreated!.compareTo(b.dateCreated!)); + _messages.sort((a, b) => Message.sort(a, b, descending: false)); _buildThreadView(_messages, null, cvController, context); } diff --git a/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart b/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart index 585aec47a..9e6e29b45 100644 --- a/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart +++ b/lib/app/layouts/conversation_view/widgets/message/timestamp/delivered_indicator.dart @@ -35,7 +35,7 @@ class _DeliveredIndicatorState extends CustomState (!iOS ? !e.isFromMe! : false) || (e.isFromMe! && (e.dateDelivered != null || e.dateRead != null))) - .toList()..sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + .toList()..sort(Message.sort); final index = messages.indexWhere((e) => e.guid == message.guid); if (index == 0) return true; if (index == 1 && message.isFromMe!) { diff --git a/lib/helpers/ui/reaction_helpers.dart b/lib/helpers/ui/reaction_helpers.dart index a403fbb17..fd73ac3a2 100644 --- a/lib/helpers/ui/reaction_helpers.dart +++ b/lib/helpers/ui/reaction_helpers.dart @@ -67,7 +67,7 @@ List getUniqueReactionMessages(List messages) { // Sort the messages, putting the latest at the top final ids = messages.map((e) => e.guid).toSet(); messages.retainWhere((element) => ids.remove(element.guid)); - messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + messages.sort(Message.sort); // Iterate over the messages and insert the latest reaction for each user for (Message msg in messages) { int cache = msg.isFromMe! ? 0 : msg.handleId ?? 0; diff --git a/lib/models/global/chat_messages.dart b/lib/models/global/chat_messages.dart index 935439a54..fb38e097e 100644 --- a/lib/models/global/chat_messages.dart +++ b/lib/models/global/chat_messages.dart @@ -89,7 +89,7 @@ class ChatMessages { } Message? getPreviousReply(String threadGuid, int threadPart, String messageGuid) { - final thread = threads(threadGuid, threadPart)..sort((a, b) => a.dateCreated!.compareTo(b.dateCreated!)); + final thread = threads(threadGuid, threadPart)..sort((a, b) => Message.sort(a, b, descending: false)); final index = thread.indexWhere((element) => element.guid == messageGuid); if (index > 0) { return thread[index - 1]; diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 0e2868192..8c6676055 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -204,7 +204,7 @@ class BulkSaveNewMessages extends AsyncTask, List> { } // 11. Update the associated chat's last message - messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + messages.sort(Message.sort); bool isNewer = false; // If the message was saved correctly, update this chat's latestMessage info, @@ -684,6 +684,25 @@ class Message { toDelete?.save(); } + /// This is purely because some Macs incorrectly report the dateCreated time + static int sort(Message a, Message b, {bool descending = true}) { + late DateTime aDateToUse; + if (a.dateDelivered == null) { + aDateToUse = a.dateCreated!; + } else { + aDateToUse = a.dateCreated!.isBefore(a.dateDelivered!) ? a.dateCreated! : a.dateDelivered!; + } + + late DateTime bDateToUse; + if (b.dateDelivered == null) { + bDateToUse = b.dateCreated!; + } else { + bDateToUse = b.dateCreated!.isBefore(b.dateDelivered!) ? b.dateCreated! : b.dateDelivered!; + } + + return descending ? bDateToUse.compareTo(aDateToUse) : aDateToUse.compareTo(bDateToUse); + } + String get fullText => sanitizeString([subject, text].where((e) => !isNullOrEmpty(e)!).join("\n")); // first condition is for macOS < 11 and second condition is for macOS >= 11 diff --git a/lib/services/ui/message/message_widget_controller.dart b/lib/services/ui/message/message_widget_controller.dart index 0286e7fb0..8f5757f60 100644 --- a/lib/services/ui/message/message_widget_controller.dart +++ b/lib/services/ui/message/message_widget_controller.dart @@ -187,7 +187,7 @@ class MessageWidgetController extends StatefulController with GetSingleTickerPro // update the latest 2 messages in case their indicators need to go away final messages = ms(chat).struct.messages .where((e) => e.isFromMe! && (e.dateDelivered != null || e.dateRead != null)) - .toList()..sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + .toList()..sort(Message.sort); for (Message m in messages.take(2)) { getActiveMwc(m.guid!)?.updateWidgets(null); } diff --git a/lib/services/ui/message/messages_service.dart b/lib/services/ui/message/messages_service.dart index b0f220e9d..b23a06cdf 100644 --- a/lib/services/ui/message/messages_service.dart +++ b/lib/services/ui/message/messages_service.dart @@ -35,13 +35,13 @@ class MessagesService extends GetxController { String? method; Message? get mostRecentSent => (struct.messages.where((e) => e.isFromMe!).toList() - ..sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!))).firstOrNull; + ..sort(Message.sort)).firstOrNull; Message? get mostRecent => (struct.messages.toList() - ..sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!))).firstOrNull; + ..sort(Message.sort)).firstOrNull; Message? get mostRecentReceived => (struct.messages.where((e) => !e.isFromMe!).toList() - ..sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!))).firstOrNull; + ..sort(Message.sort)).firstOrNull; void init(Chat c, Function(Message) onNewMessage, Function(Message, {String? oldGuid}) onUpdatedMessage, Function(Message) onDeletedMessage, Function(String) jumpToMessageFunc) { chat = c; @@ -207,7 +207,7 @@ class MessagesService extends GetxController { if (method == SearchMethod.local) { _messages = await Chat.getMessagesAsync(chat, searchAround: around.dateCreated!.millisecondsSinceEpoch); _messages.add(around); - _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + _messages.sort(Message.sort); struct.addMessages(_messages); } else { final beforeResponse = await cm.getMessages( @@ -223,7 +223,7 @@ class MessagesService extends GetxController { ); beforeResponse.addAll(afterResponse); _messages = beforeResponse.map((e) => Message.fromMap(e)).toList(); - _messages.sort((a, b) => b.dateCreated!.compareTo(a.dateCreated!)); + _messages.sort(Message.sort); for (Message message in _messages) { if (message.handle != null) { message.handle!.contactRelation.target = cs.matchHandleToContact(message.handle!); From 8bd16c2ce6fe0f5eb18c77c3a51c511dbf372b2b Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 16:55:08 -0500 Subject: [PATCH 083/118] Upgrade inline video player to media_kit --- .../message/attachment/video_player.dart | 598 ++++++------------ lib/main.dart | 6 +- .../ui/chat/conversation_view_controller.dart | 7 +- pubspec.lock | 8 + pubspec.yaml | 1 + 5 files changed, 210 insertions(+), 410 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart index 7aa91de3d..93a1f65d9 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart @@ -15,9 +15,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mime_type/mime_type.dart'; import 'package:universal_html/html.dart' as html; -import 'package:universal_io/io.dart'; -import 'package:video_player/video_player.dart'; -import 'package:video_player/video_player.dart' as vp; class VideoPlayer extends StatefulWidget { final PlatformFile file; @@ -29,257 +26,91 @@ class VideoPlayer extends StatefulWidget { final ConversationViewController? controller; @override - OptimizedState createState() => kIsDesktop ? _DesktopVideoPlayerState() : _VideoPlayerState(); -} - -class _VideoPlayerState extends OptimizedState with AutomaticKeepAliveClientMixin { - Attachment get attachment => widget.attachment; - - PlatformFile get file => widget.file; - - bool get isFromMe => widget.isFromMe; - - ConversationViewController? get cvController => widget.controller; - - PlayerStatus status = PlayerStatus.NONE; - bool hasListener = false; - VideoPlayerController? controller; - Uint8List? thumbnail; - final RxBool showPlayPauseOverlay = true.obs; - final RxBool muted = ss.settings.startVideosMuted.value.obs; - - @override - void initState() { - super.initState(); - controller = cvController?.videoPlayers[attachment.guid]; - thumbnail = cvController?.imageData[attachment.guid]; - - updateObx(() { - if (controller != null) { - createListener(controller!); - } - if (thumbnail == null) { - getThumbnail(); - } - }); - } - - Future initializeController() async { - PlatformFile _file = file; - if (kIsWeb || _file.path == null) { - final blob = html.Blob([_file.bytes]); - final url = html.Url.createObjectUrlFromBlob(blob); - controller = VideoPlayerController.networkUrl(Uri.parse(url)); - } else { - dynamic file = File(_file.path!); - controller = VideoPlayerController.file(file); - } - await controller!.initialize(); - createListener(controller!); - cvController?.videoPlayers[attachment.guid!] = controller!; - setState(() {}); - } - - void createListener(VideoPlayerController controller) { - if (hasListener) return; - controller.addListener(() async { - final currentStatus = getControllerStatus(controller); - // If the status hasn't changed, don't do anything - if (currentStatus == status) return; - status = currentStatus; - // If the status is ended, restart - if (status == PlayerStatus.ENDED) { - showPlayPauseOverlay.value = true; - await controller.pause(); - await controller.seekTo(Duration.zero); - } - }); - hasListener = true; - } - - void getThumbnail() async { - if (!kIsWeb) { - try { - // If we already errored, throw an error to load the error logo - if (attachment.metadata?['thumbnail_status'] == 'error') { - throw Exception('No video preview'); - } - // If we haven't errored at all, fetch the thumbnail - thumbnail = await as.getVideoThumbnail(file.path!); - } catch (ex) { - // If an error occurs, set the thumnail to the cached no preview image. - // Only save to DB if the status wasn't already `error` somehow - thumbnail = fs.noVideoPreviewIcon; - if (attachment.metadata?['thumbnail_status'] != 'error') { - attachment.metadata ??= {}; - attachment.metadata!['thumbnail_status'] = 'error'; - if (attachment.id != null) { - attachment.save(null); - } - } - } - - if (thumbnail == null) return; - cvController?.imageData[attachment.guid!] = thumbnail!; - await precacheImage(MemoryImage(thumbnail!), context); - setState(() {}); - } - } - - @override - Widget build(BuildContext context) { - super.build(context); - if (controller != null) { - return GestureDetector( - onTap: () async { - if (!kIsWeb && attachment.id == null) return; - if (controller!.value.isPlaying) { - controller!.pause(); - showPlayPauseOverlay.value = true; - } else { - if (!kIsWeb && attachment.id == null) return; - await Navigator.of(Get.context!).push( - ThemeSwitcher.buildPageRoute( - builder: (context) => FullscreenMediaHolder( - currentChat: cm.activeChat, - attachment: attachment, - showInteractions: true, - ), - ), - ); - } - }, - child: Stack( - alignment: Alignment.center, - children: [ - AspectRatio( - aspectRatio: controller!.value.aspectRatio, - child: vp.VideoPlayer(controller!), - ), - PlayPauseButton(showPlayPauseOverlay: showPlayPauseOverlay, controller: controller), - MuteButton(showPlayPauseOverlay: showPlayPauseOverlay, muted: muted, controller: controller, isFromMe: widget.isFromMe), - ], - ), - ); - } - return InkWell( - onTap: () async { - if (!kIsWeb && attachment.id == null) return; - await Navigator.of(Get.context!).push( - ThemeSwitcher.buildPageRoute( - builder: (context) => FullscreenMediaHolder( - currentChat: cm.activeChat, - attachment: attachment, - showInteractions: true, - ), - ), - ); - }, - child: thumbnail == null - ? SizedBox( - width: min((attachment.width?.toDouble() ?? ns.width(context) * 0.5), ns.width(context) * 0.5), - height: min((attachment.height?.toDouble() ?? ns.width(context) * 0.5 / attachment.aspectRatio), - ns.width(context) * 0.5 / attachment.aspectRatio), - ) - : Image.memory( - thumbnail!, - // prevents the image widget from "refreshing" when the provider changes - gaplessPlayback: true, - filterQuality: FilterQuality.none, - cacheWidth: (min((attachment.width ?? 0), ns.width(context) * 0.5) * Get.pixelRatio / 2).round().abs().nonZero, - cacheHeight: - (min((attachment.height ?? 0), ns.width(context) * 0.5 / attachment.aspectRatio) * Get.pixelRatio / 2).round().abs().nonZero, - fit: BoxFit.cover, - frameBuilder: (context, widget, frame, wasSyncLoaded) { - return AnimatedCrossFade( - crossFadeState: frame == null ? CrossFadeState.showFirst : CrossFadeState.showSecond, - alignment: Alignment.center, - duration: const Duration(milliseconds: 150), - secondChild: Stack( - alignment: Alignment.center, - children: [ - widget, - PlayPauseButton( - showPlayPauseOverlay: showPlayPauseOverlay, - controller: controller, - customOnTap: () async { - await initializeController(); - await controller!.setVolume(muted.value ? 0.0 : 100.0); - await controller!.play(); - showPlayPauseOverlay.value = false; - }), - MuteButton(showPlayPauseOverlay: showPlayPauseOverlay, muted: muted, controller: controller, isFromMe: isFromMe), - ], - ), - firstChild: SizedBox( - width: min((attachment.width?.toDouble() ?? ns.width(context) * 0.5), ns.width(context) * 0.5), - height: min((attachment.height?.toDouble() ?? ns.width(context) * 0.5 / attachment.aspectRatio), - ns.width(context) * 0.5 / attachment.aspectRatio), - )); - }, - )); - } - - @override - bool get wantKeepAlive => true; + OptimizedState createState() => _VideoPlayerState(); } class PlayPauseButton extends StatelessWidget { - const PlayPauseButton({super.key, required this.showPlayPauseOverlay, required this.controller, this.customOnTap}); + PlayPauseButton({ + super.key, + required this.showPlayPauseOverlay, + required this.controller, + this.customOnTap, + this.hover, + }); final RxBool showPlayPauseOverlay; - final VideoPlayerController? controller; + final Player? controller; final Function? customOnTap; + final RxBool? hover; + late final RxBool _hover = hover ?? false.obs; @override Widget build(BuildContext context) { - return Obx(() => AnimatedOpacity( - opacity: showPlayPauseOverlay.value && ReplyScope.maybeOf(context) == null ? 1 : 0, - duration: const Duration(milliseconds: 250), - child: Container( - height: 75, - width: 75, - decoration: BoxDecoration( - color: HexColor('26262a').withOpacity(0.5), - borderRadius: BorderRadius.circular(40), - ), - child: Padding( - padding: EdgeInsets.only( - left: ss.settings.skin.value == Skins.iOS && !(controller?.value.isPlaying ?? false) ? 17 : 10, - top: ss.settings.skin.value == Skins.iOS ? 13 : 10, - right: 10, - bottom: 10, - ), - child: controller?.value.isPlaying ?? false - ? GestureDetector( - child: Icon( + return Obx(() => MouseRegion( + onEnter: (event) => _hover.value = true, + onExit: (event) => _hover.value = false, + child: AbsorbPointer( + absorbing: !showPlayPauseOverlay.value && !_hover.value, + child: AnimatedOpacity( + opacity: _hover.value + ? 1 + : showPlayPauseOverlay.value && ReplyScope.maybeOf(context) == null + ? 0.5 + : 0, + duration: const Duration(milliseconds: 100), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(40), + onTap: () async { + if (controller?.state.playing ?? false) { + await controller!.pause(); + showPlayPauseOverlay.value = true; + } else { + if (customOnTap != null) { + customOnTap?.call(); + } else { + await controller!.play(); + showPlayPauseOverlay.value = false; + } + } + }, + child: Container( + height: 75, + width: 75, + decoration: BoxDecoration( + color: context.theme.colorScheme.background.withOpacity(0.5), + borderRadius: BorderRadius.circular(40), + ), + clipBehavior: Clip.antiAlias, + child: Padding( + padding: EdgeInsets.only( + left: ss.settings.skin.value == Skins.iOS && !(controller?.state.playing ?? false) ? 17 : 10, + top: ss.settings.skin.value == Skins.iOS ? 13 : 10, + right: 10, + bottom: 10, + ), + child: Obx( + () => controller?.state.playing ?? false + ? Icon( ss.settings.skin.value == Skins.iOS ? CupertinoIcons.pause : Icons.pause, - color: Colors.white, + color: context.iconColor, size: 45, - ), - onTap: () async { - await controller!.pause(); - showPlayPauseOverlay.value = true; - }, - ) - : GestureDetector( - child: Icon( + ) + : Icon( ss.settings.skin.value == Skins.iOS ? CupertinoIcons.play : Icons.play_arrow, - color: Colors.white, + color: context.iconColor, size: 45, ), - onTap: () async { - if (customOnTap != null) { - customOnTap?.call(); - } else { - await controller!.play(); - showPlayPauseOverlay.value = false; - } - }, ), + ), + ), + ), ), ), - )); + ), + ), + ); } } @@ -288,7 +119,7 @@ class MuteButton extends StatelessWidget { final RxBool showPlayPauseOverlay; final RxBool muted; - final VideoPlayerController? controller; + final Player? controller; final bool isFromMe; @override @@ -297,18 +128,23 @@ class MuteButton extends StatelessWidget { bottom: 8, right: (isFromMe) ? 15 : 8, child: Obx(() => AnimatedOpacity( - opacity: showPlayPauseOverlay.value && ReplyScope.maybeOf(context) == null ? 1 : 0, - duration: const Duration(milliseconds: 250), - child: AbsorbPointer( - absorbing: !showPlayPauseOverlay.value, - child: GestureDetector( - onTap: () { + opacity: showPlayPauseOverlay.value && ReplyScope.maybeOf(context) == null ? 1 : 0, + duration: const Duration(milliseconds: 250), + child: AbsorbPointer( + absorbing: !showPlayPauseOverlay.value, + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(40), + onTap: () async { muted.toggle(); - controller?.setVolume(muted.value ? 0.0 : 1.0); + await controller?.setVolume(muted.value ? 0.0 : 100.0); }, child: Container( + height: 30, + width: 30, decoration: BoxDecoration( - color: HexColor('26262a').withOpacity(0.5), + color: context.theme.colorScheme.background.withOpacity(0.5), borderRadius: BorderRadius.circular(40), ), padding: const EdgeInsets.all(5), @@ -327,11 +163,11 @@ class MuteButton extends StatelessWidget { ), ), )), - ); + )); } } -class _DesktopVideoPlayerState extends OptimizedState with AutomaticKeepAliveClientMixin { +class _VideoPlayerState extends OptimizedState with AutomaticKeepAliveClientMixin { Attachment get attachment => widget.attachment; PlatformFile get file => widget.file; @@ -347,10 +183,13 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati final RxBool showPlayPauseOverlay = true.obs; final RxBool muted = ss.settings.startVideosMuted.value.obs; final RxDouble aspectRatio = 1.0.obs; + Uint8List? thumbnail; @override void initState() { - VideoController? cachedController = cvController?.videoPlayersDesktop[attachment.guid]; + VideoController? cachedController = cvController?.videoPlayers[attachment.guid]; + thumbnail = cvController?.imageData[attachment.guid]; + player = Player(); if (cachedController != null) { videoController = cachedController; @@ -360,6 +199,11 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati createListener(videoController!, player); }); } + if (thumbnail == null && !kIsDesktop && !kIsWeb) { + updateObx(() { + getThumbnail(); + }); + } initializeController(); super.initState(); @@ -379,7 +223,7 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati await player.open(media, play: false); await player.setVolume(muted.value ? 0 : 100); createListener(videoController!, player); - cvController?.videoPlayersDesktop[attachment.guid!] = videoController!; + cvController?.videoPlayers[attachment.guid!] = videoController!; setState(() {}); } @@ -400,6 +244,35 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati hasListener = true; } + void getThumbnail() async { + if (!kIsWeb && !kIsDesktop) { + try { + // If we already errored, throw an error to load the error logo + if (attachment.metadata?['thumbnail_status'] == 'error') { + throw Exception('No video preview'); + } + // If we haven't errored at all, fetch the thumbnail + thumbnail = await as.getVideoThumbnail(file.path!); + } catch (ex) { + // If an error occurs, set the thumnail to the cached no preview image. + // Only save to DB if the status wasn't already `error` somehow + thumbnail = fs.noVideoPreviewIcon; + if (attachment.metadata?['thumbnail_status'] != 'error') { + attachment.metadata ??= {}; + attachment.metadata!['thumbnail_status'] = 'error'; + if (attachment.id != null) { + attachment.save(null); + } + } + } + + if (thumbnail == null) return; + cvController?.imageData[attachment.guid!] = thumbnail!; + await precacheImage(MemoryImage(thumbnail!), context); + setState(() {}); + } + } + @override void dispose() { player.dispose(); @@ -416,7 +289,24 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati onExit: (event) => showPlayPauseOverlay.value = !player.state.playing, child: GestureDetector( behavior: HitTestBehavior.opaque, - onTap: () async { + onTap: !kIsDesktop && !kIsWeb ? () async { + if (attachment.id == null) return; + if (player.state.playing) { + player.pause(); + showPlayPauseOverlay.value = true; + } else { + if (attachment.id == null) return; + await Navigator.of(Get.context!).push( + ThemeSwitcher.buildPageRoute( + builder: (context) => FullscreenMediaHolder( + currentChat: cm.activeChat, + attachment: attachment, + showInteractions: true, + ), + ), + ); + } + } : () async { if (attachment.id == null) return; await player.pause(); await Navigator.of(Get.context!).push( @@ -439,9 +329,10 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati aspectRatio: aspectRatio.value, child: Video(controller: videoController!, controls: null,), )), - DesktopPlayPauseButton(showPlayPauseOverlay: showPlayPauseOverlay, controller: player), - DesktopMuteButton(muted: muted, controller: player, isFromMe: widget.isFromMe), - FullscreenButton(attachment: attachment, isFromMe: widget.isFromMe,), + PlayPauseButton(showPlayPauseOverlay: showPlayPauseOverlay, controller: player), + MuteButton(showPlayPauseOverlay: showPlayPauseOverlay, muted: muted, controller: player, isFromMe: widget.isFromMe), + if (kIsDesktop) + FullscreenButton(attachment: attachment, isFromMe: widget.isFromMe,), ], ), ), @@ -453,7 +344,7 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati hoverColor: hover.value ? Colors.transparent : null, focusColor: hover.value ? Colors.transparent : null, onTap: () async { - if (attachment.id == null) return; + if (attachment.id == null || (!kIsDesktop && !kIsWeb)) return; await Navigator.of(Get.context!).push( ThemeSwitcher.buildPageRoute( builder: (context) => FullscreenMediaHolder( @@ -464,22 +355,23 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati ), ); }, - child: Padding( + child: thumbnail == null ? Padding( padding: const EdgeInsets.all(15.0), child: Row( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - DesktopPlayPauseButton( - showPlayPauseOverlay: showPlayPauseOverlay, - controller: player, - hover: hover, - customOnTap: () async { - await initializeController(); - await player.setVolume(muted.value ? 0.0 : 100.0); - await player.play(); - showPlayPauseOverlay.value = false; - }), + PlayPauseButton( + showPlayPauseOverlay: showPlayPauseOverlay, + controller: player, + hover: hover, + customOnTap: () async { + await initializeController(); + await player.setVolume(muted.value ? 0.0 : 100.0); + await player.play(); + showPlayPauseOverlay.value = false; + }, + ), const SizedBox(width: 10), Flexible( child: Column( @@ -504,147 +396,51 @@ class _DesktopVideoPlayerState extends OptimizedState with Automati ), ], ), - ), - ), - ); - } - - @override - bool get wantKeepAlive => true; -} - -class DesktopPlayPauseButton extends StatelessWidget { - DesktopPlayPauseButton({ - super.key, - required this.showPlayPauseOverlay, - required this.controller, - this.customOnTap, - this.hover, - }); - - final RxBool showPlayPauseOverlay; - final Player? controller; - final Function? customOnTap; - final RxBool? hover; - late final RxBool _hover = hover ?? false.obs; - - @override - Widget build(BuildContext context) { - return Obx( - () => MouseRegion( - onEnter: (event) => _hover.value = true, - onExit: (event) => _hover.value = false, - child: AbsorbPointer( - absorbing: !showPlayPauseOverlay.value && !_hover.value, - child: AnimatedOpacity( - opacity: _hover.value - ? 1 - : showPlayPauseOverlay.value && ReplyScope.maybeOf(context) == null - ? 0.5 - : 0, - duration: const Duration(milliseconds: 100), - child: Material( - color: Colors.transparent, - child: InkWell( - borderRadius: BorderRadius.circular(40), - onTap: () async { - if (controller?.state.playing ?? false) { - await controller!.pause(); - showPlayPauseOverlay.value = true; - } else { - if (customOnTap != null) { - customOnTap?.call(); - } else { - await controller!.play(); - showPlayPauseOverlay.value = false; - } - } - }, - child: Container( - height: 75, - width: 75, - decoration: BoxDecoration( - color: context.theme.colorScheme.background.withOpacity(0.5), - borderRadius: BorderRadius.circular(40), - ), - clipBehavior: Clip.antiAlias, - child: Padding( - padding: EdgeInsets.only( - left: ss.settings.skin.value == Skins.iOS && !(controller?.state.playing ?? false) ? 17 : 10, - top: ss.settings.skin.value == Skins.iOS ? 13 : 10, - right: 10, - bottom: 10, - ), - child: Obx( - () => controller?.state.playing ?? false - ? Icon( - ss.settings.skin.value == Skins.iOS ? CupertinoIcons.pause : Icons.pause, - color: context.iconColor, - size: 45, - ) - : Icon( - ss.settings.skin.value == Skins.iOS ? CupertinoIcons.play : Icons.play_arrow, - color: context.iconColor, - size: 45, - ), - ), + ) : Image.memory( + thumbnail!, + // prevents the image widget from "refreshing" when the provider changes + gaplessPlayback: true, + filterQuality: FilterQuality.none, + cacheWidth: (min((attachment.width ?? 0), ns.width(context) * 0.5) * Get.pixelRatio / 2).round().abs().nonZero, + cacheHeight: + (min((attachment.height ?? 0), ns.width(context) * 0.5 / attachment.aspectRatio) * Get.pixelRatio / 2).round().abs().nonZero, + fit: BoxFit.cover, + frameBuilder: (context, widget, frame, wasSyncLoaded) { + return AnimatedCrossFade( + crossFadeState: frame == null ? CrossFadeState.showFirst : CrossFadeState.showSecond, + alignment: Alignment.center, + duration: const Duration(milliseconds: 150), + secondChild: Stack( + alignment: Alignment.center, + children: [ + widget, + PlayPauseButton( + showPlayPauseOverlay: showPlayPauseOverlay, + controller: player, + customOnTap: () async { + await initializeController(); + await player.setVolume(muted.value ? 0.0 : 100.0); + await player.play(); + showPlayPauseOverlay.value = false; + }, + ), + MuteButton(showPlayPauseOverlay: showPlayPauseOverlay, muted: muted, controller: player, isFromMe: isFromMe), + ], ), - ), - ), - ), - ), - ), + firstChild: SizedBox( + width: min((attachment.width?.toDouble() ?? ns.width(context) * 0.5), ns.width(context) * 0.5), + height: min((attachment.height?.toDouble() ?? ns.width(context) * 0.5 / attachment.aspectRatio), + ns.width(context) * 0.5 / attachment.aspectRatio), + ) + ); + }, + ) ), ); } -} - -class DesktopMuteButton extends StatelessWidget { - const DesktopMuteButton({super.key, required this.muted, required this.controller, required this.isFromMe}); - - final RxBool muted; - final Player? controller; - final bool isFromMe; @override - Widget build(BuildContext context) { - return Positioned( - bottom: 8, - right: (isFromMe) ? 15 : 8, - child: Obx( - () => Material( - color: Colors.transparent, - child: InkWell( - borderRadius: BorderRadius.circular(40), - onTap: () async { - muted.toggle(); - await controller?.setVolume(muted.value ? 0.0 : 100.0); - }, - child: Container( - height: 30, - width: 30, - decoration: BoxDecoration( - color: context.theme.colorScheme.background.withOpacity(0.5), - borderRadius: BorderRadius.circular(40), - ), - padding: const EdgeInsets.all(5), - child: Icon( - muted.value - ? ss.settings.skin.value == Skins.iOS - ? CupertinoIcons.volume_mute - : Icons.volume_mute - : ss.settings.skin.value == Skins.iOS - ? CupertinoIcons.volume_up - : Icons.volume_up, - color: Colors.white, - size: 15, - ), - ), - ), - ), - ), - ); - } + bool get wantKeepAlive => true; } class FullscreenButton extends StatelessWidget { diff --git a/lib/main.dart b/lib/main.dart index 8bc81558d..8085b9548 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -310,6 +310,9 @@ Future initApp(bool bubble, List arguments) async { /* ----- DATE FORMATTING INITIALIZATION ----- */ await initializeDateFormatting(); + /* ----- MEDIAKIT INITIALIZATION ----- */ + MediaKit.ensureInitialized(); + /* ----- SPLASH SCREEN INITIALIZATION ----- */ if (!ss.settings.finishedSetup.value && !kIsWeb && !kIsDesktop) { runApp(MaterialApp( @@ -336,9 +339,6 @@ Future initApp(bool bubble, List arguments) async { /* ----- DESKTOP SPECIFIC INITIALIZATION ----- */ if (kIsDesktop) { - /* ----- MEDIAKIT INITIALIZATION ----- */ - MediaKit.ensureInitialized(); - /* ----- WINDOW INITIALIZATION ----- */ await windowManager.ensureInitialized(); await windowManager.setTitle('BlueBubbles'); diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index c016d9584..c70d4e44f 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -16,7 +16,6 @@ import 'package:metadata_fetch/metadata_fetch.dart'; import 'package:scroll_to_index/scroll_to_index.dart'; import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; -import 'package:video_player/video_player.dart'; ConversationViewController cvc(Chat chat, {String? tag}) => Get.isRegistered(tag: tag ?? chat.guid) ? Get.find(tag: tag ?? chat.guid) : Get.put(ConversationViewController(chat, tag_: tag), tag: tag ?? chat.guid); @@ -37,8 +36,7 @@ class ConversationViewController extends StatefulController with GetSingleTicker final List>> imageCacheQueue = []; final Map> stickerData = {}; final Map legacyUrlPreviews = {}; - final Map videoPlayers = {}; - final Map videoPlayersDesktop = {}; + final Map videoPlayers = {}; final Map audioPlayers = {}; final Map audioPlayersDesktop = {}; final Map> mlKitParsedText = {}; @@ -142,9 +140,6 @@ class ConversationViewController extends StatefulController with GetSingleTicker @override void onClose() { - for (VideoPlayerController v in videoPlayers.values) { - v.dispose(); - } for (PlayerController a in audioPlayers.values) { a.pausePlayer(); a.dispose(); diff --git a/pubspec.lock b/pubspec.lock index 5f09dc707..0626c802c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1715,6 +1715,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.10+1" + media_kit_libs_android_video: + dependency: "direct main" + description: + name: media_kit_libs_android_video + sha256: "9dd8012572e4aff47516e55f2597998f0a378e3d588d0fad0ca1f11a53ae090c" + url: "https://pub.dev" + source: hosted + version: "1.3.6" media_kit_libs_linux: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 47c0f66cf..5d6feef7e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -112,6 +112,7 @@ dependencies: media_kit: ^1.1.10+1 # Primary package. media_kit_video: ^1.2.4 # For video rendering. media_kit_native_event_loop: ^1.0.8 # Support for higher number of concurrent instances & better performance. + media_kit_libs_android_video: ^1.3.6 # Android package for video native libraries. media_kit_libs_windows_video: ^1.0.9 # Windows package for video native libraries. media_kit_libs_linux: ^1.1.3 # GNU/Linux dependency package. metadata_fetch: ^0.4.1 From 8f1847e88cd3369e2d56fdc6c371629c13c76beb Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 17:47:17 -0500 Subject: [PATCH 084/118] Change fullscreen video to use media kit on Android --- .../message/attachment/video_player.dart | 1 + .../fullscreen_media/fullscreen_video.dart | 331 +----------------- 2 files changed, 8 insertions(+), 324 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart index 93a1f65d9..50ae6aec4 100644 --- a/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart +++ b/lib/app/layouts/conversation_view/widgets/message/attachment/video_player.dart @@ -237,6 +237,7 @@ class _VideoPlayerState extends OptimizedState with AutomaticKeepAl if (completed) { await player.pause(); await player.seek(Duration.zero); + await player.pause(); showPlayPauseOverlay.value = true; showPlayPauseOverlay.refresh(); } diff --git a/lib/app/layouts/fullscreen_media/fullscreen_video.dart b/lib/app/layouts/fullscreen_media/fullscreen_video.dart index 6d4432393..57023965d 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_video.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_video.dart @@ -2,24 +2,18 @@ import 'dart:async'; import 'package:bluebubbles/app/layouts/fullscreen_media/dialogs/metadata_dialog.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; -import 'package:bluebubbles/utils/share.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/models/models.dart'; import 'package:bluebubbles/services/services.dart'; -import 'package:chewie/chewie.dart'; // (needed for custom back button) //ignore: implementation_imports -import 'package:chewie/src/notifiers/index.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:media_kit_video/media_kit_video_controls/media_kit_video_controls.dart' as media_kit_video_controls; -import 'package:provider/provider.dart'; import 'package:universal_html/html.dart' as html; -import 'package:universal_io/io.dart'; -import 'package:video_player/video_player.dart'; class FullscreenVideo extends StatefulWidget { FullscreenVideo({ @@ -34,324 +28,10 @@ class FullscreenVideo extends StatefulWidget { final bool showInteractions; @override - OptimizedState createState() => kIsDesktop ? _DesktopFullscreenVideoState() : _FullscreenVideoState(); + OptimizedState createState() => _FullscreenVideoState(); } class _FullscreenVideoState extends OptimizedState with AutomaticKeepAliveClientMixin { - bool showPlayPauseOverlay = false; - Timer? hideOverlayTimer; - late VideoPlayerController controller; - late ChewieController chewieController; - PlayerStatus status = PlayerStatus.NONE; - bool hasListener = false; - Uint8List? thumbnail; - bool hasError = false; - final RxBool isReloading = true.obs; - final RxBool muted = ss.settings.startVideosMutedFullscreen.value.obs; - - @override - void initState() { - super.initState(); - initControllers(); - } - - void togglePlayPauseOverlay(bool toggle) { - if (!mounted) return; - if (toggle != showPlayPauseOverlay) { - setState(() { - showPlayPauseOverlay = toggle; - }); - } - - // eventDispatcher.emit('overlay-toggle', toggle); - } - - void initControllers() async { - if (kIsWeb || widget.file.path == null) { - final blob = html.Blob([widget.file.bytes]); - final url = html.Url.createObjectUrlFromBlob(blob); - controller = VideoPlayerController.networkUrl(Uri.parse(url)); - } else { - dynamic file = File(widget.file.path!); - controller = VideoPlayerController.file(file); - } - controller.setVolume(muted.value ? 0 : 1); - await controller.initialize(); - chewieController = makeController(); - createListener(controller); - togglePlayPauseOverlay(!controller.value.isPlaying); - isReloading.value = false; - } - - ChewieController makeController() { - return ChewieController( - videoPlayerController: controller, - aspectRatio: controller.value.aspectRatio, - allowFullScreen: false, - allowMuting: false, - materialProgressColors: ChewieProgressColors( - playedColor: context.theme.colorScheme.primary, - handleColor: context.theme.colorScheme.primary, - bufferedColor: context.theme.colorScheme.primaryContainer, - backgroundColor: context.theme.colorScheme.properSurface, - ), - cupertinoProgressColors: ChewieProgressColors( - playedColor: context.theme.colorScheme.primary, - handleColor: context.theme.colorScheme.primary, - bufferedColor: context.theme.colorScheme.primaryContainer, - backgroundColor: context.theme.colorScheme.properSurface), - customControls: iOS - ? null - : Stack(children: [ - const Positioned.fill(child: MaterialControls()), - Positioned( - top: 0, - left: 5, - child: Consumer(builder: (BuildContext context, PlayerNotifier notifier, Widget? widget) { - return AnimatedOpacity( - opacity: notifier.hideStuff ? 0.0 : 0.8, - duration: const Duration( - milliseconds: 250, - ), - child: CupertinoButton( - padding: const EdgeInsets.symmetric(horizontal: 5), - onPressed: () async { - Navigator.pop(context); - }, - child: const Icon( - Icons.arrow_back, - color: Colors.white, - ), - ), - ); - }), - ), - ]), - additionalOptions: (context) => iOS || !widget.showInteractions - ? [] - : [ - OptionItem( - onTap: () async { - showMetadataDialog(widget.attachment, context); - }, - iconData: Icons.info, - title: 'Metadata', - ), - OptionItem( - onTap: () async { - Navigator.pop(context); - refreshAttachment(); - }, - iconData: Icons.refresh, - title: 'Redownload attachment', - ), - OptionItem( - onTap: () async { - Navigator.pop(context); - await as.saveToDisk(widget.file); - }, - iconData: Icons.download, - title: 'Save to gallery', - ), - if (!kIsWeb && !kIsDesktop) - OptionItem( - onTap: () async { - Navigator.pop(context); - if (widget.file.path == null) return; - Share.file( - "Shared ${widget.attachment.mimeType!.split("/")[0]} from BlueBubbles: ${widget.attachment.transferName}", - widget.file.path!, - ); - }, - iconData: Icons.share, - title: 'Share', - ), - OptionItem( - onTap: () async { - Navigator.pop(context); - controller.setVolume(controller.value.volume != 0.0 ? 0.0 : 1.0); - }, - iconData: controller.value.volume == 0.0 ? Icons.volume_up : Icons.volume_mute, - title: controller.value.volume == 0.0 ? 'Unmute' : 'Mute', - ), - ]); - } - - void createListener(VideoPlayerController controller) { - if (hasListener) return; - controller.addListener(() async { - // Get the current status - PlayerStatus currentStatus = getControllerStatus(controller); - // If the status hasn't changed, don't do anything - if (currentStatus == status) return; - status = currentStatus; - // If the status is ended, restart - if (status == PlayerStatus.ENDED) { - togglePlayPauseOverlay(true); - await controller.pause(); - await controller.seekTo(const Duration()); - } - }); - hasListener = true; - } - - @override - void dispose() { - hideOverlayTimer?.cancel(); - print("ON DISPOSE"); - controller.dispose(); - chewieController.dispose(); - super.dispose(); - } - - void refreshAttachment() { - isReloading.value = true; - showSnackbar('In Progress', 'Redownloading attachment. Please wait...'); - as.redownloadAttachment(widget.attachment, onComplete: (file) async { - controller.dispose(); - chewieController.dispose(); - hasListener = false; - if (kIsWeb || file.path == null) { - final blob = html.Blob([file.bytes]); - final url = html.Url.createObjectUrlFromBlob(blob); - controller = VideoPlayerController.networkUrl(Uri.parse(url)); - } else { - dynamic _file = File(file.path!); - controller = VideoPlayerController.file(_file); - } - await controller.initialize(); - isReloading.value = false; - controller.setVolume(muted.value ? 0 : 1); - chewieController = makeController(); - createListener(controller); - togglePlayPauseOverlay(!controller.value.isPlaying); - }, onError: () { - setState(() { - hasError = true; - }); - }); - } - - @override - bool get wantKeepAlive => true; - - @override - Widget build(BuildContext context) { - super.build(context); - return Scaffold( - backgroundColor: Colors.black, - floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - bottomNavigationBar: !showPlayPauseOverlay || !iOS || !widget.showInteractions - ? null - : Theme( - data: context.theme.copyWith( - navigationBarTheme: context.theme.navigationBarTheme.copyWith( - indicatorColor: samsung ? Colors.black : context.theme.colorScheme.properSurface, - ), - ), - child: NavigationBar( - selectedIndex: 0, - backgroundColor: samsung ? Colors.black : context.theme.colorScheme.properSurface, - labelBehavior: NavigationDestinationLabelBehavior.alwaysHide, - elevation: 0, - height: 60, - destinations: [ - NavigationDestination( - icon: Icon( - iOS ? CupertinoIcons.cloud_download : Icons.file_download, - color: samsung ? Colors.white : context.theme.colorScheme.primary, - ), - label: 'Download'), - NavigationDestination( - icon: Icon( - iOS ? CupertinoIcons.info : Icons.info, - color: context.theme.colorScheme.primary, - ), - label: 'Metadata'), - NavigationDestination( - icon: Icon( - iOS ? CupertinoIcons.refresh : Icons.refresh, - color: context.theme.colorScheme.primary, - ), - label: 'Refresh'), - NavigationDestination( - icon: Icon( - controller.value.volume == 0.0 - ? iOS - ? CupertinoIcons.volume_mute - : Icons.volume_mute - : iOS - ? CupertinoIcons.volume_up - : Icons.volume_up, - color: context.theme.colorScheme.primary, - ), - label: 'Mute'), - if (!kIsDesktop && !kIsWeb) - NavigationDestination( - icon: Icon( - iOS ? CupertinoIcons.share : Icons.share, - color: samsung ? Colors.white : context.theme.colorScheme.primary, - ), - label: 'Share'), - ], - onDestinationSelected: (value) async { - if (value == 0) { - await as.saveToDisk(widget.file); - } else if (value == 1) { - showMetadataDialog(widget.attachment, context); - } else if (value == 2) { - refreshAttachment(); - } else if (value == 3) { - controller.setVolume(controller.value.volume != 0.0 ? 0.0 : 1.0); - setState(() {}); - } else if (value == 4) { - if (widget.file.path == null) return; - Share.file( - "Shared ${widget.attachment.mimeType!.split("/")[0]} from BlueBubbles: ${widget.attachment.transferName}", - widget.file.path!, - ); - } - }, - ), - ), - body: Listener( - onPointerUp: (_) async { - if (iOS) { - togglePlayPauseOverlay(true); - if (hideOverlayTimer?.isActive ?? false) hideOverlayTimer?.cancel(); - hideOverlayTimer = Timer(const Duration(seconds: 3), () { - if (!controller.value.isPlaying) return; - togglePlayPauseOverlay(false); - }); - } - }, - child: Obx(() { - if (!isReloading.value) { - return SafeArea( - child: Center( - child: Theme( - data: context.theme.copyWith( - platform: iOS ? TargetPlatform.iOS : TargetPlatform.android, - dialogBackgroundColor: context.theme.colorScheme.properSurface, - iconTheme: context.theme.iconTheme.copyWith(color: context.theme.textTheme.bodyMedium?.color)), - child: Chewie(controller: chewieController), - ), - ), - ); - } else if (hasError) { - return Center(child: Text("Failed to load video", style: context.theme.textTheme.bodyLarge)); - } else { - return Center( - child: buildProgressIndicator(context), - ); - } - }), - ), - ); - } -} - -class _DesktopFullscreenVideoState extends OptimizedState with AutomaticKeepAliveClientMixin { Timer? hideOverlayTimer; late Player player; @@ -400,7 +80,9 @@ class _DesktopFullscreenVideoState extends OptimizedState with if (completed && !hasDisposed) { await player.pause(); await player.seek(Duration.zero); + await player.pause(); showPlayPauseOverlay.value = true; + showPlayPauseOverlay.refresh(); } }); hasListener = true; @@ -520,10 +202,11 @@ class _DesktopFullscreenVideoState extends OptimizedState with alignment: Alignment.center, children: [ Video(controller: videoController, controls: (state) => Padding( - padding: const EdgeInsets.all(20), + padding: EdgeInsets.all(!kIsWeb && !kIsDesktop ? 0 : 20).copyWith(bottom: !kIsWeb && !kIsDesktop ? 10 : 0), child: media_kit_video_controls.AdaptiveVideoControls(state), )), - Obx(() { + if (kIsWeb || kIsDesktop) + Obx(() { return MouseRegion( onEnter: (event) => _hover.value = true, onExit: (event) => _hover.value = false, @@ -585,7 +268,7 @@ class _DesktopFullscreenVideoState extends OptimizedState with ), ); }), - if (!iOS) + if (!iOS && (kIsWeb || kIsDesktop)) Positioned( top: 10, left: 10, From 02ef1ca451a8b2d8d8c456baf045ffc6e07052e8 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 8 Feb 2024 17:51:50 -0500 Subject: [PATCH 085/118] Increase filter quality for fullscreen video --- lib/app/layouts/fullscreen_media/fullscreen_video.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/app/layouts/fullscreen_media/fullscreen_video.dart b/lib/app/layouts/fullscreen_media/fullscreen_video.dart index 57023965d..b8b196d62 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_video.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_video.dart @@ -204,7 +204,7 @@ class _FullscreenVideoState extends OptimizedState with Automat Video(controller: videoController, controls: (state) => Padding( padding: EdgeInsets.all(!kIsWeb && !kIsDesktop ? 0 : 20).copyWith(bottom: !kIsWeb && !kIsDesktop ? 10 : 0), child: media_kit_video_controls.AdaptiveVideoControls(state), - )), + ), filterQuality: FilterQuality.medium), if (kIsWeb || kIsDesktop) Obx(() { return MouseRegion( From c383b0e4e137ac06edc522f87b25a772fef36b14 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 9 Feb 2024 18:06:26 -0600 Subject: [PATCH 086/118] Add spellcheck. Fix edited messages not being autofocused properly. Signed-off-by: Joel Jothiprakasam --- .../custom_text_editing_controllers.dart | 438 ++++++++++++++++++ .../mentionable_text_editing_controller.dart | 177 ------- .../layouts/chat_creator/chat_creator.dart | 4 +- .../dialogs/custom_mention_dialog.dart | 2 +- .../widgets/effects/send_effect_picker.dart | 2 +- .../widgets/message/message_holder.dart | 24 +- .../widgets/message/popup/message_popup.dart | 3 +- .../message/popup/message_popup_holder.dart | 3 +- .../widgets/message/send_animation.dart | 2 +- .../text_field/conversation_text_field.dart | 250 ++++++---- .../text_field/picked_attachments_holder.dart | 4 +- .../widgets/text_field/text_field_suffix.dart | 4 +- .../ui/chat/conversation_view_controller.dart | 8 +- .../ui/navigator/navigator_service.dart | 2 + pubspec.lock | 16 + pubspec.yaml | 1 + 16 files changed, 656 insertions(+), 284 deletions(-) create mode 100644 lib/app/components/custom_text_editing_controllers.dart delete mode 100644 lib/app/components/mentionable_text_editing_controller.dart diff --git a/lib/app/components/custom_text_editing_controllers.dart b/lib/app/components/custom_text_editing_controllers.dart new file mode 100644 index 000000000..b094fc718 --- /dev/null +++ b/lib/app/components/custom_text_editing_controllers.dart @@ -0,0 +1,438 @@ +import "package:bluebubbles/helpers/helpers.dart"; +import "package:bluebubbles/models/models.dart"; +import "package:bluebubbles/services/ui/navigator/navigator_service.dart"; +import "package:collection/collection.dart"; +import "package:flutter/foundation.dart"; +import "package:flutter/gestures.dart"; +import "package:flutter/material.dart"; +import "package:get/get.dart"; +import "package:languagetool_textfield/core/enums/mistake_type.dart"; +import 'package:languagetool_textfield/languagetool_textfield.dart'; +import "package:languagetool_textfield/utils/closed_range.dart"; +import "package:languagetool_textfield/utils/keep_latest_response_service.dart"; + +class Mentionable { + Mentionable({required this.handle}); + + final Handle handle; + String? customDisplayName; + + String get displayName => customDisplayName ?? handle.displayName; + + String get address => handle.address; + + @override + bool operator ==(Object other) => identical(this, other) || other is Mentionable && runtimeType == other.runtimeType && address == other.address; + + @override + int get hashCode => address.hashCode; + + @override + String toString() => displayName; +} + +class SpellCheckTextEditingController extends TextEditingController { + SpellCheckTextEditingController({super.text}) { + _languageCheckService = DebounceLangToolService(LangToolService(LanguageToolClient()), const Duration(milliseconds: 500)); + if (text.isNotEmpty) { + _processMistakes(text); + } + } + + /// Language tool configs + final HighlightStyle highlightStyle = const HighlightStyle(); + final _latestResponseService = KeepLatestResponseService(); + late final LanguageCheckService _languageCheckService; + + /// List which contains Mistake objects spans are built from + List _mistakes = []; + int _selectedMistakeIndex = -1; + + Mistake? get selectedMistake => _selectedMistakeIndex == -1 ? null : _mistakes.elementAtOrNull(_selectedMistakeIndex); + + /// Overlay entry for the mistake popup + OverlayEntry? _overlayEntry; + + Object? _fetchError; + + /// An error that may have occurred during the API fetch. + Object? get fetchError => _fetchError; + + @override + set value(TextEditingValue newValue) { + if (kIsDesktop || kIsWeb) { + _handleTextChange(newValue.text); + } + super.value = newValue; + } + + @override + set selection(TextSelection newSelection) { + if (kIsDesktop || kIsWeb) { + _handleSelectionChange(newSelection); + } + super.selection = newSelection; + } + + @override + void dispose() { + _languageCheckService.dispose(); + super.dispose(); + } + + /// Replaces mistake with given replacement + void replaceMistake(Mistake mistake, String replacement) { + final mistakes = List.from(_mistakes); + mistakes.remove(mistake); + _mistakes = mistakes; + text = text.replaceRange(mistake.offset, mistake.endOffset, replacement); + Future.microtask.call(() { + final newOffset = mistake.offset + replacement.length; + selection = TextSelection.fromPosition(TextPosition(offset: newOffset)); + }); + } + + /// Clear mistakes list when text mas modified and get a new list of mistakes + /// via API + Future _handleTextChange(String newText) async { + ///set value triggers each time, even when cursor changes its location + ///so this check avoid cleaning Mistake list when text wasn't really changed + if (newText == text || newText.isEmpty) return; + + await _processMistakes(newText); + } + + Future _handleSelectionChange(TextSelection newSelection) async { + if (newSelection.baseOffset == newSelection.extentOffset) { + _selectedMistakeIndex = -1; + return; + } + final mistakeIndex = _mistakes.indexWhere((e) => (e.offset == newSelection.baseOffset) && (e.endOffset == newSelection.extentOffset)); + if (mistakeIndex != -1) { + _selectedMistakeIndex = mistakeIndex; + } else { + _selectedMistakeIndex = -1; + } + } + + Future _processMistakes(String newText) async { + final filteredMistakes = _filterMistakesOnChanged(newText); + _mistakes = filteredMistakes.toList(); + + final mistakesWrapper = await _latestResponseService.processLatestOperation( + () => _languageCheckService.findMistakes(newText), + ); + if (mistakesWrapper == null || !mistakesWrapper.hasResult) return; + + final mistakes = mistakesWrapper.result(); + _fetchError = mistakesWrapper.error; + + _mistakes = mistakes; + notifyListeners(); + } + + /// Filters the list of mistakes based on the changes + /// in the text when it is changed. + Iterable _filterMistakesOnChanged(String newText) sync* { + final isSelectionRangeEmpty = selection.end == selection.start; + final lengthDiscrepancy = newText.length - text.length; + + for (final mistake in _mistakes) { + Mistake? newMistake; + + newMistake = isSelectionRangeEmpty + ? _adjustMistakeOffsetWithCaretCursor( + mistake: mistake, + lengthDiscrepancy: lengthDiscrepancy, + ) + : _adjustMistakeOffsetWithSelectionRange( + mistake: mistake, + lengthDiscrepancy: lengthDiscrepancy, + ); + + if (newMistake != null) yield newMistake; + } + } + + /// Adjusts the mistake offset when the selection is a caret cursor. + Mistake? _adjustMistakeOffsetWithCaretCursor({ + required Mistake mistake, + required int lengthDiscrepancy, + }) { + final mistakeRange = ClosedRange(mistake.offset, mistake.endOffset); + final caretLocation = selection.base.offset; + + // Don't highlight mistakes on changed text + // until we get an update from the API. + final isCaretOnMistake = mistakeRange.contains(caretLocation); + if (isCaretOnMistake) return null; + + final shouldAdjustOffset = mistakeRange.isBeforeOrAt(caretLocation); + if (!shouldAdjustOffset) return mistake; + + final newOffset = mistake.offset + lengthDiscrepancy; + + return mistake.copyWith(offset: newOffset); + } + + /// Adjusts the mistake offset when the selection is a range. + Mistake? _adjustMistakeOffsetWithSelectionRange({ + required Mistake mistake, + required int lengthDiscrepancy, + }) { + final selectionRange = ClosedRange(selection.start, selection.end); + final mistakeRange = ClosedRange(mistake.offset, mistake.endOffset); + + final hasSelectedTextChanged = selectionRange.overlapsWith(mistakeRange); + if (hasSelectedTextChanged) return null; + + final shouldAdjustOffset = selectionRange.isAfterOrAt(mistake.offset); + if (!shouldAdjustOffset) return mistake; + + final newOffset = mistake.offset + lengthDiscrepancy; + + return mistake.copyWith(offset: newOffset); + } + + /// Returns color for mistake TextSpan style + Color _getMistakeColor(MistakeType type) { + switch (type) { + case MistakeType.misspelling: + return highlightStyle.misspellingMistakeColor; + case MistakeType.typographical: + return highlightStyle.typographicalMistakeColor; + case MistakeType.grammar: + return highlightStyle.grammarMistakeColor; + case MistakeType.uncategorized: + return highlightStyle.uncategorizedMistakeColor; + case MistakeType.nonConformance: + return highlightStyle.nonConformanceMistakeColor; + case MistakeType.style: + return highlightStyle.styleMistakeColor; + case MistakeType.other: + return highlightStyle.otherMistakeColor; + } + } + + /// Builds a TextSpan with mistakes highlighted + /// [chunk] - the text chunk to build TextSpan for + /// [offset] - the offset of the chunk in the whole text + /// [endOffset] - the end offset of the chunk in the whole text + /// [style] - the style to apply to the text + TextSpan buildMistakeTextSpans({ + required BuildContext context, + required String chunk, + required int offset, + TextStyle? style, + }) { + // Only spellcheck on desktop/web + if (kIsDesktop || kIsWeb) { + // Check if there are mistakes in this chunk + int endOffset = offset + chunk.length; + final mistakes = _mistakes.where((e) => e.offset >= offset && e.endOffset <= endOffset).toList(); + List spans = []; + if (mistakes.isNotEmpty) { + // Split text into mistakes and nonmistakes + for (int i = 0; i < mistakes.length; i++) { + final mistake = mistakes[i]; + final mistakeStart = mistake.offset - offset; + final mistakeEnd = mistake.endOffset - offset; + final mistakeText = chunk.substring(mistakeStart, mistakeEnd); + final mistakeStyle = (style ?? const TextStyle()).copyWith( + backgroundColor: _getMistakeColor(mistake.type).withOpacity(highlightStyle.backgroundOpacity), + decoration: highlightStyle.decoration, + decorationColor: _getMistakeColor(mistake.type), + decorationThickness: highlightStyle.mistakeLineThickness, + ); + + final prevMistakeEnd = i == 0 ? 0 : mistakes[i - 1].endOffset - offset; + final leadingNonMistakeText = chunk.substring(prevMistakeEnd, mistakeStart); + if (leadingNonMistakeText.isNotEmpty) spans.add(TextSpan(text: leadingNonMistakeText, style: style)); + + spans.add( + TextSpan( + text: mistakeText, + style: mistakeStyle, + ), + ); + + if (i == mistakes.length - 1) { + final nextMistakeStart = i == mistakes.length - 1 ? chunk.length : mistakes[i + 1].offset - offset; + final trailingNonMistakeText = chunk.substring(mistakeEnd, nextMistakeStart); + if (trailingNonMistakeText.isNotEmpty) spans.add(TextSpan(text: trailingNonMistakeText, style: style)); + } + } + return TextSpan(children: spans); + } + } + return TextSpan(text: chunk, style: style); + } + + @override + TextSpan buildTextSpan({ + required BuildContext context, + TextStyle? style, + required bool withComposing, + }) { + return buildMistakeTextSpans(context: context, chunk: text, offset: 0, style: style); + } +} + +class MentionTextEditingController extends SpellCheckTextEditingController { + MentionTextEditingController({ + super.text, + this.mentionables = const [], + }); + + static const escapingChar = ""; + static const zeroWidthSpace = "​"; + static final escapingRegex = RegExp('$escapingChar\\d+$escapingChar'); + + List mentionables; + + // mention cache + Iterable mentionedIndices = []; + + void processMentions() { + final matches = escapingRegex.allMatches(text); + mentionedIndices = matches.map((m) => int.tryParse(text.substring(m.start + 1, m.end - 1))).whereNotNull(); + mentionables.forEachIndexed((i, m) { + if (!mentionedIndices.contains(i)) { + m.customDisplayName = null; + } + }); + } + + void addMention(String candidate, Mentionable mentionable) { + final indexSelection = selection.base.offset; + final atIndex = text.substring(0, indexSelection).lastIndexOf("@"); + final index = mentionables.indexOf(mentionable); + if (index == -1 || atIndex == -1) return; + List textParts = [text.substring(0, atIndex), text.substring(atIndex, indexSelection), text.substring(indexSelection)]; + final addSpace = !textParts[2].startsWith(" "); + final replacement = "$escapingChar$index$escapingChar${addSpace ? " " : ""}"; + text = textParts[0] + textParts[1].replaceFirst(candidate, replacement) + textParts[2]; + selection = TextSelection.collapsed(offset: indexSelection - candidate.length + replacement.length); + processMentions(); + } + + String get cleansedText { + final res = escapingRegex.allMatches(text); + List textSplit = []; + int start = 0; + int end = 0; + int index = 0; + while (index < res.length) { + RegExpMatch elem = res.elementAt(index++); + end = elem.start; + if (start != end) { + textSplit.add(text.substring(start, end)); + } + textSplit.add(text.substring(elem.start, elem.start + 1)); + textSplit.add(text.substring(elem.start + 1, elem.end - 1)); + textSplit.add(text.substring(elem.end - 1, elem.end)); + start = elem.end; + } + if (start < text.length) { + textSplit.add(text.substring(start)); + } + bool flag = false; + return textSplit.map((word) { + if (word == escapingChar) { + flag = !flag; + return ""; + } + int? index = flag ? int.tryParse(word) : null; + if (index != null) { + final mention = mentionables[index]; + return mention.displayName; + } + return word; + }).join(); + } + + static List splitText(String text) { + final res = escapingRegex.allMatches(text); + List textSplit = []; + int start = 0; + int end = 0; + int index = 0; + while (index < res.length) { + RegExpMatch elem = res.elementAt(index++); + end = elem.start; + if (start != end) { + textSplit.add(text.substring(start, end)); + } + textSplit.add(text.substring(elem.start, elem.start + 1)); + textSplit.add(text.substring(elem.start + 1, elem.end - 1)); + textSplit.add(text.substring(elem.end - 1, elem.end)); + start = elem.end; + } + if (start < text.length) { + textSplit.add(text.substring(start)); + } + return textSplit; + } + + @override + TextSpan buildTextSpan({ + required BuildContext context, + TextStyle? style, + required bool withComposing, + }) { + final textSplit = splitText(text); + bool flag = false; + int mentionIndexLength = 0; + return TextSpan( + children: textSplit.mapIndexed((idx, word) { + int offset = textSplit.slice(0, idx).join("").length; + + if (word == escapingChar) flag = !flag; + int? index = flag ? int.tryParse(word) : null; + if (index != null) { + final mention = mentionables[index]; + mentionIndexLength = "$index".length; + // Mandatory WidgetSpan so that it takes the appropriate char number. + return WidgetSpan( + child: Listener( + onPointerDown: (PointerDownEvent e) { + if (selection.isCollapsed && e.buttons == 2) { + // Right click + selection = TextSelection(baseOffset: offset - 1, extentOffset: offset + word.length + 1); + } + }, + child: ShaderMask( + blendMode: BlendMode.srcIn, + shaderCallback: (bounds) => LinearGradient( + colors: [context.theme.colorScheme.primary.darkenPercent(20), context.theme.colorScheme.primary.lightenPercent(20)], + ).createShader( + Rect.fromLTWH(0, 0, bounds.width, bounds.height), + ), + child: Text( + mention.displayName, + style: style!.copyWith(fontWeight: FontWeight.bold).apply(heightFactor: 1.1), + ), + ), + ), + ); + } + if (word == escapingChar) { + String text = zeroWidthSpace; + if (mentionIndexLength > 1) { + text = List.filled(mentionIndexLength, zeroWidthSpace).join(); + mentionIndexLength = 0; + } + return TextSpan(text: text, style: style); + } + + // Anything beyond this point is not a mention. So fallback to original style. + return buildMistakeTextSpans( + context: context, + chunk: word.replaceAll(escapingChar, zeroWidthSpace), + offset: offset, + style: style, + ); + }).toList(), + ); + } +} diff --git a/lib/app/components/mentionable_text_editing_controller.dart b/lib/app/components/mentionable_text_editing_controller.dart deleted file mode 100644 index 60dc5ae7b..000000000 --- a/lib/app/components/mentionable_text_editing_controller.dart +++ /dev/null @@ -1,177 +0,0 @@ -import "package:bluebubbles/helpers/helpers.dart"; -import "package:bluebubbles/models/models.dart"; -import "package:collection/collection.dart"; -import "package:flutter/material.dart"; -import "package:get/get.dart"; - -class Mentionable { - Mentionable({required this.handle}); - - final Handle handle; - String? customDisplayName; - - String get displayName => customDisplayName ?? handle.displayName; - - String get address => handle.address; - - String buildMention() => '$displayName'; - - bool match(String search) => address.toLowerCase().contains(search.toLowerCase()); - - @override - bool operator ==(Object other) => identical(this, other) || other is Mentionable && runtimeType == other.runtimeType && address == other.address; - - @override - int get hashCode => address.hashCode; - - @override - String toString() => displayName; -} - - -class MentionTextEditingController extends TextEditingController { - MentionTextEditingController({super.text, this.mentionables=const []}); - static const escapingChar = ""; - static const zeroWidthSpace = "​"; - static final escapingRegex = RegExp('$escapingChar\\d+$escapingChar'); - - List mentionables; - - // mention cache - Iterable mentionedIndices = []; - - void processMentions() { - final matches = escapingRegex.allMatches(text); - mentionedIndices = matches.map((m) => int.tryParse(text.substring(m.start + 1, m.end - 1))).whereNotNull(); - mentionables.forEachIndexed((i, m) { - if (!mentionedIndices.contains(i)) { - m.customDisplayName = null; - } - }); - } - - void addMention(String candidate, Mentionable mentionable) { - final indexSelection = selection.base.offset; - final atIndex = text.substring(0, indexSelection).lastIndexOf("@"); - final index = mentionables.indexOf(mentionable); - if (index == -1 || atIndex == -1) return; - List textParts = [text.substring(0, atIndex), text.substring(atIndex, indexSelection), text.substring(indexSelection)]; - final addSpace = !textParts[2].startsWith(" "); - final replacement = "$escapingChar$index$escapingChar${addSpace ? " " : ""}"; - text = textParts[0] + textParts[1].replaceFirst(candidate, replacement) + textParts[2]; - selection = TextSelection.collapsed(offset: indexSelection - candidate.length + replacement.length); - processMentions(); - } - - String get cleansedText { - final res = escapingRegex.allMatches(text); - List textSplit = []; - int start = 0; - int end = 0; - int index = 0; - while (index < res.length) { - RegExpMatch elem = res.elementAt(index++); - end = elem.start; - if (start != end) { - textSplit.add(text.substring(start, end)); - } - textSplit.add(text.substring(elem.start, elem.start + 1)); - textSplit.add(text.substring(elem.start + 1, elem.end - 1)); - textSplit.add(text.substring(elem.end - 1, elem.end)); - start = elem.end; - } - if (start < text.length) { - textSplit.add(text.substring(start)); - } - bool flag = false; - return textSplit.map((word) { - if (word == escapingChar) { - flag = !flag; - return ""; - } - int? index = flag ? int.tryParse(word) : null; - if (index != null) { - final mention = mentionables[index]; - return mention.displayName; - } - return word; - }).join(); - } - - static List splitText(String text) { - final res = escapingRegex.allMatches(text); - List textSplit = []; - int start = 0; - int end = 0; - int index = 0; - while (index < res.length) { - RegExpMatch elem = res.elementAt(index++); - end = elem.start; - if (start != end) { - textSplit.add(text.substring(start, end)); - } - textSplit.add(text.substring(elem.start, elem.start + 1)); - textSplit.add(text.substring(elem.start + 1, elem.end - 1)); - textSplit.add(text.substring(elem.end - 1, elem.end)); - start = elem.end; - } - if (start < text.length) { - textSplit.add(text.substring(start)); - } - return textSplit; - } - - @override - TextSpan buildTextSpan({ - required BuildContext context, - TextStyle? style, - required bool withComposing, - }) { - final textSplit = splitText(text); - bool flag = false; - int mentionIndexLength = 0; - return TextSpan( - style: style, - children: textSplit.mapIndexed((idx, word) { - if (word == escapingChar) flag = !flag; - int? index = flag ? int.tryParse(word) : null; - if (index != null) { - final mention = mentionables[index]; - mentionIndexLength = "$index".length; - // Mandatory WidgetSpan so that it takes the appropriate char number. - return WidgetSpan( - child: Listener( - onPointerDown: (PointerDownEvent e) { - if (selection.isCollapsed && e.buttons == 2) { // Right click - final start = textSplit.slice(0, idx).join("").length; - selection = TextSelection(baseOffset: start - 1, extentOffset: start + word.length + 1); - } - }, - child: ShaderMask( - blendMode: BlendMode.srcIn, - shaderCallback: (bounds) => LinearGradient( - colors: [context.theme.colorScheme.primary.darkenPercent(20), context.theme.colorScheme.primary.lightenPercent(20)], - ).createShader( - Rect.fromLTWH(0, 0, bounds.width, bounds.height), - ), - child: Text( - mention.displayName, - style: style!.copyWith(fontWeight: FontWeight.bold).apply(heightFactor: 1.1), - ), - ), - ), - ); - } - if (word == escapingChar) { - String text = zeroWidthSpace; - if (mentionIndexLength > 1) { - text = List.filled(mentionIndexLength, zeroWidthSpace).join(); - mentionIndexLength = 0; - } - return TextSpan(text: text, style: style); - } - return TextSpan(text: word.replaceAll(escapingChar, zeroWidthSpace), style: style); - }).toList(), - ); - } -} diff --git a/lib/app/layouts/chat_creator/chat_creator.dart b/lib/app/layouts/chat_creator/chat_creator.dart index c5ab85999..b0b55b2e2 100644 --- a/lib/app/layouts/chat_creator/chat_creator.dart +++ b/lib/app/layouts/chat_creator/chat_creator.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/chat_creator/widgets/chat_creator_tile.dart'; import 'package:bluebubbles/app/layouts/conversation_view/pages/conversation_view.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart'; @@ -53,7 +53,7 @@ class ChatCreator extends StatefulWidget { class ChatCreatorState extends OptimizedState { final TextEditingController addressController = TextEditingController(); late final MentionTextEditingController textController = MentionTextEditingController(text: widget.initialText); - final TextEditingController subjectController = TextEditingController(); + final SpellCheckTextEditingController subjectController = SpellCheckTextEditingController(); final FocusNode addressNode = FocusNode(); final ScrollController addressScrollController = ScrollController(); diff --git a/lib/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart b/lib/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart index c6f5adc64..2c38b0ed9 100644 --- a/lib/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart +++ b/lib/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart @@ -1,5 +1,5 @@ import 'package:bluebubbles/app/components/custom/custom_bouncing_scroll_physics.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/helpers/helpers.dart'; import 'package:bluebubbles/services/services.dart'; import 'package:flutter/material.dart'; diff --git a/lib/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart b/lib/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart index e60c0362c..fe5e7542e 100644 --- a/lib/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart +++ b/lib/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'dart:ui'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/bubble_effects.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/tail_clipper.dart'; import 'package:bluebubbles/helpers/helpers.dart'; diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 68c5fbd2f..8a39e74b1 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -28,6 +28,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:get/get.dart'; +import 'package:languagetool_textfield/domain/mistake.dart'; import 'package:tuple/tuple.dart'; import 'package:universal_io/io.dart'; @@ -542,8 +543,27 @@ class _MessageHolderState extends CustomState with SingleTickerP void edit() async { final node = FocusNode(); - cvController.editing.add(Tuple4(message, part, TextEditingController(text: part.text!), node)); + cvController.editing.add(Tuple4(message, part, SpellCheckTextEditingController(text: part.text!), node)); popDetails(); } diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart index 09beb6e16..4afe7214d 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart @@ -102,7 +102,8 @@ class _MessagePopupHolderState extends OptimizedState { if (widget.cvController.editing.isEmpty) { widget.cvController.focusNode.requestFocus(); } - } else if (widget.cvController.editing.isNotEmpty) { + } + if (widget.cvController.editing.isNotEmpty) { // there needs to be a delay here for some random reason, otherwise the keyboard is put down again immediately await Future.delayed(const Duration(milliseconds: 500)); widget.cvController.editing.first.item4.requestFocus(); diff --git a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart index e93b11af1..11222951d 100644 --- a/lib/app/layouts/conversation_view/widgets/message/send_animation.dart +++ b/lib/app/layouts/conversation_view/widgets/message/send_animation.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:math'; import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/misc/tail_clipper.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/helpers/helpers.dart'; diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index fa1b10615..bb7e12a34 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:audio_waveforms/audio_waveforms.dart'; import 'package:bluebubbles/app/components/custom/custom_bouncing_scroll_physics.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/send_animation.dart'; @@ -29,6 +29,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get/get.dart'; import 'package:giphy_get/giphy_get.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:languagetool_textfield/domain/mistake.dart'; import 'package:pasteboard/pasteboard.dart'; import 'package:path/path.dart' hide context; import 'package:permission_handler/permission_handler.dart'; @@ -165,7 +166,9 @@ class ConversationTextFieldState extends CustomState e.address.toLowerCase().startsWith(mentionName.toLowerCase()) || e.displayName.toLowerCase().startsWith(mentionName.toLowerCase())).toList(); - allMatches.addAll(controller.mentionables.where((e) => !allMatches.contains(e) && (e.address.isCaseInsensitiveContains(mentionName) || e.displayName.isCaseInsensitiveContains(mentionName))).toList()); + allMatches = controller.mentionables + .where((e) => + e.address.toLowerCase().startsWith(mentionName.toLowerCase()) || e.displayName.toLowerCase().startsWith(mentionName.toLowerCase())) + .toList(); + allMatches.addAll(controller.mentionables + .where((e) => + !allMatches.contains(e) && + (e.address.isCaseInsensitiveContains(mentionName) || e.displayName.isCaseInsensitiveContains(mentionName))) + .toList()); } else if (match.end >= _controller.selection.start) { mentionName = newEmojiText.substring(match.start + 1, match.end).toLowerCase(); - allMatches = controller.mentionables.where((e) => e.address.toLowerCase().startsWith(mentionName.toLowerCase()) || e.displayName.toLowerCase().startsWith(mentionName.toLowerCase())).toList(); - allMatches.addAll(controller.mentionables.where((e) => !allMatches.contains(e) && (e.address.isCaseInsensitiveContains(mentionName) || e.displayName.isCaseInsensitiveContains(mentionName))).toList()); + allMatches = controller.mentionables + .where((e) => + e.address.toLowerCase().startsWith(mentionName.toLowerCase()) || e.displayName.toLowerCase().startsWith(mentionName.toLowerCase())) + .toList(); + allMatches.addAll(controller.mentionables + .where((e) => + !allMatches.contains(e) && + (e.address.isCaseInsensitiveContains(mentionName) || e.displayName.isCaseInsensitiveContains(mentionName))) + .toList()); } Logger.info("${allMatches.length} matches found for: $mentionName"); } @@ -405,7 +424,9 @@ class ConversationTextFieldState extends CustomState openFullCamera({String type = 'camera'}) async { bool granted = (await Permission.camera.request()).isGranted; if (!granted) { - showSnackbar( - "Error", - "Camera access was denied!" - ); + showSnackbar("Error", "Camera access was denied!"); return; } @@ -534,17 +552,16 @@ class ConversationTextFieldState extends CustomState()!.bubbleText.fontSize! * 1.25, decoration: InputDecoration( @@ -938,63 +979,88 @@ class TextFieldComponent extends StatelessWidget { final start = editableTextState.textEditingValue.selection.start; final end = editableTextState.textEditingValue.selection.end; final text = editableTextState.textEditingValue.text; - final selected = editableTextState.textEditingValue.text.substring((start - 1).clamp(0, text.length), (end + 1).clamp(min(1, text.length), text.length)); + final selected = editableTextState.textEditingValue.text + .substring((start - 1).clamp(0, text.length), (end + 1).clamp(min(1, text.length), text.length)); + + Mistake? mistake = controller?.textController.selectedMistake; + if (mistake != null) { + return AdaptiveTextSelectionToolbar.editableText( + editableTextState: editableTextState, + )..buttonItems?.addAll( + mistake.replacements.take(3).map((replacement) { + return ContextMenuButtonItem( + onPressed: () { + controller!.textController.replaceMistake(mistake, replacement); + controller!.textController.selection = TextSelection.collapsed(offset: start + replacement.length); + editableTextState.hideToolbar(); + }, + label: replacement, + ); + }), + ); + } + return AdaptiveTextSelectionToolbar.editableText( editableTextState: editableTextState, )..buttonItems?.addAllIf( - MentionTextEditingController.escapingRegex.allMatches(selected).length == 1, - [ - ContextMenuButtonItem( - onPressed: () { - final TextSelection selection = editableTextState.textEditingValue.selection; - if (selection.isCollapsed) { - return; - } - String text = editableTextState.textEditingValue.text; - final textPart = text.substring(0, (end + 1).clamp(1, text.length)); - final mentionMatch = MentionTextEditingController.escapingRegex.allMatches(textPart).lastOrNull; - if (mentionMatch == null) return; // Shouldn't happen - final mentionText = textPart.substring(mentionMatch.start, mentionMatch.end); - int? mentionIndex = int.tryParse(mentionText.substring(1, mentionText.length - 1)); - if (mentionIndex == null) return; // Shouldn't happen - final mention = controller?.mentionables[mentionIndex]; - final replacement = mention != null ? "@${mention.displayName}" : ""; - text = editableTextState.textEditingValue.text.replaceRange((start - 1).clamp(0, text.length), (end + 1).clamp(min(1, text.length), text.length), replacement); - final checkSpace = end + replacement.length - 1; - final spaceAfter = checkSpace < text.length && text.substring(end + replacement.length - 1, end + replacement.length) == " "; - controller?.textController.value = TextEditingValue(text: text, selection: TextSelection.fromPosition(TextPosition(offset: selection.baseOffset + replacement.length + (spaceAfter ? 1 : 0)))); - editableTextState.hideToolbar(); - }, - label: "Remove Mention", - ), - ContextMenuButtonItem( - onPressed: () async { - final text = editableTextState.textEditingValue.text; - final textPart = text.substring(0, (end + 1).clamp(1, text.length)); - final mentionMatch = MentionTextEditingController.escapingRegex.allMatches(textPart).lastOrNull; - if (mentionMatch == null) return; // Shouldn't happen - final mentionText = textPart.substring(mentionMatch.start, mentionMatch.end); - int? mentionIndex = int.tryParse(mentionText.substring(1, mentionText.length - 1)); - if (mentionIndex == null) return; // Shouldn't happen - final mention = controller?.mentionables[mentionIndex]; - if (kIsDesktop || kIsWeb) { - controller?.showingOverlays = true; - } - final changed = await showCustomMentionDialog(context, mention); - if (kIsDesktop || kIsWeb) { - controller?.showingOverlays = false; - } - if (!isNullOrEmpty(changed)! && mention != null) { - mention.customDisplayName = changed!; - } - final spaceAfter = end < text.length && text.substring(end, end + 1) == " "; - controller?.textController.selection = TextSelection.fromPosition(TextPosition(offset: end + (spaceAfter ? 1 : 0))); - editableTextState.hideToolbar(); - }, - label: "Custom Mention" - ), - ], - ); + MentionTextEditingController.escapingRegex.allMatches(selected).length == 1, + [ + ContextMenuButtonItem( + onPressed: () { + final TextSelection selection = editableTextState.textEditingValue.selection; + if (selection.isCollapsed) { + return; + } + String text = editableTextState.textEditingValue.text; + final textPart = text.substring(0, (end + 1).clamp(1, text.length)); + final mentionMatch = MentionTextEditingController.escapingRegex.allMatches(textPart).lastOrNull; + if (mentionMatch == null) return; // Shouldn't happen + final mentionText = textPart.substring(mentionMatch.start, mentionMatch.end); + int? mentionIndex = int.tryParse(mentionText.substring(1, mentionText.length - 1)); + if (mentionIndex == null) return; // Shouldn't happen + final mention = controller?.mentionables[mentionIndex]; + final replacement = mention != null ? "@${mention.displayName}" : ""; + text = editableTextState.textEditingValue.text + .replaceRange((start - 1).clamp(0, text.length), (end + 1).clamp(min(1, text.length), text.length), replacement); + final checkSpace = end + replacement.length - 1; + final spaceAfter = + checkSpace < text.length && text.substring(end + replacement.length - 1, end + replacement.length) == " "; + controller?.textController.value = TextEditingValue( + text: text, + selection: TextSelection.fromPosition( + TextPosition(offset: selection.baseOffset + replacement.length + (spaceAfter ? 1 : 0)))); + editableTextState.hideToolbar(); + }, + label: "Remove Mention", + ), + ContextMenuButtonItem( + onPressed: () async { + final text = editableTextState.textEditingValue.text; + final textPart = text.substring(0, (end + 1).clamp(1, text.length)); + final mentionMatch = MentionTextEditingController.escapingRegex.allMatches(textPart).lastOrNull; + if (mentionMatch == null) return; // Shouldn't happen + final mentionText = textPart.substring(mentionMatch.start, mentionMatch.end); + int? mentionIndex = int.tryParse(mentionText.substring(1, mentionText.length - 1)); + if (mentionIndex == null) return; // Shouldn't happen + final mention = controller?.mentionables[mentionIndex]; + if (kIsDesktop || kIsWeb) { + controller?.showingOverlays = true; + } + final changed = await showCustomMentionDialog(context, mention); + if (kIsDesktop || kIsWeb) { + controller?.showingOverlays = false; + } + if (!isNullOrEmpty(changed)! && mention != null) { + mention.customDisplayName = changed!; + } + final spaceAfter = end < text.length && text.substring(end, end + 1) == " "; + controller?.textController.selection = TextSelection.fromPosition(TextPosition(offset: end + (spaceAfter ? 1 : 0))); + editableTextState.hideToolbar(); + }, + label: "Custom Mention", + ), + ], + ); }, onTap: () { HapticFeedback.selectionClick(); @@ -1140,14 +1206,18 @@ class TextFieldComponent extends StatelessWidget { linuxData?.keyCode == 65362 || webData?.code == "ArrowUp" || androidData?.physicalKey == PhysicalKeyboardKey.arrowUp) { - if (chat != null && controller!.lastFocusedTextController.text.isEmpty && ss.settings.editLastSentMessageOnUpArrow.value && ss.isMinVenturaSync && ss.serverDetailsSync().item4 >= 148) { + if (chat != null && + controller!.lastFocusedTextController.text.isEmpty && + ss.settings.editLastSentMessageOnUpArrow.value && + ss.isMinVenturaSync && + ss.serverDetailsSync().item4 >= 148) { final message = ms(chat!.guid).mostRecentSent; if (message != null) { final node = FocusNode(); final parts = mwc(message).parts; final part = parts.filter((p) => p.text?.isNotEmpty ?? false).lastOrNull; if (part != null) { - controller!.editing.add(Tuple4(message, part, TextEditingController(text: part.text!), node)); + controller!.editing.add(Tuple4(message, part, MentionTextEditingController(text: part.text!), node)); node.requestFocus(); return KeyEventResult.handled; } diff --git a/lib/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart b/lib/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart index 4adffb53c..329e480eb 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/picked_attachments_holder.dart @@ -1,7 +1,7 @@ import 'dart:math'; import 'package:bluebubbles/app/components/avatars/contact_avatar_widget.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/dialogs/custom_mention_dialog.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/picked_attachment.dart'; import 'package:bluebubbles/app/wrappers/theme_switcher.dart'; @@ -22,7 +22,7 @@ class PickedAttachmentsHolder extends StatefulWidget { }); final ConversationViewController? controller; - final TextEditingController subjectTextController; + final SpellCheckTextEditingController subjectTextController; final MentionTextEditingController textController; final List initialAttachments; diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index 206a3d6b1..80ddb23a6 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -1,6 +1,6 @@ import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/message/attachment/audio_player.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/text_field/send_button.dart'; import 'package:bluebubbles/app/layouts/conversation_view/widgets/effects/send_effect_picker.dart'; @@ -30,7 +30,7 @@ class TextFieldSuffix extends StatefulWidget { this.isChatCreator = false, }); - final TextEditingController subjectTextController; + final SpellCheckTextEditingController subjectTextController; final MentionTextEditingController textController; final ConversationViewController? controller; final RecorderController? recorderController; diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index c70d4e44f..d1c8ca7d9 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'dart:isolate'; import 'package:audio_waveforms/audio_waveforms.dart'; -import 'package:bluebubbles/app/components/mentionable_text_editing_controller.dart'; +import 'package:bluebubbles/app/components/custom_text_editing_controllers.dart'; import 'package:bluebubbles/app/wrappers/stateful_boilerplate.dart'; import 'package:bluebubbles/models/models.dart'; import 'package:bluebubbles/services/services.dart'; @@ -47,21 +47,21 @@ class ConversationViewController extends StatefulController with GetSingleTicker final RxDouble timestampOffset = 0.0.obs; final RxBool inSelectMode = false.obs; final RxList selected = [].obs; - final RxList> editing = >[].obs; + final RxList> editing = >[].obs; final GlobalKey focusInfoKey = GlobalKey(); final RxBool recipientNotifsSilenced = false.obs; bool showingOverlays = false; bool _subjectWasLastFocused = false; // If this is false, then message field was last focused (default) FocusNode get lastFocusedNode => _subjectWasLastFocused ? subjectFocusNode : focusNode; - TextEditingController get lastFocusedTextController => _subjectWasLastFocused ? subjectTextController : textController; + SpellCheckTextEditingController get lastFocusedTextController => _subjectWasLastFocused ? subjectTextController : textController; // text field items bool showAttachmentPicker = false; final GlobalKey textFieldKey = GlobalKey(); final RxList pickedAttachments = [].obs; final textController = MentionTextEditingController(); - final subjectTextController = TextEditingController(); + final subjectTextController = SpellCheckTextEditingController(); final RxBool showRecording = false.obs; final RxList emojiMatches = [].obs; final RxInt emojiSelectedIndex = 0.obs; diff --git a/lib/services/ui/navigator/navigator_service.dart b/lib/services/ui/navigator/navigator_service.dart index 05f3538e8..3954a8508 100644 --- a/lib/services/ui/navigator/navigator_service.dart +++ b/lib/services/ui/navigator/navigator_service.dart @@ -40,6 +40,8 @@ class NavigatorService extends GetxService { return context.width; } + double leftWidthIfSplit(BuildContext context) => isTabletMode(context) ? _widthChatListLeft ?? 0 : 0; + double ratio(BuildContext context) => (_widthChatListLeft ?? context.width) / context.width; bool isAvatarOnly(BuildContext context) => (kIsDesktop || kIsWeb) && isTabletMode(context) && (_widthChatListLeft ?? context.width) < 300; diff --git a/pubspec.lock b/pubspec.lock index c4196989c..577e995c0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1571,6 +1571,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.8.1" + languagetool_textfield: + dependency: "direct main" + description: + name: languagetool_textfield + sha256: f9f12309f1c6a0c8123402f29392614bcbfcea6ec7b18c73fa5d979b46496cc8 + url: "https://pub.dev" + source: hosted + version: "0.0.6" latlong2: dependency: transitive description: @@ -2762,6 +2770,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.9" + throttling: + dependency: transitive + description: + name: throttling + sha256: "0b328adb283db092373b2835574fbcdf7d0e472d24f0455717c836ef9824def9" + url: "https://pub.dev" + source: hosted + version: "1.0.0" timezone: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 629e969ec..96c104570 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -104,6 +104,7 @@ dependencies: image_size_getter: ^2.1.2 intl: ^0.19.0 js: ^0.7.0 + languagetool_textfield: ^0.0.6 launch_at_startup: ^0.2.2 local_auth: ^2.1.8 local_notifier: From 0811f45d91f6b10016a58abe9e5e2da174ec1b95 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 9 Feb 2024 18:08:21 -0600 Subject: [PATCH 087/118] remove logging Signed-off-by: Joel Jothiprakasam --- .../conversation_view/widgets/message/message_holder.dart | 1 - .../widgets/text_field/conversation_text_field.dart | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 8a39e74b1..ec7d50eb5 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -547,7 +547,6 @@ class _MessageHolderState extends CustomState Date: Fri, 9 Feb 2024 18:10:39 -0600 Subject: [PATCH 088/118] bump version Signed-off-by: Joel Jothiprakasam --- linux/build.sh | 2 +- pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- windows/bluebubbles_installer_script.iss | 2 +- windows/runner/Runner.rc | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/linux/build.sh b/linux/build.sh index e00bd92ed..aac5d1aac 100755 --- a/linux/build.sh +++ b/linux/build.sh @@ -16,7 +16,7 @@ fi # Inject version number into version.json tmp=$(mktemp) chmod 644 "$tmp" -jq '.version = "1.12.7.0"' build/linux/$folder/release/bundle/data/flutter_assets/version.json > "$tmp" && mv "$tmp" build/linux/$folder/release/bundle/data/flutter_assets/version.json +jq '.version = "1.12.100.0"' build/linux/$folder/release/bundle/data/flutter_assets/version.json > "$tmp" && mv "$tmp" build/linux/$folder/release/bundle/data/flutter_assets/version.json chmod +x build/linux/$folder/release/bundle/bluebubbles tar cvf bluebubbles-linux-"$arch".tar -C build/linux/$folder/release/bundle . diff --git a/pubspec.yaml b/pubspec.yaml index 96c104570..081a07ad6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -300,7 +300,7 @@ msix_config: display_name: BlueBubbles publisher_display_name: BlueBubbles identity_name: 23344BlueBubbles.BlueBubbles - msix_version: 1.12.7.0 + msix_version: 1.12.100.0 publisher: CN=BEC9154D-191E-4375-BF30-698BD4C141C4 vs_generated_images_folder_path: windows/icons logo_path: assets/icon/icon.ico diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 54a882330..86c8c12ad 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: bluebubbles title: BlueBubbles -version: 1.12.7.0 +version: 1.12.100.0 summary: BlueBubbles client for Linux description: BlueBubbles is an open-source and cross-platform ecosystem of apps aimed to bring iMessage to Android, Windows, Linux, and more! With BlueBubbles, you'll be able to send messages, media, and much more to your friends and family. diff --git a/windows/bluebubbles_installer_script.iss b/windows/bluebubbles_installer_script.iss index 5067cbb3c..4560a2fd7 100644 --- a/windows/bluebubbles_installer_script.iss +++ b/windows/bluebubbles_installer_script.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "BlueBubbles" -#define MyAppVersion "1.12.7.0" +#define MyAppVersion "1.12.100.0" #define MyAppPublisher "BlueBubbles" #define MyAppURL "https://bluebubbles.app/" #define MyAppExeName "bluebubbles_app.exe" diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 533ea6c84..f45e656e0 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -59,8 +59,8 @@ IDI_APP_ICON ICON "resources\\app_icon.ico" // // Version // -#define VERSION_AS_NUMBER 1,12,7,0 -#define VERSION_AS_STRING "1.12.7.0" +#define VERSION_AS_NUMBER 1,12,100,0 +#define VERSION_AS_STRING "1.12.100.0" VS_VERSION_INFO VERSIONINFO FILEVERSION VERSION_AS_NUMBER From 5889dedc1aa60b5d6410eccaea3149116258354f Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 9 Feb 2024 18:26:01 -0600 Subject: [PATCH 089/118] fix path in iss script Signed-off-by: Joel Jothiprakasam --- windows/bluebubbles_installer_script.iss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/windows/bluebubbles_installer_script.iss b/windows/bluebubbles_installer_script.iss index 4560a2fd7..a77b6718a 100644 --- a/windows/bluebubbles_installer_script.iss +++ b/windows/bluebubbles_installer_script.iss @@ -38,12 +38,12 @@ Name: "english"; MessagesFile: "compiler:Default.isl" Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] -Source: "{#ProjectRoot}\build\windows\runner\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#ProjectRoot}\build\windows\runner\Release\*.lib"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#ProjectRoot}\build\windows\runner\Release\*.exp"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#ProjectRoot}\build\windows\runner\Release\*.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#ProjectRoot}\build\windows\x64\runner\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#ProjectRoot}\build\windows\x64\runner\Release\*.lib"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#ProjectRoot}\build\windows\x64\runner\Release\*.exp"; DestDir: "{app}"; Flags: ignoreversion +Source: "{#ProjectRoot}\build\windows\x64\runner\Release\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#ProjectRoot}\windows\dlls\*.dll"; DestDir: "{app}"; Flags: ignoreversion -Source: "{#ProjectRoot}\build\windows\runner\Release\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#ProjectRoot}\build\windows\x64\runner\Release\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] From 71f6ef593d6b5bbc352360736cb7773bb9abefc3 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 9 Feb 2024 20:16:19 -0600 Subject: [PATCH 090/118] Remove unused code Signed-off-by: Joel Jothiprakasam --- lib/app/components/custom_text_editing_controllers.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/app/components/custom_text_editing_controllers.dart b/lib/app/components/custom_text_editing_controllers.dart index b094fc718..0b4b2475e 100644 --- a/lib/app/components/custom_text_editing_controllers.dart +++ b/lib/app/components/custom_text_editing_controllers.dart @@ -1,9 +1,7 @@ import "package:bluebubbles/helpers/helpers.dart"; import "package:bluebubbles/models/models.dart"; -import "package:bluebubbles/services/ui/navigator/navigator_service.dart"; import "package:collection/collection.dart"; import "package:flutter/foundation.dart"; -import "package:flutter/gestures.dart"; import "package:flutter/material.dart"; import "package:get/get.dart"; import "package:languagetool_textfield/core/enums/mistake_type.dart"; @@ -50,9 +48,6 @@ class SpellCheckTextEditingController extends TextEditingController { Mistake? get selectedMistake => _selectedMistakeIndex == -1 ? null : _mistakes.elementAtOrNull(_selectedMistakeIndex); - /// Overlay entry for the mistake popup - OverlayEntry? _overlayEntry; - Object? _fetchError; /// An error that may have occurred during the API fetch. From 7ddcbe8dd8ec98d13bc21fdd93b8bc9e59fbc60f Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 9 Feb 2024 20:17:23 -0600 Subject: [PATCH 091/118] Update snapcraft config Signed-off-by: Joel Jothiprakasam --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 86c8c12ad..159be57c9 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -118,8 +118,8 @@ parts: - alsa-mixin - fmedia source: - - on amd64: https://github.com/BlueBubblesApp/bluebubbles-app/releases/download/v1.12.7%2B61/bluebubbles-linux-x86_64.tar - - on arm64: https://github.com/BlueBubblesApp/bluebubbles-app/releases/download/v1.12.7%2B61/bluebubbles-linux-aarch64.tar + - on amd64: https://github.com/BlueBubblesApp/bluebubbles-app/releases/download/v1.13.0%2B63/bluebubbles-linux-x86_64.tar + - on arm64: https://github.com/BlueBubblesApp/bluebubbles-app/releases/download/v1.13.0%2B63/bluebubbles-linux-aarch64.tar plugin: nil override-build: | set -eux From c9dfb980a7a059d83a68db18732c320b1f6776b8 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Sat, 10 Feb 2024 17:03:29 -0600 Subject: [PATCH 092/118] Fix taskbar startup error Signed-off-by: Joel Jothiprakasam --- lib/main.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 8085b9548..b686a52b0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -697,7 +697,11 @@ class _HomeState extends OptimizedState with WidgetsBindingObserver { if (await temp.exists()) await temp.delete(recursive: true); /* ----- BADGE ICON LISTENER ----- */ - await WindowsTaskbar.resetOverlayIcon(); + try { + await WindowsTaskbar.resetOverlayIcon(); + } catch (ex) { + Logger.error("Error resetting overlay icon: $ex"); + } int count = 0; final unreadQuery = chatBox.query(Chat_.hasUnreadMessage.equals(true)).watch(triggerImmediately: true); unreadQuery.listen((Query query) async { From 006b5fb8d3a2ce878db53fef826dea32cb5df14c Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 13:39:29 -0500 Subject: [PATCH 093/118] Request storage perms when opening file picker --- .../widgets/media_picker/text_field_attachment_picker.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart b/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart index 32acf8acb..8b927590c 100644 --- a/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart +++ b/lib/app/layouts/conversation_view/widgets/media_picker/text_field_attachment_picker.dart @@ -47,6 +47,11 @@ class _AttachmentPickerState extends OptimizedState { if (kIsDesktop || kIsWeb) return; // wait for opening animation to complete await Future.delayed(const Duration(milliseconds: 250)); + final PermissionState ps = await PhotoManager.requestPermissionExtend(); + if (!ps.hasAccess) { + showSnackbar("Error", "Storage permission not granted!"); + return; + } List list = await PhotoManager.getAssetPathList(onlyAll: true); if (list.isNotEmpty) { _images = await list.first.getAssetListRange(start: 0, end: 24); From 8ab230fbe717ceb359f1aedc82353fb9c720f177 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 13:58:52 -0500 Subject: [PATCH 094/118] Fix payload data URL parsing errors --- lib/models/io/message.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 8c6676055..0788a07b7 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -395,7 +395,7 @@ class Message { PayloadData? payloadData; try { - payloadData = json['payloadData'] == null ? null : PayloadData.fromJson(json['payloadData']!.cast()); + payloadData = json['payloadData'] == null ? null : PayloadData.fromJson(json['payloadData']); } catch (e, s) { Logger.error('Failed to parse payload data! $e\n$s'); } From d020027557dbc887875bdd33f0cb48e4c7ffc919 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 13:59:34 -0500 Subject: [PATCH 095/118] Support redacted mode in FindMy properly --- lib/app/layouts/findmy/findmy_page.dart | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index b7dfe0ace..55893f243 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -392,8 +392,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi final item = devicesWithLocation[i]; return ListTile( mouseCursor: MouseCursor.defer, - title: Text(item.name ?? "Unknown Device"), - subtitle: Text(item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found"), + title: Text(ss.settings.redactedMode.value ? "Device" : (item.name ?? "Unknown Device")), + subtitle: Text(ss.settings.redactedMode.value ? "Location" : (item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found")), onTap: item.location?.latitude != null && item.location?.longitude != null ? () async { await panelController.close(); @@ -481,8 +481,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi itemBuilder: (context, i) { final item = itemsWithLocation[i]; return ListTile( - title: Text(item.name ?? "Unknown Device"), - subtitle: Text(item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found"), + title: Text(ss.settings.redactedMode.value ? "Item" : (item.name ?? "Unknown Item")), + subtitle: Text(ss.settings.redactedMode.value ? "Location" : (item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found")), trailing: item.location?.latitude != null && item.location?.longitude != null ? ButtonTheme( minWidth: 1, child: TextButton( @@ -568,9 +568,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi title: const Text("Devices without locations"), children: withoutLocation .map((item) => ListTile( - title: Text(item.name ?? "Unknown Device"), - subtitle: Text( - item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found"), + title: Text(ss.settings.redactedMode.value ? "Device" : (item.name ?? "Unknown Device")), + subtitle: Text(ss.settings.redactedMode.value ? "Location" : (item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found")), onTap: item.location?.latitude != null && item.location?.longitude != null ? () async { await panelController.close(); @@ -676,7 +675,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi return ListTile( leading: ContactAvatarWidget(handle: item.handle), title: Text(item.handle?.displayName ?? item.title ?? "Unknown Friend"), - subtitle: Text("${item.shortAddress ?? "No location found"}${item.lastUpdated == null || item.status == LocationStatus.live ? "" : "\nLast updated ${buildDate(item.lastUpdated)}"}"), + subtitle: Text(ss.settings.redactedMode.value ? "Location" : ("${item.shortAddress ?? "No location found"}${item.lastUpdated == null || item.status == LocationStatus.live ? "" : "\nLast updated ${buildDate(item.lastUpdated)}"}")), trailing: item.latitude != null && item.longitude != null ? Row( mainAxisSize: MainAxisSize.min, children: [ @@ -773,7 +772,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi mouseCursor: MouseCursor.defer, leading: ContactAvatarWidget(handle: item.handle), title: Text(item.handle?.displayName ?? item.title ?? "Unknown Friend"), - subtitle: Text(item.longAddress ?? "No location found"), + subtitle: Text(ss.settings.redactedMode.value ? "Location" : (item.longAddress ?? "No location found")), onLongPress: () async { const encoder = JsonEncoder.withIndent(" "); final str = encoder.convert(item.toJson()); @@ -1401,8 +1400,8 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.name ?? "Unknown Device", style: context.theme.textTheme.labelLarge), - Text(item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found", + Text(ss.settings.redactedMode.value ? "Device" : (item.name ?? "Unknown Device"), style: context.theme.textTheme.labelLarge), + Text(ss.settings.redactedMode.value ? "Location" : (item.address?.label ?? item.address?.mapItemFullAddress ?? "No location found"), style: context.theme.textTheme.bodySmall), ], ), @@ -1425,7 +1424,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi children: [ Text(item.handle?.displayName ?? item.title ?? "Unknown Friend", style: context.theme.textTheme.labelLarge), - Text(item.longAddress ?? "No location found", style: context.theme.textTheme.bodySmall), + Text(ss.settings.redactedMode.value ? "Location" : (item.longAddress ?? "No location found"), style: context.theme.textTheme.bodySmall), if (item.lastUpdated != null && item.status != LocationStatus.live) Text("Last updated ${buildDate(item.lastUpdated)}", style: context.theme.textTheme.bodySmall), if (item.status != null) From 78449f9395df516fbd559d0683d2375cdae4ae58 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 14:15:25 -0500 Subject: [PATCH 096/118] Fix findmy scrolling panel closed when many friends or devices are present (#2670) --- lib/app/layouts/findmy/findmy_page.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 55893f243..1d4b8bad8 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -1042,6 +1042,9 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi ), minHeight: 50, maxHeight: MediaQuery.of(context).size.height * 0.75, + disableDraggableOnScrolling: true, + backdropEnabled: true, + parallaxEnabled: true, header: SizedBox( width: MediaQuery.of(context).size.width, child: Padding( @@ -1236,7 +1239,11 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi onDestinationSelected: (page) { index.value = page; tabController.animateTo(page); - panelController.open(); + if (index.value == page && panelController.isPanelOpen) { + panelController.close(); + } else { + panelController.open(); + } }, ), ), From eaaa26ebc365ff8be28348c4fd30b4277bdef3a9 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 14:34:53 -0500 Subject: [PATCH 097/118] Fix next restart not working for firestore setups --- .../messaging/services/firebase/UpdateNextRestartHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt index d58f7ef5d..36584a96f 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/firebase/UpdateNextRestartHandler.kt @@ -35,7 +35,7 @@ class UpdateNextRestartHandler: MethodCallHandlerImpl() { // null databaseUrl indicates Cloud Firestore setup if (firebaseApp.options.databaseUrl == null) { val newData = hashMapOf("nextRestart" to nextRestart) - FirebaseFirestore.getInstance().collection("server").document("config").set(newData, SetOptions.merge()) + FirebaseFirestore.getInstance().collection("server").document("commands").set(newData, SetOptions.merge()) } else { FirebaseDatabase.getInstance().getReference("config").child("nextRestart").setValue(nextRestart) } From 74ef53dd5ec1904dba6ade24f91971eadb8f9517 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 14:51:30 -0500 Subject: [PATCH 098/118] Fix share target handler using chat name instead of chat guid --- .../services/notifications/CreateIncomingMessageNotification.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt index 9d9ce2bbe..c4fcaa7e4 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingMessageNotification.kt @@ -65,7 +65,7 @@ class CreateIncomingMessageNotification: MethodCallHandlerImpl() { .setIcon(contactBitmap) .setImportant(true) .build() - PushShareTargetsHandler().pushShareTarget(context, chatTitle, chatTitle, chatIcon) + PushShareTargetsHandler().pushShareTarget(context, chatTitle, chatGuid, chatIcon) // get or create a messaging style val style = if (chatNotification != null) NotificationCompat.MessagingStyle.extractMessagingStyleFromNotification(chatNotification.notification)!! else NotificationCompat.MessagingStyle(Person.Builder().setName("You").build()) From 2da769e75d5dfefbf57a06927353d67033269a36 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Mon, 19 Feb 2024 15:41:41 -0500 Subject: [PATCH 099/118] Fix incoming FT notification --- .../CreateIncomingFaceTimeNotification.kt | 11 ++++++++++- .../backend/java_dart_interop/intents_service.dart | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt index 73b68a9ec..2d430fa59 100644 --- a/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt +++ b/android/app/src/main/kotlin/com/bluebubbles/messaging/services/notifications/CreateIncomingFaceTimeNotification.kt @@ -74,6 +74,9 @@ class CreateIncomingFaceTimeNotification: MethodCallHandlerImpl() { .setType("AnswerFaceTime"), PendingIntent.FLAG_IMMUTABLE ) + val answerAction = NotificationCompat.Action.Builder(0, "Answer", answerIntent) + .setShowsUserInterface(false) + .build() // Create intent for declining the facetime val declineIntent = PendingIntent.getBroadcast( @@ -84,10 +87,14 @@ class CreateIncomingFaceTimeNotification: MethodCallHandlerImpl() { .setType("DeleteNotification"), PendingIntent.FLAG_IMMUTABLE ) + val declineAction = NotificationCompat.Action.Builder(0, "Ignore", declineIntent) + .setShowsUserInterface(false) + .build() val notificationBuilder = NotificationCompat.Builder(context, channelId) .setSmallIcon(R.mipmap.ic_stat_icon) .setAutoCancel(true) + .setOngoing(true) .setCategory(NotificationCompat.CATEGORY_CALL) .setPriority(NotificationCompat.PRIORITY_MAX) .setContentTitle(title) @@ -95,12 +102,14 @@ class CreateIncomingFaceTimeNotification: MethodCallHandlerImpl() { .addExtras(extras) .addPerson(caller) .setColor(4888294) + .addAction(answerAction) + .addAction(declineAction) + .extend(NotificationCompat.WearableExtender().addAction(answerAction).addAction(declineAction)) if (callerBitmap != null) { notificationBuilder.setLargeIcon(callerBitmap) } if (callUuid != null) { notificationBuilder.setContentIntent(openSummaryIntent); - notificationBuilder.setStyle(NotificationCompat.CallStyle.forIncomingCall(caller, declineIntent, answerIntent).setIsVideo(true)) // clear after 30 seconds in case we didn't get an event from the server notificationBuilder.setTimeoutAfter(30000); } diff --git a/lib/services/backend/java_dart_interop/intents_service.dart b/lib/services/backend/java_dart_interop/intents_service.dart index 7c4d1b8f3..d41cfc4ad 100644 --- a/lib/services/backend/java_dart_interop/intents_service.dart +++ b/lib/services/backend/java_dart_interop/intents_service.dart @@ -102,7 +102,7 @@ class IntentsService extends GetxService { await openChat(guid); } else if (intent.extra?["callUuid"] != null) { await uiStartup.future; - if (intent.extra?["answer"] == "true") { + if (intent.extra?["answer"] == true) { await answerFaceTime(intent.extra?["callUuid"]!); } else { await showFaceTimeOverlay(intent.extra?["callUuid"], intent.extra?["caller"], null, false); From 0c0dd172a0818f4ddca66c3af402b032ed69ac7e Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 20 Feb 2024 15:49:30 -0500 Subject: [PATCH 100/118] Fix drag target in FindMy --- lib/app/layouts/findmy/findmy_page.dart | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 1d4b8bad8..6b45facb8 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -1045,13 +1045,13 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi disableDraggableOnScrolling: true, backdropEnabled: true, parallaxEnabled: true, - header: SizedBox( - width: MediaQuery.of(context).size.width, - child: Padding( - padding: const EdgeInsets.only(top: 10.0), - child: Align( - alignment: Alignment.topCenter, - child: ForceDraggableWidget( + header: ForceDraggableWidget( + child: SizedBox( + width: MediaQuery.of(context).size.width, + child: Padding( + padding: const EdgeInsets.only(top: 10.0, bottom: 40), + child: Align( + alignment: Alignment.topCenter, child: Container( width: 50, height: 5, From 4b4b8ac389b6f6b18d0664641c72183f87aa6352 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 20 Feb 2024 15:52:37 -0500 Subject: [PATCH 101/118] Don't add location to map if coordinates are 0,0 --- lib/app/layouts/findmy/findmy_page.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/app/layouts/findmy/findmy_page.dart b/lib/app/layouts/findmy/findmy_page.dart index 6b45facb8..507b5d2ad 100644 --- a/lib/app/layouts/findmy/findmy_page.dart +++ b/lib/app/layouts/findmy/findmy_page.dart @@ -66,6 +66,7 @@ class _FindMyPageState extends OptimizedState with SingleTickerProvi try { final friend = FindMyFriend.fromJson(data); Logger.info("Received new location for ${friend.handle?.address}"); + if ((friend.latitude ?? 0) == 0 && (friend.longitude ?? 0) == 0) return; final existingFriendIndex = friends.indexWhere((e) => e.handle?.uniqueAddressAndService == friend.handle?.uniqueAddressAndService); final existingFriend = existingFriendIndex == -1 ? null : friends[existingFriendIndex]; if (existingFriend == null || existingFriend.status == null || friend.locatingInProgress || LocationStatus.values.indexOf(existingFriend.status!) <= LocationStatus.values.indexOf(friend.status ?? LocationStatus.legacy)) { From 0c98159f77803be300578bba1ece41858b5944fc Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 20 Feb 2024 15:58:07 -0500 Subject: [PATCH 102/118] Fix URL parsing mistake for legacy preview --- .../widgets/message/interactive/url_preview.legacy.dart | 2 +- lib/models/io/message.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart index 6d580cff0..d7b045fe3 100644 --- a/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart +++ b/lib/app/layouts/conversation_view/widgets/message/interactive/url_preview.legacy.dart @@ -31,7 +31,7 @@ class _LegacyUrlPreviewState extends OptimizedState with Autom void initState() { super.initState(); updateObx(() async { - if (metadata != null) { + if (metadata == null) { try { metadata = await MetadataHelper.fetchMetadata(message); } catch (ex) { diff --git a/lib/models/io/message.dart b/lib/models/io/message.dart index 0788a07b7..a5b961f58 100644 --- a/lib/models/io/message.dart +++ b/lib/models/io/message.dart @@ -707,7 +707,7 @@ class Message { // first condition is for macOS < 11 and second condition is for macOS >= 11 bool get isLegacyUrlPreview => (balloonBundleId == "com.apple.messages.URLBalloonProvider" && hasDdResults!) - || (hasDdResults! && (text ?? "").trim().isURL); + || ((hasDdResults! || isFromMe!) && (text ?? "").trim().isURL); String? get url => text?.replaceAll("\n", " ").split(" ").firstWhereOrNull((String e) => e.hasUrl); From bbf2e1c791a4478360e1362e8aa8c2c17cf8afc6 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Tue, 20 Feb 2024 16:04:44 -0500 Subject: [PATCH 103/118] Add new multitouchdragstrategy --- lib/main.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 8085b9548..daedfdfee 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,6 +22,7 @@ import 'package:bluebubbles/services/services.dart'; import 'package:collection/collection.dart'; import 'package:easy_debounce/easy_debounce.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart' hide Priority; import 'package:flutter/services.dart'; @@ -481,9 +482,12 @@ class Main extends StatelessWidget { theme: theme.copyWith(appBarTheme: theme.appBarTheme.copyWith(elevation: 0.0)), darkTheme: darkTheme.copyWith(appBarTheme: darkTheme.appBarTheme.copyWith(elevation: 0.0)), navigatorKey: ns.key, - // Specifically for GNU/Linux & Android-x86 family, where touch isn't interpreted as a drag device by Flutter apparently. - scrollBehavior: - const MaterialScrollBehavior().copyWith(dragDevices: Platform.isLinux || Platform.isAndroid ? PointerDeviceKind.values.toSet() : null), + scrollBehavior: const MaterialScrollBehavior().copyWith( + // Specifically for GNU/Linux & Android-x86 family, where touch isn't interpreted as a drag device by Flutter apparently. + dragDevices: Platform.isLinux || Platform.isAndroid ? PointerDeviceKind.values.toSet() : null, + // Prevent scrolling with multiple fingers accelerating the scrolling + multitouchDragStrategy: MultitouchDragStrategy.latestPointer, + ), home: Home(), shortcuts: { LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.comma): const OpenSettingsIntent(), From 2cdfa0c49670223befcb391148993c7fffa4f684 Mon Sep 17 00:00:00 2001 From: Tanay Neotia Date: Thu, 22 Feb 2024 10:37:53 -0500 Subject: [PATCH 104/118] Update to new Flutter keyboard API --- .../layouts/chat_creator/chat_creator.dart | 10 +- .../widgets/message/message_holder.dart | 21 +--- .../text_field/conversation_text_field.dart | 110 ++++-------------- .../fullscreen_media/fullscreen_holder.dart | 10 +- .../pages/server/backup_restore_panel.dart | 8 +- .../setup/dialogs/manual_entry_dialog.dart | 8 +- .../setup/pages/sync/server_credentials.dart | 8 +- lib/app/wrappers/scrollbar_wrapper.dart | 10 +- lib/models/io/theme.dart | 1 - pubspec.lock | 32 ++++- 10 files changed, 83 insertions(+), 135 deletions(-) diff --git a/lib/app/layouts/chat_creator/chat_creator.dart b/lib/app/layouts/chat_creator/chat_creator.dart index c5ab85999..154d3c01c 100644 --- a/lib/app/layouts/chat_creator/chat_creator.dart +++ b/lib/app/layouts/chat_creator/chat_creator.dart @@ -403,15 +403,15 @@ class ChatCreatorState extends OptimizedState { ConstrainedBox( constraints: BoxConstraints(maxWidth: ns.width(context) - 50), child: Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent) { if (event.logicalKey == LogicalKeyboardKey.backspace && (addressController.selection.start == 0 || addressController.text.isEmpty)) { if (selectedContacts.isNotEmpty) { removeSelected(selectedContacts.last); } return KeyEventResult.handled; - } else if (!event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + } else if (!HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { messageNode.requestFocus(); return KeyEventResult.handled; } @@ -651,8 +651,8 @@ class ChatCreatorState extends OptimizedState { ), ), child: Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { addressNode.requestFocus(); return KeyEventResult.handled; } diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 68c5fbd2f..99b05a1d2 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -504,26 +504,13 @@ class _MessageHolderState extends CustomState e2.item1.guid == message.guid! && e2.item2.part == e.part); widget.cvController.lastFocusedNode.requestFocus(); return KeyEventResult.handled; diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index fa1b10615..279103c5a 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -799,7 +799,7 @@ class TextFieldComponent extends StatelessWidget { Widget build(BuildContext context) { return Focus( focusNode: focusNode, - onKey: (_, ev) => handleKey(_, ev, context, isChatCreator), + onKeyEvent: (_, ev) => handleKey(_, ev, context, isChatCreator), child: Padding( padding: const EdgeInsets.only(right: 5.0), child: Container( @@ -1036,70 +1036,27 @@ class TextFieldComponent extends StatelessWidget { } } - KeyEventResult handleKey(FocusNode _, RawKeyEvent ev, BuildContext context, bool isChatCreator) { - if (ev is! RawKeyDownEvent) return KeyEventResult.ignored; - RawKeyEventDataWindows? windowsData; - RawKeyEventDataLinux? linuxData; - RawKeyEventDataWeb? webData; - RawKeyEventDataAndroid? androidData; - if (ev.data is RawKeyEventDataWindows) { - windowsData = ev.data as RawKeyEventDataWindows; - } else if (ev.data is RawKeyEventDataLinux) { - linuxData = ev.data as RawKeyEventDataLinux; - } else if (ev.data is RawKeyEventDataWeb) { - webData = ev.data as RawKeyEventDataWeb; - } else if (ev.data is RawKeyEventDataAndroid) { - androidData = ev.data as RawKeyEventDataAndroid; - } - - if (windowsData != null) { - if ((windowsData.physicalKey == PhysicalKeyboardKey.keyV || windowsData.logicalKey == LogicalKeyboardKey.keyV) && (ev.isControlPressed)) { - Pasteboard.image.then((image) { - if (image != null) { - controller!.pickedAttachments.add(PlatformFile( - name: "${randomString(8)}.png", - bytes: image, - size: image.length, - )); - } - }); - } - } - - if (linuxData != null) { - if ((linuxData.physicalKey == PhysicalKeyboardKey.keyV || linuxData.logicalKey == LogicalKeyboardKey.keyV) && (ev.isControlPressed)) { - Pasteboard.image.then((image) { - if (image != null) { - controller!.pickedAttachments.add(PlatformFile( - name: "${randomString(8)}.png", - bytes: image, - size: image.length, - )); - } - }); - } - } - - if (webData != null) { - if ((webData.physicalKey == PhysicalKeyboardKey.keyV || webData.logicalKey == LogicalKeyboardKey.keyV) && (ev.isControlPressed)) { - Pasteboard.image.then((image) { - if (image != null) { - controller!.pickedAttachments.add(PlatformFile( - name: "${randomString(8)}.png", - bytes: image, - size: image.length, - )); - } - }); - } + KeyEventResult handleKey(FocusNode _, KeyEvent ev, BuildContext context, bool isChatCreator) { + if (ev is! KeyDownEvent) return KeyEventResult.ignored; + + if ((kIsWeb || Platform.isWindows || Platform.isLinux) && (ev.physicalKey == PhysicalKeyboardKey.keyV || ev.logicalKey == LogicalKeyboardKey.keyV) && HardwareKeyboard.instance.isControlPressed) { + Pasteboard.image.then((image) { + if (image != null) { + controller!.pickedAttachments.add(PlatformFile( + name: "${randomString(8)}.png", + bytes: image, + size: image.length, + )); + } + }); } - if (ev.isMetaPressed || ev.isControlPressed || ev.isAltPressed) { + if (HardwareKeyboard.instance.isMetaPressed || HardwareKeyboard.instance.isControlPressed || HardwareKeyboard.instance.isAltPressed) { return KeyEventResult.ignored; } if (isChatCreator) { - if ((windowsData?.keyCode == 13 || linuxData?.keyCode == 65293 || webData?.code == "Enter") && !ev.isShiftPressed) { + if (ev.logicalKey == LogicalKeyboardKey.enter && !HardwareKeyboard.instance.isShiftPressed) { sendMessage(); return KeyEventResult.handled; } @@ -1111,10 +1068,7 @@ class TextFieldComponent extends StatelessWidget { int downMovementIndex = maxShown * 2 ~/ 3; // Down arrow - if (windowsData?.keyCode == 40 || - linuxData?.keyCode == 65364 || - webData?.code == "ArrowDown" || - androidData?.physicalKey == PhysicalKeyboardKey.arrowDown) { + if (ev.logicalKey == LogicalKeyboardKey.arrowDown) { if (controller!.mentionSelectedIndex.value < controller!.mentionMatches.length - 1) { controller!.mentionSelectedIndex.value++; if (controller!.mentionSelectedIndex.value >= downMovementIndex && @@ -1136,10 +1090,7 @@ class TextFieldComponent extends StatelessWidget { } // Up arrow - if (windowsData?.keyCode == 38 || - linuxData?.keyCode == 65362 || - webData?.code == "ArrowUp" || - androidData?.physicalKey == PhysicalKeyboardKey.arrowUp) { + if (ev.logicalKey == LogicalKeyboardKey.arrowUp) { if (chat != null && controller!.lastFocusedTextController.text.isEmpty && ss.settings.editLastSentMessageOnUpArrow.value && ss.isMinVenturaSync && ss.serverDetailsSync().item4 >= 148) { final message = ms(chat!.guid).mostRecentSent; if (message != null) { @@ -1174,14 +1125,7 @@ class TextFieldComponent extends StatelessWidget { } // Tab or Enter - if (windowsData?.keyCode == 9 || - linuxData?.keyCode == 65289 || - webData?.code == "Tab" || - androidData?.physicalKey == PhysicalKeyboardKey.tab || - windowsData?.keyCode == 13 || - linuxData?.keyCode == 65293 || - webData?.code == "Enter" || - androidData?.physicalKey == PhysicalKeyboardKey.enter) { + if (ev.logicalKey == LogicalKeyboardKey.tab || ev.logicalKey == LogicalKeyboardKey.enter) { if (controller!.focusNode.hasPrimaryFocus && controller!.mentionMatches.length > controller!.mentionSelectedIndex.value) { int index = controller!.mentionSelectedIndex.value; TextEditingController textField = @@ -1223,16 +1167,13 @@ class TextFieldComponent extends StatelessWidget { return KeyEventResult.handled; } if (ss.settings.privateSubjectLine.value) { - if (windowsData?.keyCode == 9 || - linuxData?.keyCode == 65289 || - webData?.code == "Tab" || - androidData?.physicalKey == PhysicalKeyboardKey.tab) { + if (ev.logicalKey == LogicalKeyboardKey.tab) { // Tab to switch between text fields - if (!ev.isShiftPressed && controller!.subjectFocusNode.hasPrimaryFocus) { + if (!HardwareKeyboard.instance.isShiftPressed && controller!.subjectFocusNode.hasPrimaryFocus) { controller!.focusNode.requestFocus(); return KeyEventResult.handled; } - if (ev.isShiftPressed && controller!.focusNode.hasPrimaryFocus) { + if (HardwareKeyboard.instance.isShiftPressed && controller!.focusNode.hasPrimaryFocus) { controller!.subjectFocusNode.requestFocus(); return KeyEventResult.handled; } @@ -1241,10 +1182,7 @@ class TextFieldComponent extends StatelessWidget { } // Escape - if (windowsData?.keyCode == 27 || - linuxData?.keyCode == 65307 || - webData?.code == "Escape" || - androidData?.physicalKey == PhysicalKeyboardKey.escape) { + if (ev.logicalKey == LogicalKeyboardKey.escape) { if (controller!.mentionMatches.isNotEmpty) { controller!.mentionMatches.value = []; return KeyEventResult.handled; @@ -1259,7 +1197,7 @@ class TextFieldComponent extends StatelessWidget { } } - if ((windowsData?.keyCode == 13 || linuxData?.keyCode == 65293 || webData?.code == "Enter") && !ev.isShiftPressed) { + if ((kIsDesktop || kIsWeb) && ev.logicalKey == LogicalKeyboardKey.enter && !HardwareKeyboard.instance.isShiftPressed) { sendMessage(); controller!.focusNode.requestFocus(); return KeyEventResult.handled; diff --git a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart index 1b40e3715..27877517c 100644 --- a/lib/app/layouts/fullscreen_media/fullscreen_holder.dart +++ b/lib/app/layouts/fullscreen_media/fullscreen_holder.dart @@ -126,24 +126,24 @@ class FullscreenMediaHolderState extends OptimizedState { child: Focus( focusNode: focusNode, autofocus: true, - onKey: (node, event) { + onKeyEvent: (node, event) { Logger.info( - "Got key label ${event.data.keyLabel}, physical key ${event.data.physicalKey.toString()}, logical key ${event.data.logicalKey.toString()}", + "Got device label ${event.deviceType.label}, physical key ${event.physicalKey.toString()}, logical key ${event.logicalKey.toString()}", tag: "RawKeyboardListener" ); - if (event.data.physicalKey.debugName == "Arrow Right") { + if (event.physicalKey.debugName == "Arrow Right") { if (ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.RIGHT) { controller.previousPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); } else { controller.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); } - } else if (event.data.physicalKey.debugName == "Arrow Left") { + } else if (event.physicalKey.debugName == "Arrow Left") { if (ss.settings.fullscreenViewerSwipeDir.value == SwipeDirection.LEFT) { controller.previousPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); } else { controller.nextPage(duration: const Duration(milliseconds: 300), curve: Curves.easeIn); } - } else if (event.data.physicalKey.debugName == "Escape") { + } else if (event.physicalKey.debugName == "Escape") { Navigator.of(context).pop(); return KeyEventResult.handled; } diff --git a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart index 19f63a6a5..6ea7ecd16 100644 --- a/lib/app/layouts/settings/pages/server/backup_restore_panel.dart +++ b/lib/app/layouts/settings/pages/server/backup_restore_panel.dart @@ -473,8 +473,8 @@ class _BackupRestorePanelState extends OptimizedState { mainAxisSize: MainAxisSize.min, children: [ Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && !event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && !HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.nextFocus(); return KeyEventResult.handled; } @@ -499,8 +499,8 @@ class _BackupRestorePanelState extends OptimizedState { ), const SizedBox(height: 10), Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.previousFocus(); node.previousFocus(); // This is intentional. Should probably figure out why it's needed return KeyEventResult.handled; diff --git a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart index 6f46681ce..1adf2d943 100644 --- a/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart +++ b/lib/app/layouts/setup/dialogs/manual_entry_dialog.dart @@ -114,8 +114,8 @@ class _ManualEntryDialogState extends OptimizedState { mainAxisSize: MainAxisSize.min, children: [ Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && !event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && !HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.nextFocus(); return KeyEventResult.handled; } @@ -141,8 +141,8 @@ class _ManualEntryDialogState extends OptimizedState { ), const SizedBox(height: 10), Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.previousFocus(); node.previousFocus(); // This is intentional. Should probably figure out why it's needed return KeyEventResult.handled; diff --git a/lib/app/layouts/setup/pages/sync/server_credentials.dart b/lib/app/layouts/setup/pages/sync/server_credentials.dart index 7b2fe3d39..46b148b56 100644 --- a/lib/app/layouts/setup/pages/sync/server_credentials.dart +++ b/lib/app/layouts/setup/pages/sync/server_credentials.dart @@ -372,8 +372,8 @@ class _ServerCredentialsState extends OptimizedState { width: context.width * 2 / 3, child: Focus( focusNode: focusNode, - onKey: (node, event) { - if (event is RawKeyDownEvent && !event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && !HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.nextFocus(); return KeyEventResult.handled; } @@ -400,8 +400,8 @@ class _ServerCredentialsState extends OptimizedState { Container( width: context.width * 2 / 3, child: Focus( - onKey: (node, event) { - if (event is RawKeyDownEvent && event.data.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { + onKeyEvent: (node, event) { + if (event is KeyDownEvent && HardwareKeyboard.instance.isShiftPressed && event.logicalKey == LogicalKeyboardKey.tab) { node.previousFocus(); node.previousFocus(); // This is intentional. Should probably figure out why it's needed return KeyEventResult.handled; diff --git a/lib/app/wrappers/scrollbar_wrapper.dart b/lib/app/wrappers/scrollbar_wrapper.dart index b23b2c1dc..b03e1842a 100644 --- a/lib/app/wrappers/scrollbar_wrapper.dart +++ b/lib/app/wrappers/scrollbar_wrapper.dart @@ -26,11 +26,11 @@ class ScrollbarWrapper extends StatelessWidget { Widget build(BuildContext context) => !kIsDesktop && !kIsWeb ? child : Focus( - onKey: (node, event) { - if (!event.isAltPressed && - !event.isControlPressed && - !event.isMetaPressed && - !event.isShiftPressed && + onKeyEvent: (node, event) { + if (!HardwareKeyboard.instance.isAltPressed && + !HardwareKeyboard.instance.isControlPressed && + !HardwareKeyboard.instance.isMetaPressed && + !HardwareKeyboard.instance.isShiftPressed && event.physicalKey == PhysicalKeyboardKey.tab) { if (cm.activeChat != null) { cvc(cm.activeChat!.chat).lastFocusedNode.requestFocus(); diff --git a/lib/models/io/theme.dart b/lib/models/io/theme.dart index 07d3bacec..0eaa59454 100644 --- a/lib/models/io/theme.dart +++ b/lib/models/io/theme.dart @@ -1,6 +1,5 @@ import 'dart:convert'; import 'dart:core'; -import 'dart:ui'; import 'package:bluebubbles/helpers/ui/theme_helpers.dart'; import 'package:bluebubbles/main.dart'; diff --git a/pubspec.lock b/pubspec.lock index 0626c802c..454b20129 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1586,6 +1586,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -1695,10 +1719,10 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: "direct main" description: @@ -1759,10 +1783,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" metadata_fetch: dependency: "direct main" description: From 184a38a958e29af9037489c717ca2df957ba01d4 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 22 Feb 2024 13:01:22 -0500 Subject: [PATCH 105/118] doc: small changelog update --- assets/changelog/changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/changelog/changelog.md b/assets/changelog/changelog.md index 83cec9e93..96282f322 100644 --- a/assets/changelog/changelog.md +++ b/assets/changelog/changelog.md @@ -48,6 +48,7 @@ This update sgnificantly overhauls the underlying Java code for the Android app, - Fixed send and receive sound volume not following the preference set in settings - Fixed chat list not loading on Windows if Secure App is enabled and initial authentication is canceled. - Fixed custom themes with long names not uploading to server +- Fixed issue displaying URL previews ### For Developers From d344df5894757e7c543fe481cb0058f67219aed1 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 22 Feb 2024 13:01:38 -0500 Subject: [PATCH 106/118] version bump --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5d6feef7e..b607755aa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ description: Send iMessages on Android using BlueBubbles! # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.13.0+63 +version: 1.13.0+64 publish_to: none environment: From cb478ada9844cec1ca95f15aa597a7f0c92e9786 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 22 Feb 2024 13:01:58 -0500 Subject: [PATCH 107/118] pubspec lock update --- pubspec.lock | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 0626c802c..454b20129 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1586,6 +1586,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -1695,10 +1719,10 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: "direct main" description: @@ -1759,10 +1783,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" metadata_fetch: dependency: "direct main" description: From 6bce60e24a3fe92d50ffcba22fc6032b862730e2 Mon Sep 17 00:00:00 2001 From: zlshames Date: Thu, 22 Feb 2024 13:05:11 -0500 Subject: [PATCH 108/118] doc: changelog update --- assets/changelog/changelog.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/changelog/changelog.md b/assets/changelog/changelog.md index 96282f322..8630b08f8 100644 --- a/assets/changelog/changelog.md +++ b/assets/changelog/changelog.md @@ -52,7 +52,7 @@ This update sgnificantly overhauls the underlying Java code for the Android app, ### For Developers -- Upgraded to Flutter 3.16 +- Upgraded to Flutter 3.19 - Updated dependencies ## v1.12.7 From 318ec02eeb2c8a7e313b0bd3e62b057e719e19ad Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 22 Feb 2024 13:08:13 -0600 Subject: [PATCH 109/118] Fix textfield size changing when empty Signed-off-by: Joel Jothiprakasam --- .../widgets/text_field/text_field_suffix.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart index 80ddb23a6..d234af67b 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/text_field_suffix.dart @@ -76,8 +76,8 @@ class _TextFieldSuffixState extends OptimizedState { : context.theme.colorScheme.primary, shape: const CircleBorder(), padding: const EdgeInsets.all(0), - maximumSize: const Size(32, 32), - minimumSize: const Size(32, 32), + maximumSize: kIsDesktop ? const Size(40, 40) : const Size(32, 32), + minimumSize: kIsDesktop ? const Size(40, 40) : const Size(32, 32), tapTargetSize: MaterialTapTargetSize.shrinkWrap, ), child: isLinuxArm64 ? const SizedBox(height: 40) : From 47a26c9c054a61dfbd516fd03cb1a86d8395a27f Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 22 Feb 2024 13:09:04 -0600 Subject: [PATCH 110/118] Fix not mounted error Signed-off-by: Joel Jothiprakasam --- lib/main.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 5c688456f..ab9b0180b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -726,7 +726,9 @@ class _HomeState extends OptimizedState with WidgetsBindingObserver { eventDispatcher.stream.listen((event) async { if (event.item1 == 'theme-update') { EasyDebounce.debounce('window-effect', const Duration(milliseconds: 500), () async { - await WindowEffects.setEffect(color: context.theme.colorScheme.background); + if (mounted) { + await WindowEffects.setEffect(color: context.theme.colorScheme.background); + } }); } }); From b265472bed304702994be60ecf0aeb027f82657e Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 22 Feb 2024 13:27:13 -0600 Subject: [PATCH 111/118] Remove unnecessary code Signed-off-by: Joel Jothiprakasam --- lib/main.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index ab9b0180b..bfd7f9715 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -701,11 +701,6 @@ class _HomeState extends OptimizedState with WidgetsBindingObserver { if (await temp.exists()) await temp.delete(recursive: true); /* ----- BADGE ICON LISTENER ----- */ - try { - await WindowsTaskbar.resetOverlayIcon(); - } catch (ex) { - Logger.error("Error resetting overlay icon: $ex"); - } int count = 0; final unreadQuery = chatBox.query(Chat_.hasUnreadMessage.equals(true)).watch(triggerImmediately: true); unreadQuery.listen((Query query) async { From 94f25861063d062db11d9189e3f6334a02526a52 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 22 Feb 2024 13:43:51 -0600 Subject: [PATCH 112/118] Remove unused code Signed-off-by: Joel Jothiprakasam --- lib/services/ui/navigator/navigator_service.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/services/ui/navigator/navigator_service.dart b/lib/services/ui/navigator/navigator_service.dart index 3954a8508..05f3538e8 100644 --- a/lib/services/ui/navigator/navigator_service.dart +++ b/lib/services/ui/navigator/navigator_service.dart @@ -40,8 +40,6 @@ class NavigatorService extends GetxService { return context.width; } - double leftWidthIfSplit(BuildContext context) => isTabletMode(context) ? _widthChatListLeft ?? 0 : 0; - double ratio(BuildContext context) => (_widthChatListLeft ?? context.width) / context.width; bool isAvatarOnly(BuildContext context) => (kIsDesktop || kIsWeb) && isTabletMode(context) && (_widthChatListLeft ?? context.width) < 300; From 6f8710b428d01fcd8bca284a95bfbb5c45ecbe83 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Thu, 22 Feb 2024 15:39:39 -0600 Subject: [PATCH 113/118] Fix null check Signed-off-by: Joel Jothiprakasam --- .../conversation_view/widgets/message/message_holder.dart | 7 +++---- .../widgets/text_field/conversation_text_field.dart | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index ec7d50eb5..e88ea7e96 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -549,9 +549,8 @@ class _MessageHolderState extends CustomState Date: Fri, 23 Feb 2024 15:18:51 -0500 Subject: [PATCH 114/118] Remove unnecessary focusnode for editing --- .../conversation_view/widgets/message/message_holder.dart | 3 +-- .../widgets/message/popup/message_popup.dart | 3 +-- .../widgets/message/popup/message_popup_holder.dart | 4 ---- .../widgets/text_field/conversation_text_field.dart | 4 +--- lib/services/ui/chat/conversation_view_controller.dart | 7 +++++-- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 99b05a1d2..aa26ca1ce 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -520,7 +520,6 @@ class _MessageHolderState extends CustomState()!.bubbleText.apply( @@ -530,7 +529,7 @@ class _MessageHolderState extends CustomState with SingleTickerP } void edit() async { - final node = FocusNode(); - cvController.editing.add(Tuple4(message, part, TextEditingController(text: part.text!), node)); + cvController.editing.add(Tuple3(message, part, TextEditingController(text: part.text!))); popDetails(); } diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart index 09beb6e16..d7cf0fefd 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart @@ -102,10 +102,6 @@ class _MessagePopupHolderState extends OptimizedState { if (widget.cvController.editing.isEmpty) { widget.cvController.focusNode.requestFocus(); } - } else if (widget.cvController.editing.isNotEmpty) { - // there needs to be a delay here for some random reason, otherwise the keyboard is put down again immediately - await Future.delayed(const Duration(milliseconds: 500)); - widget.cvController.editing.first.item4.requestFocus(); } } diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 279103c5a..a9181266a 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -1094,12 +1094,10 @@ class TextFieldComponent extends StatelessWidget { if (chat != null && controller!.lastFocusedTextController.text.isEmpty && ss.settings.editLastSentMessageOnUpArrow.value && ss.isMinVenturaSync && ss.serverDetailsSync().item4 >= 148) { final message = ms(chat!.guid).mostRecentSent; if (message != null) { - final node = FocusNode(); final parts = mwc(message).parts; final part = parts.filter((p) => p.text?.isNotEmpty ?? false).lastOrNull; if (part != null) { - controller!.editing.add(Tuple4(message, part, TextEditingController(text: part.text!), node)); - node.requestFocus(); + controller!.editing.add(Tuple3(message, part, TextEditingController(text: part.text!))); return KeyEventResult.handled; } } diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index c70d4e44f..e0d1995d0 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -47,7 +47,7 @@ class ConversationViewController extends StatefulController with GetSingleTicker final RxDouble timestampOffset = 0.0.obs; final RxBool inSelectMode = false.obs; final RxList selected = [].obs; - final RxList> editing = >[].obs; + final RxList> editing = >[].obs; final GlobalKey focusInfoKey = GlobalKey(); final RxBool recipientNotifsSilenced = false.obs; bool showingOverlays = false; @@ -94,7 +94,10 @@ class ConversationViewController extends StatefulController with GetSingleTicker super.onInit(); textController.mentionables = mentionables; - + FocusManager.instance.addListener(() { + print("Focus changed\n----------------------"); + print(FocusManager.instance.primaryFocus?.toStringDeep()); + }); KeyboardVisibilityController().onChange.listen((bool visible) async { keyboardOpen = visible; if (scrollController.hasClients) { From ffbf984fd196c74495de7ffc948daa72ac863f3f Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 23 Feb 2024 14:38:57 -0600 Subject: [PATCH 115/118] Remove logging Signed-off-by: Joel Jothiprakasam --- lib/services/ui/chat/conversation_view_controller.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index 622e2f3ff..2002f8b94 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -94,10 +94,6 @@ class ConversationViewController extends StatefulController with GetSingleTicker super.onInit(); textController.mentionables = mentionables; - FocusManager.instance.addListener(() { - print("Focus changed\n----------------------"); - print(FocusManager.instance.primaryFocus?.toStringDeep()); - }); KeyboardVisibilityController().onChange.listen((bool visible) async { keyboardOpen = visible; if (scrollController.hasClients) { From 09090a62d267d4b350ccd494a20f69a4a17cda96 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 23 Feb 2024 14:40:56 -0600 Subject: [PATCH 116/118] Remove a piece of old code Signed-off-by: Joel Jothiprakasam --- .../widgets/message/popup/message_popup_holder.dart | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart index 4afe7214d..d7cf0fefd 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup_holder.dart @@ -103,11 +103,6 @@ class _MessagePopupHolderState extends OptimizedState { widget.cvController.focusNode.requestFocus(); } } - if (widget.cvController.editing.isNotEmpty) { - // there needs to be a delay here for some random reason, otherwise the keyboard is put down again immediately - await Future.delayed(const Duration(milliseconds: 500)); - widget.cvController.editing.first.item4.requestFocus(); - } } void sendTapback([String? type, int? part]) { From 3493c6d96dd11ad7ae4fd5a53d534303ac48491e Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 23 Feb 2024 14:44:17 -0600 Subject: [PATCH 117/118] Explicitly focus message edit on desktop/web Signed-off-by: Joel Jothiprakasam --- .../conversation_view/widgets/message/message_holder.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 974a9aeb7..7c0350dee 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -486,6 +486,8 @@ class _MessageHolderState extends CustomState e2.item1.guid == message.guid! && e2.item2.part == e.part); + final desktopFocusNode = kIsDesktop || kIsWeb ? FocusNode() : null; + desktopFocusNode?.requestFocus(); return AnimatedSize( duration: const Duration(milliseconds: 250), alignment: Alignment.centerRight, @@ -522,6 +524,7 @@ class _MessageHolderState extends CustomState()!.bubbleText.apply( fontSizeFactor: message.isBigEmoji ? 3 : 1, From 387c7d7e1248af74b1f7b6b58c4b1440ff0c6e24 Mon Sep 17 00:00:00 2001 From: Joel Jothiprakasam Date: Fri, 23 Feb 2024 15:16:28 -0600 Subject: [PATCH 118/118] More robust autofocus for edits on desktop/web. Don't allow tab traversal out of edit Signed-off-by: Joel Jothiprakasam --- .../widgets/message/message_holder.dart | 21 ++++++++++++++----- .../widgets/message/popup/message_popup.dart | 2 +- .../text_field/conversation_text_field.dart | 4 +++- .../ui/chat/conversation_view_controller.dart | 2 +- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart index 7c0350dee..b8910735c 100644 --- a/lib/app/layouts/conversation_view/widgets/message/message_holder.dart +++ b/lib/app/layouts/conversation_view/widgets/message/message_holder.dart @@ -486,8 +486,6 @@ class _MessageHolderState extends CustomState e2.item1.guid == message.guid! && e2.item2.part == e.part); - final desktopFocusNode = kIsDesktop || kIsWeb ? FocusNode() : null; - desktopFocusNode?.requestFocus(); return AnimatedSize( duration: const Duration(milliseconds: 250), alignment: Alignment.centerRight, @@ -507,24 +505,37 @@ class _MessageHolderState extends CustomState e2.item1.guid == message.guid! && e2.item2.part == e.part); - widget.cvController.lastFocusedNode.requestFocus(); + if (widget.cvController.editing.isEmpty) { + widget.cvController.lastFocusedNode.requestFocus(); + } else { + widget.cvController.editing.last.item4?.requestFocus(); + } return KeyEventResult.handled; } + if (ev.logicalKey == LogicalKeyboardKey.tab) { // Absorb tab + return KeyEventResult.skipRemainingHandlers; + } return KeyEventResult.ignored; }, child: TextField( textCapitalization: TextCapitalization.sentences, autocorrect: true, controller: editStuff.item3, - focusNode: desktopFocusNode, + focusNode: editStuff.item4, scrollPhysics: const CustomBouncingScrollPhysics(), style: context.theme.extension()!.bubbleText.apply( fontSizeFactor: message.isBigEmoji ? 3 : 1, diff --git a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart index 80b8a3ea7..943b0f6cc 100644 --- a/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart +++ b/lib/app/layouts/conversation_view/widgets/message/popup/message_popup.dart @@ -989,7 +989,7 @@ class _MessagePopupState extends OptimizedState with SingleTickerP } void edit() async { - cvController.editing.add(Tuple3(message, part, SpellCheckTextEditingController(text: part.text!))); + cvController.editing.add(Tuple4(message, part, SpellCheckTextEditingController(text: part.text!), kIsDesktop || kIsWeb ? FocusNode() : null)); popDetails(); } diff --git a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart index 2d933e5b6..7f20a895a 100644 --- a/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart +++ b/lib/app/layouts/conversation_view/widgets/text_field/conversation_text_field.dart @@ -1161,7 +1161,9 @@ class TextFieldComponent extends StatelessWidget { final parts = mwc(message).parts; final part = parts.filter((p) => p.text?.isNotEmpty ?? false).lastOrNull; if (part != null) { - controller!.editing.add(Tuple3(message, part, SpellCheckTextEditingController(text: part.text!))); + final FocusNode? node = kIsDesktop || kIsWeb ? FocusNode() : null; + controller!.editing.add(Tuple4(message, part, SpellCheckTextEditingController(text: part.text!), node)); + node?.requestFocus(); return KeyEventResult.handled; } } diff --git a/lib/services/ui/chat/conversation_view_controller.dart b/lib/services/ui/chat/conversation_view_controller.dart index 2002f8b94..0b58d1ffa 100644 --- a/lib/services/ui/chat/conversation_view_controller.dart +++ b/lib/services/ui/chat/conversation_view_controller.dart @@ -47,7 +47,7 @@ class ConversationViewController extends StatefulController with GetSingleTicker final RxDouble timestampOffset = 0.0.obs; final RxBool inSelectMode = false.obs; final RxList selected = [].obs; - final RxList> editing = >[].obs; + final RxList> editing = >[].obs; final GlobalKey focusInfoKey = GlobalKey(); final RxBool recipientNotifsSilenced = false.obs; bool showingOverlays = false;