From 7194755f8d66f467c5bb68da4efaab0ea1449894 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 9 Apr 2026 10:23:46 +0000 Subject: [PATCH 001/152] core: fix channel profile updates breaking link (#6762) --- src/Simplex/Chat/Library/Internal.hs | 6 +- src/Simplex/Chat/Library/Subscriber.hs | 5 +- tests/ChatTests/Groups.hs | 78 +++++++++++++++++++++++++- 3 files changed, 85 insertions(+), 4 deletions(-) diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index f91ee19bce..4ff677f379 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1195,6 +1195,9 @@ sendHistory user gInfo@GroupInfo {membership} m@GroupMember {activeConn = Just c where descrEvent_ :: Maybe (ChatMsgEvent 'Json) descrEvent_ + -- in channels sendHistory runs on the relay, which cannot author XMsgNew (GRRelay < GRObserver); + -- the welcome message reaches new members via the channel link data instead + | useRelays' gInfo = Nothing | m `supportsVersion` groupHistoryIncludeWelcomeVersion = do let GroupInfo {groupProfile = GroupProfile {description}} = gInfo fmap (\descr -> XMsgNew $ MCSimple $ extMsgContent (MCText descr) Nothing) description @@ -1299,7 +1302,8 @@ setGroupLinkData nm user gInfo gLink = do (conn, groupRelays) <- withFastStore $ \db -> (,) <$> getGroupLinkConnection db vr user gInfo <*> liftIO (getConnectedGroupRelays db gInfo) let (userLinkData, crClientData) = groupLinkData gInfo gLink groupRelays - sLnk <- shortenShortLink' . toShortGroupLink =<< withAgent (\a -> setConnShortLink a nm (aConnId conn) SCMContact userLinkData (Just crClientData)) + tagShortLink = if useRelays' gInfo then toShortChannelLink else toShortGroupLink + sLnk <- shortenShortLink' . tagShortLink =<< withAgent (\a -> setConnShortLink a nm (aConnId conn) SCMContact userLinkData (Just crClientData)) withFastStore' $ \db -> setGroupLinkShortLink db gLink sLnk setGroupLinkDataAsync :: User -> GroupInfo -> GroupLink -> CM () diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index a8e9bcfdf5..2676224631 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -3138,7 +3138,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = (ci, cInfo) <- saveRcvChatItemNoParse user cd msg brokerTs (CIRcvGroupEvent $ RGEGroupUpdated p') groupMsgToView cInfo ci createGroupFeatureChangedItems user cd CIRcvGroupFeature g g'' - void $ forkIO $ void $ setGroupLinkData' NRMBackground user g'' + -- in channels, link data is updated by the owner making the change in runUpdateGroupProfile; + -- other owners receiving the update do not refresh the same link + unless (useRelays' g'') $ + void $ forkIO $ void $ setGroupLinkData' NRMBackground user g'' Just _ -> updateGroupPrefs_ msgSigned g m $ fromMaybe defaultBusinessGroupPrefs $ groupPreferences p' pure $ Just DJSGroup {jobSpec = DJDeliveryJob {includePending = True}} diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 3a75a00a20..aedbb5e1e9 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -251,6 +251,8 @@ chatGroupTests = do it "should share same incognito profile with all relays" testChannels2RelaysIncognito describe "channel operations" $ do it "should update channel profile (signed)" testChannelUpdateProfileSigned + it "should preserve working link after profile update" testChannelLinkAfterProfileUpdate + it "should preserve working link after welcome message update" testChannelLinkAfterWelcomeUpdate it "should update channel preferences (signed)" testChannelUpdatePrefsSigned it "should change member role (signed)" testChannelChangeRoleSigned it "should block member for all (signed)" testChannelBlockMemberSigned @@ -8537,7 +8539,7 @@ memberJoinChannel gName relays owners shortLink fullLink member = do ] ] <> [ do - relay <## (mFullName <> ": accepting request to join group #team...") + relay <## (mFullName <> ": accepting request to join group #" <> gName <> "...") relay <## ("#" <> gName <> ": " <> mName <> " joined the group") | relay <- relays ] @@ -8569,7 +8571,7 @@ memberJoinChannelIncognito gName relays owners shortLink fullLink member = do ] ] <> [ do - relay <## (memIncognito <> ": accepting request to join group #team...") + relay <## (memIncognito <> ": accepting request to join group #" <> gName <> "...") relay <## ("#" <> gName <> ": " <> memIncognito <> " joined the group") | relay <- relays ] @@ -8770,6 +8772,78 @@ testChannelUpdateProfileSigned ps = ] alice #$> ("/_get chat #1 count=1", chat, [(1, "group profile updated (signed)")]) +testChannelLinkAfterProfileUpdate :: HasCallStack => TestParams -> IO () +testChannelLinkAfterProfileUpdate ps = + withNewTestChat ps "alice" aliceProfile $ \alice -> + withNewTestChatOpts ps relayTestOpts "bob" bobProfile $ \bob -> + withNewTestChat ps "cath" cathProfile $ \cath -> + withNewTestChat ps "dan" danProfile $ \dan -> do + (shortLink, fullLink) <- prepareChannel1Relay "team" alice bob + memberJoinChannel "team" [bob] [alice] shortLink fullLink cath + + -- owner updates channel profile + alice ##> "/gp team my_team My team description" + alice <## "changed to #my_team (My team description)" + concurrentlyN_ + [ do + bob <## "alice updated group #team: (signed)" + bob <## "changed to #my_team (My team description)", + do + cath <## "alice updated group #team: (signed)" + cath <## "changed to #my_team (My team description)" + ] + alice #$> ("/_get chat #1 count=1", chat, [(1, "group profile updated (signed)")]) + + -- late subscriber joins via the same channel link after profile update + threadDelay 100000 + alice ##> "/show link #my_team" + (shortLink', fullLink') <- getGroupLinks alice "my_team" GRMember False + shortLink' `shouldBe` shortLink + fullLink' `shouldBe` fullLink + memberJoinChannel "my_team" [bob] [alice] shortLink' fullLink' dan + + alice #> "#my_team hi" + bob <# "#my_team> hi" + [cath, dan] *<# "#my_team> hi [>>]" + +testChannelLinkAfterWelcomeUpdate :: HasCallStack => TestParams -> IO () +testChannelLinkAfterWelcomeUpdate ps = + withNewTestChat ps "alice" aliceProfile $ \alice -> + withNewTestChatOpts ps relayTestOpts "bob" bobProfile $ \bob -> + withNewTestChat ps "cath" cathProfile $ \cath -> + withNewTestChat ps "dan" danProfile $ \dan -> do + (shortLink, fullLink) <- prepareChannel1Relay "team" alice bob + memberJoinChannel "team" [bob] [alice] shortLink fullLink cath + + -- owner updates channel welcome message + alice ##> "/set welcome #team welcome to team" + alice <## "welcome message changed to:" + alice <## "welcome to team" + concurrentlyN_ + [ do + bob <## "alice updated group #team: (signed)" + bob <## "welcome message changed to:" + bob <## "welcome to team", + do + cath <## "alice updated group #team: (signed)" + cath <## "welcome message changed to:" + cath <## "welcome to team" + ] + alice #$> ("/_get chat #1 count=1", chat, [(1, "group profile updated (signed)")]) + + -- re-fetch updated link, late subscriber joins + threadDelay 100000 + alice ##> "/show link #team" + (shortLink', fullLink') <- getGroupLinks alice "team" GRMember False + shortLink' `shouldBe` shortLink + fullLink' `shouldBe` fullLink + memberJoinChannel "team" [bob] [alice] shortLink' fullLink' dan + dan #$> ("/_get chat #1 count=100", chat, groupFeaturesNoE2E <> [(0, "welcome to team"), (0, e2eeInfoNoPQStr), (0, "connected")]) + + alice #> "#team hi" + bob <# "#team> hi" + [cath, dan] *<# "#team> hi [>>]" + testChannelUpdatePrefsSigned :: HasCallStack => TestParams -> IO () testChannelUpdatePrefsSigned ps = withNewTestChat ps "alice" aliceProfile $ \alice -> From e3003fd1f517ac1a08ca22b30bc7422fdca6256f Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:37:21 +0000 Subject: [PATCH 002/152] simplex-chat-nodejs: fix userChatRelay type error in apiCreateActiveUser (#6764) The @simplex-chat/types package (auto-generated from Haskell types) added a required `userChatRelay: boolean` field to the NewUser interface, but apiCreateActiveUser was never updated to pass it, causing a TypeScript compilation error. Set userChatRelay to false, which preserves the pre-existing behavior (no chat relay provisioned for the new user profile). --- packages/simplex-chat-nodejs/src/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/simplex-chat-nodejs/src/api.ts b/packages/simplex-chat-nodejs/src/api.ts index c3e85b3915..f5d2a5168e 100644 --- a/packages/simplex-chat-nodejs/src/api.ts +++ b/packages/simplex-chat-nodejs/src/api.ts @@ -813,7 +813,7 @@ export class ChatApi { * Network usage: no. */ async apiCreateActiveUser(profile?: T.Profile): Promise { - const r = await this.sendChatCmd(CC.CreateActiveUser.cmdString({newUser: {profile, pastTimestamp: false}})) + const r = await this.sendChatCmd(CC.CreateActiveUser.cmdString({newUser: {profile, pastTimestamp: false, userChatRelay: false}})) if (r.type === "activeUser") return r.user throw new ChatCommandError("unexpected response", r) } From 6583aafbdd4423b8085ba7302184d388c6ba8a83 Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Thu, 9 Apr 2026 14:25:57 +0000 Subject: [PATCH 003/152] core: bump @simplex-chat/types (#6765) --- packages/simplex-chat-client/types/typescript/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/simplex-chat-client/types/typescript/package.json b/packages/simplex-chat-client/types/typescript/package.json index a135b286c2..8d05eb460c 100644 --- a/packages/simplex-chat-client/types/typescript/package.json +++ b/packages/simplex-chat-client/types/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@simplex-chat/types", - "version": "0.3.0", + "version": "0.4.0", "description": "TypeScript types for SimpleX Chat bot libraries", "main": "dist/index.js", "types": "dist/index.d.ts", From 24435f5b74318b98cd13f048a86b9ab26e81222a Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 9 Apr 2026 18:44:23 +0000 Subject: [PATCH 004/152] ui: fix edit channel profile texts (#6766) --- .../Views/Chat/Group/GroupProfileView.swift | 26 +++++++++++------- .../chat/simplex/common/model/SimpleXAPI.kt | 7 ++--- .../views/chat/group/GroupPreferences.kt | 2 +- .../views/chat/group/GroupProfileView.kt | 27 ++++++++++++------- .../views/chat/group/MemberAdmission.kt | 2 +- .../views/chat/group/WelcomeMessageView.kt | 2 +- .../commonMain/resources/MR/base/strings.xml | 5 ++++ 7 files changed, 46 insertions(+), 25 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift index 69587c0152..24a52b4b60 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift @@ -42,7 +42,7 @@ struct GroupProfileView: View { Section { HStack { - TextField("Group display name", text: $groupProfile.displayName) + TextField(groupInfo.useRelays ? "Channel display name" : "Group display name", text: $groupProfile.displayName) .focused($focusDisplayName) if !validNewProfileName { Button { @@ -54,7 +54,7 @@ struct GroupProfileView: View { } let fullName = groupInfo.groupProfile.fullName if fullName != "" && fullName != groupProfile.displayName { - TextField("Group full name (optional)", text: $groupProfile.fullName) + TextField(groupInfo.useRelays ? "Channel full name (optional)" : "Group full name (optional)", text: $groupProfile.fullName) } HStack { TextField("Short description", text: $shortDescr) @@ -67,7 +67,7 @@ struct GroupProfileView: View { } } } footer: { - Text("Group profile is stored on members' devices, not on the servers.") + Text(groupInfo.useRelays ? "Channel profile is stored on subscribers' devices and on the chat relays." : "Group profile is stored on members' devices, not on the servers.") } Section { @@ -80,11 +80,11 @@ struct GroupProfileView: View { currentProfileHash == groupProfile.hashValue && (groupInfo.groupProfile.shortDescr ?? "") == shortDescr.trimmingCharacters(in: .whitespaces) ) - Button("Save group profile", action: saveProfile) + Button(groupInfo.useRelays ? "Save channel profile" : "Save group profile", action: saveProfile) .disabled(!canUpdateProfile) } } - .confirmationDialog("Group image", isPresented: $showChooseSource, titleVisibility: .visible) { + .confirmationDialog(groupInfo.useRelays ? "Channel image" : "Group image", isPresented: $showChooseSource, titleVisibility: .visible) { Button("Take picture") { showTakePhoto = true } @@ -130,9 +130,15 @@ struct GroupProfileView: View { .onDisappear { if canUpdateProfile { showAlert( - title: NSLocalizedString("Save group profile?", comment: "alert title"), - message: NSLocalizedString("Group profile was changed. If you save it, the updated profile will be sent to group members.", comment: "alert message"), - buttonTitle: NSLocalizedString("Save (and notify members)", comment: "alert button"), + title: groupInfo.useRelays + ? NSLocalizedString("Save channel profile?", comment: "alert title") + : NSLocalizedString("Save group profile?", comment: "alert title"), + message: groupInfo.useRelays + ? NSLocalizedString("Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers.", comment: "alert message") + : NSLocalizedString("Group profile was changed. If you save it, the updated profile will be sent to group members.", comment: "alert message"), + buttonTitle: groupInfo.useRelays + ? NSLocalizedString("Save (and notify subscribers)", comment: "alert button") + : NSLocalizedString("Save (and notify members)", comment: "alert button"), buttonAction: saveProfile, cancelButton: true ) @@ -142,14 +148,14 @@ struct GroupProfileView: View { switch a { case let .saveError(err): return Alert( - title: Text("Error saving group profile"), + title: Text(groupInfo.useRelays ? "Error saving channel profile" : "Error saving group profile"), message: Text(err) ) case let .invalidName(name): return createInvalidNameAlert(name, $groupProfile.displayName) } } - .navigationBarTitle("Group profile") + .navigationBarTitle(groupInfo.useRelays ? "Channel profile" : "Group profile") .modifier(ThemedBackground(grouped: true)) .navigationBarTitleDisplayMode(focusDisplayName ? .inline : .large) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index cb42ee2aba..661b7e767f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -2217,18 +2217,19 @@ object ChatController { return emptyList() } - suspend fun apiUpdateGroup(rh: Long?, groupId: Long, groupProfile: GroupProfile): GroupInfo? { + suspend fun apiUpdateGroup(rh: Long?, groupId: Long, groupProfile: GroupProfile, isChannel: Boolean): GroupInfo? { val r = sendCmd(rh, CC.ApiUpdateGroupProfile(groupId, groupProfile)) + val errorTitle = if (isChannel) MR.strings.error_saving_channel_profile else MR.strings.error_saving_group_profile return when { r is API.Result && r.res is CR.GroupUpdated -> r.res.toGroup r is API.Error -> { - AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_saving_group_profile), "$r.err") + AlertManager.shared.showAlertMsg(generalGetString(errorTitle), "$r.err") null } else -> { Log.e(TAG, "apiUpdateGroup bad response: ${r.responseType} ${r.details}") AlertManager.shared.showAlertMsg( - generalGetString(MR.strings.error_saving_group_profile), + generalGetString(errorTitle), "${r.responseType}: ${r.details}" ) null diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt index b8db5969a1..ddf0456822 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt @@ -43,7 +43,7 @@ fun GroupPreferencesView(m: ChatModel, rhId: Long?, chatId: String, close: () -> fun savePrefs(afterSave: () -> Unit = {}) { withBGApi { val gp = gInfo.groupProfile.copy(groupPreferences = preferences.toGroupPreferences()) - val g = m.controller.apiUpdateGroup(rhId, gInfo.groupId, gp) + val g = m.controller.apiUpdateGroup(rhId, gInfo.groupId, gp, gInfo.useRelays) if (g != null) { withContext(Dispatchers.Main) { chatModel.chatsContext.updateGroup(rhId, g) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt index f15f70673a..d144065399 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt @@ -32,10 +32,11 @@ import java.net.URI fun GroupProfileView(rhId: Long?, groupInfo: GroupInfo, chatModel: ChatModel, close: () -> Unit) { GroupProfileLayout( close = close, + groupInfo = groupInfo, groupProfile = groupInfo.groupProfile, saveProfile = { p -> withBGApi { - val gInfo = chatModel.controller.apiUpdateGroup(rhId, groupInfo.groupId, p) + val gInfo = chatModel.controller.apiUpdateGroup(rhId, groupInfo.groupId, p, groupInfo.useRelays) if (gInfo != null) { withContext(Dispatchers.Main) { chatModel.chatsContext.updateGroup(rhId, gInfo) @@ -50,9 +51,11 @@ fun GroupProfileView(rhId: Long?, groupInfo: GroupInfo, chatModel: ChatModel, cl @Composable fun GroupProfileLayout( close: () -> Unit, + groupInfo: GroupInfo, groupProfile: GroupProfile, saveProfile: (GroupProfile) -> Unit, ) { + val isChannel = groupInfo.useRelays val bottomSheetModalState = rememberModalBottomSheetState(initialValue = ModalBottomSheetValue.Hidden) val displayName = rememberSaveable { mutableStateOf(groupProfile.displayName) } val fullName = rememberSaveable { mutableStateOf(groupProfile.fullName) } @@ -71,7 +74,7 @@ fun GroupProfileLayout( if (dataUnchanged || !canUpdateProfile(displayName.value, shortDescr.value, groupProfile)) { close() } else { - showUnsavedChangesAlert({ + showUnsavedChangesAlert(isChannel, { saveProfile( groupProfile.copy( displayName = displayName.value.trim(), @@ -103,7 +106,11 @@ fun GroupProfileLayout( Modifier.fillMaxWidth() .padding(horizontal = DEFAULT_PADDING) ) { - ReadableText(MR.strings.group_profile_is_stored_on_members_devices, TextAlign.Center) + ReadableText( + if (isChannel) MR.strings.channel_profile_is_stored_on_subscribers_devices + else MR.strings.group_profile_is_stored_on_members_devices, + TextAlign.Center + ) Box( Modifier .fillMaxWidth() @@ -122,7 +129,7 @@ fun GroupProfileLayout( } Row(Modifier.padding(bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { Text( - stringResource(MR.strings.group_display_name_field), + stringResource(if (isChannel) MR.strings.channel_display_name_field else MR.strings.group_display_name_field), fontSize = 16.sp ) if (!isValidNewProfileName(displayName.value, groupProfile)) { @@ -136,7 +143,7 @@ fun GroupProfileLayout( if (groupProfile.fullName.trim().isNotEmpty() && groupProfile.fullName.trim() != groupProfile.displayName.trim()) { Spacer(Modifier.height(DEFAULT_PADDING)) Text( - stringResource(MR.strings.group_full_name_field), + stringResource(if (isChannel) MR.strings.channel_full_name_field else MR.strings.group_full_name_field), fontSize = 16.sp, modifier = Modifier.padding(bottom = DEFAULT_PADDING_HALF) ) @@ -164,9 +171,10 @@ fun GroupProfileLayout( Spacer(Modifier.height(DEFAULT_PADDING)) val enabled = !dataUnchanged && canUpdateProfile(displayName.value, shortDescr.value, groupProfile) + val saveProfileLabel = if (isChannel) MR.strings.save_channel_profile else MR.strings.save_group_profile if (enabled) { Text( - stringResource(MR.strings.save_group_profile), + stringResource(saveProfileLabel), modifier = Modifier.clickable { saveProfile( groupProfile.copy( @@ -181,7 +189,7 @@ fun GroupProfileLayout( ) } else { Text( - stringResource(MR.strings.save_group_profile), + stringResource(saveProfileLabel), color = MaterialTheme.colors.secondary ) } @@ -204,10 +212,10 @@ private fun canUpdateProfile(displayName: String, shortDescr: String, groupProfi private fun isValidNewProfileName(displayName: String, groupProfile: GroupProfile): Boolean = displayName == groupProfile.displayName || isValidDisplayName(displayName.trim()) -private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit) { +private fun showUnsavedChangesAlert(isChannel: Boolean, save: () -> Unit, revert: () -> Unit) { AlertManager.shared.showAlertDialogStacked( title = generalGetString(MR.strings.save_preferences_question), - confirmText = generalGetString(MR.strings.save_and_notify_group_members), + confirmText = generalGetString(if (isChannel) MR.strings.save_and_notify_channel_subscribers else MR.strings.save_and_notify_group_members), dismissText = generalGetString(MR.strings.exit_without_saving), onConfirm = save, onDismiss = revert, @@ -224,6 +232,7 @@ fun PreviewGroupProfileLayout() { SimpleXTheme { GroupProfileLayout( close = {}, + groupInfo = GroupInfo.sampleData, groupProfile = GroupProfile.sampleData, saveProfile = { _ -> } ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberAdmission.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberAdmission.kt index 48171bfeb7..7c9db58316 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberAdmission.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/MemberAdmission.kt @@ -34,7 +34,7 @@ fun MemberAdmissionView(m: ChatModel, rhId: Long?, chatId: String, close: () -> fun saveAdmission(afterSave: () -> Unit = {}) { withBGApi { val gp = gInfo.groupProfile.copy(memberAdmission = admission) - val g = m.controller.apiUpdateGroup(rhId, gInfo.groupId, gp) + val g = m.controller.apiUpdateGroup(rhId, gInfo.groupId, gp, gInfo.useRelays) if (g != null) { withContext(Dispatchers.Main) { chatModel.chatsContext.updateGroup(rhId, g) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/WelcomeMessageView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/WelcomeMessageView.kt index 1e99c7f527..927e9940b5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/WelcomeMessageView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/WelcomeMessageView.kt @@ -45,7 +45,7 @@ fun GroupWelcomeView(m: ChatModel, rhId: Long?, groupInfo: GroupInfo, close: () welcome = null } val groupProfileUpdated = gInfo.groupProfile.copy(description = welcome) - val res = m.controller.apiUpdateGroup(rhId, gInfo.groupId, groupProfileUpdated) + val res = m.controller.apiUpdateGroup(rhId, gInfo.groupId, groupProfileUpdated, gInfo.useRelays) if (res != null) { gInfo = res withContext(Dispatchers.Main) { diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index ac9f9b2fc8..f2872f3f0a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1171,6 +1171,7 @@ Save and notify contact Save and notify contacts Save and notify group members + Save and notify channel subscribers Exit without saving @@ -1999,6 +2000,7 @@ Fully decentralized – visible only to members. Enter group name: Group full name: + Channel full name: Short description: Description too large Your chat profile will be sent to group members @@ -2007,8 +2009,11 @@ Group profile is stored on members\' devices, not on the servers. + Channel profile is stored on subscribers\' devices and on the chat relays. Save group profile + Save channel profile Error saving group profile + Error saving channel profile Preset servers From e6dde90c40da36c0509220bfa7302969dbf2916b Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Fri, 10 Apr 2026 09:31:26 +0100 Subject: [PATCH 005/152] core: 6.5.0.14 --- simplex-chat.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simplex-chat.cabal b/simplex-chat.cabal index c4317c85c7..621a784ed8 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.5.0.12 +version: 6.5.0.14 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat From e2ecff7215971feffdc262aac826bb8fa21068f2 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Fri, 10 Apr 2026 08:37:37 +0000 Subject: [PATCH 006/152] simplex-chat-nodejs: add member contact API methods (#6763) * simplex-chat-nodejs: add apiCreateMemberContact and apiSendMemberContactInvitation * simplex-chat-nodejs: add integration test for apiCreateMemberContact and apiSendMemberContactInvitation Test creates a 3-user group with direct messages enabled, then verifies: - apiCreateMemberContact creates a DM contact between group members - apiSendMemberContactInvitation sends an invitation that the recipient receives * simplex-chat-nodejs: bump @simplex-chat/types to ^0.4.0 --- packages/simplex-chat-nodejs/package.json | 2 +- packages/simplex-chat-nodejs/src/api.ts | 30 +++++++ .../simplex-chat-nodejs/tests/api.test.ts | 85 +++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) diff --git a/packages/simplex-chat-nodejs/package.json b/packages/simplex-chat-nodejs/package.json index 498d502edd..657c6e05f2 100644 --- a/packages/simplex-chat-nodejs/package.json +++ b/packages/simplex-chat-nodejs/package.json @@ -24,7 +24,7 @@ "docs": "typedoc" }, "dependencies": { - "@simplex-chat/types": "^0.3.0", + "@simplex-chat/types": "^0.4.0", "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.3", "node-addon-api": "^8.5.0" diff --git a/packages/simplex-chat-nodejs/src/api.ts b/packages/simplex-chat-nodejs/src/api.ts index f5d2a5168e..8bc56db41c 100644 --- a/packages/simplex-chat-nodejs/src/api.ts +++ b/packages/simplex-chat-nodejs/src/api.ts @@ -872,4 +872,34 @@ export class ChatApi { const r = await this.sendChatCmd(CC.APISetContactPrefs.cmdString({contactId, preferences})) if (r.type !== "contactPrefsUpdated") throw new ChatCommandError("error setting contact prefs", r) } + + /** + * Create a direct message contact with a group member. + * Returns the created contact. + * Network usage: interactive. + */ + async apiCreateMemberContact(groupId: number, groupMemberId: number): Promise { + const r: any = await this.sendChatCmd(`/_create member contact #${groupId} ${groupMemberId}`) + if (r.type === "newMemberContact") return r.contact + throw new ChatCommandError("error creating member contact", r) + } + + /** + * Send a direct message invitation to a group member contact. + * The contact must have been created with {@link apiCreateMemberContact}. + * Network usage: interactive. + */ + async apiSendMemberContactInvitation(contactId: number, message?: T.MsgContent | string): Promise { + let cmd = `/_invite member contact @${contactId}` + if (message !== undefined) { + if (typeof message === "string") { + cmd += ` text ${message}` + } else { + cmd += ` json ${JSON.stringify(message)}` + } + } + const r: any = await this.sendChatCmd(cmd) + if (r.type === "newMemberContactSentInv") return r.contact + throw new ChatCommandError("error sending member contact invitation", r) + } } diff --git a/packages/simplex-chat-nodejs/tests/api.test.ts b/packages/simplex-chat-nodejs/tests/api.test.ts index 52153ecfed..7bc1a89b86 100644 --- a/packages/simplex-chat-nodejs/tests/api.test.ts +++ b/packages/simplex-chat-nodejs/tests/api.test.ts @@ -64,4 +64,89 @@ describe("API tests (use preset servers)", () => { expect(servers[0] !== servers[1]).toBe(true) expect(eventCount > 0).toBe(true) }, 30000) + + it("should create member contact and send invitation", async () => { + // create 3 users and start chat controllers + const alice = await api.ChatApi.init(alicePath) + const bob = await api.ChatApi.init(bobPath) + const carolPath = path.join(tmpDir, "carol") + const carol = await api.ChatApi.init(carolPath) + const aliceUser = await alice.apiCreateActiveUser({displayName: "alice", fullName: ""}) + await bob.apiCreateActiveUser({displayName: "bob", fullName: ""}) + await carol.apiCreateActiveUser({displayName: "carol", fullName: ""}) + await alice.startChat() + await bob.startChat() + await carol.startChat() + // connect alice <-> bob + const aliceLink1 = await alice.apiCreateLink(aliceUser.userId) + await expect(bob.apiConnectActiveUser(aliceLink1)).resolves.toBe(api.ConnReqType.Invitation) + const [bobContact] = await Promise.all([ + (await alice.wait("contactConnected")).contact, + (await bob.wait("contactConnected")).contact + ]) + // connect alice <-> carol + const aliceLink2 = await alice.apiCreateLink(aliceUser.userId) + await expect(carol.apiConnectActiveUser(aliceLink2)).resolves.toBe(api.ConnReqType.Invitation) + const [carolContact] = await Promise.all([ + (await alice.wait("contactConnected")).contact, + (await carol.wait("contactConnected")).contact + ]) + // create group with direct messages enabled + const group = await alice.apiNewGroup(aliceUser.userId, { + displayName: "test-group", + fullName: "", + groupPreferences: { + directMessages: {enable: T.GroupFeatureEnabled.On}, + }, + }) + const groupId = group.groupId + // add bob to the group + const bobInvP = bob.wait("receivedGroupInvitation", 15000) + await alice.apiAddMember(groupId, bobContact.contactId, T.GroupMemberRole.Member) + const bobInvEvt = await bobInvP + expect(bobInvEvt).toBeDefined() + const aliceBobConnP = alice.wait("connectedToGroupMember", 15000) + const bobAliceConnP = bob.wait("connectedToGroupMember", 15000) + await bob.apiJoinGroup(bobInvEvt!.groupInfo.groupId) + await Promise.all([aliceBobConnP, bobAliceConnP]) + // add carol to the group + const carolInvP = carol.wait("receivedGroupInvitation", 30000) + await alice.apiAddMember(groupId, carolContact.contactId, T.GroupMemberRole.Member) + const carolInvEvt = await carolInvP + expect(carolInvEvt).toBeDefined() + // wait for carol to connect to both alice and bob (and vice versa) + const bobCarolConnP = bob.wait("connectedToGroupMember", + (evt: CEvt.ConnectedToGroupMember) => evt.member.memberProfile.displayName === "carol", 30000) + const carolAliceConnP = carol.wait("connectedToGroupMember", + (evt: CEvt.ConnectedToGroupMember) => evt.member.memberProfile.displayName === "alice", 30000) + const carolBobConnP = carol.wait("connectedToGroupMember", + (evt: CEvt.ConnectedToGroupMember) => evt.member.memberProfile.displayName === "bob", 30000) + const aliceCarolConnP = alice.wait("connectedToGroupMember", + (evt: CEvt.ConnectedToGroupMember) => evt.member.memberProfile.displayName === "carol", 30000) + await carol.apiJoinGroup(carolInvEvt!.groupInfo.groupId) + await Promise.all([bobCarolConnP, carolAliceConnP, carolBobConnP, aliceCarolConnP]) + // find carol's memberId from bob's perspective + const members = await bob.apiListMembers(groupId) + const carolMember = members.find(m => m.memberProfile.displayName === "carol") + expect(carolMember).toBeDefined() + // test apiCreateMemberContact + const dmContact = await bob.apiCreateMemberContact(groupId, carolMember!.groupMemberId) + expect(dmContact).toBeDefined() + expect(dmContact.contactId).toBeDefined() + // test apiSendMemberContactInvitation + const carolDmP = carol.wait("newMemberContactReceivedInv" as CEvt.Tag, 30000) + const invContact = await bob.apiSendMemberContactInvitation(dmContact.contactId, "hello from bob") + expect(invContact).toBeDefined() + // carol should receive the member contact invitation + const carolDmEvt = await carolDmP + expect(carolDmEvt).toBeDefined() + expect((carolDmEvt as any).contact).toBeDefined() + // cleanup + await alice.stopChat() + await bob.stopChat() + await carol.stopChat() + await alice.close() + await bob.close() + await carol.close() + }, 90000) }) From 98f194263897d5206ea026f74bb469b2beed3b10 Mon Sep 17 00:00:00 2001 From: SimpleX Chat Date: Fri, 10 Apr 2026 11:26:07 +0000 Subject: [PATCH 007/152] 6.5-beta.8: android 340, desktop 135 --- apps/multiplatform/gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 1926f35f0f..3446ef9c30 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,13 +24,13 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.5-beta.7 -android.version_code=339 +android.version_name=6.5-beta.8 +android.version_code=340 android.bundle=false -desktop.version_name=6.5-beta.7 -desktop.version_code=134 +desktop.version_name=6.5-beta.8 +desktop.version_code=135 kotlin.version=2.1.20 gradle.plugin.version=8.7.0 From 393e11c0c461c0aef548f2411b0b7fee0b64de4d Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Fri, 10 Apr 2026 19:15:33 +0100 Subject: [PATCH 008/152] 6.5-beta.8: ios 325 --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 32d74395ba..63191e4fb2 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -182,8 +182,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -553,8 +553,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -716,8 +716,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -803,8 +803,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.12-ERy6t9H0AqxJf9JR5ehJBk.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */, ); path = Libraries; sourceTree = ""; @@ -2019,7 +2019,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2069,7 +2069,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2111,7 +2111,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2131,7 +2131,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2156,7 +2156,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2193,7 +2193,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2230,7 +2230,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2281,7 +2281,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2332,7 +2332,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2366,7 +2366,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 324; + CURRENT_PROJECT_VERSION = 325; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; From 75d62b08ca91ae6b7e171f40b8d2dd322fe23f15 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 10 Apr 2026 18:25:06 +0000 Subject: [PATCH 009/152] ui: group service events channel texts (#6781) --- apps/ios/Shared/Views/Chat/ChatItemView.swift | 12 +- .../Views/ChatList/ChatPreviewView.swift | 2 +- apps/ios/SimpleXChat/ChatTypes.swift | 104 ++++++++++-------- apps/ios/SimpleXChat/Notifications.swift | 6 +- .../chat/simplex/common/model/ChatModel.kt | 35 ++++-- .../simplex/common/platform/NtfManager.kt | 8 +- .../common/views/chat/item/ChatItemView.kt | 12 +- .../common/views/chatlist/ChatPreviewView.kt | 2 +- .../commonMain/resources/MR/base/strings.xml | 4 + 9 files changed, 108 insertions(+), 77 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItemView.swift b/apps/ios/Shared/Views/Chat/ChatItemView.swift index f72bf083f6..138aed6c65 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemView.swift @@ -195,7 +195,7 @@ struct ChatItemContentView: View { } private func pendingReviewEventItemText() -> Text { - Text(chatItem.content.text) + Text(chatItem.content.text(isChannel: chat.chatInfo.isChannel)) .font(.caption) .foregroundColor(theme.colors.secondary) .fontWeight(.bold) @@ -209,9 +209,9 @@ struct ChatItemContentView: View { .font(.caption) .foregroundColor(secondaryColor) .fontWeight(.light) - + chatEventText(chatItem, secondaryColor) + + chatEventText(chatItem, secondaryColor, isChannel: chat.chatInfo.isChannel) } else { - return chatEventText(chatItem, secondaryColor) + return chatEventText(chatItem, secondaryColor, isChannel: chat.chatInfo.isChannel) } } @@ -234,7 +234,7 @@ struct ChatItemContentView: View { return if count <= 1 { nil } else if ns.count == 0 { - Text("\(count) group events") + chat.chatInfo.isChannel ? Text("\(count) channel events") : Text("\(count) group events") } else if count > ns.count { Text(members) + textSpace + Text("and \(count - ns.count) other events") } else { @@ -275,8 +275,8 @@ func chatEventText(_ eventText: LocalizedStringKey, _ ts: Text, _ secondaryColor chatEventText(Text(eventText) + textSpace + ts, secondaryColor) } -func chatEventText(_ ci: ChatItem, _ secondaryColor: Color) -> Text { - chatEventText("\(ci.content.text)", ci.timestampText, secondaryColor) +func chatEventText(_ ci: ChatItem, _ secondaryColor: Color, isChannel: Bool = false) -> Text { + chatEventText("\(ci.content.text(isChannel: isChannel))", ci.timestampText, secondaryColor) } struct ChatItemView_Previews: PreviewProvider { diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 112e4099c0..3524ceff18 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -296,7 +296,7 @@ struct ChatPreviewView: View { } func chatItemPreview(_ cItem: ChatItem) -> (Text, Bool) { - let itemText = cItem.meta.itemDeleted == nil ? cItem.text : markedDeletedText() + let itemText = cItem.meta.itemDeleted == nil ? cItem.text(isChannel: chat.chatInfo.isChannel) : markedDeletedText() let itemFormattedText = cItem.meta.itemDeleted == nil ? cItem.formattedText : nil let r = messageText(itemText, itemFormattedText, sender: cItem.meta.showGroupAsSender ? nil : cItem.memberDisplayName, preview: true, mentions: cItem.mentions, userMemberId: chat.chatInfo.groupInfo?.membership.memberId, showSecrets: nil, backgroundColor: UIColor(theme.colors.background), prefix: prefix()) return (Text(AttributedString(r.string)), r.hasSecrets) diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index b3d144b446..4a14d3ae99 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1652,6 +1652,10 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } + public var isChannel: Bool { + groupInfo?.useRelays == true + } + // this works for features that are common for contacts and groups public func featureEnabled(_ feature: ChatFeature) -> Bool { switch self { @@ -3191,11 +3195,13 @@ public struct ChatItem: Identifiable, Decodable, Hashable { public var timestampText: Text { meta.timestampText } - public var text: String { - switch (content.text, content.msgContent, file) { + public var text: String { text(isChannel: false) } + + public func text(isChannel: Bool) -> String { + switch (content.text(isChannel: isChannel), content.msgContent, file) { case let ("", .some(.voice(_, duration)), _): return "Voice message (\(durationText(duration)))" case let ("", _, .some(file)): return file.fileName - default: return content.text + default: return content.text(isChannel: isChannel) } } @@ -4047,42 +4053,42 @@ public enum CIContent: Decodable, ItemContent, Hashable { case chatBanner case invalidJSON(json: Data?) - public var text: String { - get { - switch self { - case let .sndMsgContent(mc): return mc.text - case let .rcvMsgContent(mc): return mc.text - case .sndDeleted: return NSLocalizedString("deleted", comment: "deleted chat item") - case .rcvDeleted: return NSLocalizedString("deleted", comment: "deleted chat item") - case let .sndCall(status, duration): return status.text(duration) - case let .rcvCall(status, duration): return status.text(duration) - case let .rcvIntegrityError(msgError): return msgError.text - case let .rcvDecryptionError(msgDecryptError, _): return msgDecryptError.text - case let .rcvGroupInvitation(groupInvitation, _): return groupInvitation.text - case let .sndGroupInvitation(groupInvitation, _): return groupInvitation.text - case let .rcvDirectEvent(rcvDirectEvent): return rcvDirectEvent.text - case let .rcvGroupEvent(rcvGroupEvent): return rcvGroupEvent.text - case let .sndGroupEvent(sndGroupEvent): return sndGroupEvent.text - case let .rcvConnEvent(rcvConnEvent): return rcvConnEvent.text - case let .sndConnEvent(sndConnEvent): return sndConnEvent.text - case let .rcvChatFeature(feature, enabled, param): return CIContent.featureText(feature, enabled.text, param) - case let .sndChatFeature(feature, enabled, param): return CIContent.featureText(feature, enabled.text, param) - case let .rcvChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param) - case let .sndChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param) - case let .rcvGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role) - case let .sndGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role) - case let .rcvChatFeatureRejected(feature): return String.localizedStringWithFormat("%@: received, prohibited", feature.text) - case let .rcvGroupFeatureRejected(groupFeature): return String.localizedStringWithFormat("%@: received, prohibited", groupFeature.text) - case .sndModerated: return NSLocalizedString("moderated", comment: "moderated chat item") - case .rcvModerated: return NSLocalizedString("moderated", comment: "moderated chat item") - case .rcvBlocked: return NSLocalizedString("blocked by admin", comment: "blocked chat item") - case let .sndDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo) - case let .rcvDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo) - case .sndGroupE2EEInfo: return e2eeInfoNoPQStr - case .rcvGroupE2EEInfo: return e2eeInfoNoPQStr - case .chatBanner: return "" - case .invalidJSON: return NSLocalizedString("invalid data", comment: "invalid chat item") - } + public var text: String { text(isChannel: false) } + + public func text(isChannel: Bool) -> String { + switch self { + case let .sndMsgContent(mc): return mc.text + case let .rcvMsgContent(mc): return mc.text + case .sndDeleted: return NSLocalizedString("deleted", comment: "deleted chat item") + case .rcvDeleted: return NSLocalizedString("deleted", comment: "deleted chat item") + case let .sndCall(status, duration): return status.text(duration) + case let .rcvCall(status, duration): return status.text(duration) + case let .rcvIntegrityError(msgError): return msgError.text + case let .rcvDecryptionError(msgDecryptError, _): return msgDecryptError.text + case let .rcvGroupInvitation(groupInvitation, _): return groupInvitation.text + case let .sndGroupInvitation(groupInvitation, _): return groupInvitation.text + case let .rcvDirectEvent(rcvDirectEvent): return rcvDirectEvent.text + case let .rcvGroupEvent(rcvGroupEvent): return rcvGroupEvent.text(isChannel: isChannel) + case let .sndGroupEvent(sndGroupEvent): return sndGroupEvent.text(isChannel: isChannel) + case let .rcvConnEvent(rcvConnEvent): return rcvConnEvent.text + case let .sndConnEvent(sndConnEvent): return sndConnEvent.text + case let .rcvChatFeature(feature, enabled, param): return CIContent.featureText(feature, enabled.text, param) + case let .sndChatFeature(feature, enabled, param): return CIContent.featureText(feature, enabled.text, param) + case let .rcvChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param) + case let .sndChatPreference(feature, allowed, param): return CIContent.preferenceText(feature, allowed, param) + case let .rcvGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role) + case let .sndGroupFeature(feature, preference, param, role): return CIContent.featureText(feature, preference.enable.text, param, role) + case let .rcvChatFeatureRejected(feature): return String.localizedStringWithFormat("%@: received, prohibited", feature.text) + case let .rcvGroupFeatureRejected(groupFeature): return String.localizedStringWithFormat("%@: received, prohibited", groupFeature.text) + case .sndModerated: return NSLocalizedString("moderated", comment: "moderated chat item") + case .rcvModerated: return NSLocalizedString("moderated", comment: "moderated chat item") + case .rcvBlocked: return NSLocalizedString("blocked by admin", comment: "blocked chat item") + case let .sndDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo) + case let .rcvDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo) + case .sndGroupE2EEInfo: return e2eeInfoNoPQStr + case .rcvGroupE2EEInfo: return e2eeInfoNoPQStr + case .chatBanner: return "" + case .invalidJSON: return NSLocalizedString("invalid data", comment: "invalid chat item") } } @@ -5153,7 +5159,9 @@ public enum RcvGroupEvent: Decodable, Hashable { case memberProfileUpdated(fromProfile: Profile, toProfile: Profile) case newMemberPendingReview - var text: String { + var text: String { text(isChannel: false) } + + func text(isChannel: Bool) -> String { switch self { case let .memberAdded(_, profile): return String.localizedStringWithFormat(NSLocalizedString("invited %@", comment: "rcv group event chat item"), profile.profileViewName) @@ -5175,8 +5183,12 @@ public enum RcvGroupEvent: Decodable, Hashable { case let .memberDeleted(_, profile): return String.localizedStringWithFormat(NSLocalizedString("removed %@", comment: "rcv group event chat item"), profile.profileViewName) case .userDeleted: return NSLocalizedString("removed you", comment: "rcv group event chat item") - case .groupDeleted: return NSLocalizedString("deleted group", comment: "rcv group event chat item") - case .groupUpdated: return NSLocalizedString("updated group profile", comment: "rcv group event chat item") + case .groupDeleted: return isChannel + ? NSLocalizedString("deleted channel", comment: "rcv group event chat item") + : NSLocalizedString("deleted group", comment: "rcv group event chat item") + case .groupUpdated: return isChannel + ? NSLocalizedString("updated channel profile", comment: "rcv group event chat item") + : NSLocalizedString("updated group profile", comment: "rcv group event chat item") case .invitedViaGroupLink: return NSLocalizedString("invited via your group link", comment: "rcv group event chat item") case .memberCreatedContact: return NSLocalizedString("requested connection", comment: "rcv group event chat item") case let .memberProfileUpdated(fromProfile, toProfile): return profileUpdatedText(fromProfile, toProfile) @@ -5208,7 +5220,9 @@ public enum SndGroupEvent: Decodable, Hashable { case memberAccepted(groupMemberId: Int64, profile: Profile) case userPendingReview - var text: String { + var text: String { text(isChannel: false) } + + func text(isChannel: Bool) -> String { switch self { case let .memberRole(_, profile, role): return String.localizedStringWithFormat(NSLocalizedString("you changed role of %@ to %@", comment: "snd group event chat item"), profile.profileViewName, role.text) @@ -5223,7 +5237,9 @@ public enum SndGroupEvent: Decodable, Hashable { case let .memberDeleted(_, profile): return String.localizedStringWithFormat(NSLocalizedString("you removed %@", comment: "snd group event chat item"), profile.profileViewName) case .userLeft: return NSLocalizedString("you left", comment: "snd group event chat item") - case .groupUpdated: return NSLocalizedString("group profile updated", comment: "snd group event chat item") + case .groupUpdated: return isChannel + ? NSLocalizedString("channel profile updated", comment: "snd group event chat item") + : NSLocalizedString("group profile updated", comment: "snd group event chat item") case .memberAccepted: return NSLocalizedString("you accepted this member", comment: "snd group event chat item") case .userPendingReview: return NSLocalizedString("Please wait for group moderators to review your request to join the group.", comment: "snd group event chat item") diff --git a/apps/ios/SimpleXChat/Notifications.swift b/apps/ios/SimpleXChat/Notifications.swift index 24dc58202a..a40e8eda99 100644 --- a/apps/ios/SimpleXChat/Notifications.swift +++ b/apps/ios/SimpleXChat/Notifications.swift @@ -74,7 +74,7 @@ public func createMessageReceivedNtf(_ user: any UserLike, _ cInfo: ChatInfo, _ return createNotification( categoryIdentifier: ntfCategoryMessageReceived, title: title, - body: previewMode == .message ? hideSecrets(cItem) : NSLocalizedString("new message", comment: "notification"), + body: previewMode == .message ? hideSecrets(cItem, isChannel: cInfo.isChannel) : NSLocalizedString("new message", comment: "notification"), targetContentIdentifier: cInfo.id, userInfo: ["userId": user.userId], // userInfo: ["chatId": cInfo.id, "chatItemId": cItem.id] @@ -197,7 +197,7 @@ public func createNotification( } // Spec: spec/services/notifications.md#hideSecrets -func hideSecrets(_ cItem: ChatItem) -> String { +func hideSecrets(_ cItem: ChatItem, isChannel: Bool = false) -> String { if let md = cItem.formattedText { var res = "" for ft in md { @@ -213,7 +213,7 @@ func hideSecrets(_ cItem: ChatItem) -> String { if case let .report(text, reason) = mc { return String.localizedStringWithFormat(NSLocalizedString("Report: %@", comment: "report in notification"), text.isEmpty ? reason.text : text) } else { - return cItem.text + return cItem.text(isChannel: isChannel) } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 0ac7a1b973..4e406044e5 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1748,6 +1748,9 @@ sealed class ChatInfo: SomeChat, NamedChat { is Group -> groupInfo else -> null } + + val isChannel: Boolean + get() = groupInfo_?.useRelays == true } @Serializable @@ -2891,12 +2894,14 @@ data class ChatItem ( val id: Long get() = meta.itemId val timestampText: String get() = meta.timestampText - val text: String get() { + val text: String get() = text(isChannel = false) + + fun text(isChannel: Boolean): String { val mc = content.msgContent return when { - content.text == "" && file != null && mc is MsgContent.MCVoice -> String.format(generalGetString(MR.strings.voice_message_with_duration), durationText(mc.duration)) - content.text == "" && file != null -> file.fileName - else -> content.text + content.text(isChannel) == "" && file != null && mc is MsgContent.MCVoice -> String.format(generalGetString(MR.strings.voice_message_with_duration), durationText(mc.duration)) + content.text(isChannel) == "" && file != null -> file.fileName + else -> content.text(isChannel) } } @@ -3754,7 +3759,9 @@ sealed class CIContent: ItemContent { @Serializable @SerialName("chatBanner") object ChatBanner: CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("invalidJSON") data class InvalidJSON(val json: String): CIContent() { override val msgContent: MsgContent? get() = null } - override val text: String get() = when (this) { + override val text: String get() = text(isChannel = false) + + fun text(isChannel: Boolean): String = when (this) { is SndMsgContent -> msgContent.text is RcvMsgContent -> msgContent.text is SndDeleted -> generalGetString(MR.strings.deleted_description) @@ -3766,8 +3773,8 @@ sealed class CIContent: ItemContent { is RcvGroupInvitation -> groupInvitation.text is SndGroupInvitation -> groupInvitation.text is RcvDirectEventContent -> rcvDirectEvent.text - is RcvGroupEventContent -> rcvGroupEvent.text - is SndGroupEventContent -> sndGroupEvent.text + is RcvGroupEventContent -> rcvGroupEvent.text(isChannel) + is SndGroupEventContent -> sndGroupEvent.text(isChannel) is RcvConnEventContent -> rcvConnEvent.text is SndConnEventContent -> sndConnEvent.text is RcvChatFeature -> featureText(feature, enabled.text, param) @@ -4764,7 +4771,9 @@ sealed class RcvGroupEvent() { @Serializable @SerialName("memberProfileUpdated") class MemberProfileUpdated(val fromProfile: Profile, val toProfile: Profile): RcvGroupEvent() @Serializable @SerialName("newMemberPendingReview") class NewMemberPendingReview(): RcvGroupEvent() - val text: String get() = when (this) { + val text: String get() = text(isChannel = false) + + fun text(isChannel: Boolean): String = when (this) { is MemberAdded -> String.format(generalGetString(MR.strings.rcv_group_event_member_added), profile.profileViewName) is MemberConnected -> generalGetString(MR.strings.rcv_group_event_member_connected) is MemberAccepted -> String.format(generalGetString(MR.strings.rcv_group_event_member_accepted), profile.profileViewName) @@ -4779,8 +4788,8 @@ sealed class RcvGroupEvent() { is UserRole -> String.format(generalGetString(MR.strings.rcv_group_event_changed_your_role), role.text) is MemberDeleted -> String.format(generalGetString(MR.strings.rcv_group_event_member_deleted), profile.profileViewName) is UserDeleted -> generalGetString(MR.strings.rcv_group_event_user_deleted) - is GroupDeleted -> generalGetString(MR.strings.rcv_group_event_group_deleted) - is GroupUpdated -> generalGetString(MR.strings.rcv_group_event_updated_group_profile) + is GroupDeleted -> generalGetString(if (isChannel) MR.strings.rcv_channel_event_channel_deleted else MR.strings.rcv_group_event_group_deleted) + is GroupUpdated -> generalGetString(if (isChannel) MR.strings.rcv_channel_event_updated_channel_profile else MR.strings.rcv_group_event_updated_group_profile) is InvitedViaGroupLink -> generalGetString(MR.strings.rcv_group_event_invited_via_your_group_link) is MemberCreatedContact -> generalGetString(MR.strings.rcv_group_event_member_created_contact) is MemberProfileUpdated -> profileUpdatedText(fromProfile, toProfile) @@ -4812,7 +4821,9 @@ sealed class SndGroupEvent() { @Serializable @SerialName("memberAccepted") class MemberAccepted(val groupMemberId: Long, val profile: Profile): SndGroupEvent() @Serializable @SerialName("userPendingReview") class UserPendingReview(): SndGroupEvent() - val text: String get() = when (this) { + val text: String get() = text(isChannel = false) + + fun text(isChannel: Boolean): String = when (this) { is MemberRole -> String.format(generalGetString(MR.strings.snd_group_event_changed_member_role), profile.profileViewName, role.text) is UserRole -> String.format(generalGetString(MR.strings.snd_group_event_changed_role_for_yourself), role.text) is MemberBlocked -> if (blocked) { @@ -4822,7 +4833,7 @@ sealed class SndGroupEvent() { } is MemberDeleted -> String.format(generalGetString(MR.strings.snd_group_event_member_deleted), profile.profileViewName) is UserLeft -> generalGetString(MR.strings.snd_group_event_user_left) - is GroupUpdated -> generalGetString(MR.strings.snd_group_event_group_profile_updated) + is GroupUpdated -> generalGetString(if (isChannel) MR.strings.snd_channel_event_channel_profile_updated else MR.strings.snd_group_event_group_profile_updated) is MemberAccepted -> generalGetString(MR.strings.snd_group_event_member_accepted) is UserPendingReview -> generalGetString(MR.strings.snd_group_event_user_pending_review) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/NtfManager.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/NtfManager.kt index 39fcea3981..385120f18b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/NtfManager.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/NtfManager.kt @@ -44,7 +44,7 @@ abstract class NtfManager { chatModel.chatId.value != cInfo.id || chatModel.remoteHostId() != rhId) ) { - displayNotification(user = user, chatId = cInfo.id, displayName = cInfo.displayName, msgText = hideSecrets(cItem)) + displayNotification(user = user, chatId = cInfo.id, displayName = cInfo.displayName, msgText = hideSecrets(cItem, cInfo.isChannel)) } } @@ -119,7 +119,7 @@ abstract class NtfManager { } } - private fun hideSecrets(cItem: ChatItem): String { + private fun hideSecrets(cItem: ChatItem, isChannel: Boolean = false): String { val md = cItem.formattedText return if (md != null) { var res = "" @@ -130,9 +130,9 @@ abstract class NtfManager { } else { val mc = cItem.content.msgContent if (mc is MsgContent.MCReport) { - generalGetString(MR.strings.notification_group_report).format(cItem.text.ifEmpty { mc.reason.text }) + generalGetString(MR.strings.notification_group_report).format(cItem.text(isChannel).ifEmpty { mc.reason.text }) } else { - cItem.text + cItem.text(isChannel) } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt index 05c84db4c3..d2d0a91c9b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt @@ -48,8 +48,8 @@ private val msgTailMaxHeightDp = msgTailWidthDp * 1.732f // 60deg val chatEventStyle = SpanStyle(fontSize = 12.sp, fontWeight = FontWeight.Light, color = CurrentColors.value.colors.secondary) -fun chatEventText(ci: ChatItem): AnnotatedString = - chatEventText(ci.content.text, ci.timestampText) +fun chatEventText(ci: ChatItem, isChannel: Boolean = false): AnnotatedString = + chatEventText(ci.content.text(isChannel), ci.timestampText) fun chatEventText(eventText: String, ts: String): AnnotatedString = buildAnnotatedString { @@ -612,7 +612,7 @@ fun ChatItemView( return if (count <= 1) { null } else if (ns.isEmpty()) { - generalGetString(MR.strings.rcv_group_events_count).format(count) + generalGetString(if (cInfo.isChannel) MR.strings.rcv_channel_events_count else MR.strings.rcv_group_events_count).format(count) } else if (count > ns.size) { members + " " + generalGetString(MR.strings.rcv_group_and_other_events).format(count - ns.size) } else { @@ -629,9 +629,9 @@ fun ChatItemView( buildAnnotatedString { withStyle(chatEventStyle) { append(memberDisplayName) } append(" ") - }.plus(chatEventText(cItem)) + }.plus(chatEventText(cItem, cInfo.isChannel)) } else { - chatEventText(cItem) + chatEventText(cItem, cInfo.isChannel) } } @@ -643,7 +643,7 @@ fun ChatItemView( @Composable fun PendingReviewEventItemView() { Text( buildAnnotatedString { - withStyle(chatEventStyle.copy(fontWeight = FontWeight.Bold)) { append(cItem.content.text) } + withStyle(chatEventStyle.copy(fontWeight = FontWeight.Bold)) { append(cItem.content.text(cInfo.isChannel)) } }, Modifier.padding(horizontal = 6.dp, vertical = 6.dp) ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt index 9248ac6efe..f5e0389043 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt @@ -241,7 +241,7 @@ fun ChatPreviewView( Text(previewText.first, color = previewText.second) } else if (ci != null && showChatPreviews) { val (text: CharSequence, inlineTextContent) = when { - ci.meta.itemDeleted == null -> ci.text to null + ci.meta.itemDeleted == null -> ci.text(chat.chatInfo.isChannel) to null else -> markedDeletedText(ci, chat.chatInfo) to null } val formattedText = when { diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index f2872f3f0a..609b6c4b3e 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1707,7 +1707,9 @@ removed %1$s removed you deleted group + deleted channel updated group profile + updated channel profile invited via your group link requested connection New member wants to join the group. @@ -1718,6 +1720,7 @@ you removed %1$s you left group profile updated + channel profile updated you accepted this member Please wait for group moderators to review your request to join the group. @@ -1726,6 +1729,7 @@ %s, %s and %s connected %s, %s and %d other members connected %d group events + %d channel events and %d other events %s and %s %s, %s and %d members From 9f1ff78d1a31ed6aa17d11620b10af5727514355 Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Sat, 11 Apr 2026 08:55:20 +0000 Subject: [PATCH 010/152] desktop: fix nanohttpd jitpack dependency (#6784) Jitpack stopped serving nanohttpd under the 10-char commit hash efb2ebf85a (returns 404), while the 7-char short hash efb2ebf resolves to the same commit and jars. Switch to the short form to unbreak desktopCompileClasspath. --- apps/multiplatform/common/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/multiplatform/common/build.gradle.kts b/apps/multiplatform/common/build.gradle.kts index 602b8f2b90..ea5579ed7d 100644 --- a/apps/multiplatform/common/build.gradle.kts +++ b/apps/multiplatform/common/build.gradle.kts @@ -118,8 +118,8 @@ kotlin { implementation("org.slf4j:slf4j-simple:2.0.12") implementation("uk.co.caprica:vlcj:4.8.3") implementation("net.java.dev.jna:jna:5.14.0") - implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf85a") - implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf85a") + implementation("com.github.NanoHttpd.nanohttpd:nanohttpd:efb2ebf") + implementation("com.github.NanoHttpd.nanohttpd:nanohttpd-websocket:efb2ebf") implementation("com.squareup.okhttp3:okhttp:4.12.0") } } From 1428ad75f9686c7aabb5e4052d16c5f93bb1f731 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Sat, 11 Apr 2026 13:05:51 +0000 Subject: [PATCH 011/152] core: channel comments preference (#6780) * core: channel comments preference * api * remove from all group prefs * rename * fix api docs/types --------- Co-authored-by: Evgeny Poberezkin --- bots/api/TYPES.md | 13 +++++ bots/src/API/Docs/Types.hs | 2 + .../types/typescript/src/types.ts | 8 +++ src/Simplex/Chat/Types/Preferences.hs | 50 +++++++++++++++++-- tests/ProtocolTests.hs | 2 +- 5 files changed, 71 insertions(+), 4 deletions(-) diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index c2303e9e6d..7a68fa92a9 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -51,6 +51,7 @@ This file is generated automatically. - [Color](#color) - [CommandError](#commanderror) - [CommandErrorType](#commanderrortype) +- [CommentsGroupPreference](#commentsgrouppreference) - [ComposedMessage](#composedmessage) - [ConnStatus](#connstatus) - [ConnType](#conntype) @@ -1480,6 +1481,15 @@ LARGE: - type: "LARGE" +--- + +## CommentsGroupPreference + +**Record type**: +- enable: [GroupFeatureEnabled](#groupfeatureenabled) +- duration: int? + + --- ## ComposedMessage @@ -2070,6 +2080,7 @@ Phone: - reports: [GroupPreference](#grouppreference) - history: [GroupPreference](#grouppreference) - sessions: [RoleGroupPreference](#rolegrouppreference) +- comments: [CommentsGroupPreference](#commentsgrouppreference) - commands: [[ChatBotCommand](#chatbotcommand)] @@ -2160,6 +2171,7 @@ MemberSupport: - "reports" - "history" - "sessions" +- "comments" --- @@ -2376,6 +2388,7 @@ Known: - reports: [GroupPreference](#grouppreference)? - history: [GroupPreference](#grouppreference)? - sessions: [RoleGroupPreference](#rolegrouppreference)? +- comments: [CommentsGroupPreference](#commentsgrouppreference)? - commands: [[ChatBotCommand](#chatbotcommand)]? diff --git a/bots/src/API/Docs/Types.hs b/bots/src/API/Docs/Types.hs index 37fc6121ce..e55e037243 100644 --- a/bots/src/API/Docs/Types.hs +++ b/bots/src/API/Docs/Types.hs @@ -237,6 +237,7 @@ chatTypesDocsData = (sti @Color, STEnum, "", [], "", ""), (sti @CommandError, STUnion, "", [], "", ""), (sti @CommandErrorType, STUnion, "", [], "", ""), + (sti @CommentsGroupPreference, STRecord, "", [], "", ""), (sti @ComposedMessage, STRecord, "", [], "", ""), (sti @Connection, STRecord, "", [], "", ""), (sti @ConnectionEntity, STUnion, "", [], "", ""), @@ -435,6 +436,7 @@ deriving instance Generic ClientNotice deriving instance Generic Color deriving instance Generic CommandError deriving instance Generic CommandErrorType +deriving instance Generic CommentsGroupPreference deriving instance Generic ComposedMessage deriving instance Generic Connection deriving instance Generic ConnectionEntity diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index 34b34ccbd5..ef232a6461 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -1714,6 +1714,11 @@ export namespace CommandErrorType { } } +export interface CommentsGroupPreference { + enable: GroupFeatureEnabled + duration?: number // int +} + export interface ComposedMessage { fileSource?: CryptoFile quotedItemId?: number // int64 @@ -2420,6 +2425,7 @@ export interface FullGroupPreferences { reports: GroupPreference history: GroupPreference sessions: RoleGroupPreference + comments: CommentsGroupPreference commands: ChatBotCommand[] } @@ -2492,6 +2498,7 @@ export enum GroupFeature { Reports = "reports", History = "history", Sessions = "sessions", + Comments = "comments", } export enum GroupFeatureEnabled { @@ -2669,6 +2676,7 @@ export interface GroupPreferences { reports?: GroupPreference history?: GroupPreference sessions?: RoleGroupPreference + comments?: CommentsGroupPreference commands?: ChatBotCommand[] } diff --git a/src/Simplex/Chat/Types/Preferences.hs b/src/Simplex/Chat/Types/Preferences.hs index d8c6f10b3a..c02d2b8433 100644 --- a/src/Simplex/Chat/Types/Preferences.hs +++ b/src/Simplex/Chat/Types/Preferences.hs @@ -177,6 +177,7 @@ data GroupFeature | GFReports | GFHistory | GFSessions + | GFComments deriving (Show) data SGroupFeature (f :: GroupFeature) where @@ -190,6 +191,7 @@ data SGroupFeature (f :: GroupFeature) where SGFReports :: SGroupFeature 'GFReports SGFHistory :: SGroupFeature 'GFHistory SGFSessions :: SGroupFeature 'GFSessions + SGFComments :: SGroupFeature 'GFComments deriving instance Show (SGroupFeature f) @@ -217,6 +219,7 @@ groupFeatureNameText = \case GFReports -> "Member reports" GFHistory -> "Recent history" GFSessions -> "Chat sessions" + GFComments -> "Comments" groupFeatureNameText' :: SGroupFeature f -> Text groupFeatureNameText' = groupFeatureNameText . toGroupFeature @@ -230,6 +233,11 @@ groupFeatureMemberAllowed' feature role prefs = let pref = getGroupPreference feature prefs in getField @"enable" pref == FEOn && maybe True (role >=) (getField @"role" pref) +-- TODO: some preferences are channel-only (e.g., comments) and should not generate +-- UI items or be configurable in regular groups. Currently they are simply excluded +-- from this list. When more channel-only or group-only preferences are added, +-- consider adding a scope property to GroupFeatureI (e.g., GFScopeAll | GFScopeChannel | GFScopeGroup) +-- and filtering at the call sites in createGroupFeatureItems_ / createGroupFeatureChangedItems. allGroupFeatures :: [AGroupFeature] allGroupFeatures = [ AGF SGFTimedMessages, @@ -244,7 +252,7 @@ allGroupFeatures = ] groupPrefSel :: SGroupFeature f -> GroupPreferences -> Maybe (GroupFeaturePreference f) -groupPrefSel f GroupPreferences {timedMessages, directMessages, fullDelete, reactions, voice, files, simplexLinks, reports, history, sessions} = case f of +groupPrefSel f GroupPreferences {timedMessages, directMessages, fullDelete, reactions, voice, files, simplexLinks, reports, history, sessions, comments} = case f of SGFTimedMessages -> timedMessages SGFDirectMessages -> directMessages SGFFullDelete -> fullDelete @@ -255,6 +263,7 @@ groupPrefSel f GroupPreferences {timedMessages, directMessages, fullDelete, reac SGFReports -> reports SGFHistory -> history SGFSessions -> sessions + SGFComments -> comments toGroupFeature :: SGroupFeature f -> GroupFeature toGroupFeature = \case @@ -268,6 +277,7 @@ toGroupFeature = \case SGFReports -> GFReports SGFHistory -> GFHistory SGFSessions -> GFSessions + SGFComments -> GFComments class GroupPreferenceI p where getGroupPreference :: SGroupFeature f -> p -> GroupFeaturePreference f @@ -279,7 +289,7 @@ instance GroupPreferenceI (Maybe GroupPreferences) where getGroupPreference pt prefs = fromMaybe (getGroupPreference pt defaultGroupPrefs) (groupPrefSel pt =<< prefs) instance GroupPreferenceI FullGroupPreferences where - getGroupPreference f FullGroupPreferences {timedMessages, directMessages, fullDelete, reactions, voice, files, simplexLinks, reports, history, sessions} = case f of + getGroupPreference f FullGroupPreferences {timedMessages, directMessages, fullDelete, reactions, voice, files, simplexLinks, reports, history, sessions, comments} = case f of SGFTimedMessages -> timedMessages SGFDirectMessages -> directMessages SGFFullDelete -> fullDelete @@ -290,6 +300,7 @@ instance GroupPreferenceI FullGroupPreferences where SGFReports -> reports SGFHistory -> history SGFSessions -> sessions + SGFComments -> comments {-# INLINE getGroupPreference #-} -- collection of optional group preferences @@ -304,6 +315,7 @@ data GroupPreferences = GroupPreferences reports :: Maybe ReportsGroupPreference, history :: Maybe HistoryGroupPreference, sessions :: Maybe SessionsGroupPreference, + comments :: Maybe CommentsGroupPreference, commands :: Maybe [ChatBotCommand] } deriving (Eq, Show) @@ -354,6 +366,7 @@ setGroupPreference_ f pref prefs = SGFReports -> prefs {reports = pref} SGFHistory -> prefs {history = pref} SGFSessions -> prefs {sessions = pref} + SGFComments -> prefs {comments = pref} setGroupTimedMessagesPreference :: TimedMessagesGroupPreference -> Maybe GroupPreferences -> GroupPreferences setGroupTimedMessagesPreference pref prefs_ = @@ -396,6 +409,7 @@ data FullGroupPreferences = FullGroupPreferences reports :: ReportsGroupPreference, history :: HistoryGroupPreference, sessions :: SessionsGroupPreference, + comments :: CommentsGroupPreference, commands :: ListDef ChatBotCommand } deriving (Eq, Show) @@ -465,11 +479,12 @@ defaultGroupPrefs = reports = ReportsGroupPreference {enable = FEOn}, history = HistoryGroupPreference {enable = FEOff}, sessions = SessionsGroupPreference {enable = FEOff, role = Nothing}, + comments = CommentsGroupPreference {enable = FEOff, duration = Nothing}, commands = ListDef [] } emptyGroupPrefs :: GroupPreferences -emptyGroupPrefs = GroupPreferences Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing +emptyGroupPrefs = GroupPreferences Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing businessGroupPrefs :: Preferences -> GroupPreferences businessGroupPrefs Preferences {timedMessages, fullDelete, reactions, voice, files, sessions, commands} = @@ -501,6 +516,7 @@ defaultBusinessGroupPrefs = reports = Just $ ReportsGroupPreference FEOff, history = Just $ HistoryGroupPreference FEOn, sessions = Just $ SessionsGroupPreference FEOn Nothing, + comments = Just $ CommentsGroupPreference FEOff Nothing, commands = Nothing } @@ -635,6 +651,14 @@ data SessionsGroupPreference = SessionsGroupPreference {enable :: GroupFeatureEnabled, role :: Maybe GroupMemberRole} deriving (Eq, Show) +-- Channel comments. ``duration` is time in seconds since post creation +-- after which a channel post stops accepting new comments; `Nothing` means accept comments indefinitely. +data CommentsGroupPreference = CommentsGroupPreference + { enable :: GroupFeatureEnabled, + duration :: Maybe Int + } + deriving (Eq, Show) + class (Eq (GroupFeaturePreference f), HasField "enable" (GroupFeaturePreference f) GroupFeatureEnabled) => GroupFeatureI f where type GroupFeaturePreference (f :: GroupFeature) = p | p -> f sGroupFeature :: SGroupFeature f @@ -678,6 +702,9 @@ instance HasField "enable" HistoryGroupPreference GroupFeatureEnabled where instance HasField "enable" SessionsGroupPreference GroupFeatureEnabled where hasField p@SessionsGroupPreference {enable} = (\e -> p {enable = e}, enable) +instance HasField "enable" CommentsGroupPreference GroupFeatureEnabled where + hasField p@CommentsGroupPreference {enable} = (\e -> p {enable = e}, enable) + instance GroupFeatureI 'GFTimedMessages where type GroupFeaturePreference 'GFTimedMessages = TimedMessagesGroupPreference sGroupFeature = SGFTimedMessages @@ -738,6 +765,12 @@ instance GroupFeatureI 'GFSessions where groupPrefParam _ = Nothing groupPrefRole SessionsGroupPreference {role} = role +instance GroupFeatureI 'GFComments where + type GroupFeaturePreference 'GFComments = CommentsGroupPreference + sGroupFeature = SGFComments + groupPrefParam CommentsGroupPreference {duration} = duration + groupPrefRole _ = Nothing + instance GroupFeatureNoRoleI 'GFTimedMessages instance GroupFeatureNoRoleI 'GFFullDelete @@ -748,6 +781,8 @@ instance GroupFeatureNoRoleI 'GFReports instance GroupFeatureNoRoleI 'GFHistory +instance GroupFeatureNoRoleI 'GFComments + instance HasField "role" DirectMessagesGroupPreference (Maybe GroupMemberRole) where hasField p@DirectMessagesGroupPreference {role} = (\r -> p {role = r}, role) @@ -788,6 +823,7 @@ groupPrefStateText feature pref param role = groupParamText_ :: GroupFeature -> Maybe Int -> Text groupParamText_ feature param = case feature of GFTimedMessages -> maybe "" (\p -> " (" <> timedTTLText p <> ")") param + GFComments -> maybe "" (\p -> " (close after " <> timedTTLText p <> ")") param _ -> "" groupPreferenceText :: forall f. GroupFeatureI f => GroupFeaturePreference f -> Text @@ -938,6 +974,7 @@ mergeGroupPreferences groupPreferences = reports = pref SGFReports, history = pref SGFHistory, sessions = pref SGFSessions, + comments = pref SGFComments, commands = ListDef $ fromMaybe [] $ groupPreferences >>= commands_ } where @@ -957,6 +994,7 @@ toGroupPreferences groupPreferences@FullGroupPreferences {commands = ListDef cmd reports = pref SGFReports, history = pref SGFHistory, sessions = pref SGFSessions, + comments = pref SGFComments, commands = Just cmds } where @@ -1091,6 +1129,12 @@ instance FromJSON SessionsGroupPreference where parseJSON v = $(J.mkParseJSON defaultJSON ''SessionsGroupPreference) v omittedField = Just SessionsGroupPreference {enable = FEOff, role = Nothing} +$(J.deriveToJSON defaultJSON ''CommentsGroupPreference) + +instance FromJSON CommentsGroupPreference where + parseJSON v = $(J.mkParseJSON defaultJSON ''CommentsGroupPreference) v + omittedField = Just CommentsGroupPreference {enable = FEOff, duration = Nothing} + $(J.deriveJSON defaultJSON ''GroupPreferences) instance ToField GroupPreferences where diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs index 1b708a2ffa..6d9ee54e6c 100644 --- a/tests/ProtocolTests.hs +++ b/tests/ProtocolTests.hs @@ -101,7 +101,7 @@ testChatPreferences :: Maybe Preferences testChatPreferences = Just Preferences {voice = Just VoicePreference {allow = FAYes}, files = Nothing, fullDelete = Nothing, timedMessages = Nothing, calls = Nothing, reactions = Just ReactionsPreference {allow = FAYes}, sessions = Nothing, commands = Nothing} testGroupPreferences :: Maybe GroupPreferences -testGroupPreferences = Just GroupPreferences {timedMessages = Nothing, directMessages = Nothing, reactions = Just ReactionsGroupPreference {enable = FEOn}, voice = Just VoiceGroupPreference {enable = FEOn, role = Nothing}, files = Nothing, fullDelete = Nothing, simplexLinks = Nothing, history = Nothing, reports = Nothing, sessions = Nothing, commands = Nothing} +testGroupPreferences = Just GroupPreferences {timedMessages = Nothing, directMessages = Nothing, reactions = Just ReactionsGroupPreference {enable = FEOn}, voice = Just VoiceGroupPreference {enable = FEOn, role = Nothing}, files = Nothing, fullDelete = Nothing, simplexLinks = Nothing, history = Nothing, reports = Nothing, sessions = Nothing, comments = Nothing, commands = Nothing} testProfile :: Profile testProfile = Profile {displayName = "alice", fullName = "Alice", shortDescr = Nothing, image = Just (ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII="), peerType = Nothing, contactLink = Nothing, preferences = testChatPreferences} From 6f21826579284b00f3b6ebc59caf5a56bb3ecf3c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 11 Apr 2026 19:40:33 +0100 Subject: [PATCH 012/152] core, ui: chat item to show message error (#6785) * core: chat item to show message error * ui: chat item for removed messages * remove local maven repo * command to test dropped messages * update nix config * show parse errors * error texts, simplexmq * alert messages * simplexmq, alert * better parsing * better parsing * simplify * correct message * remove test api * do not check size twice, bot types * send error in relays * do not create error item in relays * diff --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../ChatItem/IntegrityErrorItemView.swift | 18 ++++++++++ apps/ios/Shared/Views/Chat/ChatItemView.swift | 1 + .../Views/Helpers/ChatItemClipShape.swift | 1 + apps/ios/SimpleXChat/ChatTypes.swift | 18 ++++++++++ .../chat/simplex/common/model/ChatModel.kt | 15 +++++++++ .../common/views/chat/item/ChatItemView.kt | 4 +++ .../views/chat/item/IntegrityErrorItemView.kt | 14 ++++++++ .../commonMain/resources/MR/base/strings.xml | 4 +++ bots/api/TYPES.md | 31 +++++++++++++++++ bots/src/API/Docs/Types.hs | 4 +++ cabal.project | 2 +- .../types/typescript/src/types.ts | 33 +++++++++++++++++++ scripts/nix/sha256map.nix | 2 +- src/Simplex/Chat/Library/Subscriber.hs | 18 ++++++++-- src/Simplex/Chat/Messages/CIContent.hs | 22 +++++++++++++ src/Simplex/Chat/Protocol.hs | 8 +++-- src/Simplex/Chat/View.hs | 8 ++++- 17 files changed, 196 insertions(+), 7 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift index fdf3743aac..c816770c76 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift @@ -77,6 +77,24 @@ struct CIMsgError: View { } } +struct RcvMsgErrorItemView: View { + @ObservedObject var chat: Chat + var rcvMsgError: RcvMsgError + var chatItem: ChatItem + + var body: some View { + CIMsgError(chat: chat, chatItem: chatItem) { + AlertManager.shared.showAlertMsg( + title: "Message error", + message: switch rcvMsgError { + case let .dropped(attempts): "The app removed this message after \(attempts) attempts to receive it." + case let .parseError(parseError): "\(parseError)" + } + ) + } + } +} + struct IntegrityErrorItemView_Previews: PreviewProvider { static var previews: some View { IntegrityErrorItemView(chat: Chat.sampleData, msgError: .msgBadHash, chatItem: ChatItem.getIntegrityErrorSample()) diff --git a/apps/ios/Shared/Views/Chat/ChatItemView.swift b/apps/ios/Shared/Views/Chat/ChatItemView.swift index 138aed6c65..d0ff1934ba 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemView.swift @@ -145,6 +145,7 @@ struct ChatItemContentView: View { } else { ZStack {} } + case let .rcvMsgError(rcvMsgError): RcvMsgErrorItemView(chat: chat, rcvMsgError: rcvMsgError, chatItem: chatItem) case let .rcvDecryptionError(msgDecryptError, msgCount): CIRcvDecryptionError(chat: chat, msgDecryptError: msgDecryptError, msgCount: msgCount, chatItem: chatItem) case let .rcvGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole) case let .sndGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole) diff --git a/apps/ios/Shared/Views/Helpers/ChatItemClipShape.swift b/apps/ios/Shared/Views/Helpers/ChatItemClipShape.swift index 980308f13c..0491b38575 100644 --- a/apps/ios/Shared/Views/Helpers/ChatItemClipShape.swift +++ b/apps/ios/Shared/Views/Helpers/ChatItemClipShape.swift @@ -37,6 +37,7 @@ struct ChatItemClipped: ViewModifier { .rcvMsgContent, .rcvDecryptionError, .rcvIntegrityError, + .rcvMsgError, .invalidJSON: let tail = if let mc = ci.content.msgContent, mc.isImageOrVideo && mc.text.isEmpty { false diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 4a14d3ae99..99fdeebac4 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -3271,6 +3271,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable { case .rcvCall: return false // notification is shown on .callInvitation instead case .rcvIntegrityError: return false case .rcvDecryptionError: return false + case .rcvMsgError: return false case .rcvGroupInvitation: return true case .sndGroupInvitation: return false case .rcvDirectEvent(rcvDirectEvent: let rcvDirectEvent): @@ -4028,6 +4029,7 @@ public enum CIContent: Decodable, ItemContent, Hashable { case rcvCall(status: CICallStatus, duration: Int) case rcvIntegrityError(msgError: MsgErrorType) case rcvDecryptionError(msgDecryptError: MsgDecryptError, msgCount: UInt32) + case rcvMsgError(rcvMsgError: RcvMsgError) case rcvGroupInvitation(groupInvitation: CIGroupInvitation, memberRole: GroupMemberRole) case sndGroupInvitation(groupInvitation: CIGroupInvitation, memberRole: GroupMemberRole) case rcvDirectEvent(rcvDirectEvent: RcvDirectEvent) @@ -4065,6 +4067,7 @@ public enum CIContent: Decodable, ItemContent, Hashable { case let .rcvCall(status, duration): return status.text(duration) case let .rcvIntegrityError(msgError): return msgError.text case let .rcvDecryptionError(msgDecryptError, _): return msgDecryptError.text + case let .rcvMsgError(rcvMsgError): return rcvMsgError.text case let .rcvGroupInvitation(groupInvitation, _): return groupInvitation.text case let .sndGroupInvitation(groupInvitation, _): return groupInvitation.text case let .rcvDirectEvent(rcvDirectEvent): return rcvDirectEvent.text @@ -4156,6 +4159,7 @@ public enum CIContent: Decodable, ItemContent, Hashable { case .rcvCall: return true case .rcvIntegrityError: return true case .rcvDecryptionError: return true + case .rcvMsgError: return true case .rcvGroupInvitation: return true case .rcvModerated: return true case .rcvBlocked: return true @@ -5082,6 +5086,20 @@ public enum MsgErrorType: Decodable, Hashable { } } +public enum RcvMsgError: Decodable, Hashable { + case dropped(attempts: Int) + case parseError(parseError: String) + + var text: String { + switch self { + case let .dropped(attempts): + String.localizedStringWithFormat(NSLocalizedString("removed (%d attempts)", comment: "receive error chat item"), attempts) + case let .parseError(parseError): + String.localizedStringWithFormat(NSLocalizedString("error: %@", comment: "receive error chat item"), parseError) + } + } +} + public struct CIGroupInvitation: Decodable, Hashable { public var groupId: Int64 public var groupMemberId: Int64 diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 4e406044e5..f89a599bb4 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -3040,6 +3040,7 @@ data class ChatItem ( is CIContent.RcvCall -> false // notification is shown on CallInvitation instead is CIContent.RcvIntegrityError -> false is CIContent.RcvDecryptionError -> false + is CIContent.RcvMsgErrorContent -> false is CIContent.RcvGroupInvitation -> true is CIContent.SndGroupInvitation -> false is CIContent.RcvDirectEventContent -> when (content.rcvDirectEvent) { @@ -3734,6 +3735,7 @@ sealed class CIContent: ItemContent { @Serializable @SerialName("rcvCall") class RcvCall(val status: CICallStatus, val duration: Int): CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("rcvIntegrityError") class RcvIntegrityError(val msgError: MsgErrorType): CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("rcvDecryptionError") class RcvDecryptionError(val msgDecryptError: MsgDecryptError, val msgCount: UInt): CIContent() { override val msgContent: MsgContent? get() = null } + @Serializable @SerialName("rcvMsgError") class RcvMsgErrorContent(val rcvMsgError: RcvMsgError): CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("rcvGroupInvitation") class RcvGroupInvitation(val groupInvitation: CIGroupInvitation, val memberRole: GroupMemberRole): CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("sndGroupInvitation") class SndGroupInvitation(val groupInvitation: CIGroupInvitation, val memberRole: GroupMemberRole): CIContent() { override val msgContent: MsgContent? get() = null } @Serializable @SerialName("rcvDirectEvent") class RcvDirectEventContent(val rcvDirectEvent: RcvDirectEvent): CIContent() { override val msgContent: MsgContent? get() = null } @@ -3770,6 +3772,7 @@ sealed class CIContent: ItemContent { is RcvCall -> status.text(duration) is RcvIntegrityError -> msgError.text is RcvDecryptionError -> msgDecryptError.text + is RcvMsgErrorContent -> rcvMsgError.text is RcvGroupInvitation -> groupInvitation.text is SndGroupInvitation -> groupInvitation.text is RcvDirectEventContent -> rcvDirectEvent.text @@ -3810,6 +3813,7 @@ sealed class CIContent: ItemContent { is RcvCall -> true is RcvIntegrityError -> true is RcvDecryptionError -> true + is RcvMsgErrorContent -> true is RcvGroupInvitation -> true is RcvModerated -> true is RcvBlocked -> true @@ -4721,6 +4725,17 @@ sealed class MsgErrorType() { } } +@Serializable +sealed class RcvMsgError() { + @Serializable @SerialName("dropped") class Dropped(val attempts: Int): RcvMsgError() + @Serializable @SerialName("parseError") class ParseError(val parseError: String): RcvMsgError() + + val text: String get() = when (this) { + is Dropped -> String.format(generalGetString(MR.strings.rcv_msg_error_dropped), attempts) + is ParseError -> String.format(generalGetString(MR.strings.rcv_msg_error_parse), parseError) + } +} + @Serializable sealed class RcvDirectEvent() { @Serializable @SerialName("contactDeleted") class ContactDeleted(): RcvDirectEvent() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt index d2d0a91c9b..d5e2110063 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt @@ -714,6 +714,9 @@ fun ChatItemView( } else { Box(Modifier.size(0.dp)) {} } + is CIContent.RcvMsgErrorContent -> { + RcvMsgErrorItemView(c.rcvMsgError, cItem, showTimestamp, cInfo.timedMessagesTTL) + } is CIContent.RcvDecryptionError -> { CIRcvDecryptionError(c.msgDecryptError, c.msgCount, cInfo, cItem, updateContactStats = updateContactStats, updateMemberStats = updateMemberStats, syncContactConnection = syncContactConnection, syncMemberConnection = syncMemberConnection, findModelChat = findModelChat, findModelMember = findModelMember) DeleteItemMenu() @@ -1310,6 +1313,7 @@ fun shapeStyleWithTail(chatItem: ChatItem? = null, tailEnabled: Boolean, tailVis is CIContent.SndMsgContent, is CIContent.RcvMsgContent, is CIContent.RcvDecryptionError, + is CIContent.RcvMsgErrorContent, is CIContent.SndDeleted, is CIContent.RcvDeleted, is CIContent.RcvIntegrityError, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/IntegrityErrorItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/IntegrityErrorItemView.kt index d528396193..08b6520dfa 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/IntegrityErrorItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/IntegrityErrorItemView.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import chat.simplex.common.model.ChatItem import chat.simplex.common.model.MsgErrorType +import chat.simplex.common.model.RcvMsgError import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.AlertManager import chat.simplex.common.views.helpers.generalGetString @@ -73,6 +74,19 @@ fun CIMsgError(ci: ChatItem, showTimestamp: Boolean, timedMessagesTTL: Int?, onC } } +@Composable +fun RcvMsgErrorItemView(rcvMsgError: RcvMsgError, ci: ChatItem, showTimestamp: Boolean, timedMessagesTTL: Int?) { + CIMsgError(ci, showTimestamp, timedMessagesTTL) { + AlertManager.shared.showAlertMsg( + title = generalGetString(MR.strings.alert_title_msg_error), + text = when (rcvMsgError) { + is RcvMsgError.Dropped -> String.format(generalGetString(MR.strings.alert_text_msg_reception_error), rcvMsgError.attempts) + is RcvMsgError.ParseError -> rcvMsgError.parseError + } + ) + } +} + @Preview/*( uiMode = Configuration.UI_MODE_NIGHT_YES, name = "Dark Mode" diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 609b6c4b3e..9ea32d5131 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1377,6 +1377,10 @@ bad message hash bad message ID duplicate message + dropped (%1$d attempts) + error: %s + Message error + The app removed this message after %1$d attempts to receive it. Skipped messages It can happen when:\n1. The messages expired in the sending client after 2 days or on the server after 30 days.\n2. Message decryption failed, because you or your contact used old database backup.\n3. The connection was compromised. Bad message hash diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index 7a68fa92a9..aee16ac5ea 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -70,6 +70,7 @@ This file is generated automatically. - [CreatedConnLink](#createdconnlink) - [CryptoFile](#cryptofile) - [CryptoFileArgs](#cryptofileargs) +- [DroppedMsg](#droppedmsg) - [E2EInfo](#e2einfo) - [ErrorType](#errortype) - [FeatureAllowed](#featureallowed) @@ -149,6 +150,7 @@ This file is generated automatically. - [RcvFileStatus](#rcvfilestatus) - [RcvFileTransfer](#rcvfiletransfer) - [RcvGroupEvent](#rcvgroupevent) +- [RcvMsgError](#rcvmsgerror) - [RelayProfile](#relayprofile) - [RelayStatus](#relaystatus) - [ReportReason](#reportreason) @@ -454,6 +456,10 @@ RcvDecryptionError: - msgDecryptError: [MsgDecryptError](#msgdecrypterror) - msgCount: word32 +RcvMsgError: +- type: "rcvMsgError" +- rcvMsgError: [RcvMsgError](#rcvmsgerror) + RcvGroupInvitation: - type: "rcvGroupInvitation" - groupInvitation: [CIGroupInvitation](#cigroupinvitation) @@ -1813,6 +1819,15 @@ connFullLink + ((' ' + connShortLink) if connShortLink is not None else '') # Py - fileNonce: string +--- + +## DroppedMsg + +**Record type**: +- brokerTs: UTCTime +- attempts: int + + --- ## E2EInfo @@ -3192,6 +3207,21 @@ MsgBadSignature: - type: "msgBadSignature" +--- + +## RcvMsgError + +**Discriminated union type**: + +Dropped: +- type: "dropped" +- attempts: int + +ParseError: +- type: "parseError" +- parseError: string + + --- ## RelayProfile @@ -3261,6 +3291,7 @@ A_CRYPTO: A_DUPLICATE: - type: "A_DUPLICATE" +- droppedMsg_: [DroppedMsg](#droppedmsg)? A_QUEUE: - type: "A_QUEUE" diff --git a/bots/src/API/Docs/Types.hs b/bots/src/API/Docs/Types.hs index e55e037243..826b8c1957 100644 --- a/bots/src/API/Docs/Types.hs +++ b/bots/src/API/Docs/Types.hs @@ -253,6 +253,7 @@ chatTypesDocsData = (sti @ContactUserPreferences, STRecord, "", [], "", ""), (sti @CryptoFile, STRecord, "", [], "", ""), (sti @CryptoFileArgs, STRecord, "", [], "", ""), + (sti @DroppedMsg, STRecord, "", [], "", ""), (sti @E2EInfo, STRecord, "", [], "", ""), (sti @ErrorType, STUnion, "", [], "", ""), (sti @FeatureAllowed, STEnum, "FA", [], "", ""), @@ -332,6 +333,7 @@ chatTypesDocsData = (sti @RcvFileStatus, STUnion, "RFS", [], "", ""), (sti @RcvFileTransfer, STRecord, "", [], "", ""), (sti @RcvGroupEvent, STUnion, "RGE", [], "", ""), + (sti @RcvMsgError, STUnion, "RME", [], "", ""), (sti @RelayProfile, STRecord, "", [], "", ""), (sti @RelayStatus, STEnum, "RS", [], "", ""), (sti @ReportReason, STEnum' (dropPfxSfx "RR" ""), "", ["RRUnknown"], "", ""), @@ -452,6 +454,7 @@ deriving instance Generic ContactStatus deriving instance Generic ContactUserPreferences deriving instance Generic CryptoFile deriving instance Generic CryptoFileArgs +deriving instance Generic DroppedMsg deriving instance Generic E2EInfo deriving instance Generic ErrorType deriving instance Generic FeatureAllowed @@ -537,6 +540,7 @@ deriving instance Generic RcvFileDescr deriving instance Generic RcvFileStatus deriving instance Generic RcvFileTransfer deriving instance Generic RcvGroupEvent +deriving instance Generic RcvMsgError deriving instance Generic RelayProfile deriving instance Generic RelayStatus deriving instance Generic ReportReason diff --git a/cabal.project b/cabal.project index e853187e42..43ea745379 100644 --- a/cabal.project +++ b/cabal.project @@ -21,7 +21,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 97802a30fce1dfeea90f0b465e21fc8eca937abb + tag: 0933cbcb9ce67e055f5230a8d5e07f5cb41f887d source-repository-package type: git diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index ef232a6461..621a69dcc8 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -278,6 +278,7 @@ export type CIContent = | CIContent.RcvCall | CIContent.RcvIntegrityError | CIContent.RcvDecryptionError + | CIContent.RcvMsgError | CIContent.RcvGroupInvitation | CIContent.SndGroupInvitation | CIContent.RcvDirectEvent @@ -312,6 +313,7 @@ export namespace CIContent { | "rcvCall" | "rcvIntegrityError" | "rcvDecryptionError" + | "rcvMsgError" | "rcvGroupInvitation" | "sndGroupInvitation" | "rcvDirectEvent" @@ -383,6 +385,11 @@ export namespace CIContent { msgCount: number // word32 } + export interface RcvMsgError extends Interface { + type: "rcvMsgError" + rcvMsgError: RcvMsgError + } + export interface RcvGroupInvitation extends Interface { type: "rcvGroupInvitation" groupInvitation: CIGroupInvitation @@ -2075,6 +2082,11 @@ export interface CryptoFileArgs { fileNonce: string } +export interface DroppedMsg { + brokerTs: string // ISO-8601 timestamp + attempts: number // int +} + export interface E2EInfo { pqEnabled?: boolean } @@ -3606,6 +3618,26 @@ export namespace RcvGroupEvent { } } +export type RcvMsgError = RcvMsgError.Dropped | RcvMsgError.ParseError + +export namespace RcvMsgError { + export type Tag = "dropped" | "parseError" + + interface Interface { + type: Tag + } + + export interface Dropped extends Interface { + type: "dropped" + attempts: number // int + } + + export interface ParseError extends Interface { + type: "parseError" + parseError: string + } +} + export interface RelayProfile { displayName: string fullName: string @@ -3681,6 +3713,7 @@ export namespace SMPAgentError { export interface A_DUPLICATE extends Interface { type: "A_DUPLICATE" + droppedMsg_?: DroppedMsg } export interface A_QUEUE extends Interface { diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 1c660f4dfa..006f37104e 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."97802a30fce1dfeea90f0b465e21fc8eca937abb" = "1pgrfzir7www4f2h1byvzlihs6vird85m1mhwiinl0xaqsycha1m"; + "https://github.com/simplex-chat/simplexmq.git"."0933cbcb9ce67e055f5230a8d5e07f5cb41f887d" = "0mnqcfvv1hshknl5mv6b05sh6nylzsy98xmfgyczfnryqd88r2jc"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 2676224631..f5f7752ca4 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -493,7 +493,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = Left e -> do atomically $ modifyTVar' tags ("error" :) logInfo $ "contact msg=error " <> eInfo <> " " <> tshow e - eToView (ChatError . CEException $ "error parsing chat message: " <> e) + createInternalChatItem user (CDDirectRcv ct') (CIRcvMsgError $ RMEParseError $ T.pack e) Nothing + `catchAllErrors` \_ -> pure () withRcpt <- checkSendRcpt ct' $ rights aChatMsgs -- not crucial to use ct'' from processEvent pure (withRcpt, False) where @@ -687,6 +688,8 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = -- error cannot be AUTH error here updateDirectItemsStatusMsgs ct conn (L.toList msgIds) (CISSndError $ agentSndError err) eToView $ ChatErrorAgent err (AgentConnId agentConnId) (Just connEntity) + ERR (AGENT (A_DUPLICATE (Just DroppedMsg {brokerTs, attempts}))) -> + createInternalChatItem user (CDDirectRcv ct) (CIRcvMsgError $ RMEDropped attempts) (Just brokerTs) ERR err -> do eToView $ ChatErrorAgent err (AgentConnId agentConnId) (Just connEntity) when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () @@ -962,7 +965,12 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = Left e -> do atomically $ modifyTVar' tags ("error" :) logInfo $ "group msg=error " <> eInfo <> " " <> tshow e - eToView (ChatError . CEException $ "error parsing chat message: " <> e) + if isRelay membership + then + eToView (ChatError . CEException $ "error parsing chat message: " <> e) + else + createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m') (CIRcvMsgError $ RMEParseError $ T.pack e) Nothing + `catchAllErrors` \_ -> pure () pure newDeliveryTasks processEvent :: forall e. MsgEncodingI e => GroupInfo -> GroupMember -> VerifiedMsg e -> CM (Maybe NewMessageDeliveryTask) processEvent gInfo' m' verifiedMsg = do @@ -1178,6 +1186,12 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = withStore' $ \db -> forM_ msgIds $ \msgId -> updateGroupItemsErrorStatus db msgId (groupMemberId' m) newStatus `catchAll_` pure () eToView $ ChatErrorAgent err (AgentConnId agentConnId) (Just connEntity) + ERR err@(AGENT (A_DUPLICATE (Just DroppedMsg {brokerTs, attempts}))) + | isRelay membership -> + eToView $ ChatErrorAgent err (AgentConnId agentConnId) (Just connEntity) + | otherwise -> do + (gInfo', m', scopeInfo) <- mkGroupChatScope gInfo m + createInternalChatItem user (CDGroupRcv gInfo' scopeInfo m') (CIRcvMsgError $ RMEDropped attempts) (Just brokerTs) ERR err -> do eToView $ ChatErrorAgent err (AgentConnId agentConnId) (Just connEntity) when (corrId /= "") $ withCompletedCommand conn agentMsg $ \_cmdData -> pure () diff --git a/src/Simplex/Chat/Messages/CIContent.hs b/src/Simplex/Chat/Messages/CIContent.hs index e2e878033d..b08cc5a991 100644 --- a/src/Simplex/Chat/Messages/CIContent.hs +++ b/src/Simplex/Chat/Messages/CIContent.hs @@ -145,6 +145,7 @@ data CIContent (d :: MsgDirection) where CIRcvCall :: CICallStatus -> Int -> CIContent 'MDRcv CIRcvIntegrityError :: MsgErrorType -> CIContent 'MDRcv CIRcvDecryptionError :: MsgDecryptError -> Word32 -> CIContent 'MDRcv + CIRcvMsgError :: RcvMsgError -> CIContent 'MDRcv CIRcvGroupInvitation :: CIGroupInvitation -> GroupMemberRole -> CIContent 'MDRcv CISndGroupInvitation :: CIGroupInvitation -> GroupMemberRole -> CIContent 'MDSnd CIRcvDirectEvent :: RcvDirectEvent -> CIContent 'MDRcv @@ -196,6 +197,11 @@ data MsgDecryptError | MDERatchetSync deriving (Eq, Show) +data RcvMsgError + = RMEDropped {attempts :: Int} + | RMEParseError {parseError :: Text} + deriving (Eq, Show) + ciRequiresAttention :: forall d. MsgDirectionI d => CIContent d -> Bool ciRequiresAttention content = case msgDirection @d of SMDSnd -> True @@ -205,6 +211,7 @@ ciRequiresAttention content = case msgDirection @d of CIRcvCall {} -> True CIRcvIntegrityError _ -> True CIRcvDecryptionError {} -> True + CIRcvMsgError _ -> False CIRcvGroupInvitation {} -> True CIRcvDirectEvent rde -> case rde of RDEContactDeleted -> False @@ -275,6 +282,7 @@ ciContentToText = \case CIRcvCall status duration -> "incoming call: " <> ciCallInfoText status duration CIRcvIntegrityError err -> msgIntegrityError err CIRcvDecryptionError err n -> msgDecryptErrorText err n + CIRcvMsgError err -> rcvMsgErrorText err CIRcvGroupInvitation groupInvitation memberRole -> "received " <> ciGroupInvitationToText groupInvitation memberRole CISndGroupInvitation groupInvitation memberRole -> "sent " <> ciGroupInvitationToText groupInvitation memberRole CIRcvDirectEvent event -> rcvDirectEventToText event @@ -421,6 +429,11 @@ msgIntegrityError = \case MsgBadHash -> "incorrect message hash" MsgDuplicate -> "duplicate message ID" +rcvMsgErrorText :: RcvMsgError -> Text +rcvMsgErrorText = \case + RMEDropped {attempts} -> "message removed after " <> tshow attempts <> " attempts" + RMEParseError {parseError} -> "message error: " <> parseError + msgDecryptErrorText :: MsgDecryptError -> Word32 -> Text msgDecryptErrorText err n = "decryption error, possibly due to the device change" @@ -457,6 +470,7 @@ data JSONCIContent | JCIRcvCall {status :: CICallStatus, duration :: Int} | JCIRcvIntegrityError {msgError :: MsgErrorType} | JCIRcvDecryptionError {msgDecryptError :: MsgDecryptError, msgCount :: Word32} + | JCIRcvMsgError {rcvMsgError :: RcvMsgError} | JCIRcvGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | JCISndGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | JCIRcvDirectEvent {rcvDirectEvent :: RcvDirectEvent} @@ -492,6 +506,7 @@ jsonCIContent = \case CIRcvCall status duration -> JCIRcvCall {status, duration} CIRcvIntegrityError err -> JCIRcvIntegrityError err CIRcvDecryptionError err n -> JCIRcvDecryptionError err n + CIRcvMsgError err -> JCIRcvMsgError err CIRcvGroupInvitation groupInvitation memberRole -> JCIRcvGroupInvitation {groupInvitation, memberRole} CISndGroupInvitation groupInvitation memberRole -> JCISndGroupInvitation {groupInvitation, memberRole} CIRcvDirectEvent rcvDirectEvent -> JCIRcvDirectEvent {rcvDirectEvent} @@ -527,6 +542,7 @@ aciContentJSON = \case JCIRcvCall {status, duration} -> ACIContent SMDRcv $ CIRcvCall status duration JCIRcvIntegrityError err -> ACIContent SMDRcv $ CIRcvIntegrityError err JCIRcvDecryptionError err n -> ACIContent SMDRcv $ CIRcvDecryptionError err n + JCIRcvMsgError err -> ACIContent SMDRcv $ CIRcvMsgError err JCIRcvGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDRcv $ CIRcvGroupInvitation groupInvitation memberRole JCISndGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDSnd $ CISndGroupInvitation groupInvitation memberRole JCIRcvDirectEvent {rcvDirectEvent} -> ACIContent SMDRcv $ CIRcvDirectEvent rcvDirectEvent @@ -563,6 +579,7 @@ data DBJSONCIContent | DBJCIRcvCall {status :: CICallStatus, duration :: Int} | DBJCIRcvIntegrityError {msgError :: DBMsgErrorType} | DBJCIRcvDecryptionError {msgDecryptError :: MsgDecryptError, msgCount :: Word32} + | DBJCIRcvMsgError {rcvMsgError :: RcvMsgError} | DBJCIRcvGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | DBJCISndGroupInvitation {groupInvitation :: CIGroupInvitation, memberRole :: GroupMemberRole} | DBJCIRcvDirectEvent {rcvDirectEvent :: DBRcvDirectEvent} @@ -598,6 +615,7 @@ dbJsonCIContent = \case CIRcvCall status duration -> DBJCIRcvCall {status, duration} CIRcvIntegrityError err -> DBJCIRcvIntegrityError $ DBME err CIRcvDecryptionError err n -> DBJCIRcvDecryptionError err n + CIRcvMsgError err -> DBJCIRcvMsgError err CIRcvGroupInvitation groupInvitation memberRole -> DBJCIRcvGroupInvitation {groupInvitation, memberRole} CISndGroupInvitation groupInvitation memberRole -> DBJCISndGroupInvitation {groupInvitation, memberRole} CIRcvDirectEvent rde -> DBJCIRcvDirectEvent $ RDE rde @@ -633,6 +651,7 @@ aciContentDBJSON = \case DBJCIRcvCall {status, duration} -> ACIContent SMDRcv $ CIRcvCall status duration DBJCIRcvIntegrityError (DBME err) -> ACIContent SMDRcv $ CIRcvIntegrityError err DBJCIRcvDecryptionError err n -> ACIContent SMDRcv $ CIRcvDecryptionError err n + DBJCIRcvMsgError err -> ACIContent SMDRcv $ CIRcvMsgError err DBJCIRcvGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDRcv $ CIRcvGroupInvitation groupInvitation memberRole DBJCISndGroupInvitation {groupInvitation, memberRole} -> ACIContent SMDSnd $ CISndGroupInvitation groupInvitation memberRole DBJCIRcvDirectEvent (RDE rde) -> ACIContent SMDRcv $ CIRcvDirectEvent rde @@ -693,6 +712,8 @@ $(JQ.deriveJSON defaultJSON ''E2EInfo) $(JQ.deriveJSON (enumJSON $ dropPrefix "MDE") ''MsgDecryptError) +$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "RME") ''RcvMsgError) + $(JQ.deriveJSON (enumJSON $ dropPrefix "CIGIS") ''CIGroupInvitationStatus) $(JQ.deriveJSON defaultJSON ''CIGroupInvitation) @@ -751,6 +772,7 @@ toCIContentTag ciContent = case ciContent of CIRcvCall {} -> "rcvCall" CIRcvIntegrityError _ -> "rcvIntegrityError" CIRcvDecryptionError {} -> "rcvDecryptionError" + CIRcvMsgError _ -> "rcvMsgError" CIRcvGroupInvitation {} -> "rcvGroupInvitation" CISndGroupInvitation {} -> "sndGroupInvitation" CIRcvDirectEvent _ -> "rcvDirectEvent" diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 6d7a094430..3485849741 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -56,7 +56,7 @@ import Simplex.Chat.Types.Preferences import Simplex.Chat.Types.Shared import Simplex.Messaging.Agent.Protocol (VersionSMPA, pqdrSMPAgentVersion) import Simplex.Messaging.Agent.Store.DB (blobFieldDecoder, fromTextField_) -import Simplex.Messaging.Compression (Compressed, compress1, decompress1) +import Simplex.Messaging.Compression (Compressed, compress1, decompress1, decompressedSize) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String @@ -799,7 +799,11 @@ parseChatMessages msg = case B.head msg of decodeCompressed :: ByteString -> [Either String AParsedMsg] decodeCompressed s = case smpDecode s of Left e -> [Left e] - Right (compressed :: L.NonEmpty Compressed) -> concatMap (either (\e -> [Left e]) parseUncompressed' . decompress1 maxDecompressedMsgLength) compressed + Right (compressed :: L.NonEmpty Compressed) -> case traverse decompressedSize compressed of + Nothing -> [Left "compressed size not specified"] + Just sizes + | sum sizes > maxDecompressedMsgLength -> [Left "decompressed size exceeds limit"] + | otherwise -> concatMap (either (\e -> [Left e]) parseUncompressed' . decompress1) compressed parseUncompressed' "" = [Left "empty string"] parseUncompressed' s = parseUncompressed (B.head s) s -- Binary batch format: '=' ( )* diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index 6959d3e562..3afe0ce0ce 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -671,6 +671,7 @@ viewChatItem chat ci@ChatItem {chatDir, meta = meta@CIMeta {itemForwarded, forwa CIDirectRcv -> case content of CIRcvMsgContent mc -> withRcvFile from $ rcvMsg from context mc CIRcvIntegrityError err -> viewRcvIntegrityError from err ts tz meta + CIRcvMsgError err -> viewRcvMsgError from err ts tz meta CIRcvGroupEvent {} -> showRcvItemProhibited from _ -> showRcvItem from where @@ -694,6 +695,7 @@ viewChatItem chat ci@ChatItem {chatDir, meta = meta@CIMeta {itemForwarded, forwa rcvGroupItem m_ = case content of CIRcvMsgContent mc -> withRcvFile from $ rcvMsg from context mc CIRcvIntegrityError err -> viewRcvIntegrityError from err ts tz meta + CIRcvMsgError err -> viewRcvMsgError from err ts tz meta CIRcvGroupInvitation {} | isJust m_ -> showRcvItemProhibited from CIRcvModerated {} -> receivedWithTime_ ts tz (ttyFromGroup g scopeInfo m_) context meta [plainContent content] False CIRcvBlocked {} -> receivedWithTime_ ts tz (ttyFromGroup g scopeInfo m_) context meta [plainContent content] False @@ -715,6 +717,7 @@ viewChatItem chat ci@ChatItem {chatDir, meta = meta@CIMeta {itemForwarded, forwa CILocalRcv -> case content of CIRcvMsgContent mc -> withLocalFile from $ rcvMsg from context mc CIRcvIntegrityError err -> viewRcvIntegrityError from err ts tz meta + CIRcvMsgError err -> viewRcvMsgError from err ts tz meta CIRcvGroupEvent {} -> showRcvItemProhibited from _ -> showRcvItem from where @@ -991,6 +994,9 @@ viewRcvIntegrityError from msgErr ts tz meta = receivedWithTime_ ts tz from [] m viewMsgIntegrityError :: MsgErrorType -> [StyledString] viewMsgIntegrityError err = [ttyError $ msgIntegrityError err] +viewRcvMsgError :: StyledString -> RcvMsgError -> CurrentTime -> TimeZone -> CIMeta c 'MDRcv -> [StyledString] +viewRcvMsgError from rcvErr ts tz meta = receivedWithTime_ ts tz from [] meta [ttyError $ rcvMsgErrorText rcvErr] False + viewInvalidConnReq :: [StyledString] viewInvalidConnReq = [ "", @@ -2656,7 +2662,7 @@ viewChatError isCmd logLevel testView = \case BRContent -> "content violates conditions of use" BROKER _ (NETWORK _) | not isCmd -> [] BROKER _ TIMEOUT | not isCmd -> [] - AGENT A_DUPLICATE -> [withConnEntity <> "error: AGENT A_DUPLICATE" | logLevel == CLLDebug || isCmd] + AGENT A_DUPLICATE {} -> [withConnEntity <> "error: AGENT A_DUPLICATE" | logLevel == CLLDebug || isCmd] AGENT (A_PROHIBITED e) -> [withConnEntity <> "error: AGENT A_PROHIBITED, " <> plain e | logLevel <= CLLWarning || isCmd] CONN NOT_FOUND _ -> [withConnEntity <> "error: CONN NOT_FOUND" | logLevel <= CLLWarning || isCmd] CRITICAL restart e -> [plain $ "critical error: " <> e] <> ["please restart the app" | restart] From 01c9343cdd5002da8c81b1c3c41a88a490f55be6 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 11 Apr 2026 20:13:32 +0100 Subject: [PATCH 013/152] desktop: use text pointer for text selection (#6787) * desktop: use text pointer for text selection * do not clear selection on ctrl-c * crlf --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../kotlin/chat/simplex/common/views/chat/TextSelection.kt | 6 ++++-- .../chat/simplex/common/views/chat/item/TextItemView.kt | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt index 4447bf9da2..626aea0806 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt @@ -312,7 +312,6 @@ fun BoxScope.SelectionHandler( manager.listState = listState manager.onCopySelection = { clipboard.setText(AnnotatedString(manager.getSelectedCopiedText(mergedItems.value.items, linkMode))) - manager.clearSelection() showToast(generalGetString(MR.strings.copied)) } @@ -509,7 +508,10 @@ fun SelectionCopyButton() { .background(MaterialTheme.colors.surface, RoundedCornerShape(20.dp)) .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(20.dp)) .clip(RoundedCornerShape(20.dp)) - .clickable { manager.onCopySelection?.invoke() } + .clickable { + manager.onCopySelection?.invoke() + manager.clearSelection() + } .padding(horizontal = 16.dp, vertical = 8.dp), verticalAlignment = Alignment.CenterVertically ) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt index 9e8583a79b..b8691c70f8 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt @@ -299,7 +299,7 @@ fun MarkdownText ( } val clampedRange = selectionRange?.let { it.first .. minOf(it.last, selectableEnd) } if ((hasLinks && uriHandler != null) || hasSecrets || (hasCommands && sendCommandMsg != null)) { - val icon = remember { mutableStateOf(PointerIcon.Default) } + val icon = remember { mutableStateOf(PointerIcon.Text) } ClickableText(annotatedText, style = style, selectionRange = clampedRange, modifier = modifier.pointerHoverIcon(icon.value), maxLines = maxLines, overflow = overflow, onLongClick = { offset -> if (hasLinks) { @@ -336,7 +336,7 @@ fun MarkdownText ( if (hasAnnotation("WEB_URL") || hasAnnotation("SIMPLEX_URL") || hasAnnotation("OTHER_URL") || hasAnnotation("SECRET") || hasAnnotation("COMMAND")) { PointerIcon.Hand } else { - PointerIcon.Default + PointerIcon.Text } }, shouldConsumeEvent = { offset -> @@ -431,7 +431,7 @@ private fun SelectableText( BasicText( text = text, - modifier = modifier.then(selectionHighlight(selectionRange, text.length, layoutResult)), + modifier = modifier.pointerHoverIcon(PointerIcon.Text).then(selectionHighlight(selectionRange, text.length, layoutResult)), style = style, maxLines = maxLines, overflow = overflow, From 46c41382a690deed9620d63c38a9dd1226c94664 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sat, 11 Apr 2026 21:01:37 +0100 Subject: [PATCH 014/152] core: 6.5.0.15 (simplexmq 6.5.0.15) --- cabal.project | 2 +- scripts/nix/sha256map.nix | 2 +- simplex-chat.cabal | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cabal.project b/cabal.project index 43ea745379..65983d22a5 100644 --- a/cabal.project +++ b/cabal.project @@ -21,7 +21,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: 0933cbcb9ce67e055f5230a8d5e07f5cb41f887d + tag: bc5ea42bec3a63e46b191e4150dd79957f114e01 source-repository-package type: git diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 006f37104e..6449ac8900 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."0933cbcb9ce67e055f5230a8d5e07f5cb41f887d" = "0mnqcfvv1hshknl5mv6b05sh6nylzsy98xmfgyczfnryqd88r2jc"; + "https://github.com/simplex-chat/simplexmq.git"."bc5ea42bec3a63e46b191e4150dd79957f114e01" = "0lswj7crfnwzh4g28kgxxl7g4i2a9pn03pxj7sqfqy3vs83m3bax"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; diff --git a/simplex-chat.cabal b/simplex-chat.cabal index 621a784ed8..320e51c8af 100644 --- a/simplex-chat.cabal +++ b/simplex-chat.cabal @@ -5,7 +5,7 @@ cabal-version: 1.12 -- see: https://github.com/sol/hpack name: simplex-chat -version: 6.5.0.14 +version: 6.5.0.15 category: Web, System, Services, Cryptography homepage: https://github.com/simplex-chat/simplex-chat#readme author: simplex.chat From e6bf62acf1493181c7ab557932655ecec764cd08 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sat, 11 Apr 2026 22:45:17 +0100 Subject: [PATCH 015/152] website: translations (#6790) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * desktop: fix chat view processing all mouse move events * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/ * Translated using Weblate (Italian) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/it/ * Translated using Weblate (German) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/de/ * Translated using Weblate (Japanese) Currently translated at 72.3% (267 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ja/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ * Translated using Weblate (Polish) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/pl/ * Translated using Weblate (Russian) Currently translated at 88.0% (325 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/ru/ * Translated using Weblate (Czech) Currently translated at 98.6% (364 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/cs/ * Translated using Weblate (Czech) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/cs/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/hu/ * Translated using Weblate (Czech) Currently translated at 100.0% (369 of 369 strings) Translation: SimpleX Chat/SimpleX Chat website Translate-URL: https://hosted.weblate.org/projects/simplex-chat/website/cs/ * fixes * Apply suggestion from @epoberezkin * ru --------- Co-authored-by: 大王叫我来巡山 Co-authored-by: Random Co-authored-by: mlanp Co-authored-by: Miyu Sakatsuki Co-authored-by: summoner001 Co-authored-by: Omikorin <6079265+Omikorin@users.noreply.github.com> Co-authored-by: Blueberry Co-authored-by: slrslr Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- website/langs/cs.json | 26 ++++++++--------- website/langs/de.json | 6 ++-- website/langs/hu.json | 58 +++++++++++++++++++------------------- website/langs/it.json | 14 ++++----- website/langs/ja.json | 3 +- website/langs/pl.json | 2 +- website/langs/zh_Hans.json | 4 +-- 7 files changed, 57 insertions(+), 56 deletions(-) diff --git a/website/langs/cs.json b/website/langs/cs.json index 19f4aeedb6..e80873929a 100644 --- a/website/langs/cs.json +++ b/website/langs/cs.json @@ -6,7 +6,7 @@ "hero-overlay-card-1-p-3": "Definujete, které servery se mají používat k přijímání zpráv, vašich kontaktů — servery, které používáte k odesílání zpráv. Každá konverzace bude pravděpodobně používat dva různé servery.", "hero-overlay-card-2-p-3": "I v těch nejsoukromějších aplikacích, které používají služby Tor v3, pokud mluvíte se dvěma různými kontakty prostřednictvím stejného profilu, může být prokázáno, že jsou spojeni se stejnou osobou.", "simplex-network-overlay-card-1-p-1": "P2P protokoly a aplikace pro zasílání zpráv mají různé problémy, které je činí méně spolehlivými než SimpleX, složitějšími na analýzu a zranitelnými vůči několika typům útoků.", - "simplex-network-overlay-card-1-li-1": "P2P sítě spoléhají na nějakou variantu DHT pro směrování zpráv. Návrhy DHT musí vyvážit záruku dodávky a latenci. SimpleX má lepší záruku doručení a nižší latenci než P2P, protože zpráva může být zároveň předávána přes několik serverů pomocí serverů vybraných příjemcem. V P2P sítích je zpráva předávána přes uzly O(log N) postupně pomocí uzlů vybraných algoritmem.", + "simplex-network-overlay-card-1-li-1": "P2P sítě spoléhají na varianty DHT pro směrování zpráv. Tyto implementace DHT musí vyvážit záruku dodávky a latenci. SimpleX má lepší záruku doručení a nižší latenci než P2P, protože zpráva může být zároveň předávána přes několik serverů, které si příjemce vybere. V P2P sítích je zpráva předávána přes uzly O(log N) postupně/sekvenčně pomocí uzlů vybraných algoritmem.", "home": "Úvod", "developers": "Vývojáři", "reference": "Odkazy", @@ -193,7 +193,7 @@ "simplex-explained-tab-1-p-1": "Můžete vytvářet kontakty a skupiny a vést obousměrné konverzace, stejně jako v jakémkoli jiném messengeru.", "simplex-explained-tab-3-p-2": "Uživatelé mohou dále zlepšit soukromí metadat pomocí Tor pro přístup k serverům, což zabraňuje korelaci podle IP adresy.", "hero-p-1": "Jiné aplikace mají uživatelská ID: Signal, Matrix, Session, Briar, Jami, Cwtch atd.
SimpleX ne, ani náhodná čísla.
To radikálně zlepšuje vaše soukromí.", - "hero-2-header-desc": "Video ukazuje, jak se spojit se svým přítelem prostřednictvím jeho jednorázového QR kódu, osobně nebo prostřednictvím QR kódu ve videu. Můžete se také připojit sdílením pozvánky.", + "hero-2-header-desc": "Video ukazuje, jak se spojit se svým přítelem prostřednictvím jeho jednorázového QR kódu, osobně nebo prostřednictvím QR kódu ve videu. Můžete se také připojit sdílením odkazu pozvánky.", "feature-2-title": "E2E šifrované
obrázky, videa a soubory", "feature-5-title": "Mizící tajné konverzace", "simplex-private-1-title": "2-vrstvé
end-to-end šifrování", @@ -208,11 +208,11 @@ "if-you-already-installed-simplex-chat-for-the-terminal": "Pokud jste již nainstalovali SimpleX Chat pro terminál", "if-you-already-installed": "Pokud jste již nainstalovali", "simplex-network-1-desc": "Všechny zprávy se odesílají přes servery, což zajišťuje lepší soukromí metadat a spolehlivé asynchronní doručování zpráv, přičemž se zamezuje mnoha", - "simplex-private-card-1-point-1": "Double-ratchet protokol —
OTR messaging s dokonalým dopředným utajením a obnovou po vloupání.", + "simplex-private-card-1-point-1": "Double-ratchet protokol —
OTR zprávy s perfect forward secrecy a obnovou po narušení.", "guide-dropdown-1": "Rychlý start", "guide-dropdown-2": "Odesílání zpráv", "guide-dropdown-3": "Tajné skupiny", - "guide-dropdown-4": "Chat profily", + "guide-dropdown-4": "Profily chatu", "guide-dropdown-5": "Správa dat", "guide-dropdown-6": "Audio a video hovory", "guide-dropdown-7": "Soukromí a bezpečnost", @@ -236,7 +236,7 @@ "hero-overlay-3-textlink": "Hodnocení zabezpečení", "hero-overlay-card-3-p-1": "Trail of Bits je přední bezpečnostní a technologické poradenství, jejichž klienti zahrnují velké technologické firmy, vládní agentury a významné blockchainové projekty.", "f-droid-page-simplex-chat-repo-section-text": "Chcete-li jej přidat do vašeho F-Droid clienta, naskenujte QR kód nebo použijte tuto adresu URL:", - "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat a F-Droid.org repozitáře jsou podepsané různými klíči. Chcete-li přepnout, prosím exportujte chat databázi a přeinstalujte aplikaci.", + "f-droid-page-f-droid-org-repo-section-text": "SimpleX Chat a F-Droid.org repozitáře jsou podepsané různými klíči. Chcete-li mezi nimi přejít, prosím exportujte chat databázi a přeinstalujte aplikaci.", "comparison-section-list-point-4a": "SimpleX relé nemůže ohrozit šifrování e2e. Ověřte bezpečnostní kód, který zmírňuje mimo pásmový útok na kanál", "docs-dropdown-8": "SimpleX Directory", "please-enable-javascript": "Prosím, povolte JavaScript k zobrazení QR kódu.", @@ -315,13 +315,13 @@ "messengers-comparison-section-list-point-6": "Postkvantová dohoda o klíči je omezená — chrání pouze některé kroky ratchet mechanismu.", "navbar-old-site": "Starý web", "why-p1": "Narodili jste se bez účtu.", - "why-p2": "Nikdo nesledoval vaše konverzace. Nikdo nenakreslil mapu, kde jste byli. Ochrana osobních údajů nikdy nebyla funkce — byl to způsob života.", - "why-tagline": "Buďte volní ve své síti.", - "why-footer-link": "Proč ji stavíme", + "why-p2": "Nikdo nesledoval vaše konverzace. Nikdo nevytvořil mapu, kde jste byli. Soukromí nikdy nebylo funkcí — byl to způsob života.", + "why-tagline": "Buďte svobodní ve své síti.", + "why-footer-link": "Proč ji vyvíjíme", "docs-dropdown-15": "Ověřitelné a opakovatelné sestavení", "why-p3": "Pak jsme se přesunuli na internet a každá platforma chtěla o vás něco vědět — vaše jméno, vaše číslo, vaše přátele. Smířili jsme se s tím, že cenou za komunikaci s ostatními je dát někomu vědět, s kým mluvíme. Každá generace, lidská i technická, to tak měla — telefon, e-mail, komunikátory, sociální sítě. Zdálo se, že je to jediný možný způsob.", "why-p4": "Existuje i jiný způsob. Síť bez telefonních čísel. Bez uživatelských jmen. Bez účtů. Bez jakékoli uživatelské identity. Síť, která spojuje lidi a přenáší šifrované zprávy, aniž by bylo známo, kdo je připojen.", - "why-p5": "Není lepší zámek na dveřích někoho jiného. Není milejší nájemce, který respektuje vaše soukromí, ale přesto vede evidenci všech návštěvníků. Vy nejste host. Jste doma. Ani král do něj nemůže vstoupit — jste suverén.", + "why-p5": "Nejde o to mít lepší zámek na dveřích někoho jiného. Ani o to mít nájemce, který respektuje vaše soukromí, ale vede evidenci všech vašich návštěvníků. Nejste host. Jste doma. Ani král k vám nemůže vstoupit — jste suverén.", "why-p6": "Vaše konverzace patří vám, jako tomu bylo vždy před internetem. Síť není místo, které navštěvujete. Je to místo, které vytváříte a vlastníte. A nikdo vám ho nemůže vzít, ať už je soukromé, nebo veřejné.", "why-p7": "Nejstarší lidská svoboda — mluvit s druhým člověkem, aniž by byl sledován — postavena na infrastruktuře, která ji nemůže zradit.", "why-p8": "Protože jsme zničili sílu vědět, kdo jste. Aby vám vaši moc nikdo nemohl vzít.", @@ -336,7 +336,7 @@ "file-drop-text": "Přetáhněte soubor sem", "file-drop-hint": "nebo", "file-choose": "Vyberte soubor", - "file-max-size": "Max 100 MB - SimpleX Chat apka podporuje soubory až do 1 GB", + "file-max-size": "Max. 100 MB - SimpleX Chat aplikace podporuje soubory do 1 GB", "file-encrypting": "Šifruji…", "file-uploading": "Nahrávám…", "file-cancel": "Zrušit", @@ -347,7 +347,7 @@ "file-expiry": "Soubory jsou obvykle k dispozici 48 hodin.", "file-sec-1": "Váš soubor byl zašifrován v prohlížeči - datové routery nikdy neuvidí obsah souboru, jméno nebo velikost.", "file-sec-2": "Šifrovací klíč je obsažen v hash části odkazu – nikdy se neodesílá na žádný server.", - "file-sec-3": "Pro větší bezpečnost, použijte SimpleX Chat apku.", + "file-sec-3": "Pro vyšší bezpečnost použijte aplikaci SimpleX Chat.", "file-retry": "Znovu", "file-downloading": "Stahuji…", "file-decrypting": "Dešifruji…", @@ -359,14 +359,14 @@ "file-init-error": "Chyba inicializace: %error%", "file-available": "Dostupný soubor (~%size%)", "file-dl-sec-1": "Tento soubor je šifrován - datové směrovače nikdy neuvidí obsah souboru, jméno nebo velikost.", - "file-workers-required": "Vyžadováni Web Workers — aktualizujte prohlížeč", + "file-workers-required": "Vyžadovány Web Workers — aktualizujte svůj prohlížeč", "file-protocol-title": "XFTP protokol: nejbezpečnější přenos souborů", "file-proto-h-1": "Není nutný žádný účet", "file-proto-p-1": "Každá část souborů používá nový náhodný klíč. Datové směrovače nemají \"uživatele\" nebo \"soubory\" - přenášejí šifrované části souborů stejných velikostí.", "file-proto-h-2": "Trojitě zašifrováno ve vašem prohlížeči", "file-proto-h-4": "Nezávislé směrovače dat", "file-proto-spec": "Přečtěte si specifikaci XFTP protokolu →", - "file-proto-p-2": "Šifrovací klíč souboru je obsažen pouze v části hash adresy URL – váš prohlížeč jej nikdy neodesílá na server. Existují 3 úrovně šifrování: přenos přes protokol TLS, šifrování pro každého příjemce (jedinečný dočasný klíč pro každý přenos) a šifrování souborů typu end-to-end.", + "file-proto-p-2": "Šifrovací klíč souboru je obsažen pouze v části hash adresy URL – váš prohlížeč jej nikdy neodesílá na server. Existují 3 úrovně šifrování: přenos přes protokol TLS, šifrování pro každého příjemce (jedinečný dočasný klíč pro každý přenos) a end-to-end šifrování souborů.", "file-proto-p-4": "Když je soubor rozdělen na části, je odeslán přes síťové směrovače provozované nezávislými stranami. Žádný operátor nemůže vidět aktuální velikost nebo jméno souboru. I kdyby byl směrovač ohrožen, může vidět pouze šifrované části s pevně stanovenou velikosti. Části souboru jsou v mezipaměti síťových směrovačů uchovávány přibližně 48 hodin.", "send-file": "Odeslat soubor" } diff --git a/website/langs/de.json b/website/langs/de.json index 17fb9b184a..535fe2ae98 100644 --- a/website/langs/de.json +++ b/website/langs/de.json @@ -188,7 +188,7 @@ "copy-the-command-below-text": "Kopieren Sie sich das unten genannte Kommando und nutzen Sie es im Chat:", "privacy-matters-section-subheader": "Die Wahrung der Privatsphäre Ihrer Metadaten — mit wem Sie wann Kontakt haben — schützt Sie vor:", "simplex-private-section-header": "Was macht SimpleX vertraulich", - "simplex-network-section-desc": "Durch die Kombination der Vorteile von P2P und föderierten Netzwerken stellt SimpleX die bestmögliche Privatsphäre zur Verfügung.", + "simplex-network-section-desc": "Durch die Kombination der Vorteile von P2P und föderierten Netzwerken stellt SimpleX Chat die bestmögliche Privatsphäre zur Verfügung.", "simplex-network-2-header": "Im Gegensatz zu föderierten Netzwerken", "comparison-section-list-point-1": "Normalerweise auf der Grundlage einer Telefonnummer, in einigen Fällen auf der Grundlage von Benutzernamen", "comparison-point-5-text": "Zentrale Komponente oder andere Netzwerk-weite Angriffe", @@ -336,7 +336,7 @@ "file-drop-text": "Datei per Drag & Drop hinzufügen", "file-drop-hint": "oder", "file-choose": "Datei auswählen", - "file-max-size": "Max. 100 MB — die SimpleX Chat App unterstützt Dateien bis zu 1 GB", + "file-max-size": "Max. 100 MB — die SimpleX Chat App unterstützt Dateien bis zu 1 GB", "file-encrypting": "Wird verschlüsselt…", "file-uploading": "Wird hochgeladen…", "file-cancel": "Abbrechen", @@ -347,7 +347,7 @@ "file-expiry": "Dateien sind in der Regel 48 Stunden lang verfügbar.", "file-sec-1": "Ihre Datei wurde im Browser verschlüsselt — Datenrouter sehen weder Inhalt, Namen noch Größe der Datei.", "file-sec-2": "Der für die Verschlüsselung genutzte Schlüssel befindet sich im Hash‑Fragment des Links und wird niemals an einen Server übertragen.", - "file-sec-3": "Für noch mehr Sicherheit verwenden Sie die SimpleX Chat App.", + "file-sec-3": "Für noch mehr Sicherheit verwenden Sie die SimpleX Chat App.", "file-retry": "Wiederholen", "file-downloading": "Wird heruntergeladen…", "file-decrypting": "Wird entschlüsselt…", diff --git a/website/langs/hu.json b/website/langs/hu.json index 5dda790d96..0e903d9fca 100644 --- a/website/langs/hu.json +++ b/website/langs/hu.json @@ -21,7 +21,7 @@ "chat-protocol": "Csevegési protokoll", "donate": "Adományozás", "copyright-label": "© 2020-2025 SimpleX Chat | Nyílt forráskódú projekt", - "simplex-chat-protocol": "A SimpleX Chat protokoll", + "simplex-chat-protocol": "SimpleX Chat protokoll", "terminal-cli": "Terminál CLI", "terms-and-privacy-policy": "Adatvédelmi irányelvek", "hero-header": "Újraértelmezett adatvédelem", @@ -49,7 +49,7 @@ "simplex-private-4-title": "Hozzáférés a Tor hálózaton keresztül
(nem kötelező)", "simplex-private-5-title": "Többrétegű
tartalomkitöltés", "simplex-private-6-title": "Sávon kívüli
kulcscsere", - "simplex-private-7-title": "Üzenetintegritás
hitelesítés", + "simplex-private-7-title": "Üzenetintegritás
ellenőrzés", "simplex-private-8-title": "Üzenetek keverése
a korreláció csökkentése érdekében", "simplex-private-9-title": "Egyirányú
várólista az üzenetekhez", "simplex-private-10-title": "Ideiglenes, névtelen, páronkénti azonosítók", @@ -118,7 +118,7 @@ "simplex-unique-overlay-card-2-p-1": "Mivel senki sem rendelkezik azonosítóval a SimpleX hálózaton, ezért senki sem tud kapcsolatba lépni Önnel, hacsak nem oszt meg egy egyszeri vagy ideiglenes felhasználói címet, például QR-kódot vagy hivatkozást.", "simplex-unique-overlay-card-2-p-2": "Még a felhasználói cím használata esetén is, aminek használata nem kötelező – ugyanakkor ez a kéretlen kapcsolatkérelmek küldésére is használható – módosíthatja vagy teljesen törölheti a címet anélkül, hogy elveszítené a meglévő kapcsolatait.", "simplex-unique-overlay-card-3-p-1": "A SimpleX Chat az összes felhasználói adatot kizárólag a klienseken tárolja egy hordozható titkosított adatbázis-formátumban, amely exportálható és átvihető bármely más támogatott eszközre.", - "simplex-unique-overlay-card-3-p-2": "A végpontok között titkosított üzenetek átmenetileg a SimpleX továbbítókiszolgálóin tárolódnak, amíg meg nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan.", + "simplex-unique-overlay-card-3-p-2": "A végpontok között titkosított üzenetek átmenetileg a SimpleX átjátszóin tárolódnak, amíg meg nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan.", "simplex-unique-overlay-card-3-p-3": "A föderált hálózatok kiszolgálóitól (e-mail, XMPP vagy Matrix) eltérően a SimpleX kiszolgálók nem tárolják a felhasználói fiókokat, csak továbbítják az üzeneteket, így védve mindkét fél magánéletét.", "simplex-unique-overlay-card-3-p-4": "A küldött és a fogadott kiszolgálóforgalom között nincsenek közös azonosítók vagy titkosított szövegek — ha bárki megfigyeli, nem tudja könnyen megállapítani, hogy ki kivel kommunikál, még akkor sem, ha a TLS-t kompromittálják.", "simplex-unique-overlay-card-4-p-1": "Használhatja a SimpleXet a saját kiszolgálóival, és továbbra is kommunikálhat azokkal, akik az előre beállított kiszolgálókat használják az alkalmazásban.", @@ -128,7 +128,7 @@ "simplex-unique-card-1-p-2": "Minden más létező üzenetküldő hálózattól eltérően a SimpleX nem rendelkezik a felhasználókhoz rendelt azonosítókkal — még véletlenszerű számokkal sem.", "simplex-unique-card-2-p-1": "Mivel a SimpleX hálózaton senkinek sincs azonosítója vagy állandó címe, ezért senki sem tud kapcsolatba lépni a felhasználókkal, hacsak nem osztanak meg egy egyszeri vagy ideiglenes felhasználói címet, például QR-kódot vagy hivatkozást.", "simplex-unique-card-3-p-1": "A SimpleX Chat az összes felhasználói adatot kizárólag a klienseken tárolja egy hordozható titkosított adatbázis-formátumban —, amely exportálható és átvihető bármely más támogatott eszközre.", - "simplex-unique-card-3-p-2": "A végpontok között titkosított üzenetek átmenetileg a SimpleX továbbítókiszolgálóin tartózkodnak, amíg be nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan.", + "simplex-unique-card-3-p-2": "A végpontok között titkosított üzenetek átmenetileg a SimpleX átjátszóin tartózkodnak, amíg be nem érkeznek a címzetthez, majd automatikusan véglegesen törlődnek onnan.", "simplex-unique-card-4-p-1": "A SimpleX hálózat teljesen decentralizált és független bármely kriptopénztől vagy bármely más hálózattól, kivéve az internetet.", "simplex-unique-card-4-p-2": "Használhatja a SimpleXet a saját kiszolgálóival vagy az általunk biztosított kiszolgálókkal, és továbbra is kapcsolódhat bármely felhasználóhoz.", "join": "Csatlakozzon a közösségeinkhez", @@ -143,17 +143,17 @@ "learn-more": "Tudjon meg többet", "more-info": "További információ", "hide-info": "Információ elrejtése", - "contact-hero-subheader": "Olvassa be a QR-kódot a SimpleX Chat alkalmazással a telefonjával vagy táblagépével.", - "contact-hero-p-1": "A hivatkozásban szereplő nyilvános kulcsokat és az üzenetek várólistájának címe NEM kerül elküldésre a hálózaton keresztül, amikor megtekinti ezt az oldalt — azokat, a hivatkozás webcímének kivonattöredéke tartalmazza.", + "contact-hero-subheader": "Olvassa be a QR-kódot a SimpleX Chat alkalmazással az eszköze segítségével.", + "contact-hero-p-1": "A hivatkozásban szereplő nyilvános kulcsok és az üzenetek várólistájának címe NEM lesz elküldve a hálózaton keresztül, amikor megtekinti ezt az oldalt — azokat, a hivatkozás webcímének kivonattöredéke tartalmazza.", "contact-hero-p-2": "Még nem töltötte le a SimpleX Chatet?", - "contact-hero-p-3": "Az alkalmazás letöltéséhez használja az alábbi hivatkozásokat.", + "contact-hero-p-3": "Az alkalmazás letöltéséhez használja az alábbi hivatkozások egyikét.", "scan-qr-code-from-mobile-app": "QR-kód beolvasása mobilalkalmazásból", "to-make-a-connection": "A kapcsolat létrehozásához:", "install-simplex-app": "Telepítse a SimpleX alkalmazást", "open-simplex-app": "Simplex alkalmazás megnyitása", "tap-the-connect-button-in-the-app": "Koppintson a „kapcsolódás” gombra az alkalmazásban", "scan-the-qr-code-with-the-simplex-chat-app": "Olvassa be a QR-kódot a SimpleX Chat alkalmazással", - "scan-the-qr-code-with-the-simplex-chat-app-description": "A hivatkozásban szereplő nyilvános kulcsokat és az üzenetek várólistájának címe NEM kerül elküldésre a hálózaton keresztül, amikor ezt az oldalt megtekinti —
ezek a hivatkozás webcímének kivonattöredékében szerepelnek.", + "scan-the-qr-code-with-the-simplex-chat-app-description": "A hivatkozásban szereplő nyilvános kulcsok és az üzenetek várólistájának címe NEM lesz elküldve a hálózaton keresztül, amikor megtekinti ezt az oldalt —
azokat, a hivatkozás webcímének kivonattöredéke tartalmazza.", "installing-simplex-chat-to-terminal": "A SimpleX chat telepítése a terminálhoz", "use-this-command": "Használja ezt a parancsot:", "see-simplex-chat": "Az utasításokat megtekintheti a SimpleX Chat", @@ -171,7 +171,7 @@ "simplex-network-section-desc": "A SimpleX Chat a P2P- és a föderált hálózatok előnyeinek kombinálásával biztosítja a legjobb adatvédelmet.", "simplex-network-1-desc": "Minden üzenet a kiszolgálókon keresztül kerül elküldésre, ami jobb metaadat-védelmet és megbízható aszinkron üzenetkézbesítést biztosít, miközben elkerülhető a sok", "simplex-network-2-header": "A föderált hálózatokkal ellentétben", - "simplex-network-2-desc": "A SimpleX továbbítókiszolgálói NEM tárolnak felhasználói profilokat, kapcsolatokat és kézbesített üzeneteket, NEM kapcsolódnak egymáshoz, és NINCS kiszolgálójegyzék.", + "simplex-network-2-desc": "A SimpleX átjátszó kiszolgálói NEM tárolnak felhasználói profilokat, kapcsolatokat és kézbesített üzeneteket, NEM kapcsolódnak egymáshoz, és NINCS kiszolgálójegyzék.", "simplex-network-3-header": "SimpleX hálózat", "simplex-network-3-desc": "a kiszolgálók egyirányú várólistákat biztosítanak a felhasználók összekapcsolásához, de nem látják a hálózati kapcsolati gráfot; azt csak a felhasználók látják.", "comparison-section-header": "Összehasonlítás más protokollokkal", @@ -191,13 +191,13 @@ "comparison-section-list-point-1": "Általában telefonszám alapján, néhány esetben felhasználónév alapján", "comparison-section-list-point-2": "DNS-alapú címek", "comparison-section-list-point-3": "Nyilvános kulcs vagy más globális egyedi azonosító", - "comparison-section-list-point-4a": "A SimpleX továbbítókiszolgálói nem veszélyeztethetik a végpontok közötti titkosítást. Hitelesítse a biztonsági kódot a sávon kívüli csatorna elleni támadások veszélyeinek csökkentésére", - "comparison-section-list-point-4": "Ha az üzemeltetett kiszolgálók veszélybe kerülnek. Hitelesítse a biztonsági kódot a Signal vagy más biztonságos üzenetküldő alkalmazás segítségével a támadások veszélyeinek csökkentésére", + "comparison-section-list-point-4a": "A SimpleX átjátszói nem veszélyeztethetik a végpontok közötti titkosítást. Ellenőrizze a biztonsági kódot a sávon kívüli csatorna elleni támadások veszélyeinek csökkentésére", + "comparison-section-list-point-4": "Ha az üzemeltetett kiszolgálók veszélybe kerülnek. Ellenőrizze a biztonsági kódot a Signal vagy más biztonságos üzenetküldő alkalmazás segítségével a támadások veszélyeinek csökkentésére", "comparison-section-list-point-5": "Nem védi a felhasználók metaadatait", "comparison-section-list-point-6": "Bár a P2P elosztott, de nem föderált — egyetlen hálózatként működnek", "comparison-section-list-point-7": "A P2P-hálózatoknak vagy van egy központi hitelesítője, vagy az egész hálózat kompromittálódhat", "see-here": "tekintse meg itt", - "guide-dropdown-1": "Gyors indítás", + "guide-dropdown-1": "Gyorsindítás", "guide-dropdown-2": "Üzenetek küldése", "guide-dropdown-3": "Titkos csoportok", "guide-dropdown-4": "Csevegési profilok", @@ -209,7 +209,7 @@ "docs-dropdown-1": "SimpleX hálózat", "docs-dropdown-2": "Android fájlok elérése", "docs-dropdown-3": "Hozzáférés a csevegési adatbázishoz", - "docs-dropdown-8": "SimpleX csoportjegyzék", + "docs-dropdown-8": "SimpleX-csoportjegyzék", "docs-dropdown-9": "Letöltések", "f-droid-page-simplex-chat-repo-section-text": "Ha hozzá szeretné adni az F-Droid klienséhez, olvassa be a QR-kódot, vagy használja ezt a webcímet:", "signing-key-fingerprint": "Az aláírókulcs ujjlenyomata (SHA-256)", @@ -219,8 +219,8 @@ "f-droid-page-f-droid-org-repo-section-text": "A SimpleX Chat és az F-Droid-tároló különböző kulcsokkal írják alá az összeállításokat. A váltáshoz exportálja a csevegési adatbázist és telepítse újra az alkalmazást.", "jobs": "Csatlakozzon a csapathoz", "please-enable-javascript": "Engedélyezze a JavaScriptet a QR-kód megjelenítéséhez.", - "please-use-link-in-mobile-app": "Használja a mobilalkalmazásban található hivatkozást", - "contact-hero-header": "Kapott egy meghívót a SimpleX Chaten való beszélgetéshez", + "please-use-link-in-mobile-app": "Használja a hivatkozást a SimpleX Chat alkalmazásban", + "contact-hero-header": "Meghívót kapott a SimpleX Chaten való beszélgetéshez", "invitation-hero-header": "Kapott egy egyszer használható meghívót a SimpleX Chaten való beszélgetéshez", "simplex-network-overlay-card-1-li-4": "A P2P-megvalósításokat egyes internetszolgáltatók blokkolhatják (mint például a BitTorrent). A SimpleX átvitel-független — a szabványos webes protokollokon, például WebSocketsen keresztül is működik.", "simplex-private-card-4-point-2": "A SimpleX, Tor hálózaton keresztüli használatához telepítse az Orbot alkalmazást és engedélyezze a SOCKS5 proxyt (vagy a VPN-t az iOS-ban).", @@ -266,7 +266,7 @@ "index-security-review-2024-title": "Biztonsági audit 2024", "index-security-audits-label": "Biztonsági
auditok", "index-publications-heise-title": "A Heise Online kiadványai", - "index-hero-h2": "Az Ön hálózatában", + "index-hero-h2": "A saját hálózatában", "index-testflight-title": "Nyilvános betekintés az iOS alkalmazás fejlesztésébe a TestFlighton", "index-f-droid-title": "SimpleX alkalmazás az F-Droidon keresztül", "index-publications-privacy-guides-title": "A Privacy Guides üzenetváltó ajánlásai", @@ -279,7 +279,7 @@ "index-messaging-cta": "Tudjon meg többet a SimpleX üzenetváltó alkalmazásról", "index-nextweb-h2": "Vegye birtokba
A jövő hálózatát", "index-nextweb-p1": "A SimpleX abból a meggyőződésből jött létre, hogy a profilok, a kapcsolatok és a közösségek a felhasználók tulajdonát kell, hogy képezzék.", - "index-nextweb-p2": "Egy decentralizált hálózat, amelyet senki sem birtokol, lehetővé teszi a kapcsolatok létrehozását és az ötleteket megosztását szabadon és biztonságosan a hálózaton.", + "index-nextweb-p2": "Egy decentralizált hálózat, amelyet senki sem birtokol, lehetővé teszi a kapcsolatok létrehozását és az ötletek megosztását szabadon és biztonságosan a hálózaton.", "index-token-h2": "Időtálló közösségek", "index-token-p1": "A jövőben közösségi utalványokkal támogathatja a kedvenc csoportjait.", "index-token-p2": "Az utalványokkal fizetni tudja a kiszolgálókat, hogy a közösségek szabadok és függetlenek maradhassanak.", @@ -292,12 +292,12 @@ "index-roadmap-2026-title": "Fenntartható közösségek és kiszolgálók", "index-roadmap-2026-desc": "Közösségi utalványok elindítása", "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Növelje közösségeit", - "index-roadmap-2027-desc": "Eszközök a közösségei népszerűsítéséhez", + "index-roadmap-2027-title": "Közösségek növelése", + "index-roadmap-2027-desc": "Eszközök biztosítása a közösségek népszerűsítéséhez", "index-directory-h2": "Csatlakozzon a SimpleX közösségekhez", "index-directory-p1": "Már emberek százezrei bíznak a SimpleXen való üzenetváltásban.", - "index-directory-p2": "Találja meg a kedvenc közösségeit a SimpleX csoportjegyzékében, vagy hozza létre a saját csoportját!", - "index-directory-cta": "SimpleX csoportjegyzék megtekintése", + "index-directory-p2": "Találja meg a kedvenc közösségeit a SimpleX-csoportjegyzékben vagy hozza létre a saját csoportját!", + "index-directory-cta": "SimpleX-csoportjegyzék megtekintése", "index-directory-users-group-title": "SimpleX felhasználók csoportja", "how-secure-comparison-title": "A végpontok közötti titkosítás összehasonlítása más üzenetváltó alkalmazásokkal", "how-secure-message-padding": "Tartalomkitöltés", @@ -315,13 +315,13 @@ "navbar-token": "Token", "navbar-old-site": "Régi oldal", "docs-dropdown-15": "Összeállítások ellenőrzése és reprodukálása", - "why-p2": "Senki sem követi nyomon a beszélgetéseit. Senki sem készít térképet az Ön kapcsolati hálójáról. A magánélet nem csak egy funkció, hanem egy életmód.", - "why-p3": "Amikor online vagyunk minden platform egy darabot kér tőlünk – nevet, telefonszámot, baráti kapcsolatokat. Elfogadtuk, hogy a kommunikáció ára az, hogy mások megtudják, hogy kivel beszélünk. Minden generáció, az emberek és a technológia is eddig így működött – telefon, e-mail, üzenetküldő programok, közösségi média. Úgy tűnt, ez az egyetlen lehetséges mód.", + "why-p2": "Senki sem követte nyomon a beszélgetéseit. Senki sem készített térképet arról, hogy merre járt. A magánélet nem csak egy funkció volt, hanem egy életmód.", + "why-p3": "Aztán felléptünk az internetre, és minden platform kért belőlünk egy darabot — nevet, telefonszámot, baráti kapcsolatokat. Elfogadtuk, hogy a kommunikáció ára az, hogy mások megtudják, hogy kivel beszélünk. Minden generáció, az emberek és a technológia is eddig így működött — telefon, e-mail, üzenetküldő programok, közösségi média. Úgy tűnt, ez az egyetlen lehetséges mód.", "why-p4": "De van egy másik lehetőség is. Egy hálózat, amelyben nincsenek telefonszámok. Nincsenek felhasználónevek. Nincsenek fiókok. Nincsenek semmiféle felhasználói azonosítók. Egy hálózat, amely összeköti az embereket és titkosított üzeneteket továbbít, anélkül, hogy tudná, ki csatlakozik hozzá.", - "why-p5": "Nem egy jobb zár mások ajtaján. Nem egy kedvesebb házmester, aki tiszteletben tartja az Ön magánéletét, de mégis nyilvántartást vezet minden látogatójáról. Ön itt nem csak egy vendég. Ön itt otthon van. Egyetlen „kíváncsiskodó” sem tekinthet bele a beszélgetéseibe, Ön itt szuverén.", + "why-p5": "Nem egy jobb zár mások ajtaján. Nem egy kedvesebb házmester, aki tiszteletben tartja az Ön magánéletét, de mégis nyilvántartást vezet minden látogatójáról. Ön itt nem csak egy vendég. Ön itt otthon van. Nincs az a hatalom, amely beléphetne ide — Ön itt szuverén.", "why-p6": "A beszélgetései Önhöz tartoznak, ahogy az internet megjelenése előtt is mindig így volt. A hálózat nem egy hely, amelyet meglátogat. Ez egy olyan hely, amelyet Ön hoz létre saját magának. És senki sem veheti el Öntől, függetlenül attól, hogy privát vagy nyilvános.", - "why-p7": "A legrégebbi emberi szabadság – beszélgetni az emberekkel anélkül, hogy mások megfigyelnének – olyan infrastruktúrán alapul, amely nem tudja elárulni.", - "why-p8": "Mert elpusztítottuk azt az erőt, amellyel megtudhatnánk, hogy Ön kicsoda. Hogy az Ön ereje soha ne kerülhessen mások kezébe.", + "why-p7": "A legrégebbi emberi szabadság — beszélgetni az emberekkel, anélkül, hogy mások megfigyelnének — olyan infrastruktúrán alapul, amely nem tudja elárulni.", + "why-p8": "Mert felszámoltuk a lehetőségét is annak, hogy megtudjuk, Ön kicsoda. Így az önrendelkezése soha nem kerülhet idegen kezekbe.", "why-tagline": "Legyen szabad a saját hálózatában.", "why-footer-link": "Miért készítjük", "why-p1": "Ön fiók nélkül született.", @@ -335,8 +335,8 @@ "file-title": "SimpleX fájlátvitel", "file-drop-text": "Húzzon ide", "file-drop-hint": "vagy", - "file-choose": "válasszon ki egy fájlt", - "file-max-size": "Legfeljebb 100 MB – a SimpleX Chat alkalmazás viszont 1 GB méretű fájlokat is támogat", + "file-choose": "Válasszon ki egy fájlt", + "file-max-size": "Legfeljebb 100 MB – a SimpleX Chat alkalmazás viszont 1 GB méretű fájlokat is támogat", "file-encrypting": "Titkosítás…", "file-uploading": "Feltöltés…", "file-cancel": "Mégse", @@ -347,7 +347,7 @@ "file-expiry": "A fájlok általában 48 óráig érhetők el.", "file-sec-1": "A fájl a böngészőben lett titkosítva – az útválasztók soha nem „látják” a fájl tartalmát, nevét és méretét.", "file-sec-2": "A titkosítási kulcs a hivatkozás kivonattöredékében található – soha nem kerül elküldésre semmilyen kiszolgálóra.", - "file-sec-3": "A nagyobb biztonság érdekében használja a SimpleX Chat alkalmazást.", + "file-sec-3": "A nagyobb biztonság érdekében használja a SimpleX Chat alkalmazást.", "file-retry": "Újra", "file-downloading": "Letöltés…", "file-decrypting": "Visszafejtés…", diff --git a/website/langs/it.json b/website/langs/it.json index c7f6679a74..ed8fe6c6c9 100644 --- a/website/langs/it.json +++ b/website/langs/it.json @@ -315,14 +315,14 @@ "navbar-token": "Token", "navbar-old-site": "Sito vecchio", "docs-dropdown-15": "Verifica e riproduci le build", - "why-p2": "Nessuno monitorava le tue conversazioni. Nessuno disegnava una mappa delle tue posizioni. La privacy non era mai una caratteristica, era uno stile di vita.", - "why-p3": "Poi ci siamo trasferiti online e ogni piattaforma ha chiesto un pezzo di noi: il nome, il numero, gli amici. Abbiamo accettato che il prezzo da pagare per comunicare con gli altri fosse quello di far sapere a qualcuno con chi parliamo. Ogni generazione, sia le persone che la tecnologia, ha funzionato così: telefono, email, messenger, social media. Sembrava l'unica via possibile.", + "why-p2": "Nessuno monitorava le tue conversazioni. Nessuno disegnava una mappa delle tue posizioni. La privacy non era mai stata una caratteristica, era uno stile di vita.", + "why-p3": "Poi ci siamo trasferiti online e ogni piattaforma ha chiesto un pezzo di noi: il nome, il numero, gli amici. Abbiamo accettato che il prezzo da pagare per comunicare con gli altri fosse quello di far sapere a qualcuno con chi parliamo. Ogni generazione, sia di persone che di tecnologia, ha funzionato così: telefono, email, messenger, social media. Sembrava l'unico modo possibile.", "why-p1": "Sei nato senza un account.", - "why-p4": "C'è un altro modo. Una rete senza numeri di telefono. Senza nomi utente. Senza account. Senza identificatori utente di alcun tipo. Una rete che connette le persone e trasferisce messaggi crittografati senza sapere chi è connesso.", + "why-p4": "C'è un'altra via. Una rete senza numeri di telefono. Senza nomi utente. Senza account. Senza identificatori utente di alcun tipo. Una rete che connette le persone e trasferisce messaggi crittografati senza sapere chi è connesso.", "why-p5": "Non una serratura migliore sulla porta di qualcun altro. Non un padrone di casa più gentile che rispetta la tua privacy, ma che continua a tenere traccia di tutti i visitatori. Non sei un ospite. Sei a casa tua. Nessun re può entrarvi: sei tu il sovrano.", - "why-p6": "Le tue conversazioni appartengono a te, come è sempre stato prima dell'avvento di Internet. La rete non è un luogo che visiti. È un luogo che crei e possiedi. E nessuno può portartelo via, sia che tu lo renda privato o pubblico.", + "why-p6": "Le tue conversazioni appartengono a te, come è sempre stato prima dell'avvento di internet. La rete non è un luogo che visiti. È un luogo che crei e possiedi. E nessuno può portartelo via, che tu lo renda privato o pubblico.", "why-p7": "La più antica libertà umana, parlare con un'altra persona senza essere osservati, si basa su un'infrastruttura che non può tradirla.", - "why-p8": "Perché abbiamo distrutto il potere di sapere chi sei. In modo che il tuo potere non possa mai essere sottratto.", + "why-p8": "Perché abbiamo distrutto il potere di sapere chi sei. In modo che il tuo potere non possa mai esserti sottratto.", "why-tagline": "Vivi libero nella tua rete.", "why-footer-link": "Perché lo stiamo costruendo", "file": "File", @@ -336,7 +336,7 @@ "file-drop-text": "Trascina un file qui", "file-drop-hint": "o", "file-choose": "Scegli file", - "file-max-size": "Max 100 MB - L'app SimpleX Chat supporta file fino a 1 GB", + "file-max-size": "Max 100 MB - L'app SimpleX Chat supporta file fino a 1 GB", "file-encrypting": "Crittografia…", "file-uploading": "Caricamento…", "file-cancel": "Annulla", @@ -347,7 +347,7 @@ "file-expiry": "I file sono generalmente disponibili per 48 ore.", "file-sec-1": "Il file è stato crittografato nel browser: gli instradatori di dati non vedono mai il contenuto, il nome o la dimensione del file.", "file-sec-2": "La chiave di crittografia è nel frammento hash del link, non viene mai inviata ad alcun server.", - "file-sec-3": "Per una migliore sicurezza, usa l'app SimpleX Chat.", + "file-sec-3": "Per una migliore sicurezza, usa l'app SimpleX Chat.", "file-retry": "Riprova", "file-downloading": "Scaricamento…", "file-decrypting": "Decifrazione…", diff --git a/website/langs/ja.json b/website/langs/ja.json index 2337ed472d..60d4ac08c3 100644 --- a/website/langs/ja.json +++ b/website/langs/ja.json @@ -296,5 +296,6 @@ "index-publications-heise-title": "Heise Online の記事", "index-publications-kuketz-title": "Mike Kuketzによるレビュー", "index-publications-optout-title": "OptOut ポッドキャストインタビュー", - "send-file": "ファイルを送信" + "send-file": "ファイルを送信", + "navbar-old-site": "旧サイト" } diff --git a/website/langs/pl.json b/website/langs/pl.json index 37582f80e3..fe57c711dc 100644 --- a/website/langs/pl.json +++ b/website/langs/pl.json @@ -336,7 +336,7 @@ "file-drop-text": "Przeciągnij i upuść plik tutaj", "file-drop-hint": "lub", "file-choose": "Wybierz plik", - "file-max-size": "Maksymalnie 100 MB - aplikacja SimpleX Chat obsługuje pliki o rozmiarze do 1 GB", + "file-max-size": "Maksymalnie 100 MB - aplikacja SimpleX Chat obsługuje pliki o rozmiarze do 1 GB", "file-encrypting": "Szyfrowanie…", "file-uploading": "Wysyłanie…", "file-cancel": "Anuluj", diff --git a/website/langs/zh_Hans.json b/website/langs/zh_Hans.json index e67df60a6d..47807f757b 100644 --- a/website/langs/zh_Hans.json +++ b/website/langs/zh_Hans.json @@ -332,7 +332,7 @@ "file-drop-text": "将文件拖放到此处", "file-drop-hint": "或", "file-choose": "选择文件", - "file-max-size": "最大支持 100 MB - SimpleX Chat 应用 支持最大 1 GB 的文件", + "file-max-size": "最大 100 MB - SimpleX Chat 应用 支持最大 1 GB 文件", "file-encrypting": "加密中……", "file-uploading": "正在上传…", "file-cancel": "取消", @@ -343,7 +343,7 @@ "file-expiry": "文件通常可保存 48 小时。", "file-sec-1": "您的文件已在浏览器中加密 - 数据路由器永远不会看到文件内容、名称或大小。", "file-sec-2": "加密密钥位于链接的哈希片段中——它永远不会发送到任何服务器。", - "file-sec-3": "为了获得更好的安全性,请使用SimpleX Chat应用程序。", + "file-sec-3": "为了获得更好的安全性,请使用SimpleX Chat应用程序。", "file-retry": "重试", "file-downloading": "正在下载…", "file-decrypting": "正在解密…", From 9b76d774a189fa0d596588c3ab73f53aa50eecab Mon Sep 17 00:00:00 2001 From: another-simple-pixel Date: Sun, 12 Apr 2026 01:34:28 +0300 Subject: [PATCH 016/152] website: replace dark images, roadmap (#6789) * Replace roadmap illustrations with clean versions, add CSS text labels * update label classes * dates * labels * labels 2 --------- Co-authored-by: Evgeny Poberezkin Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- website/langs/ar.json | 19 +++--- website/langs/cs.json | 19 +++--- website/langs/de.json | 19 +++--- website/langs/en.json | 19 +++--- website/langs/es.json | 19 +++--- website/langs/fr.json | 11 +++- website/langs/hu.json | 19 +++--- website/langs/id.json | 19 +++--- website/langs/it.json | 19 +++--- website/langs/ja.json | 19 +++--- website/langs/pl.json | 19 +++--- website/langs/pt_BR.json | 19 +++--- website/langs/ru.json | 19 +++--- website/langs/zh_Hans.json | 19 +++--- website/src/css/design3.css | 57 ++++++++++++++++++ .../img/design_3/section-3-desktop-light.webp | Bin 131714 -> 131184 bytes .../img/design_3/section-3-mobile-light.webp | Bin 154430 -> 153944 bytes .../img/design_3/section-5-desktop-light.webp | Bin 210490 -> 104366 bytes .../src/img/design_3/section-5-desktop.webp | Bin 206614 -> 103792 bytes .../img/design_3/section-5-mobile-light.webp | Bin 167638 -> 160510 bytes .../src/img/design_3/section-5-mobile.webp | Bin 164294 -> 156988 bytes website/src/index.html | 24 +++++--- 22 files changed, 212 insertions(+), 127 deletions(-) diff --git a/website/langs/ar.json b/website/langs/ar.json index 41825d0683..0124dfebb4 100644 --- a/website/langs/ar.json +++ b/website/langs/ar.json @@ -284,13 +284,14 @@ "index-token-p1": "ستدعم مجموعاتك المفضلة بقسائم المجتمع المستقبلية.", "index-token-p2": "ستدفع القسائم ثمن الخوادم، لتمكين مجتمعاتك من البقاء حرة ومستقلة.", "index-roadmap-h2": "خارطة طريق SimpleX للإنترنت المجاني", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "التوسع إلى مجتمعات كبيرة", - "index-roadmap-2025-desc": "الهروب من المنصات المركزية", - "index-roadmap-2026-title": "مجتمعات وخوادم مستدامة", - "index-roadmap-2026-desc": "إطلاق قسائم المجتمع", - "index-roadmap-2027-title": "اجعل مجتمعاتك تنمو", - "index-roadmap-2027-desc": "أدوات لتعزيز مجتمعاتك", + "index-roadmap-now": "الآن", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "التوسع إلى مجتمعات كبيرة", + "index-roadmap-1-desc": "الهروب من المنصات المركزية", + "index-roadmap-2-title": "مجتمعات وخوادم مستدامة", + "index-roadmap-2-desc": "إطلاق قسائم المجتمع", + "index-roadmap-3-title": "اجعل مجتمعاتك تنمو", + "index-roadmap-3-desc": "أدوات لتعزيز مجتمعاتك", "index-directory-h2": "انضم إلى مجتمعات SimpleX", "index-directory-p1": "مئات الآلاف من الأشخاص يثقون بالفعل في مُراسلة SimpleX.", "index-directory-p2": "ابحث عن مجتمعاتك في دليل SimpleX وأنشئ مجتمعك الخاص!", @@ -309,8 +310,8 @@ "messengers-comparison-section-list-point-4": "تطبيقات الأجهزة المتعددة تعرض أمن Double Ratchet بعد الاختراق للخطر", "messengers-comparison-section-list-point-5": "تبادل المفاتيح الثنائي اختياري عبر التحقق من رمز الأمان.", "messengers-comparison-section-list-point-6": "اتفاقية مفتاح ما بعد الكم \"متفرقة\" — فهي تحمي بعض خطوات ratchet فقط.", - "index-roadmap-2026": "2026", - "index-roadmap-2027": "2027", + "index-roadmap-2": "يونيو 2027", + "index-roadmap-3": "ديسمبر 2027", "navbar-token": "رمز", "index-token-cta": "تعرف على المزيد واحصل على NFT مجاني
للاختبار المبكر.", "navbar-old-site": "الموقع القديم", diff --git a/website/langs/cs.json b/website/langs/cs.json index e80873929a..41b026fb58 100644 --- a/website/langs/cs.json +++ b/website/langs/cs.json @@ -286,15 +286,16 @@ "index-token-p2": "Vouchery budou sloužit k úhradě provozu serverů, aby skupiny zůstaly svobodné a nezávislé.", "index-token-cta": "Zjistěte více a získejte bezplatnou vstupenku pro rané testování.", "index-roadmap-h2": "Plán SimpleX ke svobodnému internetu", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Škálování pro velké komunity", - "index-roadmap-2025-desc": "Odchod od centralizovaných platforem", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Udržitelné komunity a servery", - "index-roadmap-2026-desc": "Spuštění Skupinových Voucherů", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Pomozte své komunitě růst", - "index-roadmap-2027-desc": "Nástroje na podporu vašich komunit", + "index-roadmap-now": "Nyní", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Škálování pro velké komunity", + "index-roadmap-1-desc": "Odchod od centralizovaných platforem", + "index-roadmap-2": "Červen 2027", + "index-roadmap-2-title": "Udržitelné komunity a servery", + "index-roadmap-2-desc": "Spuštění Skupinových Voucherů", + "index-roadmap-3": "Prosinec 2027", + "index-roadmap-3-title": "Pomozte své komunitě růst", + "index-roadmap-3-desc": "Nástroje na podporu vašich komunit", "index-directory-h2": "Zapojte se do komunit SimpleX", "index-directory-p1": "Statisíce lidí už důvěřují komunikaci přes SimpleX.", "index-directory-p2": "Najděte své komunity v katalogu SimpleX a vytvořte si vlastní!", diff --git a/website/langs/de.json b/website/langs/de.json index 535fe2ae98..cc79255259 100644 --- a/website/langs/de.json +++ b/website/langs/de.json @@ -285,15 +285,16 @@ "index-token-p2": "Server werden mit Gutscheinen bezahlt, damit Ihre Communitys kostenlos und unabhängig bleiben können.", "index-token-cta": "Erfahren Sie mehr und sichern Sie sich einen kostenlosen Zugangspass, um es frühzeitig auszuprobieren.", "index-roadmap-h2": "SimpleX - Der Weg zum freien Internet", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Skalierung auf große Communitys", - "index-roadmap-2025-desc": "Ausstieg aus zentralisierten Plattformen", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Nachhaltige Communitys & Server", - "index-roadmap-2026-desc": "Einführung von Community-Gutscheinen", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Lassen Sie Ihre Communitys wachsen", - "index-roadmap-2027-desc": "Tools zur Förderung Ihrer Communitys", + "index-roadmap-now": "Jetzt", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Skalierung auf große Communitys", + "index-roadmap-1-desc": "Ausstieg aus zentralisierten Plattformen", + "index-roadmap-2": "Juni 2027", + "index-roadmap-2-title": "Nachhaltige Communitys & Server", + "index-roadmap-2-desc": "Einführung von Community-Gutscheinen", + "index-roadmap-3": "Dez 2027", + "index-roadmap-3-title": "Lassen Sie Ihre Communitys wachsen", + "index-roadmap-3-desc": "Tools zur Förderung Ihrer Communitys", "index-directory-h2": "Treten Sie SimpleX-Communitys bei", "index-directory-p1": "Hunderttausende Nutzer vertrauen bereits dem Messaging per SimpleX.", "index-directory-p2": "Finden Sie Communitys im SimpleX-Verzeichnis oder erstellen Sie Ihre Eigenen!", diff --git a/website/langs/en.json b/website/langs/en.json index aea1d057d4..a71ec01e59 100644 --- a/website/langs/en.json +++ b/website/langs/en.json @@ -287,15 +287,16 @@ "index-token-p2": "Vouchers will pay for servers, to let your communities stay free and independent.", "index-token-cta": "Learn more and get a free access pass for early testing.", "index-roadmap-h2": "SimpleX Roadmap to Free Internet", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Scale to Large Communities", - "index-roadmap-2025-desc": "Escaping centralized platforms", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Sustainable Communities & Servers", - "index-roadmap-2026-desc": "Launching Community Vouchers", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Make Your Communities Grow", - "index-roadmap-2027-desc": "Tools to promote your communities", + "index-roadmap-now": "Now", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Scale to Large Communities", + "index-roadmap-1-desc": "Escaping centralized platforms", + "index-roadmap-2": "H1'2027", + "index-roadmap-2-title": "Sustainable Communities & Servers", + "index-roadmap-2-desc": "Launching Community Vouchers", + "index-roadmap-3": "H2'2027", + "index-roadmap-3-title": "Make Your Communities Grow", + "index-roadmap-3-desc": "Tools to promote your communities", "index-directory-h2": "Join SimpleX Communities", "index-directory-p1": "Hundreds of thousands people already trust SimpleX messaging.", "index-directory-p2": "Find your communities in SimpleX directory and create your own!", diff --git a/website/langs/es.json b/website/langs/es.json index 5c708ef681..421cdbe9bd 100644 --- a/website/langs/es.json +++ b/website/langs/es.json @@ -285,15 +285,16 @@ "index-token-p2": "Los vales costearán los servidores para que tus comunidades sigan siendo libres e independientes.", "index-token-cta": "Descubre más y obtén acceso gratuito para participar en las pruebas iniciales.", "index-roadmap-h2": "Ruta SimpleX hacía el Internet Libre", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Escalar a Comunidades Grandes", - "index-roadmap-2025-desc": "Huir de plataformas centralizadas", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Comunidades y Servidores Sostenibles", - "index-roadmap-2026-desc": "Lanzamiento de Vales Comunitarios", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Haz Crecer Tus Comunidades", - "index-roadmap-2027-desc": "Herramientas para la promoción", + "index-roadmap-now": "Ahora", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Escalar a Comunidades Grandes", + "index-roadmap-1-desc": "Huir de plataformas centralizadas", + "index-roadmap-2": "Jun 2027", + "index-roadmap-2-title": "Comunidades y Servidores Sostenibles", + "index-roadmap-2-desc": "Lanzamiento de Vales Comunitarios", + "index-roadmap-3": "Dic 2027", + "index-roadmap-3-title": "Haz Crecer Tus Comunidades", + "index-roadmap-3-desc": "Herramientas para la promoción", "index-directory-h2": "Únete a las Comunidades SimpleX", "index-directory-p1": "Miles de personas confían ya en la mensajería SimpleX.", "index-directory-p2": "¡Encuentra comunidades en el directorio SimpleX y crea la tuya!", diff --git a/website/langs/fr.json b/website/langs/fr.json index b2551990fd..91ffa8e408 100644 --- a/website/langs/fr.json +++ b/website/langs/fr.json @@ -280,6 +280,15 @@ "index-token-h2": "Des communautés qui durent", "index-token-cta": "En savoir plus et obtenez votre NFT gratuit
pour les premiers tests.", "index-roadmap-h2": "Feuille de route de SimpleX vers un Internet libre", - "index-roadmap-2025": "2025", + "index-roadmap-now": "Maintenant", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Mise à l'échelle pour les grandes communautés", + "index-roadmap-1-desc": "Quitter les plateformes centralisées", + "index-roadmap-2": "Juin 2027", + "index-roadmap-2-title": "Communautés et serveurs durables", + "index-roadmap-2-desc": "Lancement des bons communautaires", + "index-roadmap-3": "Déc 2027", + "index-roadmap-3-title": "Faites grandir vos communautés", + "index-roadmap-3-desc": "Outils pour promouvoir vos communautés", "send-file": "Envoyer un fichier" } diff --git a/website/langs/hu.json b/website/langs/hu.json index 0e903d9fca..da5de1128d 100644 --- a/website/langs/hu.json +++ b/website/langs/hu.json @@ -285,15 +285,16 @@ "index-token-p2": "Az utalványokkal fizetni tudja a kiszolgálókat, hogy a közösségek szabadok és függetlenek maradhassanak.", "index-token-cta": "Tudjon meg többet, és szerezzen ingyenes NFT-t az előzetes tesztelésért.", "index-roadmap-h2": "A SimpleX ütemterve a szabad internethez", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Skálázódás nagy közösségekre", - "index-roadmap-2025-desc": "Központosított platformok elhagyása", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Fenntartható közösségek és kiszolgálók", - "index-roadmap-2026-desc": "Közösségi utalványok elindítása", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Közösségek növelése", - "index-roadmap-2027-desc": "Eszközök biztosítása a közösségek népszerűsítéséhez", + "index-roadmap-now": "Most", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Skálázódás nagy közösségekre", + "index-roadmap-1-desc": "Központosított platformok elhagyása", + "index-roadmap-2": "2027. jún.", + "index-roadmap-2-title": "Fenntartható közösségek és kiszolgálók", + "index-roadmap-2-desc": "Közösségi utalványok elindítása", + "index-roadmap-3": "2027. dec.", + "index-roadmap-3-title": "Közösségek növelése", + "index-roadmap-3-desc": "Eszközök biztosítása a közösségek népszerűsítéséhez", "index-directory-h2": "Csatlakozzon a SimpleX közösségekhez", "index-directory-p1": "Már emberek százezrei bíznak a SimpleXen való üzenetváltásban.", "index-directory-p2": "Találja meg a kedvenc közösségeit a SimpleX-csoportjegyzékben vagy hozza létre a saját csoportját!", diff --git a/website/langs/id.json b/website/langs/id.json index 614f5937c8..3768926f9d 100644 --- a/website/langs/id.json +++ b/website/langs/id.json @@ -285,15 +285,16 @@ "index-token-p2": "Voucher akan membayar server, agar komunitas Anda tetap bebas dan independen.", "index-token-cta": "Pelajari lebih lanjut tentang Voucher Komunitas", "index-roadmap-h2": "SimpleX Roadmap Menuju Internet Bebas", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Skala ke Komunitas Besar", - "index-roadmap-2025-desc": "Menghindari platform terpusat", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Komunitas & Server Berkelanjutan", - "index-roadmap-2026-desc": "Perilisan Voucher Komunitas", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Buat Komunitas Anda Meningkat", - "index-roadmap-2027-desc": "Alat untuk promosikan komunitas Anda", + "index-roadmap-now": "Sekarang", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Skala ke Komunitas Besar", + "index-roadmap-1-desc": "Menghindari platform terpusat", + "index-roadmap-2": "Jun 2027", + "index-roadmap-2-title": "Komunitas & Server Berkelanjutan", + "index-roadmap-2-desc": "Perilisan Voucher Komunitas", + "index-roadmap-3": "Des 2027", + "index-roadmap-3-title": "Buat Komunitas Anda Meningkat", + "index-roadmap-3-desc": "Alat untuk promosikan komunitas Anda", "index-directory-h2": "Gabung ke Komunitas SimpleX", "index-directory-p1": "Ratusan ribu orang sudah memercayai perpesanan SimpleX.", "index-directory-p2": "Temukan komunitas Anda di direktori SimpleX dan buat komunitas Anda sendiri!", diff --git a/website/langs/it.json b/website/langs/it.json index ed8fe6c6c9..0a6870d75d 100644 --- a/website/langs/it.json +++ b/website/langs/it.json @@ -285,15 +285,16 @@ "index-token-p2": "I buoni pagheranno i server, per consentire alle tue comunità di rimanere libere e indipendenti.", "index-token-cta": "Scopri di più e ricevi un pass di accesso gratuito per provarlo in anticipo.", "index-roadmap-h2": "Tabella di marcia per un internet libero", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Scalabilità per comunità numerose", - "index-roadmap-2025-desc": "Fuga da piattaforme centralizzate", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Comunità e server sostenibili", - "index-roadmap-2026-desc": "Pubblicazione di buoni comunitari", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Fare crescere le tue comunità", - "index-roadmap-2027-desc": "Strumenti per promuovere le tue comunità", + "index-roadmap-now": "Ora", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Scalabilità per comunità numerose", + "index-roadmap-1-desc": "Fuga da piattaforme centralizzate", + "index-roadmap-2": "Giu 2027", + "index-roadmap-2-title": "Comunità e server sostenibili", + "index-roadmap-2-desc": "Pubblicazione di buoni comunitari", + "index-roadmap-3": "Dic 2027", + "index-roadmap-3-title": "Fare crescere le tue comunità", + "index-roadmap-3-desc": "Strumenti per promuovere le tue comunità", "index-directory-h2": "Unisciti alle comunità di SimpleX", "index-directory-p1": "Centinaia di migliaia di persone si fidano già di SimpleX.", "index-directory-p2": "Trova le comunità nella directory di SimpleX e creane una tua!", diff --git a/website/langs/ja.json b/website/langs/ja.json index 60d4ac08c3..aff6d62c1a 100644 --- a/website/langs/ja.json +++ b/website/langs/ja.json @@ -277,15 +277,16 @@ "index-token-p1": "コミュニティバウチャーを通じて、お気に入りのグループをサポートできます。", "index-token-p2": "バウチャーはサーバー費用に充てられ、コミュニティが自由で独立した状態を保ち続けられるようにします。", "index-roadmap-h2": "自由なインターネットを目指す SimpleX ロードマップ", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "大規模コミュニティへの拡張", - "index-roadmap-2025-desc": "中央集権型プラットフォームからの脱却", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "サステナブルなコミュニティ&サーバ", - "index-roadmap-2026-desc": "コミュニティバウチャーの開始", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "コミュニティの成長", - "index-roadmap-2027-desc": "コミュニティを広げるツール", + "index-roadmap-now": "現在", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "大規模コミュニティへの拡張", + "index-roadmap-1-desc": "中央集権型プラットフォームからの脱却", + "index-roadmap-2": "2027年6月", + "index-roadmap-2-title": "サステナブルなコミュニティ&サーバ", + "index-roadmap-2-desc": "コミュニティバウチャーの開始", + "index-roadmap-3": "2027年12月", + "index-roadmap-3-title": "コミュニティの成長", + "index-roadmap-3-desc": "コミュニティを広げるツール", "index-directory-h2": "SimpleXコミュニティに参加する", "index-directory-p1": "既に何十万人もの人々がSimpleXメッセージングを信頼しています。", "index-directory-p2": "SimpleXディレクトリでコミュニティを見つけたり、あなた自身のコミュニティを作成しましょう!", diff --git a/website/langs/pl.json b/website/langs/pl.json index fe57c711dc..09062757b6 100644 --- a/website/langs/pl.json +++ b/website/langs/pl.json @@ -286,15 +286,16 @@ "index-token-p2": "Vouchery opłacą serwery, aby Twoje społeczności pozostały wolne i niezależne.", "index-token-cta": "Dowiedz się więcej i uzyskaj bezpłatną przepustkę umożliwiającą wczesne testowanie.", "index-roadmap-h2": "Plan Działania SimpleX dla Wolnego Internetu", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Wyskalowany dla Dużych Społeczności", - "index-roadmap-2025-desc": "Wymyka się scentralizowanym platformom", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Zrównoważone Społeczności i Serwery", - "index-roadmap-2026-desc": "Uruchomienie Voucherów Społeczności", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Spraw, aby Twoje społeczności Rosły", - "index-roadmap-2027-desc": "Narzędzia do promowania Twoich społeczności", + "index-roadmap-now": "Teraz", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Wyskalowany dla Dużych Społeczności", + "index-roadmap-1-desc": "Wymyka się scentralizowanym platformom", + "index-roadmap-2": "Cze 2027", + "index-roadmap-2-title": "Zrównoważone Społeczności i Serwery", + "index-roadmap-2-desc": "Uruchomienie Voucherów Społeczności", + "index-roadmap-3": "Gru 2027", + "index-roadmap-3-title": "Spraw, aby Twoje społeczności Rosły", + "index-roadmap-3-desc": "Narzędzia do promowania Twoich społeczności", "index-directory-h2": "Dołącz do Społeczności SimpleX", "index-directory-p1": "Setki tysięcy ludzi już ufają wiadomościom SimpleX.", "index-directory-p2": "Znajdź swoje społeczności w katalogu SimpleX i stwórz własne!", diff --git a/website/langs/pt_BR.json b/website/langs/pt_BR.json index a94670e443..0fdf72adf0 100644 --- a/website/langs/pt_BR.json +++ b/website/langs/pt_BR.json @@ -286,15 +286,16 @@ "index-token-p2": "Os vouchers pagarão pelos servidores, permitindo que suas comunidades continuem gratuitas e independentes.", "index-token-cta": "Saiba mais e pegue sua NFT gratuita
para testes antecipados.", "index-roadmap-h2": "Roteiro do SimpleX para uma Internet Livre", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Escala para Grandes Comunidades", - "index-roadmap-2025-desc": "Fugindo de plataformas centralizadas", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Comunidades e Servidores Sustentáveis", - "index-roadmap-2026-desc": "Lançamento dos Vouchers da Comunidade", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Faça Suas Comunidades Crescerem", - "index-roadmap-2027-desc": "Ferramentas para promover suas comunidades", + "index-roadmap-now": "Agora", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Escala para Grandes Comunidades", + "index-roadmap-1-desc": "Fugindo de plataformas centralizadas", + "index-roadmap-2": "Jun 2027", + "index-roadmap-2-title": "Comunidades e Servidores Sustentáveis", + "index-roadmap-2-desc": "Lançamento dos Vouchers da Comunidade", + "index-roadmap-3": "Dez 2027", + "index-roadmap-3-title": "Faça Suas Comunidades Crescerem", + "index-roadmap-3-desc": "Ferramentas para promover suas comunidades", "index-directory-h2": "Participe das Comunidades SimpleX", "index-directory-p1": "Centenas de milhares de pessoas já confiam no SimpleX Messaging.", "index-directory-p2": "Encontre suas comunidades no diretório SimpleX e crie a sua própria!", diff --git a/website/langs/ru.json b/website/langs/ru.json index 235492291f..656c751636 100644 --- a/website/langs/ru.json +++ b/website/langs/ru.json @@ -285,15 +285,16 @@ "index-token-p2": "Ваучеры будут использоваться для оплаты за серверы, чтобы группы оставались свободными и независимыми.", "index-token-cta": "Узнайте больше и возьмите бесплатный пропуск, чтобы участвовать в тестировании.", "index-roadmap-h2": "Путь Сети SimpleX к Свободному Интернету", - "index-roadmap-2025": "2025", - "index-roadmap-2025-title": "Большие каналы и группы", - "index-roadmap-2025-desc": "Чтобы Вы могли покинуть централизованные платформы", - "index-roadmap-2026": "2026", - "index-roadmap-2026-title": "Самодостаточные группы и серверы", - "index-roadmap-2026-desc": "Запуск Ваучеров Групп", - "index-roadmap-2027": "2027", - "index-roadmap-2027-title": "Поддержка роста Ваших групп", - "index-roadmap-2027-desc": "Инструменты для продвижения групп", + "index-roadmap-now": "Сейчас", + "index-roadmap-1": "2026", + "index-roadmap-1-title": "Большие каналы и группы", + "index-roadmap-1-desc": "Чтобы Вы могли покинуть централизованные платформы", + "index-roadmap-2": "Июнь 2027", + "index-roadmap-2-title": "Самодостаточные группы и серверы", + "index-roadmap-2-desc": "Запуск Ваучеров Групп", + "index-roadmap-3": "Дек 2027", + "index-roadmap-3-title": "Поддержка роста Ваших групп", + "index-roadmap-3-desc": "Инструменты для продвижения групп", "index-directory-h2": "Вступайте в Группы SimpleX", "index-directory-p1": "Сотни тысяч людей уже доверяют мессенджеру SimpleX.", "index-directory-p2": "Найдите группы по душе в каталоге SimpleX и создайте свои!", diff --git a/website/langs/zh_Hans.json b/website/langs/zh_Hans.json index 47807f757b..b5079ac5f4 100644 --- a/website/langs/zh_Hans.json +++ b/website/langs/zh_Hans.json @@ -286,12 +286,12 @@ "index-token-p2": "代金券将用于支付服务器费用,让您的社区保持自由和独立。", "index-token-cta": "了解更多信息并获取免费抢先体验券,参与早期测试。", "index-roadmap-h2": "SimpleX 通往自由互联网的路线图", - "index-roadmap-2025-title": "扩展到大型社区", - "index-roadmap-2025-desc": "逃离中心化平台", - "index-roadmap-2026-title": "可持续社区与服务器", - "index-roadmap-2026-desc": "推出社区代金券", - "index-roadmap-2027-title": "促进社区发展", - "index-roadmap-2027-desc": "用于推广社区的工具", + "index-roadmap-1-title": "扩展到大型社区", + "index-roadmap-1-desc": "逃离中心化平台", + "index-roadmap-2-title": "可持续社区与服务器", + "index-roadmap-2-desc": "推出社区代金券", + "index-roadmap-3-title": "促进社区发展", + "index-roadmap-3-desc": "用于推广社区的工具", "index-directory-h2": "加入 SimpleX 社区", "index-directory-p1": "已有数十万人信赖 SimpleX 即时通讯服务。", "index-directory-p2": "在 SimpleX 目录中找到您的社区并创建您自己的社区!", @@ -365,8 +365,9 @@ "file-proto-p-4": "文件被分割成多个片段后,会通过独立运营商运营的网络路由器进行传输。任何运营商都无法看到文件的实际大小或名称。即使路由器遭到入侵,也只能看到固定大小的加密片段。网络路由器会将文件片段缓存约48小时。", "file-proto-spec": "阅读 XFTP 协议规范 →", "navbar-token": "Token 令牌", - "index-roadmap-2025": "2025", - "index-roadmap-2026": "2026", - "index-roadmap-2027": "2027", + "index-roadmap-now": "现在", + "index-roadmap-1": "2026", + "index-roadmap-2": "2027年6月", + "index-roadmap-3": "2027年12月", "send-file": "发送文件" } diff --git a/website/src/css/design3.css b/website/src/css/design3.css index d2d9b65aac..ba81d6da4a 100644 --- a/website/src/css/design3.css +++ b/website/src/css/design3.css @@ -671,6 +671,40 @@ main .section-bg { background-repeat: no-repeat; } +/* --- Roadmap year labels (CSS text over clean illustration) --- */ +.page-5 .area { + position: relative; +} + +.roadmap-labels { + position: absolute; + inset: 0; + pointer-events: none; + z-index: 2; +} + +.roadmap-label { + position: absolute; + font-family: 'Manrope', sans-serif; + font-weight: 300; + white-space: nowrap; + font-size: calc(var(--sec-vwu) * 1.5); + color: #333333; + /* Isometric projection: rotate then skew */ + transform: rotate(-30deg) skewX(30.6deg); + transform-origin: 0 0; +} + +.dark .roadmap-label { + color: #ffffff; +} + +.roadmap-label-now { left: 46.54%; top: 88.16%; } +.roadmap-label-1 { left: 59.5%; top: 75.0%; } +.roadmap-label-2 { left: 72.5%; top: 61.8%; } +.roadmap-label-3 { left: 85.5%; top: 48.5%; } + + .dark .page-5 { background-image: url("/img/design_3/section-5-desktop.webp"); } @@ -751,6 +785,29 @@ main .section-bg { .dark .page-5 { background-image: url("/img/design_3/section-5-mobile.webp"); } + + /* --- Mobile roadmap labels --- */ + .roadmap-label { + transform: none; + transform-origin: center center; + font-size: calc(var(--sec-vwu) * 3.97); + font-weight: 300; + color: #009df7; + background: #fff; + padding: calc(var(--sec-vwu) * 0.2) calc(var(--sec-vwu) * 1.0); + border-radius: calc(var(--sec-vwu) * 0.8); + } + + .dark .roadmap-label { + color: #fff; + } + + .dark .roadmap-label { background: rgba(30, 58, 112, 0.85); } + + .roadmap-label-now { display: none; } + .roadmap-label-1 { left: 75.36%; top: 45.8%; } + .roadmap-label-2 { left: 7.6%; top: 34.9%; } + .roadmap-label-3 { left: 75.36%; top: 24.54%; } } .page .text-container { diff --git a/website/src/img/design_3/section-3-desktop-light.webp b/website/src/img/design_3/section-3-desktop-light.webp index b77bb2cea85082899095b245f52d592d74668ff0..10f0bb5ade803c09a34af7bed54c0e9b3aa78815 100644 GIT binary patch literal 131184 zcmeEtWmg=}6YlJ?NFZ3S1cwL?A-FFVLU4CYaCe6Ve!v0=ga9G<;%>p60Kwhe-QAbH z{O`xO=f0S8=A7x7s_w3Os`{xKRoRapEdel~B`u+>sm!m94FCYa(-rU>z{CW^<&{4% z!~p;Z#qj3S3Chz(D*H$_V!r14o8wlGvBqKeZvZ7!n}qJ3K2V#vVmrMDcH4%uit^ar zlgahoCm$LIml`xQW@k%1BT+-FO# zJ07+V1YFF`k=zucsAtARvo*0OF>C_hk;`Dusv-!i3)%R-6QKIjZr)DM;1eEk32>oc zNdOeVtQffjRH>756Sfp9iu#)aCQ-U}=~IDDrKC@(#V)r_W(MY>T08hXWqZ(^3Eb z_W#9o2#}DXqg#!k+adr-v8aP#dm^EO4_1dY=}WIh=%0^32x5H02?03qJG!%5ojl8w z+w*l80K=D3&hK0s_uxzy2=EBJMh{VBz3P+p=Crd{0Ftz@QyGz0WBp8D)_$PM$y2HK z#ZD^lHgRH%w*DSl_$01=$B4|?wIzJQ)zUhGxm(PMikpYkQS?zefU?i|J=v0aq? zDN5eo&y$DnGSb)ma#m&pn7)c%99K=G&y&^wbX-;ye63Mo8N^X5 z(z?foWM2S6+>qD4-+uWXh>M#%OU~9IsxOz!z=9AKS;S)3N$9b@^-menMBi(-0oy=K%3aGd=yuRR_P*&xfr_gd2aJp7&g;M zkKH`&_7ulA=z-we?k%4L4$X;WTFH-u#xT+kw5CLM*R@?RVtNFo-ObRp6Qi*4iMtSe zbd#PZEKKb%TzLL9FruDRcSbbnJa>IS>Udpd?K#x-o4X`aapA6@dt@mZ7svHp>ubm$ zr^P)Qo#QD-T>_rttqA)gY*i8F(M5I%?KCs$rJOZalErEHu_vgkofx0fE z3_(Zrih%>EDw3OjP%?tOm1W%x$2k0}j6J9{w?(bJZym-%cjoN(b4$+TU#F_}O7A{y z^W&dg%s7(y;q1uQieX!>MLE<CwS**jy!9{y}tXG?%G)iI29z|yLO!$?4u87 zNj_rOUy5a`Jrcv}Mt!29yeJoTYd^Wldm$HgrIFIzDT|aZRz#J2qK5>y@aT`ulMFqS zXGa}lISR{hT}MzD4Sie(attEW>=zxw{DtiH7lyJPs=d_!yuWF!aW^~Qc_4hgY1^4{ z(h?fn|B!FAn|)jpcK>kYIuQ_BHym4=I+^U4ZbUz;VorE1yGE_h3*odm?m^C5- zI;+#L2#}RoI))hRH*${~#!D<pPvw zb?am#nMT4}jDO5ELA0ee!X;I-vz%X#EZ;e9F5B9aa?Q+(5!fTq(r5O8QUz9QKGf-# zvBRUHP{%_K@{8&g#hQwP!E0+qh;bxOy}O&|Ct7UGm)sja*cKCY@jeqy2SEQlE4bpS zC85n^d1H)p_;9efjESbQ(`GntyU}^03=lBs13_Ihf5P>Q)B_Eb_wr(< zizF=U*V;aMp_8e5gxGMzNf1Z`Uwf_~T!rz$xS%#lTeC}RQiZ?W+DLCAol4oV9rkXY zt7Q8E=D1TWK?s2SuJi`}$#OD2&wvvuua($no+*4`l*Sf7kb)r4SPr%?8hikOcm_^2 zUVu(}!Cw=`CXaarP{@`-OO{_)Kx)WDB+N&vU@IxE#cg|TxbDjB&kg;T+} zkpYF=jc6&}{H@m6G-eFpJ*n#(kg8;J2ycJKYh+zIEUA3c`Qxa2;NlH-&P%SVDz7w_ z6tMDnzw0uxrdAmT+N~ivC-mOen~sb?UAy;@n9R@?=I6l}QqSvGRPHu*1QXv}{}XRvd>;J4yekcowF!;2 z{pr&$*}}?=M&P%+KQ5-7aZhMjI8TFrTS$Q0=Z-PxjJ<#I!~WF>>wM)l_UOnUV|V3h zh~@La zlsX;Sts8_ z&iEQf@B~6ae`_#?{CL>iNc+upWFMZXt!^|7}oG>JDR!80>Z#<3nHP8;r4GG11$Sube z`R=R^G9s&4Rmu9lGWfNwZA~bhKOIHOv`sf;Jn8pK!P$rsyiHn@k!SyGgf;AcUtmgO zv+Ynt$ktd46Hl2uJtpbE*)JEP7C(3Gz+N3uujRlCba9i!nJ@1&4iE-!@20W+CrPx} z!VekZD3(z7_nuyM}NL?h}OGSFMk)GxPZF0D6K!o@gv7 zT2#7Sh7vLT>F%GayY9r{NZi#LEyOQWcMWGxqjzCILh-{%`g<}F`ZJV%`gb{X{*H_} zu)1L91HQ}XdB6i6hSX*v=eyJ0v1duvXn~cx|B&oHeN)zpnO^aZz*(#A`|7eZD|WE3 zl*5w!p1n+G?8wovU-Q1Hq2^Y_vgke$78LPJO8u;Lg8fcvHKp-08kWuuiK0vGy47H! z(AbX2m6%@;fF*p9)`JoddPxv(aTTvdxo03eD%8JtI`JqNb33>&p^S!LlKSBg2wy`P z6e$rae&<|&K{98#XTbeWh$5nHkr2^0!Rmb($$V1rfU1lH$@w;Thf3z4Gsdr`j#uj+ zz@ex~?e+_b^M|kJun#k;3(HX0g zG!rj;U+thUnX5)8$Sr?wmPEnohC!c8GDD6IGJ+o*h>Z0!<4ey-J~Us_BEs)e5FAzo zRsnpEMtR>lwWy)$e`*^*;Olya4IP}s3$JGns6I(eOBN%6MLmNRW-WC|tG^7GGN|Lq zOy7IS3wIelL8`G5xc+%3iU)L@|M=-c^U{z()CYgDlDqCZREKN0#8Nj^Jo=^m*!^|G za7<#=k&s#hD*caGYh-SVlUkX6VttgT?WU*&KO1rlhNZL-@Do^n(U_Ib7(ty|rq?i3 z;QDW_XSvaf9_2t;P7q#J{;r|c*>`HvE~@6|uk<@VVc;(+T{HU0rj^MWcBn3H8SGs! zwsdH`?k8V9(CGFm`RZ2K+Y}xruQyH<9y#|NWrBXIz{w}e!LvKm^NY9aldDPbpnPK^{1#Nz37r3X*Q|@i?zBCg z#vw`;j$&YO(F&UbAHEoDKV^3+q^@CdmeUI9K|R-Sg@eDzsZ;I@HWpZIn4fRdxCgurnu&MsDjJUfory_?gnaUKmmE(k*jkmp<^$$7 zXUM&f;fxQ%J^ftO%emp#jekeqjb3@wKBi{~UeA4+H>DVGrGLJ5^bwXxb{PH2NDF-f z6^tz?MMq;fA86j9L&NTXZYeM0xfZPa5TGrckUtQy7xh77sq2p20cbjW-V?kS{OEy| z_dghmcy0FD{dYtYmtgzmclQCNA2{=#^ym%bf>NLt=@F6(6Dq*O0OzavmK?>-)bF%M zDK0CEiIXUr{69YoD#`DjO$=`*MtK-M3yGZX9;bqMS$k&}8XK8B0om5m3ZhZ{v&2L? z`A|U@=6vPCZkHv+(Ob!JIKFX)E7`nOpX4g_8|3gjoCWHt4OY2(j+4l4_I$0sy-Kh= z6xrK*MhjM-QwZ?W(VvsDbEK9>BHB@qO`I2RQeVz)M-sG+LBZy@kTcPP4! zzILywxMFS>imxlh;ZFm=`Jy6uX2}2@fLJE)iydr?ZLPY>w5OmcuojPv1e7i|dAUh< z(|@GL%Nh!@^4EYq^4xney|%Nl3vA&--uNf*cI>DVVTjX`(tqSx?nSJ&rh*9hM?U(m zRVKY8eBF!%5Jtvwe9BeCL!*sEGM0tQC67jh><$C;Q!juCx=xFniD)p znBowM#HYi${rUL7u0PkZW$an^viPF@x%aglki=!RUDBLD{6ekJbTY|pZ=ygg>$7if zzOj$zXHJYw($TW8hU!J8v%)+) z*wW7AhkxZ1D<+rq`xal)-Cf3amD)%VmkA_sX_UPFir)MvSBGX*?${@qQDaG;Msj@q z=;5<-SRByezx~&drRaCQ-2Ln1$L4nvez;%*}CxH4{zOx8EkEhkyJA`MAe!6 zW=KM}1jv^}YtOjZIFB`IdFL>P-c_cVJsjY?`{l?=*Y#HS9@b~tbu~NSyJaBechX8V zUyC|F9zx-z*YC#oZ)UB+c8XPCdlpvld`S(ZgoMB(nS}s_`yXt9BO*K(R*)VFz9)fq z8%cd^aCJNJx5VaG)H57x?B{sVOj<>Y zh_=&ZYv}a9_dNo;Kh4nkqLeReyEmY(WR%qN)4e)!eljZU~w&65>{9C z?1nZn$|FhxLU}%D(tR3tmo!&!PI0Sf&98q82Js5~JI#Pd~E7attA&(E);Bi<&V<>1E(I@7Zpv z`o>-u0PV!itksq@_o^#pYxow$&(+TCy?MJ)zV(R|Jm`AAj(evY+^~7fy)Y?8oXakF z5f{OwL7Xg$~w=`-I3Bo8=Q+FP3%_;mC`cN{V-X}(AnOZ z1VCq_j~RRB%SbCjD<+l|J_*LGYqi=q>IuavGL13on#T%EH@O3f41IzZ(qZpZ{CsrY zGX8thbs5lDM5}c5tQtrx*fDCBoe*p#N2{%N7-eDz)&BQG_=DYpjsuk|B^qwh&ecC1 z`QcWp8$C=TgiE2K_RKELw^t58sAH%+o+(r24 zf?+ahuC=-#{A|xv>)&6jeo8(i=9vMLm#42cgImWP7drr2Z~*?xv*-wY-}G4sp~LaJ z+kL+|D+37|#D(tN`PaH!62OdIsDM}V^wp)81F#w8wfYJ1#VSe8IiQJ09f@S0%nR*o zBS&ZCxk`$7#wC}G<2I$1Se|${8T8I)XPTofZ*({#c&N~Zq@P$H;Qn;oe#IP>qr=<# zbiRnbRlCU6Q)f_M!f)QPpa-}Co~>-=9vmf^-;666l>^%x(dqJ;M%%6)8sl_-Ws%e- zgnv{o(ZOQbe6bCnHAV~y?$N_&nF|hodJMW?Jmu8;FJH9nx9ymn$6uQ!DHc@C;kd!h zHVsDMP(4`&Bq{5k9a8D8Sh&(Pwo>~^_XQI zuKxGB_Rb0Bm8kjq%XM~3K=}7Yep+?JUKlZ1f2LEE2mgYJaE=}p_u#vFv88~x)5_R< z(OZenzHT)Vhv!7wSnLWd1)wEjsw5lLk1+ru+<^e8_-pdzaWRHgC4JB@*NN5+Z1kYB zMq)MuQrw|+MLy|kjIc6@vvuG5PJE>!tUz&j<~ixIRbIrx9I5#?ek)n6Pmgq^=78lf ze_^p!3DlL&#&sFfSSob-MW0{=Ub{a4M`n{L=Y+!J4+`nKLlD*OX0POyY)5cmJjCka}jS;bW5DATYZ|$ka=NMPj-(EwoI1X z8gvz?T+*oy)Bae1+$d2U9?A3R7hlmJjE5UM*~EZ@`RPTV9rwZr$emdPr4iGAe5pG5 z*l+bOK^JP|`?@zEqArQae@cZ4J0wI@YUuFC2E`CQ1n5m?!#}k(O8NVmV4OQKUGg%+ zLeiv?(;-EZ^DvV9BRvL{c}g}9Due0dS?@(!srg-wKp_JyY0$M|vlC2oXlILx5UBRw z<*50feN8peNqa|T;4t3l>lD6MHO1}s}zk7hIkVKZ?~3n(ajlr%$~)~ zQU3IuoE(r4+*NZbpITzrIsY%>#C@Mgz5v(q>a@z9Zsdtlq+S)BnZ#dbr^QsS=5IbX0XVzcp&!4M8sy3~xBKH?NA1vZgGqeq>KN;ZtDvS#}iu zrl?IZY^Mb+i5xOCDY8!iq6Hd?vsbUE%N^`)L`iN9Y|vqv7M9;d0(JX;p7Tgwa$ZU< z4ye!UXDh0g|LT&l?E1FtdW-9C?#>w2IY-pmVx8Lng}tH^p3#;N5P#A!e3`QZ+5tI$h+MYp>>?{XhP+La}w0QMHOE!lq<9wjDB zRqQ?mO^NG&vvc16s6>vDd)!Gp?;};H9uS)Vx#Wdc0xA2WbLFj(b zo3baGYhQzV0hx~x_VR8(9KAQ>@>HsZB!$gr6^A)CAm9W>b_-ggl6eB0OqXn5j+Q7&nBgl!1YgWLZ6t9^l?k;xAe;Q5v;F`Nhm9VDp z1`qxi{{|DJjkuo@qKEd(sBu5!W2^uW*bXe$MPs9-<)6&rl~6~V(_27(m{X7%FK$r@ z$yk@{rkrJ*v2J;0Q~h1}3ZFcHk@td))@UaUbA&hit9O$Y3=zhzl6tEp$3NVL`Pi%R z-r`F~gxEs$f9TZ!Vn>mj<{6|*HJ~Y_Kar1We2f66z^lu4LEz!=R7q@(|J_NN0k@(R zx(}5(thXT?0Q1FcSYQ*L7O&EiQ@yK_=uW0=A^&jvF5m7Hq1vQkw8w1fZPvz>k|AME+MXaNW=(0b)D z!(jDqyo!SqjVT|d2+92?h@-BSLYU9e6`jiNXkxc;XB6+8ig*?HNmlyz<;7==@E&M zHarV!9$!gC23bo>5RcFw`-#l=RHMbpP}cQLN|w5LDt8LMxUYR#z)9s157nFzL$8Pu z_jfRXa)Weh*&jR_Ge)lik50t+LqxWRqe9n zi_QXXIHo7Q554hXRu6M;%x`Tpe@v((LnTYE_jC2P(P<^RXqhzIW$~)Cvh^UJe>4|N zmn1RCdHsit*1$481!S9rD$CG9*R5sx_7qF!Zj~Q9opHmC_tT!ytaFd8`Ze8fuqSq=%A85 zfmUkynpZG6pa_ki;@eL1yW~YT8PN}ltkk5>pi;I{5G+xJ54Ev{rsTaGCz z9;i{h8<<~?4o0Jv`MG#UMh%^o27dO43>(Z*po%w9hX5O z^V1UuvY7%P-!0^;CX+@R>ree6F97lBAIA40GJM#VvVcWZ(dTW#dk(cua={IHRB~7Q z8ReRXV$px{hA$RB0gS3mo)wOstl;_7A2MgHP?Dp5y2M$XjDm0I^h0vY&-o>Ant3Vf z#55`(M^=$+^}F(lV(3M7t{t&@lFF!v;j{?>@!OC$Mlh3!;Wq*t%G(pt!dMLs7$w{u z_QC{@6qf}W`eSea8YZoS_tl?G`{+g=U$GjkyiKd%FjZnbvO)9X%Q*25MbD%tlfzUx z0Onn-aja-AFMaspL-zDAGF2q+sjM_M*z^8(y;yIEf*Q`)tEE~rif)9Zb5{*KX2 zbF*i!d;F+XM6IP?2&t_imm&h*b}hQUnC>FMq&4M{``&^T474SS&Jk}Cm}>1C2IfgR z%l^Ru279Higv4zW5od07c_e`i?M;w8M++}p0KAV}vV1%7FZzBBGRtSPxCy}LI|Ao1|`jV<2 zUteE!HIM)zB;$qexlBCb;b8}xkqKE;F{qMM^)M`h*C2ZqvGNp)Tvv6>U71aFBq86<(ZM@a^p5LbZmihTQRVPfOsykW4 zU=}I`>-MiLs>bg)yQgpxFE7RP6C65v0|i*=d)1`Rw6Bz0il{Jy%AB&@5mt9jR<_{ZNGBRS6O zqwn({PAxiXkkFrB?`S=%cL=GBoHb1lR;`ZyA|4g|OMGWg}C%wK)uFnUsn!IS!IA12{1L{m-&QMPy6;#K=|E zvh0Tpv?in{xvXJf8Ih9|%}A8k#LAo|pnmsm_U>q?5bVR|GY`ApfA~ZrX6G}kCWdC1 zpd(0K0=9H)A%7oNlOhDBXSbVR)3nfDFtP*SC5R3?G@=%3kMF~Kio}<{fQ*2hx;)B@ zHAmPxt;2BNm+TH`cT_ch>^jh|=)o%mU&noEOdWDOVmB7?PRzm;1dqN2V^KP^eVn`8 z&183geg5*ZWN+_AwcNmEQT$1 zhNeP?j~fx|qgx->h;^_5;-}&29(_oNN~I=nQcXne#qK~%ugY{?sY#|1cww%Gt6~Bmtf6uDWiFK zr2cOS(k_%Io6Q;mpP}eVeA8IP2738R7TI{xjEC#K*W)%xDZfCSEXTGAmO%s@7_rRE z;d(c+e3*Vya=`R})ZY^$BFbk$m8=ZL1V-iH*ol@E-BXN8g{_cX-OZn>#5h9WH&evE zB&L$5t*Qb-5Ez_E*)}mqe{8DYTa^&IOTfBS$o2UHliz0z{w`91+!+iZlF8<L0IvR(Xg=4{BE%OBfeiU0Ajf@K7NA<&A z>H~k8DX#1KK@rgnCN1l+nJbLJib?ANsg|agcRplles`~K%#Kr;o&60`;V${HRzAJ> z^@E_K7KcCIUhx1<#3tSHr)K4NU>{bIbBxLTy}wH9OYc|eqv=-|lP%^Ak1CH`U_QUh zlNfA{MZiE(ES9KMP;mm-IEzzh86kMv{0W{8d?(Fg>Ddo%Pm!XyUw_Fb*hX}(@Y7`_ z9N-^W_Dv8Wai4RdnH12|Yj16IP>U&=Ygm@(EtpoQs34}aS{6<>V8W~T-nBgHc&!$A za^0iSts$STG5orsdh06TzF3Y5vHOjc$QKu&kIK@i8P4tC&9X4eTR-W>DcrDs>~3LVWLc91r8yBNQW+nk<;ag1Px?)bQdFek4(1AR>h znXSVs{bP)!0De9rK5}per9%9=X#FC1ie~JbVDgn5#or`7yJ7VoVL})kOEl%phDRPS zI2pdzkIcr|v0cmbTl!-hZ4|QKvM#F@FqOsH3xG4gd}ft(owOJ^naTbH5LD2EJ}a~ou9aMW27%|(tX*8d3#UL} z{G7X;AsrT|+l>vEl>gTYA;0&;-h}a#f4!N3ud3k2s3k`>SYkb73`3j<)2x`N2~6jnvjs1E4knIRHuqK#=npB zwpAZxqF(7@&>Vf?IkXEYxxh;g(pEXOA}dgQKu}JYz6OJooisBe_&&ytvdti1EJh@E|f+XjxlYu3K$8d%CN`nnEFOHKsPm z1T|WguK6QHbM})hI49swqTgl)nbWe1?lk!2s%0iBdwRL%IibNoQEfrXr57db73Rbv zv*f=lju7TfUS-q35?dym+7?a=SGK^IDD(HtVuK&zkf^NHpQMhVV8l8($?b86pb&1r z_{Xg{m`{2o#_JUMe?p=+pINhe@8kCB~=ib0@QHM4q+K6XM!~$0r??q64Z~YWs$#Z>VR~nsHQT$)9#hGjr z$FDFw$>>yWeLori-lyYkltYg?GNl0%-|`OcJ?>#7v~pU=F4^u{($|h8v`XJat3sfc z8oTQ0dqfxvh0g#fJb^6JxrIXaKzK}o)oJZJ>A!~#2VMp^E9l!}$WkRul2a~Vli{t3 z-{YmJV@-~^k;;#!Rybl)6MBI9E;2NMb#Ls!*%3wI@^N~s01kL2h#C+bIs~p?jh!T8 zz~I4zz@UGR+K+n-FaZnNh_@)NhuHK@@HuJRnHkZJ^a8RoZMxc#nE)~IZn^lpRx#PC zu8=~Q#OWn{rbOH8`6q(g$M}%*coA{8b>j?>M+sSRk}=eT3a$KhY4{a|4s8@(F2=hm z+FQ<1^*bwY^eq1Sm(*|fS43~+I*2e5`#2zJuS(ht!9Kn}V$lCdw- zSm@W^0gI1@qV9Y)Q^naaJ5m6r%)$(DVc7r+h{3>q3Ku=`%vToLX$^tq@o+!XvIyf^ zH=nf1A~ltZO0)w87UZ zskJ-Q{D(Cx>Kipn<+_B3A=W3pg%fi7o$6#Vz~9~RO0B|?gfcc79Zv!R2L8pKuU}RX zC8HjZ=Z}-G(bL)z?53WAOb2<2hh_Q~X7k6%8B^HFGmC;D@7fPdnZhRTQ%$ z1*J>ZigY)~?Os1NpNpu}X!c6Kzc2H|>>39bo$X| zsYkTdul1NnVu(&<_}~79 z*3m?XW1j~5dra1mxp9>S+v@BhkDp&L)lLSciN=hZ)h}g zl5RsB*KGr4O809f9q{FAd>`%ex=;H2U@wIaRf z>w}Xo!X8MPTD$r9%p+gXv*;yu+NPL-s-ux#2s{xiWILSo!9%VQsB?%CIHdeMm_fB< zphAH@{?3M2SXseh@1u*Ar?C{l0)KbPBoC(HpXM#p2p(!D3T)HEqUE|^IH2`2`h~+A zRlnU}RmbiBX=&>*te=BxE=Ga}%{B&CiR7+xn9?5>Ai4ENuvAJZaMpX`uGMfjWsm&^^I&2-*8IQ8Lwq4R~}@bXi95L^{7wqj45?&JfK zihDD>k2}O2?`>rcq)ZnS=MHPILIBk^fPiFi6R(%rkZ7k!p*Q>Ppp)Jab&xYAsWt9z z#Fo#Ue6zXdHvd63>QwgTKQ;Bdp+Ypi5&L(#Fg~jekF+roZb=#22Kn{rW(>r2E4Tg> z=@FutxI*31VSA3SGL6IWzYEbgIi+jTOWo$2SL*362{7P7`OgVQ{Sxu>M$#PAS&SEI zgKiB-cT@Yy#!n8yq!DC%%B3Wc#Nx9eRl5ta=#duZzfsf8gck>#h2z`Pp>rg033Ee| zUNGLY8ovTr@k}GqX3t{ZN9vof(11lutx@(Y%oppihmrm5ICz9&qsd-sZ)iyTWpnQC z)<+%54$W@6+tYGVYuOmFtPL))kJT}02}a{zrORK&7v!w+&PBnG)}^Ablue^c*g`&m zGWwj39rGn_2k^-K=fOu=i^QCxXeM{jmdCit%FiGA{~-Z^}MYe=?--Wg??Q& z4zjVlgacg7aj&xS-}8m+MRsI9H5m63R1yi$W8IB!MSTtgptlBweT+DW&Pc5S#hXH5 z{m(v3K8(+y57fy*2APNv;b}}Ihuqb*`xV_ev!U0N;ofgLw(PlC7+tdy#wC)FiX941 z6klmh(>IaMiu?qta}R1pEK7j;RP!!DR(;u@jodzWk(hAwwbz$J_GSlhDC%47HwV`5 zVX6zCyL`9_ek+q{SlR4>jZyMzWdGT+RxpdT(7SC;MX6?MpJPEmLg~w4)!oY? zd@zBN_+}2g$BW*f`0%^CYac>OaWssN8*r44r+c@}6eZPc>d|YEVrZPVcyah9mBN}& zT55BZNj9xM7B!n-ifVG3U=w z@b(1WX*9*=tEZ6VMV_@Y{^iiEG;c9Zq`UPGIm67{En}Fb>zQ<+gHpKU0%-ZfS}PUa zSnyo{)ze;9bA_F9Ti(o_G7oO!y14w;;s0!Sc|b!AT|(T# zoII33!-K4vL$oH`rr?>WbK0th*G>B`b4>oiAFCDxijNJ<0QX&zd4SBS?p#!lS5zyc z%eFS7o;<~M`jGo!-4I~>uuHFyJ~6a7q172QYMFj$3;z$!^#ajFW2J6%s0D#)m&K}E zuA;@C-tH6WOi6h7N*Aa8c?_K`SZCi;N>vicMM=I2P&0?|bdZ0JdFLjKTA z5jr46lUXlDIIVgF;k;MK!~&WUtZ=sP|1u@Ka*5qb=IRHa9dEgXM}!FO?744aKCtJ} zUsZAwzPw&EK?|6AYQQ7hrl$uR-#j72GAYnE*raf|$@f_TnKwJrRvni>|85)o@dt)d zA60E2$-fL@{sqk<%eqreT)yr& zb3Z=-BNr@B<&0O)B^4wuWXIjy**0@{o7*|Yq+FvP6+0%g-ceU&f5*R?FQgB!eFmkJ zJ09eIs3!s9{8?i5in!!JFgPCcpIWZZzv?(4aVa^D(@Ji?O|M;bnpcL9e8J7AO?^r= zFe8_s_&*z?Uoh29C+-`z*u7w6J7C-+Ug%=M6SBRzMLEp77zM3W>vuSfZF)guuaytF!X}!SlQ1st7PNfFn@tz1Zl?i7o@c1ciB`h(KH1&8F9;rv1N0b`DXNPs}( zh<@@J*IEpU$3I48tRya(E;EPkMpiv>mam|N=g-TyB!FHJv4i|Vntqk%vQEQ{87&Ra z+WSTXHC<>xXn_@ob+JOu-Np(du+tb8+OOA^%&~DRX&$G?#33y&cbqL9-5~9DMi&1g zAW*c}wsE*D`&N9f#K>of2vdm%NCL=V-Y(PiQ0QooKq>~mh(tjnDU>LKHCy`s4efn$+>^zZ} zck6s>_RN`^wLzI=`WbgezdyWpQa?;nQquLgHhs~nZIOd)FGp9U0mL;P`Qrk~l0*6y8OPs}s^qNz4!X73bM-u5L!7PX z0%ENS!%9I7n=Z@*>${O)J8~@!5-MtP))Q@_Wzc1SqSg-v>SvX&2m>2t@*#!C@*J3e z+b;{{=2j($@6BuEpRE3Z-@l5FA;J%2xYJ9RKBVYXG9CpzVn-la-pm3CZ>lW8!((qi z*~=MY(ju?3y`LU964)lwi){RLHghKQij8cJu@-d}(zsmb?M7 zLm%DCS|9!$3--aqUe)i*S0`YnDln8qs3SpIg0Oyx#<{Dl*>&KRM%#P?eu=CU;nFtu z)}4VB3;1*5vfsz&O_qhuR2Pa#Fo7}#J~-_tV`HCI8Fu#PD8N> zt^|-Clne6RDWla=PfG7;e? zqtYwmiix)ZsTOHp%=DG3p>0A>(`CAdVNuU3vw{HRlv$R7J$^PW#2aE%Xsm3$C$9?C zM2nsQW~56wcU@fnR_61?cAc(vMKw^o!}|cY6B~(-?(_?ggPzv7kyYKj3hw7#nf|5d z$!eBn0NPU?%22ELF(OZ;Nsi@N>_q5+q~Wa9G){5gWMY|H-<`vE zVPi4lnqlV!kwzp)o@>y#E;&l2O6qA^1;6OQmd8{%t6{jSlWUQsDqc5EgQdc@H`Nis z{8DP++UT%+k5W~?`%7oQahROkK0x@TXq4#ZC4~QQ+Col4E%1$Rkb*rglVlKAw2GLv zyq~?WGQcL#HxlE&=q8Ev;?`vNAl*$Ml^3?TgKfqxD|hiQQ{i|(Ar4?BrjUEr*Dt+# zp3lZTFtB0wVZE9W7*00-)?e^aS}wR?iVjHPK&-app=A)C0?^vaf$h9W&}g^n9s zqyn_sACNVh0vc=ZSoDEb}LlM`4DT}wdzg0qEjEN{eQ__u97{GM#IZbA&4lBUR2^H zTR7VD_8D+!pJW#J*zM`@|RF*IMx$jmxZ&i;AhE z)!d%T^yGsXtADqHS0?d_cKW|DY1rby$z62Cb6d5j9~XDX$d7j40uj&a6fRTK3)?r$ z+&6=}BTIPu@c}7X`<(yLn6x9OPP0jRbw#Ej3JBJi__C*fxMU#H^NHdM_yg& z%zoam;~}{!rMIDj&Bq0!kfAEXCQ#o8ydp0 z)SPFi-5jD2I2Fj?S5c3WBvN`wK(Qm50u24PDXVT2Ac*nE|6!bq2=!{ip84uqDLQy* zT;Wv6s);YMZ{f8;(8^#rwU*`3w@n_9f=NI9Q~rizE-l?51EqSXr8XBn{afdM%sVN2 ztPTsX9(Q^8;^X9@#+k>K)5X9od~5oqY3}RW!DPYG54L)cOwhkvLv=?ZJNWO9Qlk$x z|_io|h1>lHMCAasb^f&Nca}ukYo7kKXFpz`zKeeP@jW{~_ zZ0JEomc*pT9c*pX(lBrprkpg2C43pcPztBGy%eQ=F!c8LMM2B^KQAAehjz@g27WF6 z+nmrbz=59avV=ysd-`u+JZ8VOq=?mkiXhxGi%|n;%kpnrW;>Ta^p zXhn$PB00h05K_6-I0xVFA7_b>KL581Saj<-g_FEG|amYc?-e`LjKQDPE?cs49^H(6P z@&B>Lgg1dlQ~~*w{Hc3cPdT0Ci9W%|7R?=MQRkoWd=l2u2ogw_8*ffj-=f}qfkk^a zOQF7uEX6L?;CVAnqG>C-#A~!E%PoAb!ab4c6{P86`F&f4xRS*$eEdx``kfT4FnvSC zZ|xQf*eQ?PTVN|O9y}f^9tN$MGH+G=UlA=`wj%UtLh@p48K+2v$(Zzdy5%XG&C0_va!9=1THbyA;dMEUe}X zpK@DbHUfSPzJJ0>D7lW1Yx-7tKw`P>Q=}o1;6Mu|`_)cWn9#Bn|==mGSyA$ThFLv7F@KzFXO7IHLidE+7j zU?qEp?oG(XuU2T|!k%rt!hm+>#O2%9z<58`wo#IpFXr5>m0NmNpVA0aUCbXRKoFo2 zTX9IfU#z?(KF5?^isEHGXcY+Zq0SUs&-+;Zu)F0&U7GtvXxXlI40m|z{HF4 z_XID^O)r{s?I;i39sUnVR~Z&n*RJ;rDUEW-3&c|fPgeeDIFrx zUD7SmjdXW&_WPaxa9uOA*Iw&>?pn&Y?$aBh?;eQ1J%z|czstTkIRi&D$0xX#=eQw? zVfW@~QjUCVm=9m*7^IGZ?ET{IB9su}Q{zXqF-OIs{_*^G_kO~aHFyPYPgLzZ1=p#` z*qbnbem}?b|30ZChbfB8MPn!Q!!LVr#7@uKpOmn8dZE&5HCdsOH{LpN|_N7c8qT#4?s_e;8%$cO_Q zPG@9-t!6n#niUmNiPR3ogh8eKlV$G5jf3k(z{CCe`Z*A27qjs`wRw9Hn6^5Wp13>k zE{-~g1%T>=cg~*~pdY*164V(uicy+jt(7HKyLvv6gskd7_U$ufEm_5Hw0BfxHmIzOW>%(pKRFr$#=}XD*GfIZX3A10#iZ4 zddaBPeKK8zgod~(3Y2Cot;yqM@Xj~q7G;5CA zQsO?^K>)5`B2d^cdj(hu28YQSJ_)RqVcl=1nE2x=F?oUBCsIwqc>b<|eJKDhWC~R0 zwuyTkBCnE>V7tj=>)ZUBt5Xx;Xjz!-!HF8^ifMj#KB>H#{lypAcH*;<_NwITZBaHK z-Hbe%tA2VbrE*VO^2^h0Sh6mJ;Ov2ktVNFqu)gz6-icC{hQc2~aPfyC?7Fh^!7JZt z-5=}JtrZIx1Eep+;tnK-_xbQi!X0)OoS)VfUnL3`_V^d`1lWULfSOJ*IDAvc4s>yV?8@EIb6~3_ zIILv0{fBk|$6q^0U zN0rRRB5;`(PT8wu^1h-1iYw#_Zln)6x6H_uMEz(J#T6R8j;h~umoaU85%}6pySNM) zLen@BpsVK|RYn(#I`;pwX9G%X>;T;OaY23aVVoFPWdL7tD^)H4(_Z92P|?fjtQmsP zR-BA7touv+O2BK)UYS(g6P`TXtxVIWcGNNJ}B2YJttFc}|SI;;taU&9SyrE_-g*WPG=m#*~>Tpk5 z7_#C41_EP8Q(#z!yei@A=6>qs#g<7h`q}PW?Fd3r%Eno>Kas%bi3r(&*J~66!^Qi|<{w;u zdYV^qn9X823ejIbvuMbn5}OUBg!hWz+3b>`Ho2)0?$YfCYr9%$?K}~qXHfXyc}=Id$p-qEZ(gRw&H4 zf&HJPglC6NlX-FR#LpseA<#nOsxR9a4ML~mP4H|JE@1_DGo?Bo!_eA(LH(vDFi7ZH zi%JNNOArz#$vPAWbX33O)>Ai=DjGOEcJ0jdoopyl@1@&6DZ2Vr-Y#1d@YR~Yj8qVP z=eDCY31mOaQxxNik)i|tiKt#S0OS2%%Hok`O6+Rn6J9ixn=)yV3I&#&V58)P%vNeB z07ooduL0?VklBZ}yWv7q(k|r>3G2#%1cYkmF3*S*gAGM2ugqk@e3aMMoiE3UK=!fG z3w3I5I#dMzIt;h92>Uyx0+^YK(qVRfe0$|{{dh7(9`>*`qmVy^?7Ne^=k2qFz!$ClEJcfziFCTM*xa5emy+B)ve z0cddbC|q(*@A^h;TpSQR6KHPDZJEnC`Vm7)&fLYzHlERy8gGvI!aIKFOMNvYdr^yb z{?;265dBY@6~p|`6jdO6egE_5_9V+tF^i`D**x?xXe$(0x9;15! z;8cp9G`%N6QeRt<71D)Gr8GPx{l$vshwmX4WKwE#JxY<#)Q&1C#VNW)oLARHfcUOD zrg5O{&qu9~Lg5TASM%gr3sn8~kF|jue2|zk^P>eA`L^*U1&lbJ0E&M>Wv6yGhd?_A zJ;Yrk*L0)d4HUU8w@8g-COthji}DH3Gi<)}6QfTy_}t1bNjO@ngg9EXu>5U637yBu znMbF5WU^p3ZZ#7mdP1E{o+Wqw&qEG?uPuQmPXRh?r$`M1EhP{@V`(J!rYq&Gw&kCY z1gvmTh(HdcRy+!k;mw~L)AiYE0qa<^t~WX<-9kdV`xa zdwZ&s-n=}38#vnWt9Jt*LmE|2y_dzp@}Sv_ua5K}sod-}DO};ivc_!MXngtp%8N-o zi}EQ7Y%7pQ-NN4TB_Q`nKKo|4=OZNhVH~Fz{{koURrtAZj_J*;u5dGwRQi*gdkMI* zHb>kS#rmuI@*4E&Pi(b1H?Br9d)^*QFVB)qZY6X)5y%jhF#;WV!cqunGQrZLrhhzV~`;KU-+!x$LHo zD%SaQ@xXL*y0|E;)j{%%rI)r@YWehQOi+dQOMh$bNm3&u8qDr7SNO2v777smCt9sr zX#m;%4n^ulyGE$|&&9V=BCT9(z*rJ$nA`^#EK#R!~ur{m_z*X7R-`t6}(h-d0tF`jS2w2B2s@dUUj949wEbSzVoq0V*5k zydan`fb#3CCdgxPf3!tQlzt;6Co37LzH@FxR(9Iqut)t&_n?v>%CZKjDOgr4@-lnG zo#fidjbu6Gw+{{AZI`{GObKLPeVbD^diX{G{L)kCv>O2sI17@U*SIEmiqFhhdQp^_ z2@EuXSRi(!R5_CmH?|Q6(JNClG!0nP3}a-Q(M>~+yKs@^KzZIv6y?+bLb@XHGIGmhZux+?1NYE zv%3$`?Z+=4(EOI`%zh11#%=+GT9VNDDke2assmzZ^;>c2jNiKmbhokpqO>V0=%Bq~ zB%k}xa!LgtR5to1{87mbC=}!f-KkRk-R5p4JFj|tFuwy>%Zj_a%GAuz4A{w2eEpJ4 z`c9hqsEu9M`sPMgn6#rk_D~~^g{-J)oAY-k=Uv~aIzxaK31AKS>>?^bK!1czW^aWL zbQ?9votG*1wrk4tn(^F;o1(uQQQ=fdA@8(E5CX;npFmp-eBLS>59C4*)Rxf0j9)nKA{k&(X;qd?Wy3 za{ut1T?tJ9AVeC3)>hmc36sMPm6+AaHLR{o5=X3#nJT&(pF;baGYeM}tzKme)zwIh zIi3>%1a~_x$^13Q0c+pPcjs}0;PcpeL-z0oy@nm`8eJQ(_$FQ7#Yn|5yGR-(vc)Uo zZ>xjl5A2ta(H(h``T%u*5WiOm6p26R69Z>A$>8aW3gk>EjX65=fx4wU`lKusc3>sQ z+FA-dXw7c6H?)uCLyraxXV;eY_0b~QIDbrRh@zeTt$rGNBZA%eO}QTe&!pxq6dz}x zfIC)za?{-?CJ;IF_M0$h)KG~+_rb%QfRfpXScnKovVN!=B9UHOL_e6ckt3(vAG<6vL^@FT+Jd9|w znyAe8ORP1AQl1!t-}|QrAyG}GZuKIEEtxd zoqe5eTZ}JGfeBllG2_k9zy@JG=wv!O<#NP=r$)JVf7b~1J@Ks>;<~IwKL{cCdm9qD z9iUn6_?wABId3rcL$QOn0T$f&HdsjAeBXfx$ezZoEmV5=DVmW>-zFeblQ@OavX`NF z+sacN!tyeEx+@CnaEW>;nYu5W>?Z|zKZWE5@!i4%I&1=krj-v=2;4=pW zJYRJ>z;))G+eMnD0h!sX0v*LaDLx-W#4V#ak;aJGo{m{zHLYLHH8eEqP4~x2ZDjFI2?uA=8~6-PYl->?bY2W)m-NP;2VB&K?TW( zzqH^JF(3iRMsijH)`D}07*2f4_dmYzkwkrIL)ooZ%T<9p=Ipa2^0qO5 zhX5Uom)B$ArEbIm3vI|P;E$n9?8sDYqyO;Q-Yys5c$mdIKPH9J)yG=dx~D`E=|gMV zJO^9z8R5zzEuKpOw$^x^TR_EeQljtsP45;baPs(O@yuL?Vx)}uz=W!)-8X>9*g;wF zQ#H6^&Z^aTGc<9Bry%PWL0Xi*?JhaX5>g*CdiLZc+H_d)F$l)5aVEEI(mI|5fS;_o zIs3`$DWOQ4#Q6?OpRJ*UoJZ;=X!e*g?_Gr~03Zc3i!ORdn*qUS@Wz32YvqYH9wHJ?;16gi8;taw_a&C_BMJwn^30q$H`%z_YCi%1 znJ-k7?RAlKYW}bIC_l_OoC5UEu^XTLdpMsJ)st$L$6FnZYDctrNqjc5nWJ4fpM4Y# zH;^&t;2k=d^*~I=BiZ*t%<6>7SSh>*nMDRDFsN&saZ))tUfHsE`?-8lEGjS;3av)V zXjl$R=XV#L$9OqF*|{WXZvy%zXAew&9EXu^5hr8C;I`4+_HW}*Uktin3B`7>*~U>f zUohF~qPC^G#uVWT*D)8^*_3af2r2cXjP|hMpnvzal1VYxj(YqD^Awz~&&e_XI}pX2 zE^EM6CnbB6Vv3XTb`G04?Oj`jxcRYmlUy;%5)7l^`~-c1^{4sD`N_Rqp&E82t?Uc+IxRwb)+lnR2?t!{Cb*Hzi=kr z7*XXpG?w${X=DAls4w{{>(k;o1R?B9AnThr7Sf!D#*vIDgVOZb+(2gF(Ii=|B>eh? zj`+$?6-?W@tg4i)Bb9Y*k$Nsv@k!p0|6UO0M#Pf?x2P6-6g{eCR(e4(<2$xF!BIfm zzy!F@0Trk3 zlyrF5h$o$o&cp&Gb$;9K(fJe@l{t`MQ&mZTFnC1Ia2S@t{og;opZO=hpTN8MUQ*J* zG!Q^O()X>V9Qj(oeV;W9zn?E&J$U6!sp#GKof0HO*052b*>g{$Xdm~nmqb3LCoVL9 z`exP2dZfrmz!*$*-Iu1?GGA(X(I1AWdu8o9B^nSutrB2y?A;E*JZxg?cDCoR&+m?D zDT5vQ8j`i(>g-Z&X{B9i`jC??v;HQfL;S$_YxMJr!J$@AOUHaV)=7U= z_dfd7=kPA`n}=Am?3rJ!tZT{1v?lWp79`hN9w=~%;eBR%!~ z(vasVtMO#7(uxW;5OOY2ZaUjAyNIo~$;htZxJg5Xc&4T3R@`*&3jX@(q;TL%fMZ`Y z-D97UDDO{u;u9lx-`pUDyX?Y_sM)L-Q?pMZr2kOU8WWo_5zGY{UDu;QZz{bFs1DQ_ z2#|Is2OGil{*E?NBT_b@QcP440N-W-b1!XhCnWC9q&)8m^T1#YKV^^5ClHg9b3u|- zI`HT35C?ukTCe@hOF0l9v{MH(_9#p}-faZm(k@RJ1{C%#-E@>hk7stN5lpeiPOO{R zy{R}CU3q?DO-d(x=aoi9MFDa99v*pP6CS2W-B(Wt^b&`2EeErF+&t8yyYrn(&3;r%M9P6+zp_`Bgz{l+~W>Z+_NF5@F% zAK^1OVyu{zsI7CC#1oTh-Nzy3lkkn=EXwY$@#O~m*N_DAnPfmFOTt8oT0=(ir(eV6 z^vF2k=?FuSr<(~E5LiOdJ=9-r@a!5zf^be%^GbBakozy6Y~ato{5Ot8@U9L-T2?+| z?*J_g!LLQ!&&F@RN_^;!?%(?$0;|A}gaUCv zl2iKBWjH^?KQ0_jP`rIjGR5vWP5rZ25`gdFT2}JUfw6CvUW0uV<1YeRb38*P$tTOL z!)ux!r`X$f?_YYLN-v`ZqwiOjM@`s>RvUF^c)7XKC@B*(%nJzl8RxZg9C(mTG1t3| z`F}Gqba+yrZQ>g#vtNvxeG+1e=5?`#NsJl%?27(-v?3C2w7pMk;ZzbSpG+e$rkv1Y zi3ceZ;24Tm6=#G1ZlvFsdgW1GV?&?srSrJic68P-WXOEnKm+6r-|?KA~&Zu=%BNJPS|a_Fj&*s ztT|Hu788(eaaHd=tFVTo2@3l4MMNbJrwKAliAZ$XOM%C^O`?AN7vU|fCQj9lBQ!@> zU$LK^s7*|ZgE?6}BXXcvQBLi%1$}tiH3llQWP5U59IdI}ULX4SvfjHX>&_!}@LqJf zMYQ6`1*^=(9~1G@>?z5I4v}skdqz1G%Q>LdxCbMNbN#5r z|HOIsluiPtnj;V_4hwNDKGc1E;*$unx|d8?CtaU80m!{aNpCl$dKwB5*Hy}*fvG^y z=jxbMYnfU$nzk*RczKJPK4M>)cnNisu6)#fi<+^cxo{&(put9gs9jYl5$tGh^3;c|quVE5tS58V6EL-ctFy6I$%wO3sBvbJV zlVH16k~!D|4a%MPMJe|N;9M(CE7eVu7X;G7RuNl4iw#m7n|@eeJqf_-L7Zj9uJ3Ig zUo~J~1U_8#ZA-Sd$L?uxofb3zDi`TPia>=+@O6DKl+RWxg#)^hUrsB6<^h;t#*U1 z%ZFTwPrm;6?a(m={XO>uYhPpM-u4U|?_DMBSuPM6+h|pD=0Mi*V|dC6 z>tvcG2RND*Cb`~40aQ%KNk|-;jAr3oZxFtyBus|ozV)hHl2lJ%tIc)MXWQf#!Q#U! z^6>d;uuWgeaKZi6q`t+b7yLxYPSiK`!$!R7j|FpyiK8t4m%SLHrVaHEP1IB#4>B_L z+gL#N8~yjk!=*ogQO_9AJE;1xNA=eXkITcI&BVpREgrRy?{e#Y`lIgceIed=zI8P^ zqeQ&X+9kA^5&4)ExmQzcKu{~JD&Fd#boOd8FY7fdp!JNr&wz_x?O_4buUiSRksYTO z0Uy&h&axQ+g7;uLo?)ag<-(5*gd3tdl8aXn zdGxDeL|ci;2o+~f=tyK|6c^73)7uu1bR5$9$Ox8&LLt(kZqkw`CA0i$IXz#n&)hml z?{~=88@nXVuElD2qGFEIcMkMWpYLLP&}}@RqH{w(>g2F__Tlrq!Gw52MZwC*{<7kG z;G?xcdAhG4Qq(>}Y!ja#-o!vfc93#IdGN zj>QaQ*8Y?I-@$_&K0t&BnKxewBC=~8ERmQwgZf%aTA{P5`qO-Au{X6=|TZI#T$tw%5yxKTXI^DngTN`AybZcu`J1JaT%@ zW|$B9bs7FzqU^4g1D|Mx#ZC7D`}2hIE2=h^jF)XvwE;`Y+_xxxO3F9mPENf^2=CUwD-hIF1C#lcD1(E4}Ql!>W6a?{1 zUVS~l5A3uIqFEGF?&OoQrp;PK13upRTeN+1Sj{eX8lWJRZ?t~ev_{=DzlI31661_5 z3+z25?I1XDF-Na=8f~pDQZ9dD6HVolxg+ABj(8zM+&@|_>nzrA;>?xu9`(j_#0Vss zW&c64|JH&#k!zMCu(B{*m{MOOUMg5R1?FP;7fErcBRzo-e#6h-U=GpI?_HbCV&>nY z)q*oYEx_opC?PuJ>+9g`2irIag&X%eU~g}K&@KQZQU1&OHbF#5sJCR);b&0{(N8zj z!}?eT->H92enX4_!+$KHnVQD{WPWFgf$|i=OBGzdi6*a%J^yY~L z0cQ<1cn@^$Piq$6&zGCnBr`YM{^kKg2Rv*gy%Q0II9Fu#&8xR?S=O z>Q%^#4tk8aOuq8IgSe*gbp<58Jr7OJTkbJv8IU*nD?#D^ zLU>t%q`nCPbScZJ9N+B{0;BfTk@JfSuV0G`N_Jk_v{Oelr+izjmZ{{jQ0%bSqx)|b z)0oM`mUB3%{p11o_K75OZ(Y}q3)_79Ux#AV+RD-jUkORzQj#y&73ZAhs{+@bC_LYFHx7Un&HEzelPe!G;7q#+%a0j$%$TU#&=W}nu!{OTY z3Sl~R#5Ig$1Xl%lR~28c?D_DnjUPSzP z%*FOOv$K;Hz{qnRA8C~Uo(PR3=vYvoS!#};#H{tEXkX2vRveQE9Bm2F<4!Z`+^jCSmrdcmV6zEa)zln2Rrw1p{v z>L&Ol&-mg&lMLb9Swa4Ju*vJ=LLmm3CYv5BGpnGWAg^eHw0<>xb3S!_8XSM3))gmA zV`_wZq=6G@j*q$L*TuyeHZWyT`r(U2Vfv#aXl=E2?7g%fQvDn*jEz7N%7V_ALI}{k zG;OxN(w$k7{P5#!>fFbHd&z_U0tcllNE+ZB;UBrk{V|r3T97HJOH|9TU$*XqyppMo zohTF+7N!{1@o{d9)SspRn43IgyQ?Z>K?gJP(0-%mwz1Wdz?%h%YH5{A@?&Zidpxr( z-0@a-`$wp2xDk4^*t^cy;!d4pN)N5>5*{;92YXFYzp2BRj<07Lv^#;WiExX;RN)vA zb(q0%d_=#!Wtu*hA7#bf-oux~&&U@xGjI_+)IA0JU!x0Xfe_Iq+3pNJTsOFMCWeHd z50B8C$aaK4%_m!f_rd>q>;;DQ$!db9dn#t;v;HkVxW$K_@x&q}I~}a*S{(>7>Re~D zX{Kr+h(ax8mfk@o4cD8|@uBd5*5j;&aAl)huaSztt9<>Ms>A-a^Ah7Pp=aE&CiTkpYJR)btByM_N2oNp%)D{HOs$B9Bvlqc zzADC>#EOZXz;NpQW5-7N$pLAsy>kzjQcS+5ftmb9pDna*f1?8g$sBDw&&G8NBE0?! zW4;)IIGKYL2D?RA&K_)AhkE%mwdb4!feRcw-9ebs7oF*LOxMwZj57KyO{OpHT=OS| zZF7Y!>~6t(<(#x>ILljM2JJliuE?!st?sk$=fr^YX&Bg*`lkGld+A9?c>CBtxw&vm z0-n3v{cn%&@x5^mjEsJKo@}SLJ`=*l7bit6V1F~}ZL4;qD?mxWb^j@7JzYZ`fsA`T zZFT3B_3r`$5m~moIAzv`WRk}_QTbw5I1mtL%pu|f5I|t7H{U1ucER|eX=J3V#Vc$mmcXz~9UZ$<&0Bd3Y}-hP^|`hYEF zuq4u@`9;#NcCPyunM#yMN<$CZx;5^VHtJ~FW2WNA#RsLAjBk_frFz6(q9dt16}!I} zv9w(*aRv6w_;|~7CPl@x+M#UQq_=&vjT(67TtM69lM8|VxylF&mkrNFyf`mmKYWG6 zVmuy}0lQ0dnHqN!E%H01XpH9)lNq!Z0v1qK_-lN^Lch6QqQT&QQmWLAGO5CYz5|Ru z)96OjgOFI3HE@}SQ(l1Z);jHDZeF7CZl-_ruM#4&6>)buHs161a9`kTMym5wG~})1 zYggowWITr?6BP1o%ABOW9y~=15{LN5uvH?bi966Uew7y~F2A{$^j*K!`U}VO)%H-M zPxR_(#E@cAHRjw)kaCu(>!{m0!e-9*eNT8nc@iAqZ<7u1-Vz43%y*F|eW@zP{UoE` z)%(ZyLu>s~mf$n-(knyZ$$}nflw3ybNZ=~)gKnlT;FPtb`B^KA!$fZ@$&Sj|nItr` z)m{c8EUYcl_Kbt-V_C!T-y^yJ?;#>WLgm*+BGR2B*151b_P`Ifz7Wb*t+@0oG#HIL zZBTxy`RcJr`vvW)WTH-O+2;75sw2ys;7ne|JyTQ4hU}9e(Z0>R$8pE)V8-cwuK0y! zu-i;eV?8o#G^!bRF6pvS+`E5C9x)vf9!Q;${m(pL_W8j_>fF%$Rw&1mZkptIoOll7 zR*U>k23S0G_VhrqM$@T3g>Bu3pcmXDqJ&eMX^};(n(8xlN3^nq!`c^;K{D$H2Lza; zRfl?g*sGax6$NU34{O?BBgJ-_lsFcLmaf0NBt2dP8VpK!yCr30q3mUG(-sdzDz+5D z)abvAMNG>L{0DEeq&h<*G##(L8`q_lInK$YwWmX*@YOP_v&FGG{G9u~E>)4jXZI+NWO)QIXykzap6=w0>didk{5cN}ygW7Sd?d{NT4ck|Y~0 z#s&UKG)tZL5z6Fn@X(LhO1OuX%;Z)W6}T0!F$b$I(X08brN%SDFZ<|H7f8)N1>D92 zH3_{WpBk${aI=CY_j6Vi$Hz|V4BtZ&h4bsnX{aKvpn_U z5-&V`rj0>)bQWK!{_T17_CFI=)uZh%^6@so%?xj#*(6B6qhkjoyj#20nA)cUG3+(Lx=-SXfA8GF9ngC_^pXppRZ z!iU*l&Kx|?6J?V6JxL%}X9k;h#p0UB_A~)(Lm!AVU2J&kw)zE3f~@+G*>7W1BeB|* z54mJ!wW>`RSLxpXNT9t!Kij~b^7$ud74SUc&AoJr;6^tO^I|3?KAhFI^o95Z*=s71 zQq$iY)wt57t22+5f(2+mm%n%7&aY(o_Vj-}1y}Zy_l^R3m(;Tx2Pcdw$!T8|?{ign zAS5ksH9yxHMFtvH6*`%FPWZr6r|iK=A~q7__oIg%hI6O=q7pg1U2(Xto=g)e!wp8f2|leAPU@6ZT5Ie;7k56Ysm4> zf9W{^5}>g+I}7@3WL5j9$?{yr&n03$fEG>;`hcdnJc@wnfaLiWvx`ZfbB9j{!4`wjnc)tBW3YKLGVT6j$~X^~f0h4%(YLG!nsKO~UF zvwFOud~8ra_+GBFY{6K!Y|}p0zC{gMZXth|Emly?n1b9w{C2Ud+f4+nJVw=g)CW`b zj2JX?tl(`5JRdXzg{Y0nXp-G9z`-s>Qu-w{1V>E9t$!~KP`PCxJ0Pb<%2t*tzg{9e%byxICGtopYhztkJ11eo{LdlI!)WN<3l z4*Q%{T>~2+-Q*A2C;CVr$OuFlHA@XXCIWl5)^e#egjl`9J2P9@@1vNu*@72HNZcjl zB&l-s;B0f5L;4k!RX^7n#_+}F7hma-O={iBKr#2-Kkb}poG*v#4pea5A8Wq@R=x9$ zild#1i51c+zWrCo#rhs_T_~gpIJA9brx^FbgerUcH%Q@@I(*alqG71~{bqjsIbiv~ zg6kp1e5A}q2LPz{7Q6c2G8z7GIAW^oPq-FewmyBrg8SkzD>7qYRQUJAr&_5&)U%mF znnzErKfHWP;&0p*r*J`!Y0tKL76lRHk+`sX@{?r{Lg&||p9vZ|1O^RhagGn0VD7YL zQE16q?G~WH=~{A6SylK^uX56z&g|TCd;DfKxGkncX~NNu^#AR+6E+=2(eoqj13!ht z^^8@*UB#5$ZW{7`tfIH(v-FyYbr2(v5+p)qk$#f-<6tvZLMe>{HKi(#?q>alq)KW& z4|~D*(Y#t55Y&*7C+uRtQ@4n_B-toIxq2tvRk#xSpZx*ziz(MA)y#JqEq<+Qk6@ep zX<|$Iz@PticoQGmMDD2zsSe^Av?mTm{L^LdIsCyJk;&M zHWE;aD_T^ElfWo|^By6|ghbInfZ0!l;}UajLSWXc)jM0_ey-F?jULbcms%tLrJJAa zy58Z4_K#zBu@=4(E-*Xol)ghw6xoh@D15ut0Bkah4unYYW-Ovw6IMR!w5BfVRWl2| zw_{Sgu0rR+mqzVJ%5HdnNQraZHGl2=>@>jN)Md*^NV@Zd;&No|iXF!1>EGAeD8l#h zZo~aPeA>;tddWpF4!0*4CChvp+H^+~quyq*OMS5(RSsqTbX35v+nV>8RW;4%9!-Z6 zPg(%vsSSS=cno5L88!{b%lk`kXF0zw>hp3Lyd(#2m0etNrdwbTxGeQ=@P(Zzis!8a z5=sIvcF%P!SbU%7xz!p> zo980idFnu~>UW$6c8cg(H`3PWqTv~ldw<@U=OBmD@I!dN=Fs3Pt6)kiJUdE#Cw?s8 zS9ueQ<7+?Pn8l`je4CaizcJ`(GdSTVqJbM6u6$6iG8Mg?TWj-^cG+)O$)=JiyuZm{ zKiIfJw^0HtL&$e0yQ{o$N@%h{3u|9_&s8}VXA;<3z`OJrMBQI+rIzzOh%;C6V#+Tp zcty{gG4}*KyC5XjUTOhbZxWPh2pp!qzU$1(dkw%*SHolx$9OAN7^J5=GQ|~&Y#2W5 zd~3Op5o-M@hcBy|>~U#m44F^*UlltjRA8FbiY8EY=n)kBeUu<$x5GhBKONl~0Lv^K zKZEAd_d`VVUVVqsoA-;2R&}{dfYStuaj{eiUU=CP07AAm_>KE=^giduDM(!ZV@j#6 z{N6TSk@Dfk()F+5Ffd=?`Xm_JsDQKYofWiGZlVf|0jUyB`)v(`lh9fG<A>u2DgLN1HG8ntBp*tQ; zO!4A>zVMH^VczMn6%5KEQ(;R z>n@$kF=;GMiK%yfn?$kdQ_G@Ph;09B)`Hb8S1=PE8<@VNMbTm0LrWF^H|ZK?w0Z&0hNntrohBea*SiXK~iDw zer)P$)cjqB{+XHhMPdk=$6b0@t4Gk>Qj6DcHc{6KKohBptya_`N=Ko@SNcC7TZ{tG zh{OL$o!uFijZ5O%d)3g)>q;Z6mq0XpUG%o@!Orvdi(d$-n1IkQ3yH|EglMnbrXU5M zG8*4IEV0%ZRQR6mhJ17%ix`2ZR8Of@byNnB4qL9qumIN$HQ zPwbki-X`3W0_ddSHp}B$6mV4rSsE%#73VXz;)(!utl|3Uf=v>-p2SPlt1PNl?ueU@ zu|I`(r5XHRu1Z#Ja;W;r9DM6a&aJzj=>DY*R#)F`P)L4Q6u_Gt-DFF3Eio=3+GSnlF4KE{JS)FZmTnC5umBf=jZj(3$8$(O2C zQ{=itp=Y|Xomq_l0eELMfi-2d0G02g2@*1D>_s&>hY`}@Ae{j~Z|$|>cGG;+MJ5vF z#lnfU*VflW9t|%P_GviX_PbxGANtTxl!r1*Q`G19Ard&*Z#O7G4VD$F$_9&2uy-}D zyfEeN{R{klb5GORjIP}t@w!@5q>`_ew<=iHlpxp9?YLawE<0?sDws>%s(3#1FVV!A z5bml}bFzk4EaY(;w$X^%z!R1pJP%kwQ^a8I`Y6{j;k5-t#yhx0u=Fzuok! z$t(w5wGY&|)?yR5K7JKNtK#P;l|`h~5`h;qiQyqEH(2<$pS?4`(e_vR#U1@D zwW%N=)pt8@sR1k$sa;);satzN-mviG=7nCf4-!a192p?Y`a16SjM2@I0!HyrWsxc2iaM`ENg0`EL0N>6t|2PTP|VSD4{u*9>6Et!6|C z4?HarmtaMI&~ew~K5eW@uR>m5VX|G1PaSiz-WotBNo9#c8&_9ZY(FZ!@T9sq8WTn1 zx#0a#R+wC_nt3LPmSRW*yr;Dvi`owO%Qf1yh>E1}%1rX}aeiU2{zG1UDN~oQJPPbm z`W2mC0ej>!1NYPne3luoGYR1@0+RgAOlLItP#FHfw`3lpXszi+%u#o2w)>4>ctx4| zW|;#Tuv+{Ub?fI8{lgAW@%KtvhRTZ#1Y34+geKUW@$dqGszq(-vVX(Blpy`!16E?F zS{>J)Zj3vg@~A}BF{=JJX2q?uS-7j|^|s2el37ZlrN?F^md?y$sQ=EUuOl z&b)Shdct`dUynvb{2E#hOo)9pF33$^d%QL2lw58=AV-6eBo6Y2WKjeMyNVa|0oUU`Q3Jj+wxB9vuqajFIGY>>n2$8&b~58 zbf)N{!b`4s_hVi{k!6;-jI}ZR-rxAoa_fbl%(0F3?|KZG@!`Jct`CYb_FI-3RKEwC z-n#vr{yAzxj}ocW{D$Xo4E3T|(#Q?l?%b1{61sd+*FSn%^en;om$DFi*@h56Qn>1N z|8XeR)4lq<3qCbHqK6k3>pE$oR@P{G?==_Rq&H8$--HU4PDCa=bM}=9Cn)R|_|3&L z%UIF3=&I~h2nQSV9W50+v?z|J69n8ec1-h6S%SMK&-&NxWmt? zM*fybLAhYnJ4qmW@K*`e$*g>(FnF2a!DB?2h>GmKU(1dj7heG?gR_&?!i5{OK_Lq?iSp2@4M5}-S>3QNuN8@r+enP z&td2PdrrIqx&%J!CQk7B2c(5kD%K^i22**l!Fd-fGpk8Wc8&r-}c+uylKWS9L zYVM@F7mV-mVW7$+7{T*sGMIy2x)4539CJiXPXnR*RiwC_2=S!i{-sy3x#-l1s~v3uK}uxTJ!V{@DkB<0 zSG47!O9MEeF-p{x;LRj-09XhC>YC>J# zg1Q8M!?%f~_(1d7?6I=x8^j^CjB@nj!;2Ki7+|d7>>XdSw&Q!_2@x0PSuj*su=9?& zqf_n%4Zg~2s*C=cT^!k1c62@OAI7byhxRmrud-Bi$3m(F4F;Z_Oz%?7aB}t?`$}Od z0hp|H;js>&m95M^^x2ExNC&=%>llP%Fjs@xKHq&%V;N-nLf^ssM49I7d2;{@{N{Mt ztO==6KB5>6yu!M>A&)gX)(2E)ZBJFOI-PS)f`RU%p4vjQet<}2uMfl5s%i;8cu%xj z+8pN0(@`wYqYH)_UeiHo+otV#1Ol*Jtq;IPn%9bWI!n%Ppje{3m8GZDQ>w z9fID-H5Qi#FMyVX=)eh8c0HGrHZZ$VQV3ABg4Mb+=H)J{uj;AnTkPbD?=+%(-a6<2 z+_T`7XHA4njdvY8I>QRld%U!p5s{y^8Eb@T^A)+c8K$GoQdVgEEGm4P*Feddl91h( zE~oD=#EdeGGm#b|{j^Z_MQPBFY4+S24^QqILbbjT=_(_~;^r__hUdq5_C!I{FD~_p z&1o?}@C`VCa(Oeg$q9%o!~p2!6YTX9hcm3QZ)8m5q z5{bVf#bsj40~8bJn`me%H|Wb#IIDy8z4QMFOFXwQImzhT_y7?q%~t+l%EJiM z+yxP@sXVGOeuwcTTF9CKuc$dc-R3TQ(PL96*Bu0yBU_o?&FQr?N|w5woXWfvYw#O^ zWnX@a7Isiw;IkEkZwW8u04Gz}eVG6_QfT=jcsY-1 z%wrI^zHBB4D84Oe4|(Sb26-|s_|PcVh=hDp%io*cp$TqRNlG=4hHe0_)M#SUjHvY; z;&ub#MTff>zr6@#_HM%gD3Lgu-X_5TE4U0I*~+b$Nunzv8H|GUvO2UuCj#Q(IfvNi z;5ff}A#&4K*;E#2;pB7cuhFBNtp5#)%3juo@S^E6mGM|50^bFu!=n5Mc+X3X%KY9e z&tkUah+t=)ltR7T<{-X>V)2(3HlLG(c zxmWnm<2j10=O8EIb5Pc24m%a$ZO+ESV9oKnZ-G9>bBG@~FN1VT2ihuOAs$ZUV&Kzo z-b*?njAXnrWtsf6pQ$F;ZIrR0UCe2G^Ptr+&$Jg|>}PAYdJJmI-}Fw-SgJZS39F|l z=$m*wO9t!}sT>k5*rDA!uF<#f<~A4nXa>VxG&zLiQ)5d5BK z1MI7h6UOj}vD)E}R1X481Ya^8NEEedncx^+?G_L=-jD4@`H8i%+-t|LIsfDOg_aOl z{KFlnAmJ4{jH6Z|G4Kc?Ucw0@_=(tjK)vLYx*R$VIsl`5R)4#}$7ZqFV(rT}Y+7we z32Dh@r=71UTaPY)nuF8)O2-m)Vrnq_P!FapGWZ(IZ2-AnHbaZjHfu!p6kadC!>4_G zKwMCVGgOZUF$$fh?!3W@d1zbjJi4s z(Vs}dAXflRoNfm!K)Vu^4A5}kV3bGh zO2OrJo*fH!%ki z&{eKt3(YjjGN0piua6!h2~;bw7)7Wu( zQ!0phu5)?MynI0&Ph4><1SZ7eFk*-6PZ!qak#NYlB?+GE;G^qpo@)?#%sF4+j1a7#s>))urrFgIz=TDsbZ+xhxfE>L9GE@XKY26Ke~XLzhr%soe-bB z*+D<{RH9bN4D4=u!W-fXP928V+kB5t~O|Z~5hd@yAT+$0Lzolna6Fbu$ zp4Ve$&`D3{DUrmSNkd0g$B-L|9l161To+O=2sdLZ{UOCuRq%Z~X?(PTwvv}#2N74? zZ8G8YMF#tCRP*w5%jdPeL702SWW?(QZ#;_{w#6q7bY&}YSRzPLFM>ghcfktQzU7yr znvs9nY)6LG-llkHITu_Kf{A%^+9x|<*5IJ_8jNrG20VEi_r#C0!(KC8;06N`#c$Xf zT&Ga6)s1fXHVn1|-x*&j!;PJr%iZl`-uqMrtq&kJtkN;M6})VxD;32{H)&RDS?2;=TE~FM}nTl`UIPd zFCXQ8XlB2V@9p;Nkssi}?3S>bCdIe8Py3Lg*gvIH*=`Zg^K`M7Awy(09iwM2%EBQL zRWgBvEb$m6IgRNF=Z)q2Oq!tKb)LVrz1H1X;dD;AqF4s7KCzF_T604-0EjtI`8?d? zB97aUQSA0is6q0%RZmfzE&)bJ4yTif>2y)>tk23Y;4MKFqE@to-j@}4un9wvWxnJ z9hpl1uP7`U@y7B87O!)o1E#!6NskYTbIt-bwj$NXu9I@*8^5L!7^)4&7f?9nIFD~i z4G-ve(1Do-QiIikw@`mL{r38$g__|7C4A$VHv`6Q)lGkjcjBX)7sdsB_RNVC@6ggL zEm$Bgg7;JQ8m>1xY@i_Zi9paCD=#REfD zy4$EHC@#4O5a5d3^<#M6Mc-0>AxeaT%zOf=akK6L-(XN%At# z7=yyXJ7$M}?8#kDA_s@-sBvgL>oF%ufGMO1<$k_cszBSL8RzAxnq%i1WZ}Ixmfd|vmGoYlPoP5{h3 z-`+PI6I}6j06#xx+{Xa1fvWeXP6Rm}7oh)q`|tuF{Pg(5dVP9HaL3yO1Om^meIAKU zMW0|Ev!1i|eC9l104@MzVDNqAH31NK|I7p&eD1q-dmewj-KiX)yUx1dedb;BSob*v z0#7UepMf?&;PV=|PjeRVIm71|a0r~ZX9F|?IPvkn8+sgDu$p^b0}|Y{ zcdf2^l>(CP=`?K`fRljWnaVZZd7tfDa6r~`!!u|$*O0Gtfq*Vx-TLHxjPV!vpRV%eNK3(Q=m z?i6Ks3xZu@=o}PHRwLWPbBJnRpQdd4Li}p5c;1v5bE-61-2cqMa062}onwye@&emR zYgXKax9s3OFZuS2CZ+4wH&8u}_$(e3UY2^JBj^LD71>t40NRS?5{+W>{F21~-Y@oQyB4>H0bStjCi!Gf ziv819%L<<2Ll*p=_UqN!8)(Mg>BBHX^)mhE4EbZ4Nvuxu!au=cZ~;l|rmgyT2wxo( zQ}OIs*sFlSAWG_olbmdwW2+TbPsp3DDBhlH+%t8>bAaRug%<0ttVqb$5I0A!gmgq^6W)u?3$PZ))75Zx=K*xL zcfoym4wP+3zf^LQUgUL3S2Vqo0vk=0-E^;Vn#tXqxf(j!u@AU)qZ>WVMH$m34*ngg zF}=lsi}6+h8}aYg^)4h`Lj(unU|~8Z;N2T&0b_n_i=CNr-u6MQFui;pg?q_uU>!S= z_~BDv_m%?te`s^#a!9T>I$W;Fz)A0SbNS?iBj@+xygT>iZIr5p1>25kAs+OR+W*|J zHRNaNN!Yh_sBY4;k)ZRw0qzqg*{;P2mMA|4Om|M{IjQQs^n`H}R+ofl7T|hPh3M!j zyUR|=RRnlg=GwG|bPC}`+4KT^+for=q!Fy*9wGfTYi+)EY+B5e^tVger5gag@k+gK`J~M@!15~TFGf`EgF-_)x%T<8kN?d*t)kd)``~6rxs z9VWRm@#2&dwOydYmcKMTj;ZA6gOec2{m>P+zVdjA3;8v>R9~L+ygmSGz67WwFH<+3 zl{E-7dso}IPu4NU6g39Jv(~cC?>5H8v}$mU9rQjt^YzSwP`|z4iAuU-owoI4vV0Tb zvpNK@Ox|UPJYUTic@F7dbumBV#I$=Cz$_Pap8?vgGok6N5l@^*)WADi zBTqaX#mfHrrZQ5RC@Tjw2~GUP-KzL{?z&NZN=pw=cTpQ^qOrc-obuY6iucj3TUF}e!bWtO26Vwpb8Cu2q z&NyIuL1PMac-OIZA`p^c-vp&g469dkQg97BS*uoT>1)=g6luhoGi3^tL=AT#S?||- z52G*FFwHR*U;a%D4tc)7^g~R;F8}=mJtkkM=Qno5Lm2Mzfdf{Q8-3iCiy3!?ib3gr zYB>KBv$SVzVBV1VA^3o^r+d}QKSHHO} zzP{4hO)v8FUf4f$?;x_hn~r3OQgjOz34S?I-_;ZD(Ug5s&W1kTsBNYC-C=9_n6QQD zf{5qbKKy}u+={CCf+oBuk-;?feDn8{p|NSfq`xLoK&EZa+R*n(J4KBK=8uVYWyS+u zkt?$F4Zsn~u>$rl$;v6svd=p5W~v6Kga%=S!x)#N3tGAo(m@0&{vRXljDlZo@g((@ z97V|S?TDSQ&J2ce&}m>wt#H>Va7%<;3T|XDA>8QE6`#By?oygNJa$+7Y;f8_L$x9Y zSvmF=#_iN_Tr=SzY6-hps6mRvQaFqjorczX%Wv`4Ok#`v^)~vu8cy^e%O*To)oogW z*D)6~x}LkzNo12fjx_B?th*W@d8ZXw-VtN|xPufo<}5>!!>yav&p7AGAx)lslrAdZ z-oYAaRB`5*D$BmW78!8uZG$_ky?(%)=}>Kl2Y2|i%AVNLHD$)NXSm6MK6BsdK;!Z; zZ^~_Ku*Z?SyjLyhy!{ZT5Vae4GElo5_+;ArQrPBQwVpSc| zrW#%4{^>(J8(L>XII?L`s~ef<&iQ|#5ihDkZxEIRaWHI&nw%AG}3 z&2d}f*~@n}`&Dv!jHz&m<@Iqg>4q4bi7bepxmsG9=EUucc}yxt?6gDF9osoHMw3X2 z|Hhd3mqG(F+D)0SJbqOrC%@`2pBx8?`Zf+i#bY8Ne$Nf5#h%t6F947sy2whnt@xZ0 zNO^9fbH$5>o@VNB-{ZN?e8nM6W}(B7u(jJ(T!)#bs_H>Z%1QwTH?JHZKpbpupv&j> zmPBZqN3Zd*EI`g)N_g&N6c{JkS~jxK&0X$OgZ8q;CA&uvYomE{He8X9`QsjF?RkEz zExgUPM*ICp-74~*=wRs{tFrya;_h*hqfXQVgiBA;L4~!Ma#^+og9;E+Q$js>s}oD{8N@wqkdM zDj1dSMIr;D?h1B_MNzR*i857!L@s$%n&z(BrpEH#gruwyPw$PFtP5xZu*V^!o)O?< z4irB|aH!98bOoM0`5hHQai=NicS!_(WCBgYoqR2x_arIO`;Px6@F>aJBuM7~WUT*Z z45B^DMc+%R7$5n5)|}wN_nSttEilDB5B+HH1b;_8fFo=Fo_Ah)3PP5Tanl!CyqJWc zaQeD9&sI_1<3Vyd z4P{UHVG3)!B$5S9{*W~ZvChQIa(EK$iRZ7r(YRWxK%Js`+>$<}lX_d5Pg8$>N3!_n zFwLpcTQjrHq94B4@1Rb9shP8Wj`y@Pxm2pMl9pVBKZ;Ril-Rv%ZtTnpGF+ayrgVn| z7UU&SLjs$$@hK#hFBy86zw$6*AZ0N(_LL04Q%WA1dlk zh6?v{c?vmEw~mDGE+y~f4JC<_#@dJz5PVv4z;#n~hr)=}G1{FDFp3PGS70)Kg4xLq z-nlkA#=p1p|KY63HLWQJ-@M2g-f1FOwC#m&-1-JR!eZ9WN1Zg-xs2J;*NRPr!$3EM zZ1l2{A0j>#L8^n^RM9jm`$H?@YM9UyK(=p)M3A)4U&LEn*GA%3%R7x#^Q)2!mg|00^c&>@{M`M3ZKhOR)oe9h}7 zM7BrW@A;;8=ez9<*B!csJ6p9B4bvC>%sJ?YaZd89e+?MJdp7(N93pOYtxjcKgFG5d z;q-(VM+LY|?-NSP!<+bB7371z!$oxCanUQ!hb#E_Mj{%SlDsu4 zC6pH^oAAgs@kdC0k72;iHK}_E_#tAOJ(@m&Nh>(#kSexgZ+%Eoi+X-lC>U79K!atf z5(A6I z_S_qMgQPqCUT#r16Vz<}gca6h=1L>2!;_%)NXW4lPhnq@(F8tI)mx)tq89qI3k9Be z)B5iOar_xA>B|3mjN`9(dF)+C`Ltvh{`r!y?Gf-D$tj$`*asCGnJ*2>S67LOV_q!g(VqE7!@ z_@-jvoe!=v#r64pts%-Vx*}A2u&XanP4~WYH-cZC!1q!yYj;5r##(1LnSMp$U4y^v z`mEf2uGMmMi^LLQ@&4ZMpX5ARX23ZX@mQCtFjjCSDLqhsH z(nS*0SyH1`h zyM{ONWYhvYSn)T!{J>JB3BDU#N>h+YAR&@>v~#Wtjvg}4(LR-6ntEsa&-wquWvT=c$avz6@%TUAM<8~8U`Wk1C&!^S^5 zgsHy@#PNyo_dTAd7rMfJ_`Fki@uR`|^|8$DhB*?Vt+jq@T^df`<9 zOWT^agf)0&1~?V@WU!iOkJ!}n^n~K1(ykel?vDL6NcWzXOfct02uu}wH!yaw ze8;>%c|FFu*w^x{sx1y2<4cA1k0@AVhw@)a&J-yl={13OPA-<#mqgNCd-Df>&~U4 zgbT{YQyu>In94#6q^0orNALIV1ED;c7ZhW4hp)qRlt+fa*yaNOu@4HFh!=552S3z(Z}k*FNAMkabBKTtj@@ZY z7m}LRAVei@feB;75iJ27u45*^l_uF)%DF;OOi_XZq!2nLf(laAKdI>%p00+ zdq+@Xk8K?Fm8p2T1W!STr#kKO6s9+yMc@xC@&QzZ(K%LGDrWg^!=d4iYy6uXH2822 zR`duTPOY`?3dHoF+0wd77crk#x7-`ySl{`CtEEFvq9d%7%!`6pFSi{)_lToUWFZ zt%3_uPQY9e5%t})ISS`qyZrRyUJl#?Y1!2^qHnQt`x2RcTA9`o^Y=m3JnQ%G5c`Z6 zI$%DW5l0ouDsMmeQg&Le3;+sXIX{2H`%b5p$rnwz;KDCF$5Lj~K-bf6@)y+=A-1dN zj`y$3L;8s;dKLry5h))SZ*LRyC}%fkP*TuDcGC5!D^0J9U1Hvef-1=;bRn&HBq@0k zYjuLTG~-3-4q;!xbt$>*pafshkJO|1j0fV{d9-4@1P`3%NU@}fXD!2doEKwy8Qah{ zvjpCmt8YKgBe5A^nB-k!2{tr`WRz>ad$OS~JiRq+u9 z1uT5J_)Ik2TAP!Pu+M|@*9DMEllNA}hZE)65$oug{I?yP9gGJ45)}9m9{E>7wLi1; z{E3d0lk=@V8R7|{@XR5Kgt+x5DzDp`FPD_`(lctH1@600C=;^RT)M0;UfsG~ALDXt zO%J)LpPRS5g(Lf9iVB$TxGD)qviNjbE9NpeBczuBw#%G){le!+)0S&WZ6FlQd&cX| zLxJ05G431luGjc}W^Y%E=n(zrZW!1tbb=W|TP_-v(s(SDp?La?O+7`{w@CV}_DJE5 zn{eZ#$MdIuCw+l3=mMRaUktE@>&7cWff(2gR&OU}7Rt=DyjH-L(EGjODbLJ)gbNlR=CL1(OAo2#HFE z&IBdzO#(th+|jzbsW$o-+u@wPhP~f;<=XBLs%W^-V0q>0tM#Th>8%4oocBruNmMR0 z!S0i~-UUwG)!4t9WPS}5CZ}B<|1~>lP0om~YF0#lAEBH(_@2;vH@)MEbxVdMJO+mu zKJfWTMCx!PA+2;v6YV;7x23IXX)ufilP>$u4~A{li_IU*dA z=Mp;53U!kjWkRw4Cq8M9ljeoS*plwfd?~J+pJbNdD41xq(aP(bldc^-h*p*XlBX-=HXpADf}5P&;R!xnEWKrMp8a@$xh@iJn4^cD!>T8 zJTq9$l_XMmNYff8^!gQG#97TFK3~o4P~pM?Q4Ew*(c8}NXX?XIP{u0$I1wp1sudY9 z>T0Sj@SUTEalvK?wvh!<>ma_K7?a?2g1bT>GdE-GW9L;?NgN@m3PWv@s%FyK5Jh;J z;miOBIL#N+p(y;oCAC*@|>{uP;+)pCDHFZzqW@MlcplcNtL<5Ygu z>*&S2n?AmqhkQo1cyrPT+B}*sJI{BQ`>5VLB)iG0v?*Qs(M{>+Z!kqQbC))4uHPZn zGn!Ql!R&3@m_b(ddoH@EI7Aszz1=1x_=I>P*Si@Ul#$e+rWvGxodxgjnF{z9Yowp% z-2RMH{**t+Lt0a;pCI*4id#>@v<^ zUH)YWO{-6iF&^)fEfw{DBx#AH$DV-`F*iJ^;~Y%s z*+l5=4_)O>#nlCO^a6<_by_>N8&-QbMqn!Q1gx}P4x$fb$Mh6?tCVByO$Wh8--$+p zhW#7}D%q4YNc2%sAo?3$yMQ0N?XAHuHwC!#w4 zk#YSKeevfMTTe-g7OQ+?O{{%A360(GEdBa%zE4d}*n(Z`24D~>Oh8mLX>l0kq&MbS zOynJ{{#F^rW6uuEP-u+xt-mv`31@I!kT6Do56OPfzWmn2C1o3+b- zgn<9{rs{*g9*_UC049?@j_|47AjBPkE*!KLlBhZdGTLm*WEoQqI{6UQO=0gO8INW{ zySN^ix9}4C^K!Az8mN4)t{@)#znMn=#l)olbb80HWPbiaKg8Z~)Z~RJLwr%xl=09PS02ft@vtjE4iuZx|P4PS;I9An66tcT=e^v5&TU> z!cTSCp8=vz9pS~WbC2~TT&9I$wqmL0FaSBC=G9`rxH)RsiZWZVxm|8JHa{9X38*>B-WGA|&& zLD>4g(x3drZ2Y$O^%LjwzY2%_7r@n@27rFSEq@&Tu>k)M5ae%_t^7eoe~{51Wb|K( z_549Fe-O+c1oOYroN)yM13U|Z{qgg!o&m0Wc6(>`J687D=y1Pcpvb1n{NAaTi*$hg zkqfO?w{(aG%lJvb{_D1JKlQWEC?t*pWhUEo>riXssI`_H+w@!$x(>KHW-EuNRAm$| zaHG!!WP6M=3uB{Nmtz%xBHdMl;XH9Hv|ZgB9)_IF1}aCjbsQ@Zwp*F3Pt-eOXn0?E zV>rD1%F(v@jLKYmht*EO6ThrN(ipTtYxKJ!)J2}XvcOwsoaOBNegCY+2bx%LB+9)+ zHvT&>stF)gREW*qu4%kyF^-}fCesI55N^Mfy}nqLm|mhxWN!se2`du!oCNcvs+Id; zLi!VR2;YMRcWfjEF1qCI@}S^dU8O<4x-ttjjJF|#G1CQAynvgDWYTn>ZJG}oQ^-Sg zrm*ZD>a`J9Xx13X;gB09Z@TDA`~{T{TU06Kwi3XOKt*w&_-T`;tT0CLzQ;>lmbmcp z|NSz^AFmTkn2>mw&6wfzLa%dB{|3i+%jB?dLsnD?U{8;Zsr$BNJnj{L58O3#Eo-D< zI;?^@QuLdcoU@l$mZ%i=ynG)!J|BkepN&@RzI=hi1$?zzo&?YJf^=fZDA}N)N76TQ zK$GsJd<8rKFOB+p*Kw^UTFga<*b>K&-3Yel6q)8vka<=V->|4APSOz=%a`wL8QEg# z^yBx4TN-u`WNh{#!G?2u4G6cb52?dBH((=NwwYT%ogNogI?V(DLoe&CAteZIH!_p$HU>vpEXq}v15?E3-y_&_?iPXg-pLX;-*lXpB^c0*b2F7*6|6JNBeCe#O1 zV>s)K(RSmI6t1j(C;Qob_BwJx7`A3~%gNFlmh^)%IaWBi*)nv(ccw;cJ3s!|7P74kiRD2}{T_<{-!rL055Xhu)?D z-s>5?GI>!}qr&y2X9T|-!RRF~cjIRvV}_JFX_}pSaN$i+Wpa&O^YfhG=pKEZwI^Of zTcx#!+qcDtd7+;l54Y%$G!PSd_2F>YOAqfj(gdi}Rf>?%FYD_L4Pm3~x)OI9z5o|& z8|OOu04awX%(yolt(;mgw@ZwZoN6yYpl@ zo!>>{3~WQGGs*2ie}$vie5`WcPd$MkTgOqNKNR36ra+L1Jz=(${Au zYRW2j>7J9(V-oxD@fNmxG%QQbdjqrSi^C!EGI0Y7tr!1efXZ&~coDB{=<*b~E@igjo6L0QV(VhUhoJ*MsFnJ@Y;{6%xH_MaF2|QExVEWSjYm$}7-ym9 z9b1_lx`#($U0RX+XY6?l>}V+hxI6Au-~Kld6r5<;WL9wdj$#=hrx)E(yF5unw?0yd zK!taJT}|YHQ z_^cwM88kdO>uZyu;c|A?)Sc)=QrvjuAI~-hqScinDr|{E9m}U1h2r0oey2hKkZPaT zv8`!404wL6i0b>zMGh~w(Qx=zK9emjw4yx)Tm30i1G;HkeV>nrxG zMQa1~y>aRKiStpYej75!Mr9g3%3{_SvYUd*)yj6DFCKMUEEHM-VT%aM;hh!<6J^JE zvgcqsd&MmfAv=rOoh10e|i?6e8(d9>BA*c=AT2L*D%GU33aO*ifdtLRWLhr0? z#Zz5H5;O0F#UZX!FybUf7`jyyujC=$n1!f)GEELNe^(8~wDgg7k8MszJ2&8~?a`J+ z#%nksLHmYi2k)GZ6`gTA2RK0s35MC+!de7=A^9ThQ3eQ^64qvvt*b?Zmz3-W6)-MX zl{k)ruUj)qaWm`a5uh8SNX$JV~(F4CNq0P)tpm z;IsoClA;{s{yCk6BN2t)$iJx&c{&kWqWQwNN2;WoTYl^fo+K<`b(hw+;6q9Hd~G+r z4`j;vnMHeuk@*2A>UtGs-PfdnQx&b*4Cqu<<4O)e{R&@UsVgTy%=FTx_K_+?GSLKv znY3r@bzwA#S)EJ=bq)8_T+a55VEHOP$#GV~!6@eouJ{-iXt(ms@=cPcb~IyqwJMws zooesq$AAdosIKv0vw3m2p*u|3y3|nW%&B9`t?;;~09hj6%tY?{CaE)~j-d^zbSbQ*zbYJM^P`FHePGR!)9s=VRq5Zv&0xE>5ZM zb0TENXWWU~WwXu(R*6(9Sx6Yc4mbVZ-8Qka?8wSJEtd@49NCd+Bix~lfdXF>s(W-( zjB%vFkdiqbtdTFQFX&P3*&%bCL=m~6kEAmZ>|Hl6b{Mv0YRP!9+bf?)Pvs4^j0I_C zT4J}opyi~8aUF5zaoNCZeYo1pLpQwJ6(^@3h(BPJ%P!{}$j>>#m4>j+TpQYKD6^4% z*&PWxCrOQgm(ka;3y+0u`&uO|&6IpBZOG+ zEK9$=uGFosU96vJ>B{q}M_ITd{v3=^;78;(kCYGPU2(`i?Jc+wN-7Fy2~qj#`Dn@| z=iXyo7;yX?|JB2c*PbCP771k|dXG;V-#N#+J`vm50|FLL!Xq!-O)uCfUVKwTyvuD{ zn5K#eX?kKbPNbtnn?F3S-FF76=iYya>rM2VK3ciC0B!iH655(HoZiROVfHWKx=m%j z=b-V20S8x#{L%d^-;{Q6VTu9OwrLsR1={3Nz7pSDjBQp{j8+n9Pg6N1D?QTES`j(y zO7ce%gy!(lZ}xOTibk4K7l#fHTTkCFLhIzS39f-)`B{*yIGZKz-m71=NhOuC^(S!! z=z_j|t)Dg$Fo!{DiO)?Eo3^tmp#TVP_&!}%+i(q;Fvnw!2q)SPL8Iat0xaox=ySNT zwkbyyX}FB-D5l{#UgvpothMPVNl2Lc@9SrM_z@(bV(kX#tk&Ev>RvvYvo|g(eC^ zo%y>fvWoqy0tu^;^INKTX>D_lH8)dVc+=2#2?C<^)g#mKt$mn>^y*KGQLss*si`Es ziHwr@H^TW}{dmr3rxcRo^7GK&QadXbg1cNgsmEpq6q3C zDo1+=xffr;)O4lxGEMVOT646Ft}3Y_{~%k!v*0xMY5*4KKqOeLB8N}KoJ{CSx3b$h zC|YO8ocQh~*7wVN+j}mQ?Qd=$sZ-(c=@k>?PVaZ_=5b@uA=GucB7H4d8GRi;eNAq+ z@#<4Pj=a*FZj|2cd0p2D$x)WdCr?gPmcA>F<8CdyI39nt&G9PKe6dO3t@wAl$w`T9 ze+xH~{IeCEiN`Xa-$lR9z_?4Du-yZWdx`KMv@EpgQQYjNr~SD+0*~c3L{YSZO`*!` zN#%i$9UhnL+2Pi&#GY65D%H$2VVsCuhq1%63tY(SP^#MNRBhe5zTKtMH#bnIhULq_ z!H=sof7xlR6&apucv6EE(AoQ}jmB&SOOpM zNl@Uk0F61Kd<>KN*jO zjV6#SZx)sm|54};5}+H|k#YC1hS4-?vZi0DZF$A@e zHWDuac(f%0hhudbIFhJX*iT7tVlV^%N-K$1Jq2UKG^iHsyIxmUrxP1{O2t=;+V66| ztVPBgQ9-mhDW_6XoXnu{5?_-)vF@hnY~{#*Uc#`NkaH@#rPlH_PYt#5--a5hz?qyR@dX`ghb1 zb2$O5CaU1&l>N~Tn|yqs&iubR|cLs*$#OwZqoB#Amm<5(}_UE}ZR+&E|sCA4rV zq#z)DcBTgpXFFK7c`Mr967fkpWo(R2B&kryU;I;W3#gZz1YSN0#T6#|sFUnU8E931 z<%i2DP2FMaLwo*>>`3CLbbe@^wp@??P?brSGn~<8izQVS$#2g7nTWD7eeY$W$ujn2 z-_|FFww&)Nnqnu_hR7*&nSXwMtsSD$F+5tI-ioja+mdrR*ZKbYYww|1X}?@ENzYe0 zUlC$@RlJ7>w9Sh*z#cOJ0 zG7@MM99c{A4@oUG%ba+cMy1%uwA2Kk8E4_xzE}Nbb)`n=0v3_C9p5<9o+yJU?bOQdXm?1xZYpGu=^vi0m${ z2$Sl41GscG$yH!Y8@+1PqmTuvsAKvuKZc9=v^;TCFlLy#ye!f?tm@oMTooE4VJ@~Z zjiFFiJGHt5jI+%z7F3iQy&q_lL%!D?vQ z!-8itJE>f9axsI*3n}ps|Gf69dsPg61F`}gJl2$+US5!Q^q^yg@@<2U;eZ}+ZGjPo z_x46A2>JOrj_4!sf8&>epxx!oxK$&$3y#&7H+tw*kuq}3i7FbA&A`k|o`hC`Ez6+{ z@#KIAg{P$QrIAP?siw`z?j+ZgPBxFsS1Fl=<`oZMoXTz+J)t4NSME)1Yr@5idaCNG7G9yWJ1L=3LaU$p?>@3WwF?;o*|3FpE)f+~gl301DWAPD zY5l0yPtMbsSG|Y|E)Nh{v&76=9|WcMre53dM1OO;3Q8O8PCA}WO^Z|U5>*RN*E^&vjg3J%UUhr1GM)&d04u8!bngM$GqddA`gSulv=+CM8DW(>T}Ep-eUr zovDaM5AExxI(|F_liz3&?@cVgMc(PRXVkSdn{_@Wx_ZpEAki}M6^(|QZk>&5^>}WC zh(KFX1X&>(5YX-;cMDn^I$K=h`vbqJipPkfa4#mZh}J_;Z< zK|Q5QGmr!Yc1Vc!+8gwR9iIk0C8cD*?WECxGyT~glbSjU3<@ZV0Nm1Owp=8@{n zM|P__6>&WsR|2vahOESTq>3A0NSQQL`ls4z%!kHV7r&mTiBFRp;lSY$=pE;^z>0`X z?l};MVoBHgBZc;El_yR6iRk<0P?*ZXR}iO(Izmf)loU);&XY}j>Ev4pxwUWa;ck`g zbHu|nF-T2|YVXE-xg+06f?jK!QpCuSkGlXrm}vV*KcLtpfG_h@Njr9Q$l#W!iE@zZ-9`PpLN!_UlY%2_limGhfPRTklgI4Mnr|;DFoEsQ{$M`b zyb`R;+rC<+yU;Z`$;Mlo^dj%kn=Y=m!oTT)8uc`E)aD~m-&k3fUrtC=JUeUp2Lv?v zjF%>X_q(U3yNU7KCp)hBIO}p0vF`>AT~l|tAM)1fVVfF(|F^|Y1O&vG+OM651*@z6 zY})DEiq))pSPpgL+aRWU@aKaxava6q{768X>y%#MbP~ZL*?3N{jg4OIv$bsj2@x+K z9mfQhesJ&%>)*t+q<9B7R#u!wPNlA&(h>PG(Nl>hRM;)uwdvYqf5NERK3vx*f%F#f0C831(3@d zBm7XNrSvBZJ|G^1V|xFkMqvoVK^SxHTF(q;_O*N<`mE1YZa4U7Oi+))0>wMvPt#B5rY+6z^hN z?gfirLX)CZ)!)?*sP9gYG7z*B8o`)|Od)D3SY|Q^gWyF}NwVKn_GqLa0CBX|jFoCF zWHGU-eUfS&S?ZBB37PiCF^EXjkYZu13+)9UVxr3BX1h&6Oo(E7k0gfHsJ|<`E!s+1%2> zmu)P0oEGvzwK7sM4+uh6D`crt$Xoa$v5d>_E`8p!+2-0$O6$NI%YS(MyJyGTn+3qz z5j=T-aK(Q=9_Fl4vD;*feMn% zt7?n`-(1t8z_ql~%X~vO2pi%tg5on&PiN=Z^xvo4<3kI0-2Csf;Jz=2mm8O-&lW{M z0{5UjBLB5_o@f_QriT$tgDb!Mt<97A(88Fh{-i)D6vaO!s+i&>xJ@U`f+iEMKy7xM zz8bH9uR4pRm1OjLej;!F0ViCw(6{9|@uLbaXW54J{22OGcRjGB!etOp@r^4GdpPST z7Yj5Nxpx)UIRJyVu3;r|;c8I^{v7j7F@sHT{+xMXdDpt$Ka0yXlWS+h8_gFvpgif6 z8$Z!RE1cBxE97T%VR&O!>|*PAN71u7%kw<2>tBBV&`3&C6PG@#TDRUdD<7;bt5hz` z?rK-#iTt6$wgerc7baUmm8sS5k(6T1VxwvInD!*@?Dnp%0(~cNfnShaz!7 zj-L?AeH0Fe5r3tX)BNH}ajEkhn!eMf@H1 zz0FDOh6>6NRbztwj&Tm$hqBa!F~sZo0jf;97)oKXdL&(>|6aq;Lyf#7@nPzTa5E3j zlzpF1yZhqEJ!ZXTP-?%*_n99cxCMGI3W)#6nuS0hA6FjM+*YaRXS}$wK>wwo>>)>O4E_x+x00&mdZjp_X;YeFHP`x z2NY6dWy>BP6ao@KFeDVBFldl!PdICggQv;lI@$TOOGASYw^Kb5li`HJqKyV3N)dnk zNUMf1?d(yL|G&nmKyIuhb~6SWv=z56{$0>u(w3CqzWD?(9igWUGUcHq5(fSo)FOrA zSylfe z_z|fTaqS5_#^AEJnIf0!sditR190r~9xq&|*nDn2%r}aj>?O9n6F@t|SWFHvCMnKa?-0t?3XKSD zhhvuYLaR~_1Pl{*;)3O-jh2AsE+PAw_s6AonM9fXb6}sC1hJoHOTZ8EhJPg+ zpBTkWqVHuahd5;DF|o^{Scz&LJlbL$DV7HO;GIYgGhzx4%x~UtsT*g!FY$=k=AXZw zTOet(32$7WCHD%gdd6UK8GR6o8Qq#zw;8RO@t znF{ho+|Afxsdn$!&S8||iz_*ohlOF&*~q>rq63;brM}?!tMiPVJ@Ijh{}uXK8srS< zHSeNMgvpmDU#NI(>PAJz^gu74G&sbyCF)~){9~QU=P_=|Eqqg2Ib zvr=6HT23uES->uOt|{fOU2xbCg>r$qS8YF4uvd;((1UTN4RcOqmm-Y?ioQdmh+7X7 za-f_w7dzCm0CF|x?S@b8R(>o^Zrv~0zTH134)ehhTZk@$&%yeOJqaSU*uLI+k}{9D z%^16wdR9{l1ZqyinGenhz;-2IO4P3{SNpS*k`>1tG6tw$ubmN*4HAqfpW5^grS*M|ivF5U23Ut4NDVAMZ7Lv&ZE7V}2 zNNdU#$Bc#f|GT=B4bwujH!;>WD`t1#V+kqrOLIBcAf}(ZgdcnO;X?}k8dcpx#jgl9 z0t0j~eS2IHJ_4nV9MV5wPfJOPWi^hntOmJ|J+Z85bE#~LdCSi&T>IiE$&eptH>&GE zDV@zerLn4(h*wIFK*Oc)3n+n=SoRlB>1;uVzyrwAui$G$K}|=pwKhfx0Z=3L z8l+8C>3NkmQK)xqCUSXyTwAFzKaFR_APrCDmr%P_E^aCJv8nXp(w6F#+-X{jAAd_S zs986PDdQREWi$YtQu{6NMFHu$Gj(12uztaVr#xtMn*v8h9kek!12ygQR&yus8A{KB z(xQ4vza} zP3t<0e(gc~NCT8pJo7YBn5y2UiLCzw9d+6R;+MFx4<)r*@Mpc$ z`oeRCJFESO;gX)^_C}ax_Aqamrz2GHwMA!P7>nU^LSyzLA!lwS6@~E=(x^&6jxmQt z!jWLQUzV$1LkJ&E@%#gVJoe&*)#bmiYjkig=e&y}MIwAUkexNOA9|Lsw_6Uju%rn2 zXTDvXTp!jBP?TCUg-5NV}7(aRu zGp1!6cuGa%?A-ficAK=}JP!cMm)*)6s@*)@ck)s{v4&EqC%od9fw0$tcp9^Djewb} zmbAK4U=?VJ5A7PAAAM2;^5QJFp+}wiNsmtEb5w=Hm9qSkZpF{fkdTIgo~M+;-VqeW zaMo>ybnM>_Y=JiqXpOX%q~SF^tkH&XgFJ43%8l>|os+2$QMPQCi(ksh)3XoVnhmq; z;$+fp(-r$^yk^zfMcqvBA&qeCC3ZOHjahas=sz8!ZIf9Rj*Y%z;vie#eO zj^BWZd}4DhwFsS7@}EY!)#NL;zDS>abWb+J0R=L_4EMz-BGL67ggl+vx5+;48D`^s ziMv%P_z>@4T5b_i^QqJ=yIZr_3*AIR%HBaeh2^lmsJnB~YWlFSM?9I(3A6LW;uGyN zlqr@?Kb&26PANwQ^4rO>8kf*Kr3zVq?4Ga-N@jgh`X6E#5r5Co43tIJ z(s*{*=_Aoe%9(#b2t=%=ki6;WYEg+kuagAozol+5tCsJGPLqvZ2Hm}mV3i4d88&9A z!IS#8sVBh8W{9X2s?yz?NVc}jJ#L_U7QfqVoOi;r){>pV_y0+4B(vFu-xdZYOF11a7-`-faCuB_OQFSb z^PogI^mf^_;;rE9B^3!dFuUYa;y4dy!KQ1^-$aPznFdQOX#*HQ3eE#%t6sKP>q`Q& zXoWZ!j3~wDX({Z^{!gj9o&gO*AYhrF`DaFV}46d6DFLu-`OiGK2rHRG7kPv@bpY%tGc6UKhL|e};to;n6h`_4l zqJpXLVAHY?s+fG$OInC25F~A=<5+=lVcv8#T@~o3Ir{f(r|F}hQ^cR1xp)8&b@p<6 z`(81-4`TEz6eMwt7efaL%wunOwX*7y<%e@63`=*>E0zFh98vTW1w`53*2UDL){Vd@ z&E^^Nos3S=sdD0iY!?m5?o27bZ$}8ho+A|gyCmPAN=}}odXobXJ0Qc3{F2!G6r5ec zf66#?Nqdn4;r7*oCUKLdq?au z>Dc=q<}q<-(1O5Pl2ymPDZNmaxHz#rdgrlJY9W&kh!ED5j>I$dp)qAF;5Xe}R=fX0&*MIvf${KL=uz~8e35I$x0$!{@k+#K%#vaub z!JG7Ygn*IA2^=F+GWo4n{5vHkP)Snb!32c=t=5d%T&y&>S_R65LpqkZ>(3T>jlQ-A z5n+#B$L8Sjp%W%9X6s6P>nH{2Nhnk#`f_y$8Ig@L?Ojm$>Q)&o?sub1q;O|FBP;Tfh9frh=^o zFJFFje5^WDpgh*XwfUb*e@eu8p%hCj z|0jp+h@8&1x1TEe$`e5kdh(BaeNcgY41*xEOag`l|B%f==p?-YkG09LYerp~t8|Lt ze(YakC}$v`%3Bi6i*N;^b}X}-eBl3x5#--fLY*MyWPrFoW_xj{642GqFb0Z$(~6~J zoERS`GeH%T72h5?Du}3s^6cn51HA*dH$o@57JGwN8y{re&xv8tnYie`DKfQJB%gFU zWK1nZ@7$JIli2tF#JwB=`BFfw6f1HkHhK6I?y>}(6u9prP1x`?|F|BY0xy*^#3G+o zj*4o~!cgcESj_secYZ%=j!@@TcUrLBlHeoTthB?{>2&F$uR3W zzYqkpQtA}0{aos(zQ%4Nge1icdI@H>JEDClEnsVDtlW`bQ)61+xnGCjHsNgPC!hms zt%*}kGR8Gtvls|^yMv1@XgNx<+>5F6K0`*i31!jMyaJT(Z3hfvoQXz>*d zQnBBq!Y0(1GsDt#9dKPrbfIKw8Ah<@lU$rE5oienwazB(+5o^{U5(6h4TbRCZ1-?) zy=H)nwMW-(zjE)SPd|odk}xL;`;macokOUhRU5vJ4!BwR6Cf|bC>Q!~9gqAqW&bKI z&&L7MHHGwrD*vra?-x;)8(Lq;oi&t4=Wsin@j-m0&Gz(V3G};v%?TEMf_cR0JsQgl z(qgFspDyNxQIpsw1|GZUfTD1t_)~S&(&eXr6cvHmX8klgPoKenSBaFW;>A#($RTA? zvx}+|vHntTw*$ehP@CgZK`}%1OY1nN*~FZ#E>>n02jD%WFibwtFESm4N_%Wz%~=I) z|D7W*QvXy3l|m^}J>*-!iVC|Q_R8fHmL7dz@yQ0s?P^#=DCaZTRpSHnK9csKHeke08(XfKl)rM!PEr6N?DbcG=YG*yb;Z6 zn_+fDV4|#XXZ;@9P3eZC;-~Ry;_`w$Kjv08ORZ~`^bx8q1fIwZ{w|%vL-5D~S1NRD z?R`s#ZKeHzpcFL?gEg~m!Q$ZnrMhl=H)-@R+}Vk-i^A9UJLQ>gw(>SXb_y@kINH(6 zG7O0wY%E&SsFcy}lep7sL>{PgMW@KR1pQ`yE+dl{aRdOXJqx7u9z(Df3FfpEC%fldld_tcpu5h2s%%$?~)z zKT)V!e6UsA-&AnnS=LorROSQ?7$nkUDST8OvSX;_4PQ+%_tc7^clKmkUH0UqbF_{Pn@MP6ipR@F-q8+c95KvdVKpwC+>f@0955ZTO}>_-3Bg;5kB`{Xbj% zYFlb2SslHyNMte*BmzIUc~QqRLPdEtJ-0xI5C``9>+==@zt=fV zuyXTNp zpNR?!X%9$QlG={QihW{lF5C^0^UU9>fyhEL@1uXIeLO-K)96ar+v&3$o}JOpt?r?W zVz685<(pjUnlJfHAGs|K&k4)_x>ud=m1qtfHl zl_j)?Yh`txT4cvK!uhq=mdj!Z4L!}eo=?^AOC25qr0x*itqJ!3{W!4*sYe7L*wwTd| zn-kJO&L|HiAWD-&UyIBp_H00aBhtz73^IdeFrGWGh+eeB<7<Wwxl8eC0O0sp3#B->-@IB(ft zEf*r(ZY2kx@U_$`E;BIk=($B+_$LH6Iz2=+*ix(i~@N3xc` zgMmmg_`t6Zm8{xd_EuqO?^cLaQ$%DGSA3|i(Qz;&MIjM{g zX4He#mlu&oQg{R>>j`v}m3L4Zyk$|+md5<|u>kDOoxGQ=wgW82^&64_OZ1O@%!l3S z&pwnqwj(GOSP1;xG;XQdnA@xz>~hL}`f8O2XM>u)c@bcVKyPYEVzay*Z^kI3lW>DF-e4Vg;a|5Q6$6<3#yPu#!5rVm%ZYar@Ov}2cYuu*|jV%b60%!ZnA-vS68t!gJ`Ts%pJ2eD8 zWpSUFig$1{YH%21mqzg>vTu3ncc%6{!IfQ_T+;P3!b!;0au6Eqxk?H@SZRYhR$xY3 z7`_gXvIQ}!^^csSvyjL^P+p@?_*G&?n2Wik^MQ^)3#sWZptfMk8nt;gm*h=0+nsb7 z$*sR}`jqqoK>2hR=|2aKa4?si6kRj=O{CQq+>Thq_K#LE1prRfn;7nDpf{8l-0)8J zyZ6TA3f~vk9f=$*AlMX(RL?yhiyzOr-=pjY%MRM>v1;f>b86gVT#?DceHw1o^q0Jg zmdvqS`h4E~H z{sOieru~ucjOdxIlp}}%BN8QzBnG@0+lAh;taOfil@Jeoj2P;6jVfds$N^KdyS~uUyZ7jBiL?bp0zZ( z{edL@5a=Ul-LpJy4;hV;CEiEUE!b9+$=WVX;OXe^l-Q$>s*!zBlqql(si8Id3{{cS z4o@uySbO5TdzUM%bGB5o!}Kp04)8i{C&nkBHg3{=n-?Z#S&`I}F2`Gzzi&{K^vwA= z=<+2yH@0XyTbyIF>mbxspx3#k2G26gLW&+4&5;99X%BmH_%PX<8_wJjB*78g2ZeFM zVr5O{KWO|y;Bp9hym~c}_P;cJI|=BK#gC~1x(k+wbZvR$rwpLh24RSFHC!MqO6B?U zpBw5k*0&j0HGhl292a`x_6LfPP*?` zw%oT?A62!nJO-pno_KbM=umpudaXj8J1sE1M?h4w*{JlsZs1jJ;XJPC+Io?LR#E>M zxO3&TES(`hBw8wN-Gd!*|G0_7_K~lNY0M?++lprE3TZi~p+)`<8BEisIbh(!5}MkA zO5?Wj0C9DP;lcsJIf*d8acRfD7nn0FqBQvyLU4jMUuZDo4~`GX-zot%M_MpYXeU zk?@i}8-fv)Yx<2zYOdwKn^C4qQoW~vji`hhLLU?rPvMfntnZJyDezSVT{n-+BpSXK zGOQObx8g+(@DuR5Vz4RJz$@cssT!i^So*t56`)BvGzXR1zE>NtG$qG+`KqOU?Xb%DvYzC8vb?1XHE} z0_~+vQ5wy`Yo(%nY)!H;t1q6`N}B||#>lN|{yx4A<*3CMXH$(`tZrS@PKD4QcdJtL z{F{Th_BLLJ0cMYKP_TGHa>fzsTY*!+cq^@coGWUR^olX`2C=EwJ=Q z=7+PN0jW%EODp2Z>6;}}SAR>dq1XevqK|7R6ukq}7TIdTML)yFcbSb6o%W*b9%tpT zz-Da@UOL2FgNt70t`5~OjyZ77-x>OLUVrEiEisOo0`%OHN_ry!*`PY)1hC=*5xgJkUiE>wBld zk;Wm8!R0aAeo6>8*qA)+doaN8{%OU>c5O=8A+Lp}BI+2i@xqoHgoXI`7K|%zC1)E4 z^>6XU+qhD1*qiyImaqe9I;AEOx5nS&;GhV3HZ&p5mb>o=bYe~2p{sG{qe;h)S^ zkfw3m9>z}~cTU0$ZY1#xCFaDe!n|VnMU_r$O!i)U;gL|SeQIZsMP z0;GCll&IiyO?J{1gpo}Z7X0v|JGM*lEltYlS*->RCabb9SP-tBMEpcc9>Y?_GRZIA z0mQI!lBFK&dcYJ<{PQU=riIVJF^a!aX$^ijP$0FkvgwTFkElA+!(Bqkt5~t;toynojC@vrv-WbdSd+c`KiSsk+bz4 zpyUA-F}cAIZc-;I5Prui*yrW+D4JFJ*OL6pYR>}*t+ES9)C{;!uQk~{%x5-qnEL)P z*G6G5ERo8$3d|mss6Eo0xwIq&UV3SDj4_zq8x%>VG7eH2mLOnD-#2-!BCZI90ErC% zmGCI?AO9ht)EkS^LSQ|J>5}rXut=kRoaGEw8mDD|{W34@DUXsp6~)C4`^9mhua$aE zsDm@#fQPS(cxYFmaldf7X8Q#K`?Gdks9~>U3vFMJpVy^3E=DF`8@N&QZNZC;OesZHmdj5`U;i9kBfYe#1qE34;g#vo|r{CK=%gj-q3h4LyPoo7## z#|&B$nz&;SJ_}7p4vScR*tC~To-X@L^s8VPUkx^QY9Ol>u9#VUo57?4(LkTl%2pjH zKx>RJw^NmOUm-Ac{O)ID;It>M?}ux4#4}~??s;nV061nr+kWO=~Vek@9N4}Y) z@dR@W6!UmQo+ev0nHzhs>^SllsB^`FiC@PlYnUmpZaN|$WJ^m%)OO;9Ojghtek z^_TdYClpYpqkbC!L6jcSeBdCHZI-VkiQrq0SLTYz-^BMJ%Zt^C82N3d{dwBDOQ|R# z@Rf0w*e@kc)m6?eJkPARrKv5~u{TDvE}K8mp_klO*$o#)pzy7T|AyP*Y-j>P7_`Et z+!?ej_N(8!-7!L0XkFn*-KQ5rCxwTV*!UTb`*a#6c}$l3E3e)NJy&vF{4L}OlvGq# zfB9IXl)XI|GV75ghH;+?>u)u9{OoqsC}qc!lFGIrBMNgoGqRq_A&Bb@%=>&#r_mxd zBZaa{i3t-E3DU1QEn;pSj)F6n6yfv=R|JWbNhQH*HC4$^>j8X1x~KT^22^~Q_yU@1OMBuDPv z#H!3PlGxpb5~4m|&}Tni$ixQmME7dTFN35fSVRU>(E@`*WQ2%|L#&eP4|a50Efdqq z&7W7YDm4lv8F+>*JUfg>yp+%8>0=A9#6%L+n_uc1p?hSH8o__Tqf)A4by7JnXi6-O z(oD+5@Olt9`>9gzI0i_bm7GM>g!Ki6i?d@h?;}8xA*0i%Y0&mtG z;n^1ogz$H1E-ot=u)xG4q7^0Ul;zs>MZ6MQGUCdMnD+gz&6M@XYS7JuImvaN>nEA~oW-Qg^QiyD9Msx0O5jB^F)+WM$%lrbdPd-PJ<9^`1l(M1Zm3BnFk zM3uC=kRs}3m{Q@y@UYOrpMZj1MQhI8Lt}*GZPLC-i|O@>p2#go&cCHp=wI#BJ>Goh zgaAVjp0-&aemyw}GCSu>xfvR`NhqMYszvXms0T)Z5hFJAfX$d#%sF4~hPYD}E&UqC z6SpNO0qeE6Ty@)%u$R0ziRjK_%)7)z6fRD$#(@y$S0L?e7vj7zQ=n85KwyXx8110? z*=k;hVpmd?7?d+!fm`bSz-P9^PNbaHGgRF!Atua0OAKD8GeLJ;(;tcWkH%%g7wU>Q zk}h++AoQLt(mO}nkzk|R>{c#QdY@F(5 z=kTXZ;P9WFps9U-Xlsz3m~J^lYj&qSuOvT*(_IrdvZUo~bW&hLa25;*9`94{cmNre z{aDJF&`Hp}0-j0d2?2eLP0S=wEG^NoPV&!ol|w%3SoEfYj2wsERO%kekeCP}Hu>hl zUNEd0&tct1jimWhP~J2ri0n6b^gE(uOCJ0cMPk$%N8|!UdK%k~IUpx0*jh*yr0S*b zk;={nw=8;3rn-Z##kXgjW}*ibzJ-9qYw;Q%jlYbJR}9ncFL^aZomoGZrv@0qe=LRC zg5j4J+GB$7Znn5pofxE4`yjJPQR~>zX;HKad?Oc!-M%+v2*%q0&}|nZYvGV zaMa!GDX~qn(RBQ_I1OzrZO<1G9fRUTvNq;DLD8dcKyg*(jO8mzYspcT?AuyK3m|>Y z7}j&pf8+kCG~o0lI>n-ld!i2S+9x%1DOOw!@JLe|!~DHj0|x|72R}SLX~zMYFTfNb zM|kgDWGa+j+-)~r5ZLg1Q4|=I@DR_@& za6e2@Grf#?8W4~OzwooC)7z@A1-1{+%6q^dfwHi5b7+cUp)iPQjflP|+U1;Gx{>lozDsKm2-91NS zY4(T14=sNZAVRm`>L)C%`h+a_pnPAD*%b%B=8R*(i8c`(vsl9M{@9Kmp|p#2K?`gg zNLZ|+{J|Cvr=g6I=PC)A-pwBPayzh#SFJ855Ov0MA;m3f#MKpH1JJ(l`DGyz?#)Qr zQhtp}W74-Yox@^(X5)sv{j`<(X4hAi8KBwD$|G9Y0a$MHtIV%Mv{Nb<)HhK(ec{e| z%aHr{+TEbL+W`XaJZ}gc8AiHgSf{AZFBE26potb!)h=jom?VWNo#3TfRlH!G)-Pgn zHPvPsIh&|4A&k_jTjIZ4NfksFbZ_-PiO3ud_TS}fI`Xvpv+NyL!wI_ih~{|wSIaw=Xrrjl9L2$yPP zG(Mw2RXfA0&eRfgVayO{E&Q~4YPr4z()lU~sA)9*?b#(ePag8<@*&U(TC*Qm&h`8* zFUT1r-ZhRXIZm9I0-eZ4gz!9L5#Pw!Y+8V-^sgkgytw4<0cEI#jK_M6OpJ1VjhhR- zp5ye*d^^vh3I&TLWcz7-lqiepl7LOToZ@$u%ulqT{lsYge3~41dkU%0|ESr1U5k$0cwQ$>#qgIBuE>Gm5(9xziI&e&$R}6 z{ewge;>hKIku{!%Qhygz${DzgY?_cqN6 z__#k0)t#TRMPi3dE#hD56n$kJk+gZk-amD3@40s0y=~Ae!t`64?ZyF2#%SQ5;V!;P zLVBCZatZ~yk`|mnCEyE8MaP!S{IxdM5k&!tS?Dw0z6(&>2#DVxJI?7rjht)Ovu)s%96DHB->(|b=Yo5| zP9qG$-;NtvM{u&s)VT~MZL0YRtp=z3U(5+VyUNNqMQOjUJmeW&mJLTaTlLpP14#NR z6j#~j?tW{)1}M7xmW0j1+>Q+DS%>$74^qn7#;ptk{;-^Is8R2JvCnR3a-KB^Vka13 z>1vqt*FhK5J2#SVkmv~)dM#0Me`wQySxDj+$G8A@>G`QlJl};~%gnmxx0sL7^eyoO zAu;O~9Xl;HWl3YwTMCY517pn{W|%gH7+u!-EzfkSsviCwJKEi7C)LY6p7vCRRK2M7 z9=~^GoH~!tPiDTgJIR2}(u6WwPW4>ZVbyA!D+J`xPQcwTa>DM{?53C_<0mC<1Dq8z zayNMorMg*`&f54^Np@0>1`%bE#x&E)I}iN8nf!YK^@HCPr=qPN==1;8MI!@@rl!=tJUkqa1^QrI# z{|x_-C>>80h-m|YNyIf6RK6q0%!mkUqh}fAcS3)9D&~nis-b7mL+4I;+DR7A%p`Tm zz+u!wAe{2wzLXH_ClVR%7vR8^vf%*fso;ITKEzZuH>I&dX%J!hf+jzB-V;HB!=NPV}tyu9P&fdalRP}NoQQ3dZ6 zA<4K-pt84AL<+jix9$|r0vSI6c0yPw#v#z9L)0;u93W*XTKDHF%qr16{Z80HjM4pg z=k`)7uet80hbJX{N-|b}hmpPD8B15xAvV@c5LIaX2-Ge?0t_oek$Uf#tLm{v@jYq0 zZh5e+e$?bh)9;=PsTpv3ashly>@mbMly@$?G9Bi%rwwu4bp#pV*H{#cZ!bMWC}s93 z$~XM=#;DFUSnWnuO=&&&mTL5pk@atd>m+mRk?VeeB zyZVp8v3QjcoRJ%Pq^%~$1+OcUprfoUtpP%WV4L+(v8cxH_fL6gt5ah~ja*>i2Hd=( z?@4QEH(;8`=3cKdm?kAzW;4(JOEsZvR2M%C$mIHpl$*IKvK$)>`hw!WrqF;qN{=QJJVY{W51DC(~IghsCousCVrXs z34YYK7a4df|7_%!(AQ4ANm2=GM~DBa-}a~K5GT?P;I70FVI@-gfJvip+`pST5qi7v zKqjQU(QA6(13&qNLK64WBGae&zW|bU4cUuJ^zZ{tDEB_E9&@<4_42=-92Hc_g}QW_70$6ASWco zkyD7AOG>LMR(Bm^4M}@AB&!bXu9fSB!mmDGy_qe8`H*wPdxRqNrO|an)&VSWTgj04 zZn(5G=6Qy68}C*#_2!}-5scpwvOKA`Df&TpsoLeL{57qBy*RPOo0-D$QWSA$&$ZHx&>c#ULkfhJna9=Gj6FZwP=4&q+t{tY zVRcIKCsx#>B9VF+=88H02-AcT)e>Xf^lI6@eXnIz{2A8_XBs$(9?Dadcqb3c=h+@F zGLL8Q_obHl7{4H)oeh65+{8F&TZs2S_w>DS+N;7V)d6vq+=wZ}(N>;2eKCe&Y7B>-|BpvlP1G4=Z0<gnCUxyDVd$=k>dIYwzU8@yO5EAZ>^iwbAL-#TzDekMpNR2a;LL25v zZ+pS(pfAPhI1($)Uv%95*26wzPrqZ*LxrNvbjQK3X8Be6PaK@?5!^`FQ8<$+-aS>Q z>z^hTpBe>}l#+hzb=%OrbWLnNHuW}%MIosRu3MSB3Tb;e_M+dw#o1yB4|Xa2~|4)9@^z@~c2@ zInhEhLyw#Im8`=n#S+!OWD0fS3T&6TshiRF3VL(mFN;+Wc~m7(TTa<}S9!qr@WTCY z)bV80QqjFWZ`(?gUAdw!)XdJ%Ein!~YvRbIx;&*Y{&epG!qa%9IT>KC6JX3l4V?I^ z5!NyGIxN4yj0{zX8Uw24LfB`8wPe@F%fe%NdYp>w{kK2a?fq>9d3uawm zPo@fsH=O!0k13%kat_3(!L6gFB*lH##XkpFfh%u~yYm#>!W4Q)wY0Zhxi@%fa0l=g znmDmJ{aCB3R*t6}at=5FOrq+Y9whqb5XJU2jLPlKG|;DT(Jp(nnQgx`;VM62Q|UD0 zs6Gf_(rycvcR>M{-3`hGiwJV7L~UAs!)DXQzSG|tBF3nAl*+-(@Dq<~csiDFOin^K zFnIFyGB|6#`=*t`1R!XOYZXq_53_Ha?#)m636dl(5c0BkJ#8p%$h$z!gsIF<(Qbun ztx`m`^>V!rE5-3f#H2!z#T@YbRS$A%sv|ijLqpxGd{0zu3O$}Rp@5qh9Q4_~tKnBe zI#!2x?Uy@6O!r2J_RwhFOb~A+owU0KtTSLUD~ca**T=ezhduu=GdCN^4|EsT<0+Az zDWmGwWEi6VHzmzqK#y~V+FCy~|5uB|{|m;6k^KDAO?;qHR}CujKdL#DB##bzL-sXT zXEpu2&)4i60K0Zf^cvNNKj;L}mw(EDjU4#^hyEfR|D}C0P;z}xQ%N>BAljIK~EI(7wlQpWo?xHBbd4(kI`qqY+yxO%Y*`Wp^#{+Sl9= zaU@ZwNDjx}dCF!L0ZCNeni5F9r1usST*a;8qK2@pGC7>b;CRj;{_hCi1s=d?d5K%Y_Er5}*aXUiRwjj_K;OnfusVvTl>pUW(*`S|DHVmZyZ(eP?LZ!$05c1M`t zNdgN#3tRVHi+eJ!v2v5pGt#C0?K6E|hhDYw%x7|dSzuBDF+oyNx7)19Q3RG@`0(l? zh->Gtg4;nTMcs_zqL+6e8+vo0Ox8*C+kwy(+mbXco58ka9ttN$lE_`Pk}7Dv^KbMD zR#Vw`&ap7u%$ZrZ6Kg-%D{t_fH|`ewi;h}>^Cc@Dl2g2RfVKaBF!xPCngHFBU)w!x z+n%;<+qP}n)3$BfoVIP-w(soAZtUa6-nj8s)JxSl^;S_4Co@l0GGmyxZM@L7!>*6n ztHCcc9x%ND0HVc$3r0Y2{}o7^C3ey8>I7dvxXUsJA*cm_;jvDF1{hs|P=_XIj+0xF z$bR5S%t_Rkzy0IgZR0ze<--U!%5*XG&ngrJjamC(n4NJ;ErD-~cQ#rg7U`r1&0+oZ z)JDyKFK}>^G{xci z&7_HM`Iq*PxfD3uvDXy6@axpy3}6x;W%Mfxxl)s*2B%M_1_A-kwGc9WSuyU~#lePB z`W7Bu<}|e@n6EF6Q|;VSKK=d|Toxz$)~t}!#Yv+v^(xnN4KG06-RD|A zN;HkYXo&w+g2k#OzL+H^h_M-4b=VWZ_;tWd0f)+`EM3L`1y-}{UoZ)p*67w=ld32f zRJl>WZRpfy+#NW26zg+~lYtn^Nd!J)A7?-4^B&e45%^WALkuyMa&)_v4;L)Dfr+Hh zwx@2}Q`m%nzi4lDK{1HbyhTF^WX&{<{c*X{>yd#4Do`Q3dJ9fOHx`q6B3jO-2dPS*xnl+uApZB47oAlKNO_2^!%g!Jf%%U?D!{lm9+(H7j2gd~6D;>})xm#vv zEVC-`40>d*PP)n!&3LVasfw2rW97O=vhMt3#dC^@T2mucckzE*Fuo4}z!kS^0Tn>Y z{pw~-iT0j;QNuP!41ntW-%AW!Z4b_G)-`ze4N!kkH-q`cNPipur*J``BF`az$?zfy z!Hvg~D#9)40JLVcbVXZ5emw?jm zgYH3w*L_}Vn3AsV$|Jp@ei{j&&busvQ@EE#j(XVh>q9SVtL3P;k;t`>1rR6ga{K93 zKs1sO|9Xz*7)GJ_H7%E`)JB(@gz)@1pC}Cq>(DbY0eXe!OeQ7kqs>-8`ZBVu%s-#o zvshaY>JraZKT3(|q#-?BuAs@t)df{e>)-ZAanYNLlPjWpe_@S;nS5$&A69>K(6a== zi;S~G*V-!iz1C==5?>(%3XOFVq|9!0b6zSVr4NRq^3#57?{J9^cmgHQY7j8kq%}Dv z_s@gK0>fgCgjEu_!bH8k+`E_HRNUb=Rso%G2G_${QFf9Wyx<9|Ren{$PYUdxFn^>V zCL3dLC01oyD{XU9;WLnlfzU9^#GJ1cGSKl^sk}5dZKpV_llYmLOi)fQl0VpIq0xhT zbCr{F1ab7sm(uHPyQm4h%GRuC*YvLkP~&)7s5zjJXTt1AeB#pHFcMzj==w{?@l?{n z>@@Djv&78lLolyL3+Yz)RWofOekjzn;LvqfBYtiMCLM!n_B|gUY*IO4mvMOBE**m9 zOengFf^Nd|2ZeA-3sW-ul|C3br-uJ6&O${iWAW%3KrSw?W(wrl|XQ z-f!mp(j}!%{+;Zy5wZ$y6QX)xoTslVJDnEWDfg=}TgsYgrb;paWFEweP^?X$Hrz0#{_eaW za@0mG#-*q-5K!qR<*muqV0);-Z}UhkSNz))7mJ^&kfxpSFgMc8#4@ft!jN+w0$s@b z;FfhfrffE4{pi9Bde*rq3~ck`D7YpkQSfz+f9)7Ja{(k0Dg}xk)zLcr&)EdOS9YcJX;P z<7U^H;Hqf(9{3yItsQydQ!~&rQF(ojR`fP}nIe@!WWaC*z;zoaSYG z^5DfrA$AS7q`uGzw@I`zBx(Vod7Y!g$m;Vb$0LZ+sfQ!;i$UTZu{^qay9 z(?8QnN&Y~^Ka-%3g~hwc>52lbnp%USR&i=PFV!BZ*8@fj&asjGID-`l4bbYbxJHhw zN-b?=(5dz6en}7=y*|izy;?{!w$u?f9QFYAmGMW3p)#r)`fKp|jz)rI8Nn(^-v_e~ z#fpPP#T1Eoauq0OdtuT5Zz1iQOxmB$p7hV4_;{aHkv?#hg96!v;RivBMuq2RULp-C zo>xuE1{?ws2XiKp$$Z*l2PchCS((Fa<2Rnq56z@CKh{BTXQ7lv>eu|PZy$aeEWh&F zhp)sFr_^g`7lqvcog)qCFpv-~q2OUT;u`@`EBJdRXSX>pxgxuSZUokCg0ULly4YL^ zM&(@mB-!5=`elQL&NX~6tUpZPl17K=ot?ARW%cJg?lQ5ds;ki)@u)rGq-%Fiw&J`W z)7)gU7oQS2CDY^#NrymsCHU_l^pxiy{6YDwn0R^4@{CF)dFssE98n*!9~u7d}|@vuG$0C>jkW%MSckqGY>Im zjM!;K)W~t0ZkCOm7kZ*IE96vjO4z>QjIdeQI=-?=!SsIMug8D}{oC z(mg6^7pp3<7mY!Y?^!RQMwx>K@<5b@XZOucAmE5V)#S;LIDV3}jR3(Arr@~9Zqxjp z*f;7B2&9|n!)=;*opkUK!hKXZv3H2 zAHF*a`s@5QdYgl_*amm1!+p(mmFFQ({YlFqEl_w&t>#&;t{Y%>0 zd5CK#7vhv+j7MGySHm3NeW2d;gRYU@%E|$0;7Gf&zk@&erXFVB7#0W5Jm2ImouaQq zJ~h(ZI(Jl^pf-r&1hrhY-C9;QeDy7Au74HIGCux1p}8?5ukUl^{$4L^0rxv9YZn6N zW$jSz-__hqQGg(PamTFsA}YQJSwV>?OL-=oG5YIqvansVx{Z|;0Fd#O{`&pg5T5Tm zhA{+o3xn?XQH%fUQ1OV#i6h^e!%)703=XU}*jeYQ)F5{Ny17THcbk(<@Gdg_Aj%KS z0Lx6iUtCyvmv1s8i@I_h3$_D3(Sd0|dJ!++rx(6b6UZ;6!HLXhe7vuMdxM*9&bom& z6OW9anbNgkTh?dr#%rbIM;HUN5BB2kpBa^PQP7~duM9sMZF%hl{I{`|zVE_|w(XCj z4yFu8b9>wy`)duH*#+E)L~{B7XWb>Izf%_j0jRZ@JRiK9NZ$h6)TmzY43=1YLpQHV zP~2;h(mHmSuG&2_$COLGLtM+R8EiF-$(XfE2!uDfd=sVTYqR3X1_H$U^6 zNjF`8zXHdnT}1x+d+CjT79q0p4dyxIZYg2Fm9<0;Ob8RJYpSOP(J?J7rw5+Y7x62PCXtfs?9 z*{u}4*>#;ESWx2BBhMyO>x2m#<;Rk`x^?cDZClo1`^OroLNds`|(4WeB z*0I=-1UUI9&+npmsyKy|9tKOvHZtZpH78oPELO?e?>-A`_$)atn$XA63b0|U&r5!! zQe_OjHH-{7yBiF_@Lt2Totx*W;`|hx8N`)Q&Lc0sD{2vEt?WUggN!geW;bZcJnb*S zGCW4;5e^&RR**R%{QfBwTTS6C`J^W?c}??@;;2$I%mg(Ti2j_+30g1(Z^%!Q=YU=3 z88lgJUhW}{Jaiz5&Ahh8XBSg~#3;T}p{~&jH5b=wA`K+sa>6{U(y)Uq9_JmYhsI&T zrjhPb169?(?V8u!*9`2aVi@UVL@2E}JyjTsbZWfWP9BX+VEgTlHMh1#pDZvpR9(Z? z(ADm{a4}ko+$$%>x7S z9(;;NTEuOb6!)a?t59){DUmnf{0tK!FT$Bwdiejyfd=`1A^?UE^};G&CD=A!)lMcD z)z`C6VmABa*f4Z~(qQGWi&l6h6W7F%2w<0b<&wn4^zs+PV2$$+J&b?InKE=iRQ}oz zEPJ~{kbprZo3(T;BlzpQh&fRM6g_uMi7D<)+Z-&SY^!z>!sZ(b8+D-a8jWnCH@iV7 z(d2d3?#02Ds;&BsTY;_T%0TOF%r;6PX2xkTG9S}fI34a9KBkE5}1kd^*kN{>FD1>%WsP9 zD>=Thszep&k*fhYg9+vlkXP30Bd&BR#js$JTLw6M+c>tRTDd!b$8F3e(Q^&){qCOl zkhIkLIp?H9;w)QDA3ZxUTP~j7-uH`MIVZ<8-%0^DZPWU7Y9~RII^YuKJ4I{^nMi5@ zW~Z^AZ4>?CAWI5lrmz=(cwG{xHL1UQ$C_Y;$yT~7RklI@cRGtYpIwBEI>y*TYt?9p zlY+=K$%u@0AKWxor zYPqoWcdX|{LdU8OLmB^_&9>WhHzkZvQHG~@TGrn-b&3=ZsBz1Bzhk}P90H%X40Agj znQw;#RHd}j2n8H4F`bboxulbX`Ii3U>nIw90itM5@4$P*42#5mrwQ#tfPD5F6W7pU z2|s1uS>KewK+iIaABW38OcHgg7skm0$UfuYt6nGTEz1vQ^2^>7zw4}JKS@U6F%l-(&_3x7`d72?h+a@Bu>0Lg>5h@b>^u-& zJwcoar=Aef11rZa zkfnSf$5@1>3O>xoj8dW-N+oi{MebVCz{UbT8TrD4G6RaPvwcTw)e(K`_&&g`$ zz>?ct&f(rYr;uH4=)xTm!dFh4j*8VUSyhCPI*JmJOVV>6^8MRK_b(bMiY^isOT=DO zUZ+z{ce1(M8E7|${XZ8E+M+>dLIP)AB1i0LIgNL_G1s&J;R72=iCfKA17?8uZ#fZR z#dx@&*Ny0`qSY-BN#$O)J+Z8j0vNeXPU3p-##O>;Dr^W)oHc7m$4kD#=SfN6LC5-| zX=;7};}lcSNqhz>p3_8cd)u9t+N`XL5|xOkN8b`1KiiCY7tlV*!`mR!M%p?&Cr+j{ z&w^(aDFN!ChaJ0LqA9x+y|M<70q$5bC;JL!z>@{tHLub1tmY(B`LbV4+UatL3icAvmCgd`wj@@(Wgq>w=vs#wqVOd{Rs^ z=gr^`PMgtLE%1eY@wh*zI+5t}z6M3R zwtOyMod3z!TYshrpRsHTOvdEMJlQ=>?Zo+S^-9EX&@tZdZGt%}-FD!5C?{Le=@m$cgbWK+uPPqw1adj-f?VvL+>Wuwi@QfSa!BH`1Q-pU52J>l_-N*G#)rlfs0hjOJRBM{+L9ZdylvFpZ zWO*Szkjypp62IB8onye#89CrD$bwxh1wAe-wIIXj%>WaLj zXwmh9FUE|e+lPV+P_0Z09X{IW9ypfpG|c5yRn-sGZ3K| zI+YX3;;{g$Dk=ZvCSYqa{XvoG9rzn>XQStFc@6YZL>V6`txYh-EhCx&sMqn0h1WfI zatkjy&z#TM5521%Osgjzy^h1BXN#}-8e)2tSuXyQsiWuYSjN8%VvZG0DYfJ!q{(9A zEy9MEPkto_1l;g9Jw-&x$V9UZGqf5S<6dW>L;cO;A2lBut=i!9F}_SfKUUG<)g7V3 z>pj;98r{7~WU-)?ZEMDpSJ=tIvt=qXE})AMpzE`Fh9TmTL&BRA_EIcDzPoiECh+{8 z&nop{u~c0RZ&?}wntV#;D5}=bwjt%-J#f=)Hr$X~84=R7=H;sgseNYO?JN+|vEqp) z3dclX6VjF}s%TH?Yv@QA=ae}aGC+7i}rrB>s1D`#F?XFfb52YbeFQxz=muclcFsk`2|h^a9*PCe^_!l2rBN^ z0-EX^yl1x&%MYCEpuYMpLO1>-tl6~3j>L~n=E6U5N~m0oQNxn_xlr@l-*G+mz!5Xk ztZyC?>)A#K^aDDs`=|W;392LHEbVhx45nF0mBX?_UrKaet+t>9&b6c=y9KZGfkX{|Ra zgTZG_)91*_Q2CAR={%op@+^s$bIW7dK*Ask|78srX*cIxF@1RJR5gxV`^{VCH`kO+ z;od@4*4@Ke>n3wz0h%&zcq25xR&Uvd{}&iFGPgU)%Pwkj`s4663Q-%GDHSfMPagWS zSW=d=Cw2TraC0!zVjT;)$W!&0>@ExsGg{|mF@t95BYQM&oR0`=8fuV^1 zPr$&m;2bdnjH@!{Hiae}LiJ*pW`#JvZdrD@1R|wK9i(9_BbXR)-^ro3mej?;V$&~D z?{IPY2E~~#DHtXv9+!m9UG()KoWG*@g14g7y#=*dIK3n5o49HUmL!sJ{$v!QfwWc{ zDKD|aeY^HkOYm|sR&$W7n&2<>8o8AMx$(YaN}%|!H@_(0x~^MkEcF>!nFXRE-8e-V z?vZY=;WTne-X?lxC1}eW6TZWpn{Fis>Hq}|-|Wgt`(e^$D_mX!A^ke!ArRac^9yOL2|3g94(N2O7!>-NS*r!WlLC;h}O4!;9>Q>AV%a!NBjxX z*qu{1YZ%HP>Ov@$TgZzomy{p(#?L-TQP3wMacQcjeZ2sV_PzY1wO;%XTPOUkZi($` zVmU8O<+d}y|LnGcQa8M%FHh6z9d<+V1iYWCoBMYNiDg_CsG9G9iMPJP$M9S~_d*o^ zViiP<02M&$wrV(R`8tgO{!>viRUdZ29A;Vkv!7|dM7`MCD4*4N7aSOe zEgyK2!VU9haQqvYTL!VU-wJh=9;#1{r<;MhDI&9QLoWa>RghcqPLE94W>g*7_!MvIVl z10V5ka2D1img=5+no0z>_&68dHTaZMHmk^lZ?jCz_m6qEPJ>3WiBd3nFDhRZ-+N*U zIo2f|M|&t*T~Pyd6wmlh@;I3JPJ_T~@dv@v&#ixi15ZNk%?PSB9j1V#({Cweua_Kz zQo%nHKRPFm{1Z)@1P{*~xf@+<*wkQ!3dJSPLTbX|u>F%$PW?;pIC02^!Aom}dxvC`1efk%>~*)8FWyWGTudOt7611@7L=3x$EvTkGgp5r`) zPyZP%aBvTXOUq*t=6;Q-i;(DN+m_4hosgV3aZ0EIU33yp;=PmoM;BD*0#i=bGP|?4 zkxlh|W9!7&9yO>K?lMMOttnFiRBmIjGx~T{niLS)13N`R&V4<5u%G&uqW*Cea66NA z>*rpfdnPCh+*#ghNlhFrYOfpb%IOmm$(Qs)Nh@P6mqXrVL@_$?=R&ZH6vnaN-i>;3 z8mN0fAr)zGy=vL4v6(QpmfR;qqsPqSmEs>BF3^r#>V22;Y={;)EQ#mT84n6z`}}&c zg@ApH2v;Eva@12!O~03hSa_}0?G*o*cBMG@eTH8+2~V2cTjP0Q9^Bw+KpC-|+HG0N z_Uki~nzii;e75P&3i{u=23@)5?UYROm+8AxSx^d}0{s)ITfRoMd$$4}w_gg>F@p4# zuNG17CeG4|PHnh+?P&~AoS)Wg zsh*RwpOC^Aof_4%U|`XIp|{OdIwdd_2IK3Sx^SzIlREIUR?)wFN;go8Y?{aj3yKJN zjTyGMB7&rOX3^0}>_=vIJg80KTplx`#QrBWIF* z&nQ}%RPc!AvXF+Z*%EMRf0-8CoPH@EnzsWg{2I+g+h zT%q^?#gW5G#D;I4OOjL`X4F-Ee%$LG6;MO*3Ri|X3W?l(NSl5nPau+@oUSBDA>RZF z*b06S(`(q533fJ|HpSK!epUx&@m5N%VYUVC+E~(6s?PiNMZxh_7_0LqRr<^8woFLxj6ai?-l9NyB zsNLLMhY%e@L5N@Rx>P*yJGIygNfHln=AH5UajrPM__g2-Z|m6gVI!!x!qWU@YN(22 z?hO3!GEJ$TfRa>ch+-CvZT(>>?~ip2_0!ievkU|uf=i7aBL>3qG_Q)dQEECX(o^}u z=;*fjIiWEka;?7|b9@zbg5sIPj&g&)yroT0n)tOss6SllZQ`HB3T21JzzUZ4`gQWm;0$DgynlpPD}%7l7t7;Xk=GS@sZ zQ7&151z)u;wm=s1EmeBDkkbHqs2siSXtPm4*NDf9Dqw}^w$OA{(O|3t+NC;tv*@c8 zxVw6PRAWG37nH51qQ`nyo_noQLst>!nAK;=Md2n7T+GDxF)mBP5F*K;A!8(S??Miw z?x;m#h4R$#fg(MjH1Ds{4`7dRNs+pJ9-Yf zcDTPB8<>r}b~`uDToajCYh!&p(-fs<1d$m9A|%<|b1eCP-m6=P=HPyj;-{cn(i5~+ zSbT{Z5vIgFCi-`A8_L}TL311OI3Uc~$1AwtAGpbyGxS>J!oHI|;_wD7Ecz?m@(uXq z<6fy~=peR#r6oK|0m)o|mN1g_Yy>NLdxvBnI@b1heSaJFrm5c;lc+0lxJsZJKiG4w$41u^+Yr~Mo$?_X!aCCMP(&r+kKVCZTUp^E*CUAPPKF$l3L8< zf%1l%L;l)9=J}$^)ra%rv*HFmr|mxBzMC$<8?@vvnt}9{)`8<{_-bnc<09|xa!`UXu=Jt<6X67OvUCAMLCrt+$kxxD_701 zfO!|dAMe)Y-vvMRD|PPFd$WuF{7dz#RX+BiK6py}^*nfv-aC z`I#DwHB9K*@BO0jN{_|-yjC^xT8d?xgNvovj>lB>!Qrv8vjmkOOSc=-{+qk7{}V%s z?dBqGAAT4oWU4KypujauI6Z(3d@9ftNrPUf$-52vInV2& z=VZy$7z;-tp~WLL5;AC`YgyyYf?w1!S>a9{m2m?VG92srtAd`RzeBR-%wAz z!)SBD?oM~-LzGTmz|h+4*%a^;B*P$C*UwS8><=4!H1lRMBEa9#XC?q<(S3xIp%qXo zJL51>~<044pyoV+V%C{yVQ&jJBKv4Pj zo|!m_k(F!i9-+evLhK@;l{Y{5+`BpoW$Wy&}b$@-a75bVDuM-oI&&ROZ;u z|9;0s0PjK2!L1(jd@0+cxdx;N+>POTxCrwe$(rY-XCR0%@Fzx24#w;sD%(0o`gS^F zBCyrK(ZH4X&VRk_p!l;t6H9&85BbyaS zP~hFVfhg4$(PF5-OOzk?@&?a?mTy`B=i6DAg&) z^LyBy2bUM3RmqLXjP7F}3T?#N2(~d>O4F$vf{71cJaurc;Kdo|Ng`@Hb=;|RR65l9 z$mh6H2VNKjbTsNGQ{py`{gU$RFF=Je_7h=G!VWws>d%9ue=Y4qlqz++-ITsLzr>3T z>8{<_CQHb^Q>V)5+xKNxm4d_{6wi6_JXM*veS^=t55!o|W<-)Njxo^-c;2Z@ew~&_ z#a(e?vs*NokFC}c*#?YAljbhb8C;PB9VoMJt2e`w(JQmEn4YgPr^idy^kRjO#1ntv z-)H2X=Xqo4#W>wlG=S#P)u1l?90fLWh>-At3?=6><|~Pd|LU5D4k5QUs3gQZ`!_@KWsc`- z=j>fIBKtk%BOyIZ=55vR4%kr$=VWxo^Lf{lFNwxuGT&z!{!jl*vF*KchhDOUH{j)Nf&z<4AlRp9NKQH0(TlRy*f|2+(Q;mZ0vKigajQes0%ANf1 zGzq0lP#E&WmS}D=3r}(t{p(ZOHh~q%)j;5r@T}dvKcPqWPM@JD6iDT6JuV_+u00d6~CPKv&A*~0q>M~L>Og4iv z0sjb{4c98NjsyL4V0k>u1O*r9+(cEOudWok-+dd`7aFc;NPde^Z}s{{RkdZ2R%^o2 zD5=wJp%V^LRuE(|p_Ab*0W$qmlbR=P9=G$xJU8+mOu&;5f&32)LjZ0LlCM}zBBZH3 zZP6EOX!JD8-4MoQ%DJD=Nm{Ui z+pnFDb=#erRcH?6-pQZ&3bqlr`>xH5zj8LKqwO%!N>Ji>Z9hG*Z?Tog|qhkA4(&#SJ|UTNrlEC8jr0^E)5E2HH&abf05i@R45xsAJ~+XG8_Kx zpy7+_s`f=n(AV;v`3;N5yV4bYpUDIRaxHS36@=R9GB+82E_y&QBKIjexc6HM;o&4$ zCR#+Yk|ee0Q5J-3h0fqdM?|27!gN_47eD-3_gI^_E|!yCP7MC79B2HtdQk8*ch$5* z^$#gztUW62_mc-R=rDI1j~G-Yn3QRY6%H~FXAkOWaAhRzVtUD*5BOF}Y2M!R-{fRP z^}fh4vVr@wJfji>#ectWg!|%_5KF*U47KjF7s4{nC5f^i+KTAzYu_c)QR9Y_qxX*A zEM`W4KHcFw1LU$A&KvY&RflH7n8wd}e4Xl{xA&lz(KP|*;U8%Vu{VoK|JZ`q}OLIdr!6nB&zL5%Jv2(pHsK}i|M=9 ze{$%!jbiYsX(mDQ10zUSGGl0v)~S92ei2pWAUVEl!_3v}G#FXshTP853%OE$*unjr zzf4BS1S>JeW`!ev?1^q*wzfn{p0YDy(kZYZW;qiqR3QNa6U4rJkiEZi;ANwB+)YLj z!RcnOJBum^z@@*)8Do-=aLoX1&fK)#S6=_=6F0cjymGalh)&HZWdkH~`h<_{5X{N)-U%39bQRdozj(;p(N(3{qN# z?;3|kyp%Ens|N!vHYu6|5jRwf_&R`ud2DA(o->0}bfh{KOqvhye)*>Fi#VL-*9=`! zPLEKlul?7l;4lxI!frR(P?6h!*OZY`&>sI`&j*IQ(QtJB4?=#W$k|H$twyo=t6%u} zvfZ;?bk`S}ywzl4X`Bt@R)MFJPPay(4L>mAYR&P*rEq@z$2t z#driXfWP$kYMIIf8l%j8fHK!jW+G}GgP)`QHg#)Yh8>h2W9U8MXGz*InQ40m=&X1- zmb>7ucKA;=`HE{6AgM6ogrw)DBF%}E-nuL9@Dnx}yKJ;%yg4c?d1?wUn@K90H}elR z)kORng>1zZ;}HagdZX6wDGK4b1{HMR@kJjJvJ$c?%@X1kEzTkXniWLyIBgbPrcwdU zM!;zubOVjeg0i=?m=6N2vX3tkfOfJYsvguVxVelU5(ZUTAqv}W$Xq!<1Jg$X8izLp zJ{i!~tfoqeD>mKHQAk5lSCIGs>)lGc)?4c0l!z&zu(pPZTGkcDM9U_gg3mC)!jJ#v z1b@-HsvJPB$+!b~YC`rd6*rA_Sd+73UD=J^)Tw3SmBZ88QZze%8WzK-Xg|=*yR;bt z3h^Ua46>@UY(#!7xTt@=fQL%R<}#~8aJ_CEbxHSp)|)`)_p=la3aUoRQTT1w;Ue9U z@T6wqY1!CmeOE6WlgoC@%D18@3jWdgu5kQ)d%FqkFfg`yxTRcWdll6!=My7ZGRAYA z68nMK&zwi9w4IdWg07&7(`^}!m>WOLp+idF_G)*KD}#kEK#mOYWrR&j7W|@FuWzW~ z$U_^BpUEiq757HKJE}_$Nij$i*)6}bUP2F;Pem{TwruC7y6#hJ zT9Ar2d{NR5H9T(k@sg4!=vui)DWW`ejkN{@UsegyH1_n0f1@Ke;FlHaYxQ6xRcCl( z$mCe@@c%e-*tEdAtZ#|j4G`3^t~}Z78n4!(@&ZXd{c1w$KC-ah)k>}Oow$co-hb9| zj09-|;-bK_jfMC&R1}keYTi5)LFj@w8V8kXPMzOD7Cpv%Rl$gH|Bpef}_k+ z|I^%7{bk}IDY!2^v(ZYg*Qz-!^y}1r? z4o<_^i$MvO==FCn=To;8Vv^^_a>jD1^}Z}!1QqT*#IK1CVna+=OO|)$p3YBbF$#R8 zPa>lnf5%*#@46E{xP5R<;H*dYv3eC`cNtwG!ZT3zmen0=(Y`gQ++Sx1trt@+P3NAr z%7*b0k}>4di-o0g0uJ00i=0%$Ui3d1E^^H`x~YWr3DVaCJ%f`JA)q6SIKuwE_@I)M zA2~Aw3{7cmn#MIg|M&;(l7!tp5ipCFqi#x1Qm2|%7M=))I}^WF;~a)YQeW1;f{K8$ zQ=scJR$rxj2Eom!i?J^(Hu&R9Exxje6(*mqsVAQgE-|l|ukdeZhtKftZ0CmWjH8+VS!6ce4?(!r^zU>>O?A`QR*=9igoE&`TAvtxPD7i;Rka=O zbUVrwk*FwX-uHud^B(j7 zsb3=Dq|iHvo~`&JFFIs%c*dJfAsT5jmF#paf~x)o-y}GU2FR@zcW*)cWYi%US}NFV z2u(QT=w@L&#p7!Mm^fgP%7Ywc0k-^7SK!cY=$PNM+riz zHovWTob1-rXo@tuA+Tzec-r^Q+D_0O%!3dUr5CHn$9u0P< zv@B?z7*QA{e+r#P3PS~Q5T&g0TOe)lOD6W#>ggN=GLpoI1&-E6SL$YkyOS<& ze>1J8hlz=h{a1;GLLIb<+S;xBnJj_YP!eG^!`X;M=T~vq8Bx1SzP$PLb`b#i>%CBU|&X?^V_%_PC z4CPc1H>tw#Yk9wxCT`F{D7yKGDR|7^>;X5&=Zv+2n=R+8Zot*w6!}gq3&iiIDDEv5 z5+QgC~$#2g6qba_qPmwFFZ(#GHA1XWe161 zxp=r}coSjm`@G_bpMwbqr62 z9Y=+Wo&};LrzVWJRbK3rpQ?$tOKD!K2pq0?@fNqG1y-yH`$(9BIHV5OAb7a_H8Lef zP8sZZO|()TQ$+`htp9Yy=@KUhXJw)C>3`;S?msskA1APg%3f@*E^%b7YB+o2`?Gxd~NB3Mv`+6sV;t(?9z-2vGE7M#uWs+ z0cb%t*G0PVAx{~5hJa?v3wd(^}pGPJy4aiM2SOlVEQunTfuHtCquH3?dizvp79 zohIUMujvLHTWPn#dZg%Pqj6Z9#%eXVjNi7eD62 zkI2q`4*XY>;tTpZlCMb!?s7_iJoo6Q|B*53vRgPQBUrm;Dg26N| z_>LoJS@!U1k|#WOy_yFCaS~c?Vd6Xgh^^nbSLK8`z_l&BI~g;SAbTFz-FkK-_Y_JO zQ5XVo&r2K-sUf=0m(aqZ0@-~7pc>RhYxPuJV&*qN3v>Sfaas}k|E|rc#KLasGBsf@yFYnRJBY)M80MI6qU;ahb35ll#MLq*OVw|38*l`HTq>2J z{9)t9Tet~<50<1^g^|5TL+;OXM_wSaO(q+4aOpA{NHRmtHC1Wu04{tYZ7p!SkH2_o zjdjs12Td!;QN(7+R*nnK-}Ir?E`!)jbDP{wKlv*O%^unp5g82E7m7UT+WrmAGA5XG zLk@*UUJn=KSO1-;gtv$1wBAaGteI(zDO8H;JokN!>O0=ZQw#`$v zZQHhO+qP}nwryLdY`dyYcdt8oKj5vE!<=XA+!65=qklxuNPLcIW4G034ZnL~RRcEz zrTF^wAmOVl3p23fojZCh+t0|YD5B?EKFk$D_-r%<`vAyTA;KG{0${T_qm$%q&2!qa z1Fj&7J`BizuQyuSVtHCr;m_qiEQ4-(4|+j%gHh`< zNG@nA*=PUcpxVqG0eBd4%z`I3yKrP|Ugom?nZfKy#=Dvu96BQv3O)AnnA#TGZK($D zPYj8rW@};0NOBDujMfI)C^nosJzMR708zC4;@p>8us=p?USNG94D=pMss{}U^2`!9 zV&T3p+Ee1dRmn!f71saDTT_|I?FMQqONZbn2LKndFHE^*N$?;dz95bP@!}ug@HknK zj#o0n_q>Az&M#WF1_L*ia{!{1&31&z-QC&hq=mHnaCK;#T*S>EEu?*IW?C9lT=9pf z!TwqcuKxB&iu-q);i|Nj$@Z=BimnFEcc^n~>viKN2ySncp9*FT0IP1k(l-vhTR|8@ zzJHjHF2!7xd|Qsl&yPaZrZSRh=`-3kNJ=wMa7{PznXD#GW2ToMh~?RJ5Q@d9?O?&i z#7ffn3Tm=NwcBF9o1nY^u&gcJCj00nZv|Nm^AD2=`^%a+0PFnanQCTs58W3*Q(Ucfk%b)?9{j&~ieV-&*+ z#Pe0bzD)&EF?sY;wJ!P(nHF@z&B%{j$6=uOVe(B@=*&y>&6s#(em-uJXilz>u$%ai za*D=2LzYxDx_)U>e}6Gl{62-O-dxq=+|_*T~alFegnWAe2Wg zs&AB)KxVH#fIA|K4e1Zwbj(^t)QLQN(b}BcBQ#D1DwAq&b@{u8(}RGgmfOqR+?a)c z`vx+mL&=8*(_vJEjh0z$UvPDp3H7he*sv^2Q-`!jP3V04L)q(95XK9| z+s9183?a2vZ+i}?Ja=BZN$j+GUxRBd-FEL%dTc*;k=knZyarXDyKdbjciVh!|F^E* z`2zsreW8&SRizptX56dG!NrxL7~;D{CgmxdpcOwAbF~N2um*5Q2EV4NdJ0 zf+ND#d%n~%o5f}MGBo3o1eR*fwD4#B~W>*hFnBx_qq;m#1R`+CyHB_mIhVjQ8Ph(O~6_U_e_A#0VW}pN*3^ zv4-7U$z?F#hv09c>!$hC)CRo<+yq&Ac1ct#RQv+tZ35=Hc(D|GJ_Mzp+&grq5Ka_> zg1TmJd_@&)8MR7Mt9jjr>@DX$gPGotIU_6F28;8NReLvc>O=Jl0Ui#v7pf{+RO7I0 z{dO%}vosbRYmLiLBipK`_yr6*ooF1_EJ37b?6k9YEb;FsX7j^OK~uK4DRZ@-pD|UH z$M>Z#8TkgGoO5W`D01Rb!4--GEcmpjjPcuel%T;`!SJQQ{UuWuisw<5p#0&)F^Y_B{b;uK~HG$coJcyl(JvL#>h zki6W7**hhK`-)Q6ji2Z z1$X3ME;z~L!wG2#9=yxD-WG{U@{+;C`7PyP241P@Kxxsnd#YzDdYDb!mP%o*nU|?m zB_q+B2+?8qwW8p*(h`a*2NOjN$KixCx@RM}k|kUD$_Xa}kvR=el1O$-R_PA@4tf{* zm1bZ?T~gnJ!^ERGFaVi%v0BN*2sP0@+M`q5fJ6Eqrnr1fS0)bK>l3W$fft7>95jZ(9E z>4<2mp)>&3o~vb@P4tls9U44p|MHzbZMw9zDUGlD5Te!@5uQb1WwREbVkfSiXoQN< zOiq$?f%^2);R`W91`So#!a8y;Gt3@&$l+3=={Eu=HZ=2w^L6k6&3aEti}}$Xru5d3oo9I@&Y|(k2F{6%3f%T?YMAM5ADf zSz%@`(&Vz=s@DWyHj8h(?91hF4Lr z<`?=;%5NH*yu5gX(BJx&&MJRIip^HZv;M+w^plbhA`ATT z>y zOf&Jx$-i2}GL)i=9^Wr z_x~VRwtB%Lo1s6I6&d_#uRWwNv6lt-$JMwQE3G(a;Ka;L?a)#@kK~f1^sDeE3+{91 zQKxYi^Pp?pGHg_I7~?;Pznm_h0FxwTyr1mk1)2*MH+|^k5@bA(j_gA!UNuV;Dd2yRhubYryKxly|=={Hp zSK59f5og8E{36GEw>M;qbjebGS;d^Dk&cn7VTz9x+mxnlei0}uP^jkVpmIO$iX_JynQ|&#d{wk z{@AYM9`mTGCpJA60lSQ~^k>wm5h-?a0Fe9AR(my^=%f`V-sJ^R!dfhqKv5pk7f>XC zr3ugV-huT~Ne%*9P#Ek-tBr&ns8uzeB+782*SW&Qx+4n@=9S`r0g4JTuMMT>SUWh4 z1JE~UIX_K(R;S+_zdD*^H&q*l`&^W~^ zH7KNH0W&geVQYZ?Sxf>ysEc)+N6q05h*8eH?Xe4-=mZVOF&Lzu9o~WLFWo|{lnI%# zTkX?W-O)s76xr~t@-1Q&P*csLzgEoBrt^Tac@(U>Ecv@vRHwi=vrJ<50++BC3y5bg zCmzg8xyqPqP?lMQpBB}{#_D4dr$@XU+qAwzU7p#PQH;A}KsrC!)#?q%t-4 zvWiB>*ifuMq#8Nk4G=0X+bt!%e9{WLgRItK|wySdPA!VyJ@J-3k5I zHwVSm#m7hYfXjkptwOS-?c*hF2}RcDBB2IFXmB*{HnV1k1R8&uUKcfZ^RZUYICZrn z{6nOIJk#f5hrNok|7{sc^u5D3y09RUdF5k|c)b8!y{P@PJ=QL16m=?4-`&q97HGy> zw#zz7N#|YaFq+ZauX}Aj?*2G|Fd|=bGmvT*(2L;lFI_n*?P!yIA}~07)ZH)*P@ybM znhJ#B9o(cropZik_(eYR4F{c(ps`9RBZ1!(Av?vvoC*uIFSdi>fav;s{S$0w0{-uy z|F^t;>s0yK%lONu!H0E=|AI-6-aZdfuDNbPfGtM~DJR`l4f}nu(c>SCa);C%YJ8meSEQ&fD9- zsPe?^AJ7vR`fbiQgn=O;vF6*_mpxqbu-_J-J)5nx`J?X~8ma!o ze}a3bl;ioZgh)X2O|>}Hz>XFDlyQ7!>0y6STNfQtJK~O})YDM(d>VRmK){iTlc{)7 zY;;(joCBAw&t0M|f12p6*pCT@t*GqC6)Pb5T*+aSwf3Zg>6pl1*NKd^HKRlJ)5?$* zpBiApDJ3Ac=VWB9`Uje+G^$h!T7ZYm1Mt-XRyRS9UK=pAFP?!psn6){WU2o7eVs6> z=4OdqBsDZZW#`!d^e#?cOASEfKnC{2ANfc-k7;!pC!bb5xzCC1VcKQsBosIXE^g=;Ohrv2^IXL3gM=Kkoe^P=`f_RRxwLGx}Q19xJ zPaYH4X!d)$H!K05eb!+G!|P1n?5DY_BB}QIS8%4%dCjKP&4dmFa1Zs=$Yisk_U`GI z8o;MG3XHs}OE&P4JM)ummKi*Fkcf}z!Q&Um4%EW+=1gDdIVQA+4B!I)LXXw|()y2) zNdbJ}HnbIC6gR-6D|1PmKguX!+x}C!Q!blny%@R!-L%b4;B81^?(v-suj}J$KJ_6} zMuiH{vTuR9a_70+TC;k#cQefz8MM>0aO z`4IZm$I}U6tY2)n&}m%_d!>v@6i8bmuh*&0An<*~KTt50AlrwqftU_~5~e3@tVer? z^pQuQQ~2mDo=Juq>zQre4m3Fqvl(0A0l&V999Rl;uJ?f_C_-rXoc>+F*_uHvuv7%}yvz1&%#ymKAJ z+Cv!Bgoj0fgCr@Bt3C!3 z9`*fJdWL)eK6a9f5_CtL;JTiT=fGV=R3TJ`b4rwuK<&zrLa3s_=1V_6&}UuiH^b+S zDJ4CG*>{xv- z80FChU;S5*sX6aF6m%%hi4EV%=XAq8lKmg;E|vhxxc;;+j3*Z>m_+M|nCuUnl(=KC z*5!?Go~?30z3P=BXY;iZ#lrDP3fbVklUt`L&DSFN7OP$%eC=5Y9Ul}5^FIVZx>ly~ zG?zO`?ap6~{{ICrU@TsV66ep9lCJjE?=qRj@Z|8Et<(Fva_u_lOyuzXb!{42J#6{R zi>k-c!MJt|?piGCp7p9MyX$EtiQ%heCI3_X?gm(MgQs@KiWyjcM7~Lk{hVtGZhtH9 zm0}GIN|^0X*?D?FWpmDSG79jl9HLAG5lvf5?B7KZ)wQZpW%oB;L7=3o*1Z#< zWR-p=$TcL>zF7ObGH)a0fop!~PGOd}bVd@Ygd{^0A#_FnAiQg@m72te5jJ zDn=5H3tDAh@|&YDv71@a@cwBQm{(#ix%=o{kd>CXKV~+_F&xJcX$?UERU>=>k){2a z$~~cWJ-FjLhSF?lJV3&5RUgX?-hGLh(~>l=Q$WE4HHvE@`GtA_oP+bBOyjm4iUO>R zR-Qs)(PL;+$Bk^0o>KKWuS!=OBAn`r92iTzBN}5k_yOVC++uGk4ONXh0aHn&34SFm zKZ3F?U(RL;BCZqv?72AGwo3V@^qkBuOA)Z#e?7_viv-all|YGpNSL%>_WY13)=4@z zksX_f)H8SsmGcnM{*Y$uEg1;VU|ptvJSmc`2vV8@X8F~5Z_=1QjC;N1eINf1w zwvs-@COlFJ#yV9!P{;BbP8#-+YS){ve^Y17xQ42Ev}&!2y;a&1iOD?d(gOq?pks9- zV6!kggg1TPjzUb$^XG3!C?e&g{*yiVwu;&Bph&(3_jjh|$~8jk?O$ON{h=Ri?<`x+ zYXnGCNS5J7dWSJWpD@J?I741%!=nYb+ykKdDb2<1UTg2}A$52|X>grj8zhO18a(=# z`cb$oTl-C({?&)oL8d_sz(76=NxOOvs0z-8Ch?EQuAj?~BqFvjp4kl)(ajNe($H2w zfSX(2jhyVEr_Yz^s}tPI`*6yjR;z8EY4FNH5jLACm&EItwVZsw${Xi5j8Us9zr^q1 zht6d|h&T=@g`4&t{iNyF_0pl4tTtf|zvr#St9m;CuF}+zy7?_!52qDT*==!Vlcquk zQV_Vc)Uzt0DbgzL=pAGRf{YW%oM=9a=mP6dRw_DXp(#v-y3#<}KC$Yzv!a*X6C61XaBRU(_tH43X(Lt(K(E&US1ow0pUb0th$mv%S zu%!#B4_A>of0$DXvjtAeUN?|5JZ;l>YK8*4S8w02x~|3JB-sK=YOi~QeS}h`Epd{w znXo^;i|#eAB-r<6Qp4LSj!?dnGKO4{3PJ~`nDx$#0K1Jclh{2K;v7N%m%;yb;AiM2 z@?Q&tInlNwxhIpA!6gNr3h9e<-f;Khqyd-r1&RxQ+q;22dty@z%e~b3zMwl;>@G44 z>~1eg=`-w=^s&3*6=)_K4M_SjmDw5W0Tq%VH6hc*$#vCPOCh`w`I@5nlds_tRiJ&C zF!q+@gLe zAtN}k-hDg*WNpc8Na^q!6S1#z-9#N-JQva#rHYGc8EjOaDL{A%07vabTY7h!?aFV-ia>+mZ)-o@6scIY<3{C@j0GF&VT?wKDI6?F^BB{sP}4(LacblK=w~9} z`>s=>GmxRxqM2=p<&x>+#%WAEiIY>iF74_;!yS~~;Mc*eJC34!v5>4+DtG`g1>#gg z_CyE->HnhWsvKy1k*5Uz&KR6PM!c6YMPUopO9ay&gyfb0?4pvuOffY%1B#8d7RCGW zovtWOyCf^vhr5jBDuY5Y?wU2qdgn4w1X3GANh9h(bLVB!b{oZXW+CG`K!R=1B!#_O zhr*p8dqq!5lc2}u7(DEcQz~V=hx8Bl}1Xr%}WE@W;7}{o)`cbY7?-6*ls@Bb4>G;MPb! zfeGp%z6q7QT>FNFLXj9UwNR)bul-(m0w<+TIfO24E#hQ))%h&-;Zl7ZWyK_?K>wz$ z^)*&!op{lXDveF_nh9|ycQSmK3L}V7ZYHS9`yRp7F$KnZ<{*^|;EbXSRsKatfy#2h z3@b0fP@NbjNaA|`Ka~K?WRZs53Lh7ueCARES(&Mi(kNa(b^C8$-ri)8jq1wEHaIto zbD@3k>)YO@E%K7*qT#V5RfLwfw;C*)kz9ZskTxSWL&@|ijy%1rbRVN8p^z9Vhg*t#n)M!YLzq@wx_(HJ zw~hV2Bi1*QC=ltXm|2=Xc;+MOJvX>_YYcbBbhGlSC~0PQe;uR4Ib4Lauh%n8WUw48 z+Jl3=>lel;CgLEdgv>-0B#yZ|p>)$JMHn*DJ z+o$!jrXGaTu_*fh=3N!PJy=jpT4uV+LyrdaQW@zhA1c-_Y>_g zd`_?++kJGTh&&D>M(XzO72IZqX@;cWZdg(%mbYic)Jr{b)29XDxl6|uXPaz9aw(Oo zr8o-6=~H0TOcn_~b|{^L56cg)Wp{d*F`Q%tP}3AUwV)HX?^9xDfyKB^N!1=x=uiNq{FD}TCZ)M?{s2%Ed zMHK!5Ei7}Sm$N<7%>)JOf{WDFWxSNa9+h>OSO5+oJjUn+87QFm$px6{N>5k6Y3sy* z@ZWe8)NGs7l}4SJRc{psSogfTRbXgFE;(0*21ec6)3C~2q*6+Sgmaa-RqOunsx@Y9 z9zsw)u_4kL1OZl$UGBR~HyO@*Q?$sKxM+F6XlmyD<**%ljo?P!Dc?LJw+bh%oK^$G zvN(b;!jfA8*&KY9Bf=KfD2a(Sh3(V#sk_EYx+-OpXv|Pj0-K(zdcD`c|DIJmb+ zx!|eq#pg3ru1H}`Xb5nt%j@^|i0HQ*WLQ_1u@{QLh@_?Lcb)oT&&Pwu(xMNrn*I=P zkXEo?-;j4*b*sr21kcuQ9|`;qwl>TbR|vV1B~l^K2XzHB0@4aC?zfwoil;@Tk)U(% zrITAUKeTkz#9$p|7j8do%Z+@>St8P<%JzZ8}c!RM3(X4v20zOZ_K6`ylXpRjCG zyy>ATwdILkh#@P|4wpR%jjWpmZ-@&X$Mqg(lLyPee37e)mR)8syd*QUO5*= zSuldm0gd#sSNmQS^X{Kq+N9rPzzl8Ac5Xy#lv7;N^wx*kdgyeo`qSWATH?eH-HC9+ zXTyH?cJ=H9=nsCYPx=6s?(N4U^sI0{eJCo#Fvo%WQXo|ER7?(bEg5Vs$r;*^~>;WH>n)raI1o)Sw#=v3BIdi9#5S$+77!a!Bk<35Ed@@HTjXT=2^!DJzo`tXW%*`amwi)$!%>ACLGS_ z*Djg5hA`xGs7Z!mpwV4eEYh2Cq(`6(Jj{-Yt9(4n(ESc+b)s?htz)qcFt1 zRl7X~zK#bfQC4z?aqpm+f?E>c?+`#dAIF^Ua()^B>3AzZR!b(70BY`?>03Z0vZ=f2 zSNlUD=NhAwYxW2b5cY4df}r_1Sw3FE3G#%y{8Q1Mj36!zU4Y%*3)MM2*S!k_TRp!n z(FJA9a7UeoEJ$dn*9H2w75FBeNpwo%-!LwW3K~nI&Fz`IT8pnvikTiPga1~JWsi=? z;K*F`0g`_`4nC(lb)8Q2>D+p z?oxEWDOiwf`b6Avbz6_n@byIgD)Mu8O1#{wXFg`@GuBCA8^M$_xHKHlx!pUxgCPG2 zQIhmEx3kO_CXTlqEOpD_%;Om($eTs@>KK{d&}Dc{(?Mo3c?F-j=PEy0p%gQ?Xhv=D zJ96achpaB@Q4~0f07OY3X7YGn_waa15^rijZGn6n4^Mig1(m+G4PLcSD~{}ShsZna z@Y%0J5;>o5?>6D7Aj6~(N30=P{jgHip%HN@>~9go?YBwUsgtxZCx|;e2Z!eJUhe>q zid?U7Th`lLxSpVMw9iiuCw3xFn`9M4$$78ojDSX3{&V3ZV@USBfZ``To4y$POLNuKV3XWIexaC z=B#LlCJbCVm9#-uCv_8V(Rr!H8TexlswK^$;A%}|`>Gxuuj+L)%ckjIo^B9>;I#80Rek4sE!)b@n$sC-X&B0-gddXt@c* z0*DU;P6+I`w}J28Ne#<_Gl`Ff=~*ZZ#E}MgMco}Q%aq@Qoz9zKB$+)oILt0+iw_Fs zkUzua_1pWjJQAn;jUUf4dpppMCPQ6NdjZInQ~EsMB$vhCma*$crn~;qDH`BI2Y9ur z6v-)X&Dl__l0575oPuO?xA-gXjcHrqgE5iQ-TvYEvhjn1M~f>h-(smj-e>m@IQ&x< z0pqa3-D->3ut&D|meLKel4I9Yq;%A(U#5?o6kjMH%1cn5D)cS@*Wc9gUS1;8CE+pH z1=2L;RxaeV-SHUDAT(9^{UGVEtr>^V^2f|9%fb`MW;&uk4-ns!URqa{G0C)7A@iYQ z)mt@kpG%wCP!lulB15JqFGG@*_;8}H?~?@eP-z8o2fdhTpQf569%*@6CBH7+CYGO| z(#RbA%nrF#sJ!qL# zwA0F>}Ik| zzNw>8l7By|&cvQyoWzHTmsFM(rhWDBW?NXH+X|kDV07AJ7eyrWfzeDe(PT*&BzSGLem#7@X{?K08oI_kRx9z;Mx*N(4*7ctY~NOjt2 zTTyW^Z^gKYUe4;0R2KLgx~(>1ItiySXVSB$VY7L)cdm{myNou&PivxpP7hDw>}phj zu|6ACY#)@GpkrD##Fgk{fI$)*$faE#xd!dwE{1h^dc zu^+w}V1F&=t$(-{_E)tp?3hR_n)) zHxCWvlY6*lvwW@MQx_44BPU6_HtP1;YTF{6Zzn1tO-P=h-YG{L*R`83xk6mGIa5A0fPJ}YjC2(noF zH5_$APssNq?gjzDU19auW}2)tFEl8>7udPCV+rCmq)y|w$8(B_#gYL-V2tT29`LNE zwJk@~UAlAXD(pW$0w>(Cv!1*3txURIV80ms536Fb5WMIYe8a)NlPp;$!tF0tL>?*J4t!>6ucO1 zn6(oASVQYdyQj5UwHvO{)PJ5ta-zz?AtJqn?GqKNn9R$nNj?rg zG4DT9=F+NNV7N#7U`{@THp|CInYF!7Omh37BtomueBFGN3~0OqCNWP%P0^E+I?(h!u`*qk{YU}^pBh~-O&h`$_dHA zwRIR=&Ue4FJABYpo+N#_OEI*NBU}4?8AyXX2!>C}Z07LXBt_|reOsXZF)}KhY*d`! zqO$%1yURcl=?*&XrwZZeCP86?N}~OP^TF*q_1YAdDFcH!!DN0W7xA1<6bR+Jn+S4l zrq^|h<$>+JwHed{&_kaOm>o#4QZYb%4Mkox(0^QR5D3{7my0QMkdknbilC#cCBp}~ zH4|6YcUrhO<;3m^vD~}MA^CG@_dN{6qcwNI69u3^=w~6F;6=37;vjqI~GUxZ1UO4WM?kWXM9T!q7IaZP+G5B}HkMV}KPuhiRS zzi`BK=)^1W=lE7n1%VG29g~t@SShY{Afp*H{%CRykv}V>h zT_>tW7u-4Ir3*MJyX4308vi6LI@vkT1&m8Wk8~qq#~0dmX|1 z=@bWnQEpaO-aZYNmZkBcn=%==WVcm$5ulUMu`~Xty(C?gEu&LJ4}>u)Zi-lqZ~cgj zR@G5<e-YL%J7BmPcvWJ9r=S1zcjM zm)P(9gr-_LMAsE=uS2zw^cvX{hxKX*am>e#F=Bw*bNbg+3ch#zxGmske z2QFO9A1Jix6|S~u!*2ruJ$Wx znz$~ZAn`kK5=z6z3rCgeejT7e^XpQ@YgpLkptP$I*)XIyqJM)BGb~f7y2X+qly) zNiAAK#R{+6MYzM7f_pNvhz=GVN085^m_MFnir25X<)5EW=Xk&a`+NOKI1Tz_N8ZU} zbBy~(pA5f+lY5L#*}~=z%2OSICg>hTQU>r_$$L?ZxRj8iCqb^$;e$*jRBP^G8s6VV zx)O26^z`dCuzVqY)e!e9C0mCFTS{n|mH~ zTw+f2ciyjs#r;LaxF{vBHn5by28JIm-@GRE)UE|Vuw|7SnPWc2twHePP5I5SigndF z2BQXinKIfL^lx)Lg9ce^#(ma#p%mnYvdcAthU%wUj)YV{i&^aVA>^CqBdrK{pdeBC zvZ37=PNCVvUqb=aa;}JpU!11EUCqAH>ieUFsn(pN^7lU1BYTfT{xhdSj7G>}n-8@yK@Ze{)uebhm%vYHUDXOuV{szn6nyzZ)?!(gdjqEEKT zX{Fqov5Oqm$@foW+`Y~EPHaQgXG;J@Dyagfg^t+1U90o2DD>dt&eo=l{&#%90IW(I z*yv#1t~ZXERu7C5PQ(5cU!BtAJi^a|@n%h(+#UG6LnE|a^@vncl>DlHfp5eZ9OqVQ zvG9g^ydLNAPKHmL!O}JdnhUdFZc^F_*oG$i=ol$BlW`&<6*gRbv-Oy0qXS8uxKO0J zi~{YRlthqvp>>GNCsh=Epc)QYMBS4)yRUvOREp3);1$j6!NX9JiLcmV%g%h}i6)kr zyN`@N5g9w3ebQaZ%v{N-OFFwDZE)FKEr1x5C2z4WsPUfZWgq*d9ii{lF648(9w@wV zUxG@Xd|Ix3TQ0~>N7qSQ;tux>rlW?Mdnz^N0#x!{hJbp#x~Bb1wD#^%YaXK>F}c@# z=$VW}3YX94(m`f73CYTfw6cl+OcHJqrE%MFK(b8IM{isJYEg5X#(-*|PA&MfTy5Zp zhP$68Z$2AE&(B_2mR#Bvc*RZ`sz#2LL4xgSjMz{cSe4O`O%+YFwK2Q#A9q0xxcCk? ztZCqR=3@`?TF)CmK?kv04r`0fQ^eTd1Ao*u$#X@TU%#s^ox-g_Yer&B90=+nF@$4D}BYcsYU-#N@x;PQvV` z>R0N%OhTV!6faDQLH@SacH8is?`?t3vq_Oon=P4M*WDl(v}kxsa5kRshC&+-n4?v zBCxfG{vzBfyKYI{?=`DV4*LrweXu1z{?Qs7k4+-Mi=}e97sU146(iMC5V$gOt z1`5s|0L49&0JEG#R!|WbUplsSd;4Z`L}5D-W)b(TGMRArZN^~-Rh^^%9hOCWAXrKr zUMH%ul4S@oL4f#_rhI$MXPS>97pG$vheMp2V6c<-Ov7Dpe7dB^Wrb+ZQ-stK5!b8J zts{wzvYegvA=zhU-r+XQ*c{Ax@r61@@kj-#Zfmw=;_iyu3Hw$DErSt{r|N+5WTM4I z;CUERW}2=sn4iLnBTtM)=o6C6_Ctn0V*p;YO;a*UopvOYBRkSZiDe>nfr}@J~ft~z8cDKn3 zZM8a4fx&IxJN4cp(&E2l9;_n8IN(X}fPWA8IwqeFt4g~YN+O^jce*ZY&arOzDD>3& zQ9}2c3VL9|zR1#=U2^qi^2YE1(QjGM=iM1-oAK|~eU$r+2759Eqn(Z3w=s?e>AT@! z8gY=ofAR(Zrc169QR)~|_a(RjHFzGav)ZTr?$_=c!yHPeYkYvUGK2o;QN`!BZO-=L z3$QO(f6O-iAF8u=P*=Nf z)6^)uB`SU(CQ3yMv7+o@MowPZjNSG7!8Oqv_O1D#Ek*m01Z`Qw_xh zhYQ>ER9Cn-lGg1v$J?y>DP6hZBQv=T1->FE#}Bw#OWPlGbf()xa|dl}ZBEt%_D_{WU5WP%&m?I%$29~XLy-1?X_gbl3ACn>}HIaGvd zW_&^Y$ZNLZFPZBP@Ve?&pve(T0Eeb@B8I$$Xbr{>Ch51a{>Xlbf$+h42GfB#YC|Qc zFl0}&ds?Mpl2@B29-WA)Xa04Buzgg^=G?i6Fb zq2?wwr?6I3vU4p2zDr65FjX)2H&j$1C^{c_3Fp>>zo($v!sn2l(;Mk-r@1uKn&8uN z-!gg^S<`KU#Y#`OK!qe>AUiE+#Uq$xPqM*YhE!g?TI*T-jF@(e%&nA&iJ8u+D87}3 znysb~u-fq2bFi{==kNqpBmeKX6deMX;P25ZBX((m5m0<}F*L|i;ev{z4|T`Ckl%he z9m?wX@ufT^6b6V&KqP(|x;HXQAR&Tgz&fwnq0!O4vkl^p% z721`OZGb4}L4lI8*=xd*HU>{Hm}r#e-eAf_3*BK{d@)DGZZ(KI7GuVK70Y~1e4HSF8-9&!` z&0|2b0q!~S3>Ww@yyh~LkKi33-&mtcNN3Sj6KKdU7GRtywn!N0UNs%m<6Mm$l|7N{Z&jL9F(f|XW$KI=cIU3z$dOh$0y;QwTlPAi zfh2pTGhwb=ublCbr0dJMlh7%H9kss{aI5Bf&gcJq%kZmu5zb<0!2UL}WA~Fd8!wkdo`vJmb;=&+1ah(oV#m z*46N8iGpMQu~W-4*V+9P-?+kHUHzPFiUL_4Udk!{- z%uM2UOF!(~8C-w;t%t2|>oYNH-;y9mQG*j$7^b|X39A&> zWyUC(eea3@F+N`vh!=ENvuCNB%SdXNz0>AJ1AxsOtfK=JPlaX}wtdT8vOJ$^vWO-&pEFFGsl&~*d?C03Avvhw^U4z9|>+G8}1h*Efo@8BV zf77m30YXl*RRwgHR>S1BkhDA3D!DowBCD1Rvyrc;FKS$l)lmasg;49ch>N0Ga~&fr zL^$xb0!V_Q6&t#CTn@|k#nyL6sZ7$w93kQERV!Zk|I^+(#fkz%TY|^7ZQHhO>mJ*- zZQHhO+rG!P?KAhyOQ%2HBr{2;J3X1HpGtP^>{O~!m7S`!*J2w4ZvA{6f%)sfPtE!+ z>=)_t#lNRzpLmQqektY_;5`oE!pfpxReqqV_@3#XR6T6iepc-pp0FP@#okPqRgtkP z{@wtmj!2bY;rb^GdZ{yg_ow`fz$hsbp^+Lr7Q^Q`XcG_|@68hxYF8`N7Nm+_*$5(r zINq7p$A&$#`PWimz_OxM-2xxtEBQ1c6d!`c^sGfA3hTL4@pIvC<5TairTrVQ?8({E z{MaVYR|_ydm1CRZiV{s<&49QtXmI{^i*J(pp!_rmq75w^5ZpL%;e(8|uDpf?Rmi)7 z2SFbOC(~1*G^J;P=W1H2GrG@8%tTOzAlxp`DY3fff8_zgag6y^;YGrd8JIycuyT-n)YsFfID}1N!_juCP0*(ewlrROE{O+l% zkE+f@6YIWzM`yyV#O%W#SsT4G%?{hq6rtchRzAjbc^QzI_DpZ2sdRV!TQwZbozBil z81d4g?=!@~IBEtY^AGXl=rTfhYF%$0=6${Yw5%M;SG;1xs+hi?9EbL= zIbe!iu`2Ile3IB%@ZkH|XSAX?&DBOceIjdjt8l!l-I%gS+gS_AG7VKwO_VM5q>jup z)XtADs}$``(D$W1KAzTCa^l|kMLABUGH21{XXiL{4xG<0wmLGut!^< zIs{_2v@W1PJ>AKEBY_Ez1N7Z{(=^+b6F3Fz0mh-VmZ4ex44zO_8!)Tm>A`@t9a@&f z4a~-Z!w|;xgCyBO92H&NamRtqTh8-@63+#p&6sIcQI)Py|C3XhAL1E;P`zTxL7rL$ zf;X{te&wmgc2%bvuT9D-Oi$xW&0dijaCZhttq*Eg?j1npefqj-p5la9Mgb&5)_Eym zn9d^ieC0xWfxfnBnhwY0X`7!))jxK2QF;jBrb#M3KaOMw3%uC_Sry{})TN{NK?42Q6}B50G6D57CgTtR7%=7ot0`@pca4>&Qmo zH+c5}visX)EV0H}bL=U^>+q6iGH>d$(yFJ@qA$45kff+`#j=&`MZNCM0sYi_RkR-Z z<#80vwhH!Mz0eGG)X#!Iq}BM=#_%fsKs|lN&Z6dUEL{b+IzqK`oiOszrd!Jn>bc zM?0{zKCd;jIB8MaoY5@b@f;F@Hx|{APM?qK#~{clc3Z$}9xf`e5nEWV=>a2i>lFv< z=xD;Nb^0uNZaH=1trxV%cd=#sMx@Be5_$DuD^}G;7wJD=snjc~f)Y#uf9Y?yxs<@R z2n`uN8mY%f+9!C+g%~dB0l$@ zI~hVB^u*SBY@GF`fMFFQ<-wU?|Eq{#SK&;yEq9{WRya}YESN5G5zY|12xE#_`5zgM z`d1t4RqFTDoDWXo!pBJGlsQ-Ii9SH|m&m`*k}Sr)dEpJELrZOKbUvN3OYaoiEKC-h z0Eii5diKs!NDOb2)xou=<@4l7WmJ10Xwa7ggNhY#D*o?{z->?le{G)2`*FhZmiO;+ z`u9qAD#*E$g5hv0Ls6zPDvLBXwNp8mbj1lzAo|{HI6KE>(+~W+MK};WDm_<`1&_*I zi&mkWdGt-v&Or&rjbFb0^$L&IgG+EeFrtt~70piXv^HQ*$W^Nh;i|U}A%*4!WPiAJ zFmnU|E;Fha+ff;R4LSg~3;waEYD8TK|9kW4+N1%5yK|2BqJJ0mMI4Afx{*i8F#&or zT`(7@r$xk<<-sHAPJw|XHM{fY6XyLg5D@Qsl3+9k2-CpDvFvDDD+FZ6r}=X8rbNxgiZEvg<3Y4E~;ZG6^?`f-UL z(m?R~E`qdF&yAyZ8;cpT0t8i_3DoK5Uyw>greg=b$~Xfp8dAsJIYkh|tnRF{zzPfA z$_d&-7olo&A9ucp{<15Yn_BHI^uws}7g=#H>G6jGjq9*WFQ@&o}3wuA3So%dI ze?cC#lvJdpf^sgnN3OluI_icr8!@=zXsR+ev^P^vaFsChK#neWH0s2;xlfYkYJA3rCoO3AMz_v}is=xE$IzVtz-7i(}CVt|iSh%kKlsr^hPHtRLLxF_dH^ysE!A-KCZhON2 z(c>MB4IO?5V#&HZ_6O-GoH|%cVsjcK!EmTfqFrba5LS->#R64>(ZC5yiEcG&MWYN7 z*LTEPK{J-r!6|sjHM!@M;y79i)$40kOr#3W%4QW8o)I)XN=wGCJzY71_s%D81@PTe z12e$mV&0LKBSrC*=$~@DLZ+)R%BAHeCbVv7D~HN8_xt&4Gn&<-pYcpyxn~EN0%P!; zW(73=*5O3{#)qRb{36!u^a0CXLeP3H7hvE9Z*&Sl(;m;rxjP`8I@wl|kX}p!@)!;1 zT(y4P=iEKKWQ6aMvnF%`Zh^=&fX5RG-++u5v{aR!+{6cH&XI3fZJ+Rq#%n)ae&g9ujcE^S3WVf}X-o1>#8bswnBk<~8W zo>x&NE5TxB$S7u<*^<~ovumeduN?*mkCd8ZtV|)=R#C+ecmh;tCgF|o)=emIfE5VV z5@~}YzDOzWQ;yaM5|UG3#!X}`-95^7Je=*sS7+~8a0;~&@GMwY$%tP3HjlT{T zt>ZAO7YenY<)E>1h^J0b{`B=o-A)AFakcmc_B%v=g^4b`%^YMb(O&6{CbP%0~*KRSf4xsTj@wgBgY~GFl5`M2r^3u;_n#2bx;|0PvDt8VN`S`6$bJ z9SlhG^}gA}Oh66RAf=(riaR4Nfujj9_l@N?l=Z4iVP2ei4x)n1tcFdb}mt{ z8!+vfQ4^>6>bS|pRSJW@{@b4x7%xR%40`vYmN2A z3x^RGCO#`!2!Kl&>_7qbNuh>{6(5oTmm*@-o~hL~=N0c9!xde$QFeLvkk>>A&{KS! z8BppfRBd;_dEeJHTGws1CbE!i+DmC@Fwn3YH8~le?y_9cFj553A8Jml+qgII5(21#5u92#?5>Dz)65KHF|7g-n>4b=v_Vn- z>YwI@!mR4Co_+BiV^B9>hi{`TP7e@gRKtkwh3Reae;+<=Fa0ZP4|)t2*|$a=t)ROp?|MgS6Xr#ylJWYx)ClO61EFi1cHP!O^+aN}J>jdsiUm2-5u=ho zHL)qtQ;z(QpmaUZvh7;pdIP1r!dfkaAcv~^>lO~sHWC;(BV4zE7RBgkT!+k|xr%kk zva_E9m(+v}R-1u?+skzg4UB5DA#XnfSx{1`2boZu)A@fPU}?IMHoc6AfLV4OpLynP z?q=rQC~(2%(e-69vkX^m+a?|*uL3IgwLk-eHX~L$y7j~`D@x1x{$=Bo+)Vym)mw>} za(Jn?ofIR7eVa!!4sJw8Z+?tM7s9jBp3}a{^qRG$gss$z#4m^v1uAY_k9UzV_M~bk zQkN8Uz3|XVK~>oBp}zgA2c$6Y{n^)b&6(!N@G047zW-?}27sTXKAy)|G(I};wbwzs zC11qMm1(?r+$-;`YiEx97=gqhk`pKGbq%@@xYUj+e(^!T+te39otFEY(N*RFH3#7r z){9M=5Z7vLd#zk{*b-z}6U7YO z>e3ceMEvdGQoOnwc#6(V1T=mpT5a}eujWCKJLY`$gz(c^$_ikxj}_xwyHH4ZFyA)) zUb#SHz9mFz3WsyoFZI?5ge5WJSvjl7`C9Yawi!>Ieei7=%JasLoV5?XNGl;(^&9!> zyR{T#mxcDJT@P1pY-}xNg%ob7?==|3`1M-T-1V*Ffe7Qw1gvIt^axlRZjS7$|46%! zT>Y<@m7PvbloCnn{vG3PZP6oBtV)WnIO3T4H0Bi z)NkaI=N@m4ufes&)=~E#Kavy-h4xMoZiOOZzHJ{jRL4;=*j~F1JLP$Q{82CC#WUWN z(Bp^e>q^|d{Lqt{uj8$zFl#tIDDPG7UCocR_!*_~EieQ^)XQDu8g}%td74+D6d2;Hw{YShA!G={ex1+DA|ES;f)XF*Fx5(_8z zs1?wP@r06TK6(|jG9t16g)YMY0CO5OqANlO&4$q#aR7N;pRaJ#|G;6? z4svc-yQ;#Nl?#;<3n$!ntN@Fjpms$+ipL7Lk>pQG<0qp}Y{(0rs_5<+aywXm@CCvzpRb>vbj=ZWw2r*J*!ZfQPR{ z1hy#2cGAM;tamS*<*@OAEV|q0Ci_R@I0`)(s_8l)?Wiyj{X&0v@%V6AruNrY~ zEwRYd)bXo8G}zN=xVL!rN*W$$-CXCC(RTQ+6}D*7Y9)h=u{AO9ZRDi$TW-UlmYX@g ze{DD%cX?bf+Q}(lW6R~hZXu_IKvs-+V9hcRxG3lVjxo+t3Qb|1?S$6_K2ZcP<2++JO1K{fO2>-+ISxb@7rzRHp85oWf)&ICh~LkM`j0;GfZ6xDOu zzuRI@()LeMrP}PSZuumi1yPT)+|=U^8SoFdN`}uNs2eR-ke|3T4ciueogd!w@RV6! z>9#`%oiX4L?pBe$bBS*)KQUf##MP17&nPaD^s9-xRbc!~wk<$~>)Nni0GJq>Y2`fT z-iN;VNA>T!E_0VgkKHc6t!V;LO%^)_rcc4>hM_L-1{pVd4*W&n{4#jl1gFn^fy@m9 za+j;#z_9fG;_&>fMH+ss*cn2(xM3s%h9ABdHC-6;=*3MmGh!$AC>HM#-RS7hwZTR` zRT@m!-;X$sFVpI4db#dNtEkPH`4X5R!JH;;%Kl^9s{wV9+Qwt%A8y&B!gHTt(pPey zn7)ipd%6?PQMNNV(aq`Z#ui8xi?T#pmSGxFjrsaj;u1V&e15)(i#{KtBcd|+qCLiU zJKfTNNX+!OpGDp8t2QaIMLsxi$dFKdH7skg&MHAS^?+m-swF$Y$Jo|F{v_mP`Dt)!A||KQ)*NalB4kG?52nyd@?Vr7xvAQuN+!Q{5Iv{yNHUi2^rCJ%sZ*M9(^c zJ~$JI=U-|5ywYs)$aZe)HN{B;|Adud#wgD_X*BT~kLzUMwxx2@zZD)0Elr?O9ARq< z$S$po8lBagz;_BA64p)L_}oEBS^pN<(c2`Y&!MdG5H7;Bbe!m6O6-KEUhh7nhF$b7 z51`h@cCVEsEC{(4JXoGnHa?R>$%3Hx6YYc0wY2wKPoZ)O6*3dOp2)LK1s6O2y~8(O z$(E5(A;AshoACp(2g_3 z9G6AB>;ZmY+e4x6(H?8LM!zO`CIScUNs9AG03!Me9Lae)g{=nA+P_vfn`5MS<-RqJ z>)x9pd>%{_zK)~|-$pTn?V=gL_tFgFdus;sy){Aj{0|PB?EDiIa%qNogQ32I2;A6w zFULdOXMYhaDQ%vuFXyxa&r7|kn%`$7@ais#Yid~Hd0&HTrzA;7St1^1oHN`ONND7n zkbTZ6#`r+Ytb5`NPKigKA=iCq5@o;t%F8 zL($ZzNhSqJ$}*<5l7CQnl?3VwodA_s&kjzP296=?k;$cp59k0EQ^7vq2sDt5vhQV= zt(g?X##qQhBoc}XPbC508qwk7-L=j~x)A6~G1kFWbtz$>TJVDhYwnWGD$E7rvVUo% zEZ*SaMWJ?ZFu)Ur82Cl`c4M@Ht|P0$)U~8DZM1$h=E(I9M(bC67>3R#Lj>e*6#W$L z*@-V&1X%g(JE#+Q7y%y#a~#al)SRTCX)2bRkm4yThbZ*hmO|!#-NK1~3QPGpD?!QR zkzAcf_cQfoV0>8pYpqx%$tT@@U+{|>`@YEg0t1Vv+Jud8VEo|e1NxaH5i zJi+X1Fsa-dYR}s>ovmFD&xT7KYwqY__D7+<6Kpg~98rp8&>WsWQW~exsySUhkXoP7 zC{-mc%Wcj&ex0>OUYdpYO#AZp`qch!?SX|fRt}Dg=DW{qIn*N!RB_6$st-Fv&BoJ+ zk=O)0^18kpaVGQQk-}`sGGhga@hLrdX5EjrEjA%#ht9&q?2GqH+fz>x+%C%_FJLcJ z&DG1~A|;BP0^$(0uzd>~hxPi&nIK|7-!DiiEQ!8YZ&fa)5rZ)1E$!yr`^{+IG|DLi zgw?${UG2AnOe;bK4by;m(L&yR$cPW_vkf)#-)RlMK6z(`h_LH z4Ke*&(Z}u|4MFFCno%HeCp*W+Z3=V3wo&k$S3Q%JWTO)kAEF|nSr>ikcw=%5TXYEC zJbT~IfwQ*ddL(G>YFRNM!UKcf{K*O;$`dP>u)CV7uWjj7O+BEaHj!$)t46t>doanR zTTt-_wciP{4m7Rn+E?8hiJ;B#hgVJHjoV>;wHf+Z!*2&B6AS2(_y>so4p$8 zaoF#3STiM^uN2lbSYuF1&uVeSE9gW-5S&L3)>egSdrKJp4mwab>2sSZ?41*0;@yR{ z`sT8?g}YppHz8<~J&5g2qzMj1Pl=6;(+Lq38Rn2X*VkesU?foEzBkc)??|b8Cqhh{ zcj1@PHb%sTv|SxyY0fFY_|y;*S49V6C_we7dG?ZD)S~>Pp{2sm8;`2YETpT(JW#yy zRy3KZEtwd|f&~+ydPN%elI@`_EZgZhdffqsl;>1ArcBA7XEYVYDIMLH-k6?HBkv0G(ME;g-Gksb=ZL+bhg#i(&n_p>|?g-F?6H+clv@L^Db270MTFC%SS@7K9`ZIzB$S4UGbCT~G z#V9(2LNBgAqmJ%hZ=iqtS-ZSYtOx{ixuU;(ex_I+0Ooo@fByJLw$u;E@q+&N_K{*` z5SZ-=`S$HC!Ad7E(;NIhqsSmI*BSWzsjCnxg}_{^@2gu|E>Z@8xm^Fh4QTeCI04_! zbn#N&U72x?sw%3w3KHDo#tG<&H=q?*6WEzwO&Sll!6`E6oKkb5BFT!F z&p$Ma`#Q{;vdS_zX|LcAp#o|S71D`*a=!&i{5xa;Lwd+)be8W(}TKQ8- zZW?m+dQ)_q`2$v%MUl%gZzPIfvgC+PRmho`4W3Zku#rSLFsXt{+r7tOZ5C44ezvle zkYJYNTvSwV!%MzhaqV~D`J}bW)RkaHT!~fvneqzK^LY@2wb0%8&R`8X?BR zWK{}>%ecB>Ma9LzZT~7@!wJU_U)N5No}|ZaErR~h_KNn8EO|YY)}=d>d^m;)A?){` zPz(;qW;7l67S%%kx?{lNZ44$pI1v)=Jo~@`sN7yu`LwC=Gs*NkP z{*F5-3DO#SE~J%D%gm|U(g3YpYe)CZhdXJ_%Nl#mt~^Lf@5aev*ZE#*+osNrn-34t z>ZeuK>}^?~)~=0{$M(~mwDxta9e3~lqY!KT{~kSOtod{73f2L1Bb0sDj05Iz7oOa& z`<~1fM!>YagOrBMU4N7WHv?9w1U<~OHF+Os~3NS8ib-SUT~7(ds{^(Huh zP_I%4K8#daWb8sRF!?UheiOGAena$U4tnc*Go^C(QC~iRbF=1G(mi_}6zQi-_qB9c zPm$fMk|JBk=5{v~v-J86zwe2E=9zKix2R?(-DY*O{IP$IpbzbcqiNHSOVK8l70~}C zNRh-IQXHLoW_~KMcGZ2j`ksI-eq&Z{c_u(s0*eIG2Jf2H^{t;9iF`t-`5^3h8(nu+ z*VD1f?gHH~3HKp=HXZsY8Oi$TclV@{AN_H1=d6*$_Gm|DU_fl$0Em~9r=gU8X#$O%qX*a(Y;oy0t zx_vCdbmLP2Vvm3(N{VuUKzQ_t1&n2`wOlOU-klyU{40q95?HmoNUtn2%D6^ywCse@ zAf?Iv?!$)<6gNMO=-CE9&}1!PMSvoZGQnL)BA#XandpTCg!}EZ05ZWr3GR^fVYLe_ zAX#j((QFG0PSA4iCY20@Ru4p+2sly%@trB_g}wQ61T=QR!|}!#98P5wqZw`^F6+<6 zwzsjvOX71a<1xQzqBxG|f$DMB64OvnIx&GF%~0wX zw$p+OHFcrOlTLaY9z>UBD)F&sq;zzMCprk=rT~vItd^N!|1OB_0*Ht3@aPX^f^=KV zS~iwDZfSF^)h(b6Yayleuy&yU7Ca7+^+y?D@c(h&x&iyMw@8NuGmW0Q*nOxdtxv;E zMSmgMUE1)_$b~LY#(-<1y>3rys-f&I&-hbBd#7bUwzoRm!-3s!RqKbs1zKl%j=U+s z+g<(wQj643ULarba)N%BE0z^>!PH>_Xxu(q2o8*e%$4)LFs%=0-fVjM=~&WP3vn-+ zyc6Ah4_%oD&GmwpC2^R+ewZlIK$49#&=zo14}-lar#or}ni2gmW;IrKa&!EM$M7t| zn8t-g$&S&6ztg!q?q~=l#L3ZiLlG7gWzzWspYbZHLcgfaFZGb~qA3gyzbhRZ(`|kQ zO)@S{qW{{fAKK?w~;HPFY4s1eI8B4ZrB7R!9Ma+9!tP5&{ndKdn`2J+jQN$zU za7nZ4tPHV6O5Os4g&MYOv^_x5Py2HOGe%Z(tw-Q9TPb-c-c5l4rAh&`xWx2g@LaeZ zy)cM}p`&B$X`ij}KI&%19h7{7TZdbTVL-q;+!*iSv6J<~MziCiaw$qt)v{=@?Qe`g zbV8qCcwWo%t;S# zmgg546vaC-o@8ceaLVdi#j@fG{hUi~0JwgOB9FXZJ(q?2IaU=jI3M{GGbp%q&83;o z3$%!vgFlEE4Um8PJ?Ne)|Fwbcs%r5=FOf)eD#RVD<~y&C1@N)~s%-4_?9WBxe7UR` za8QKhm1497WDoXd_s$H2yiYOys?W<8I$$!c!1h?2r>OvyQr-R^8?j4k=nG9^p}_^}{h)FiVG1U>PV|@*%GA z$Cxw2vG!|~|4O1A%s@I~z`Sy#w?=SHzD8q+Wf1)&Q-IPivj^EHc8AjBy+nXNZ@(Z_ zB{0u=CN($+&bp8}!TfX^r!eVv6NF|W5Rz&dZ>a1R2Zi};s}}Y~?0P{xMWm;g^`&rb z%Goyg$;h_l=RxG>crjbeFZ_!%lvP!$+e_~4N)>!7iN%}zSvKoK9FaHd4bhu&g9Ip=eryd&exFq3$0*Bi@_4i!pBp& z950fm=b@J$W^{Mv;6~`mQi1s5H>^k3C#qrzEeU{6gxL3kHz}Lxs?biEWTSp z*?rfgmVmqcrB-Ln2Z4JeYqF=09aD6uweW(sxI?qj0)omOQU%mT-E~Z_Dx9^sCO3TZ z3Emj5#LfxJgc8r+n(`n30TD?VHeu=2erdH^<|3wk`J#&ytWf8-Zg`^rY@A8>C( z2>*6^=EB8g=zS+Q6YmIc3BUOKt1~P(cenT-pYEF_o_PrDbEw3(y6W0M?V^6%R zu>94<2x2`N%!e@(pyaO6BoGkD)^Td(MM|z}{q%kcVOvqpf)QbC!2E;3oU*EnpgUA))b7te+@uf9 z4Z@|!Fs!I639TSh{nJ7AeEjs~mA=v0@@o%K>Gt6;yLS8{i7SuE&@lg}I~B zLPGoVM?&I)Ims0q_BZ5#!DqK5K?CCyVRQm3t#Z#~1@BPc>mo}Cz}ql5wY%tIZAYEN zOw19NOuWQ~;^Th`(DA>(B}F0e`GPKzw`a1Cs-{y=y1{_`jCWHrzUQJV zgP-j+v1HO8>)IfNizQS*Ydo-xHF?QzK)Py$cFE;QHc!FXifY6u$-)-0BQYu%P#VlxpuP=PT<**=tu*mSZ zEGbsEQoY$uNQ7Gz{1EFBIoy>&cX~4}N1>g4m|plGXE72`unvN`0c!ID(U(v!*9JNi zv9J(?rWEd>;`iW1Wi39#g*R2bD+)4fg!jT>9sF~1s5GWzt|D<+XU~{`=Eh4~Qa%l{ z(WD?ERZlIsBVE$1OCKc>RwHH(N1MyF!PFMUuF-RZI?h4qBHTQz)pVgxJ9@-`v9eeB zVX2Pj{#?dov@A{4irjY_#^Dx_70 z9k?PHi)aNP_OH>G$`@OHes(zD4~@#v^vM)on2Gl z&IGO>V7lv4%4AH29_l+(_zSYvVc#H&c1{bx(sq#uDdbLBRq3s`wYtNO)X6U;xbPrg zaXgo#QpvtcAs|Yt_0)JCan@4P;b*w&0CN2L`B)ywxn(dog}ymkSY37R*)OUG9$Ih} zZ4aE8HF>+`kGU+Hs!vK^l_rFY=Ie8n6^N2gc}O@8dJg4EdMXcHAgf}&vh0(gF(>|r z=tNNGa1E<4MB-avYSst=+sl|1B@{y6816(%XR5oxii*9N{*YQTKFJSSYzupdw!w3u zwvn}RN#N{6ANu&KMPNrE%@UasI!fK zDw_t!I-SS2!EAIDiXa^+YY`A37bwXctGR3WauVU!HylEtVpSD#$Z_e3iUbf}#G_Be3_L$Y~czMq0cE3F5c6nU?@8dSD z|L;#n$2~f~5@0>goOpDCxJ6|J(A@YA^TpP)Y6fGQN=j4{H=n6UN(4ms5ITubY{q7u{a zKu1=-KO}U3IlA+v8C&(H$U+-7W&ZFlaQGD1*}J7r3~kkFOs`rT&(BKxZCdNtn{rLf z9fh@rh6(@dQANP}%wXF0(gtgJnxereIt~mX)1md6*Fi)W-Qk5}4$su+KucNzOWq%q zGgm~cxv0yHf_Q&92#GcUAF*%N!JweX&+X9hhgPv*>aP_h$hTFR(dEQ&aoP?pVDY6L zYI_%u8wR>gS7s1SCH8wWJQT!F)0rBfZR}kdlPdA|)N9nMf}Hkxhr8-94NbZ3ES4eM z5|Dt4tC%|@Zw^xGAyG)me?Kt@>j-#P7W(D>6gupor`_qWlxqVfS%6mD@Hk1?BI~*L z5GNm6HAKt}SOr142HE1{?c%sC%b}D1CLgIHk<1({&^odA*Y9J8bv~6BsZ)`ba7a&$+179^N-UqinDfpM8p`0@E!kc}q zsJdoj%91L>c%{d#Iwq2$G7Ch(lCeJJwKXR^fEJVt7_N5Fs^4aC?t2?4ZVJ2X^uf(6 zP1^}zPx1vo0Du6+i|s#vKt+3{OP%F!l+8Dld{8#rm2rVtau@$EGvfb8W`38|mKpvV z0M(2>xQc5156*1XQP!I7!Qe4M0e4@2)pYnY|9SYEGxY?CKaq$GYOZ7+u7q)m4Uw$C zrfH0Tv_ZHePw~Cu^b2^j1o1+-w;WHPEDCMaTf3zohS=WJv+atE8{rWx6onfei6k0t z(tEh$A0)1aDtpuyhuj%ENU#(n!Aq%hiz!Bm+%+%u>@1VMo(PRe6sn=o&*|XV#vYuZ zyl0FZZP9g^6-|*Zs@^@mN7kWG)A;fImC`X-NR!Q`vkn5$p6ZpK%dCKl!I=Y~HqCw+ z(52n)V4EP@Li?H5R8%wkcx)khm$2#BBT;2Yr41e!@b$+b>z6FEH2w=>@^Nabw*gthb0#*JD6x z;(Y)9{JPc&=5JRM6MS}a^ zd~96%jooe)1W8KY`KAe@<2z0XGrIJ@)LK)oucE6GPNadK`o(R8m8=x3pgrGKJWL8o0yHD~%|vb65e$p^()^wqRDj?`i$S~Zb$dm| zkLWeB>f81p&a3~^+6N#mYnYGVNlQTc2E=8B3J|nl0ch8cxTH}If)^zL?F$f_IU+#t zq$Qwz2jaX+1qfca2(;@@T-u-j!HX7;_63N`8tE^1*6jbkHYnb|(*Ugpj9(9_Q`O_$ zL(}>Zo^(7({+qHE?vu2HGzh9%+H^BB2yaHHb@l6Yu4BBb{-$n`kR#IYx zEdr$Sp9!&scq z!0C0`_yevk+ZVGLK)mWLG-}P6LhsLhINzUdh=+)Sz_x7Px45Kf`L)p%sT0~H(Fl0oQ;#^AZJpOq92R|! zIoR7@7?M87c<0TP!6x0iW5mft|$rfsuap;F>#|L??`KdykaQ)PaM)M z`go~!XihSa3nUQ8zdg6mUab8cyciRWaKbIE*E;L#lXX@T`{%zyOTS^YRxAHuXlU3y zJM8-p+ZyXdt+lm@#`^7(!|p!`uKml*XLU9 zfq?PhoXC(QIU~=n47p(Bl-Or725M>hyUGOkeQa<&W6euwJdLrl?f3T&-{@%qy?&Fs zEuPR}e&%xI5gJR_@^~R~;t&ldsEN@SJf^8Ey7Qj%sa2g@$)QNSTT`S;M6f(Bgz<3G z@GM;*%-=!)uJ)SZST4S)7$5}dQ>T?R4F0F(_Kct)VGyWAsEMEU4tdhvetDS!v4Kp5 zTY!at)%zU8>772%MS$<7yx`refueZmSejO(dIh;DA2+8ep$oL}s-dkTp=-hb(dzL2 zZrO!S zNUZ2v<@SJ(ipd5J!JZ-UP@TNcG)9{R>b>xTIuO`B85*4_ox01f;p0iG#D3!69nVlr zxv$!8v^|!@2)K^3eNM)x)GIZyJ%#|03Zi5Ev=|Q=STsp!HW1m6^v(dX%;XSao>JwO hyN*>)ho4D7n^O`x#s4q#OaA|5m;Qgl|GX9WKLG8>5B2~6 literal 131714 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 o2LIE&*qms?1N0 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 Hh(c@F}e%$2#bcuJzEt|8Nu5u;7ik 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�+F-zQUs4kUz)$zMFRO;p{tV-=MO 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�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

m@@IWBAiT=OT?7mJ6>jq)5 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 diff --git a/website/src/img/design_3/section-5-desktop.webp b/website/src/img/design_3/section-5-desktop.webp index ba28f542f4a2ba46e1d3f709870a731d2beee90a..cdeda8bfafc54268496d45c8f35cbdf753ee053c 100644 GIT binary patch literal 103792 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�D$9=)u2NrBb`3!v9*GjI&K+W{cp70R;PHCD7C` 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

$d0~x`A4|>}n81PKv}g(Ea3Y0QGOWLQ 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⋙{$ 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 M!2iGf_ng500DcQB%K!iX literal 154430 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�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 diff --git a/website/src/img/design_3/section-5-desktop-light.webp b/website/src/img/design_3/section-5-desktop-light.webp index 8ce4908f8353e2b542abb306f3da50cb478336af..072710646159a56e8dc2251b83c658ee0c3cad54 100644 GIT binary patch literal 104366 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 WWB>t}`~ThG|KI-l|3v-&X!t+6a$N`j literal 210490 zcmeFYWpG^0(k9p~W+sbSmc?u_vt(J4MHVwNW4CQt%*@OTwwNrk#gfI$%#7W=dhf)< z&dknk>~~{-ZQO|Lh!dx(va+7ctdo_UrJ*P%$ITB9(2KfFX)ikGbK5|vXcmKxUA@*|BL9;lBb0g60?65Sz@;odzkvwqx+}p3BG9F{As6wd8k;z?1Z#iS3$^GZu zVACG9?sC)pU;b|5Z)Ycm70{|KH5nD~s$(XBug=dMY1mjrxAWd1^Rnx0vJ-AooH$IxW0bSdGEzU}!XE!a|3TpYa|B>8WOwZ|cX80fM^Fj+0Uu7eSr6XW6Oj~CNCkZZw#|!kFs%7kg?z}BqL-f5Hfw9?W<;e zUKCQ{(+{r2_5p_t5?QB>=TvJYr}I4=Z_k&<5wAa#{%RT|!2m6tVbTgMji)u`q&w(w zzv#S!E?Qg74h9?uPT*u`QdyDuu`V`2MXxTZ;o2E;jv*{HIjS(twkL6QI!jma;Q`rUt#5VZAHa^UB4de)W4{dvLxr##q}V z&(1#E+BdGC*{pIt^+?Zf=}3S}ppZTC*?}!(X#gJ+nF)C zby%PQN&j7>G``?`aU~O~Q=KU-b%#opDg4v52-8yuMj4CzM=@EFis`(@Y*~$$zj(nw z2|wK=Dx1FpVyW<}OksgVFvzi#LBo%OcSLdY&c(8DQT_I`AAb^Md#V%7pfloq^fd}D z|LifXkkL(qxyS-nHIxZXxwGlJG^k6KQ7vMp;ZWIGH53VgkS;O-0caKGkk(567P7p8d*O1Q zls48S^+=;nG=4YGB-7*`p64H^UbxOg9<3r@l$QiBpi zf)KiQ|J>xTth_^Cx|#d^H|;=J0#EzCo5)7&n;eAJ)&jUEzy-*E;>+Fj40Ol5ITVa* zVZdD<1L8Ot{eU%0x07Y`PL}Nh>MC|dsuiN0&$C2K14h9?qW%U%W6-?}`}urjqEl$U zn-3-F9a}@%iJISoVMEI@tR;s6dC8J%8Aje}MFD2i`=JQG(dNn5P?j2IB#La-ppe82 z=y}f=s#z5P^vWgIE(ie5jO15mePI_IWi_Y1$s)hw2B$K|(J0Doc4zpIV>Z|@>j2VN zBg=QuJ^mEnZ&;#v3>T0=E2HNbB5SS?Oa7PzJi>K0C?qrYd=XR3;vXgeOfrXizP-=y zJPGY;pyE%3aN4DCaO&ZG((95aWz85SZjmQC-9^6{E@%(ouwPAwusOY}Nzy%qH)fSu(Ot9AoNaeZovEZaQ-$H$iap5@vVN1%$@ z#ES%;=LNsJxrYeoa%5V@pE1K_?B|6K7GVntaa9lntCcFHrK(`ibFVRT4*7bitZ6Ekw?W<6SQWh!($eg5=^Vr0F@ z%&0N0GSYf1UN%#Be^@IwE-u;206VsMq+pq%Iebi1?rYAE9xw^-rM?B%>=*Zi%u|1b z70$f))MVL4_%zH~{d>aj=VT+J&qRD5n)vM3>EfLacLx|;S*0lJxa@749q!*G{Ogj>f38F%Vl`B=EvlJ zvv~H(2Hrc=(LV=~kA~Pzx#sN||2Z9x0=h7Hq*(CISuY+;H7@uKd)EV-8Azw<=YFtf z3qIrR!Zv@P2^;m|LVhU4*4(naJ8?xj?u!4<`?=g)oT1sKaJ5Ig*$+2zV$D()RXOtT z)~+4xx|MBM{j8NYBcxGTsmW(aE@4N9J9T7?JGD;y84+coTdLyr8eZ7m*8UF(EqZuZ zPT9GbTC20_W(^7Frl&@IrT38xgJ9-^HLVa|zOT68d9~NKHfzOMqo1yXZz_Fr!l1Cx zQ7gA@#=STL*?0GP__yXmzr(`j<}d=39*rKG27r~$Q8Q*0{K$so6JTgjYYc z8&46+*A^?dNZ3ll4m{)`PVa7PHM*JRqb_fpXrBV|j&L;=S?mXw!o&FIZ`SFH1Kq|J zeq;@F(+!B~^H_~{D5AaWWN=YK0}=W4`38IZX6J`1xGq9;hW!<4nGl2A26S!C*xsGz zhtE6=`*FF~(+Zb=X1#=CzDk}o^NxF$TTNuIX~m=+$@jJ~@i7(#4K+1i#8$Nw*uOSd;7Y2??}|tuK2+wKM+`UPg9qIbTA5G?;m? zKNs(Zv|RF;)htdg^;v3?`kY~|f#e(3BXxC%UC+nCz9Cd{48I*nQk!2bDw5%qq+E5F zbZJMf+Qb~33902b2h!7xNmjK|;XFgJL{Qm5@Y^9C8$r95QmI1PMa`2dh{g}VD-T3BY* zCnVWzF~X1CE3+UevGiSoZhlL27=)fBce#QReI<(iFW+Lw-rm#T)6uZc!VWncc0*N` z!8gK)*>yqZ>00@kmv2|({_Zey^b(6gq%@RH-sRGUh(%X2q~HX{NN*Ff-?sz#24VK`jFsFW9?=}u`Pf&6%f-DI<0nQN(;{Hb$i8$|H~w;D@@33UGZ z1*^fKAmRw?>e1MNTfCDsvnqG1>@}*Jyy?JrZ3#lF*M#bfQ|9X9LtfkR{J<71-ZH|W zVL*7^M1pQEimCD9R7;M`igYtTl&N6S{@@C-o_0)aI$Y0^LdvxJF%1BuM9NgOnvS2W z`6glSXgsTFxZc}&QD&A`x>lr&yH<|StBVQY^e`Lmu)&m_lwbi5eQCO5D@%rd31Gq> zPyiLW=E>CN?So? z9o=aL))DgxW)g>ic2f3j+ISpXoS`j#?IeFQGZ;}Lz{34A%e!dR%;t@(q#Icp&gL}L z%ou;nBK~3GaHPsNWR?<{i)I0U#tuH}S`SF+@zb z6z&BNNUI@$ABDK3?Z(hFd`vdXCi`;dfjQ(_`)d`jF{{R0Ka2X_-HAH$Fg&3$%t)&F7exOCR zo-#0z$lpPY@#joaPM;-Te^v7D%CP&D1t7F@O0Xa}W`@ipLu(NID(@5U>IYF-u38)0 zfsR0&3>7niH)2sxnUA*2<|x2LwW8EQDjD%l_hVV_n{gMw20!U+ys`4mo;)Tcc+p*Z zirkqePiKr=NU=iN2v88IHG1pcJNXluW56C9F&MAksoE++x;>d^1+dQ~96Q!){a9ra z)3KYTu{i(d%}rTlXxQ30_v)K-r4q4FUjWLjkq#r3S8$%Zq38qkB9?%Qz+5i#0*=+OanE5vkVOik>OBitaMdM?DDMxaqZvZ*vr-q91J;yeD6e6%~xK;NOm z-r@Pnj!*s?pog!F)VSnDO$}?YPKRFe6m<^{W#YNL_hHrpj>ax!Mdkadaq73~1XTZC zHh6izZw)@Ziv4BPz;`dwTmbi7H^v=IC!q!FdzSFjoNj5048iY0@?~lADkd)%$HW${ zrwiR3$@081rF?GETv%P}~sAT}^5|TiDYQmW zIsMsLz-lW8D8CLru9wSiOIR`aUibK59S8Z2%5iNso`G`E1XnhCet{1f^6n@6bK&YD zRo;yK4m((CK4Uts$@GfY@r@lqPYwEl2C*XqV66q5XT1lHj!WF{OnakzC~Z~`fBx(& z$}wZ`Zfp2`Tu?$-%{T^7?s%x@?k=*vD^iwAU~@o5MwmE>TjmGdVUOW}wz_)l_-DDh zZbvJy=fthVUG;KK&l4`(UyPoXvuPQRt2M_@SM1RXEqu>4@!p{o02wMwlY3!`dfSkv z)VKGd@4nZ5;O_xi{r()A(3~m*w75sCBF_DG;NeD*JlAb!@tTv3TlAs{hH&S&dqNTR{p-09Z#9gdZ2gLm}-V#A_R@bmdDFRTHZ)Q_T!W)`y>x zR-@e;{T1>1q{3UXTlJnGPro(`Xttl+b;=FV&v z;phyQPW)O{L;4DTi;*$WarIk9=H4`^h4|40sH z$DNuRH6$Lo^`^rj)Etj@6Pe;>4~3U_$;Wec#b}$zKYO)jUFBud;rs0~9Dug4ijtc( z68mp) z7uSU>Wqb345s()cLsh&+TOh#n^Cg4eEF}pZ*gJOr0kF^e(K6{MrF+OdXc)R+{|5!!8Z~nhuH6R=6aOp~@cU~| z`LP!8P|zlc!4i`A&P6!yOn{;HBdOVb7e+Cg0tyKaKe;2uJR;Y2syo zv-4fPXoSX0Ci+d>Cq0k+-@)z{AH7naq+Kj7c$KvcEtZzwCv>{agjKQ^^kD*;Hx--` zmKqQM7vxxHH07P;75vV=nqqMo)-o|##8WA}S$fl^wx<*mG*+(JbxMnw4wGWQjjdsn zF~$#L zW)G<1h-sV2h}XDnDTp(qdn$&F7zzN&AEl5-Gp(iKVr(S)u>j7HYMCJQ-!yLSYj9z$ zRkKDUxI4k`3PTM5d!jn@TtY+O1qXg-I5yE*YMPL&PgcS`qR9lD z3?u=%{<~}vu14XsERBuTE)(hyj;?zjB(oZlR@cM+d}+GW4n{zE+ZE9vUi}Chz#Rxy zdvp17{#fv&_4kLB_cQ3rivBc!zarCVcLep7qeIJC&)(~8B5eKCd*Ni)8*Xv&w2;Y}Mltt>Z;~6n9%UZ^K18^3B6{hTXvn(CFFR7=p$pPK=Cw%CSy&n? z%v_52p9k;p>MXZRY@92}4&B1u`=v4iyy1FCv7dWuFuqO1Sk#h_yYH9)K606>w8Wz# z0bGoSkTtHO>KeE!-(`*TYt(n8+j2kD-k}1Bb>zU9Jvq2nh{rDe4!^Aq zpD{IxEETAukj;S=X*Ke*z{fNA8@eTLHg$1O$pk?ta6`~r#ODQ$J@=2tDe2 zo>L_&(4+{#1RUpd;&K>jyMA7r+sBfb(7GlUyHqVmO07xqcbP_<8h-n+J@Suv>ab#7 z<@#s2rku8dHM|VH+;;c$o4=N~DKn#O%xi?VDU+j59TK+xFmDMVUZF=nfc-D5+c)vex)wOyRtv<8rO}I;t?k+R9w!_{>1W;{=b;*M5n|{D`ea zes&z&giY^mf%)p_tAZZ#_3+=-%!$NOc_B{E{$=OK>u zMfuiaC-i>43Zktms=0L{1-roNcDA_T&0Udxx0{mX?-_9J~uRNq?L2CCdEnoPj)|;>UtO8l{*epN2nE(d%72)n7z@P0v zle@s8@h3JLHMP|Ihlx=N9KDJ^b2537oqaAXZ#;hik*GU0zjS{5ohJ?XyD5Rmp5?o2 zA7Ov<0siyMDMZ>V4`5;iGyXJ}fWliYY)p<2ELtgx{ha z&d$g=-U1a@49P><;3LXbOhWlGD=MDp)eXr34uAC!Z|2*{<@?*Tu!vbAkSL9c0w~>y z0OZxh)n#Vtf-e|3Dq=MrM&7`Jxi^9xmOgM*zPgJqJAO-lO6ICESaiBW<}P!U~{WbGv5hWc@)D?c15#lfiz6r>tnQC zrsg)Huk*MGJ3MQEX5eTS$EP8>4_h1T76X7_%gZA9o|E@#Viht*9+Yqkd$NimM}*-0 zojI{ukuDF4;JSZUU&ZJbLPU!%+x02MBTP4Q>ACa}s8?XgZ9Y5cDCYNyw1B1e_X;d=Hd8ALzNCK+f&oU=JhA zxM3f1vn=va?c0IQ$n+r!umPqlf#-_|0C{Ayg{mjpgoENYCF;~jF4RBcuRsmM`EJt( z$;exP3U8zqZ{sgMUOUh9iz9twRn)DUg6kh8&trio97QXY-suu$kWUiN(6JbrxG}w$ zMek(#j_Nkf!5yAY2k3#DV{Z$TuC(Mu16ADQI@9enc$K2N3e2iU!U zzsK;CWbA7c1C0rpWike4GAZ#b)c|BF5a&ifb}Y_BQTewT zGV!(yV6{GA;tInLvnF$7daJwl>&rp|pq@P%>~-pdmce%BQ0a{voJ#gSBz8+D{3*i4 zju~;H2@b64!vhEq=>r=z2_Cx(xqkU-Bl*5cP(ZoUQr*VVz0f`w&R)_DKQ`Gzt;A%c zCTNr(YRiky|7{NuMu(H}(A{U2eih}$wZItJMMmP)0>A(TiOG*#vZ0y@UYebi4ip}q z-l@IO+P4dPyMN-y#DWm~d535$&XiCTubTwk9uN)tJ}%PD{lY*KpBfBzY`RR zXA@pY$=v4|N3%z6;keZ}$^OikM=+_VvD7U0KvNY|13p`@j7%u(%=h11%Oz1T4}O1J zgRjkW`W>KfY&f{EPR2K`+Fbg3M7!M8TAS<-!G6o{eztxwX=n#1|tzc0vZg069q zpYTI@G{Iyy8Dg5W1ukx}VfFq(%{c`Z`xuJ!WUDpCzoIk!92DyD+2q1DL6Ow2&yTh= z3)(7=bhzpjoVcrWLBdKRIA7}iT1K_k0FpA>)BW{HHmwS`$q}DYGX#5%u;UyXKH`pO zM`NgINp8&C4#P=|js~0Xz<+EEg@dJhvZE6ustUJh@)=RM_#BCt?`|COS9eCRDVV_g z7wuA5eYUvZi&X~3*ZqG*>04=ue8-ICgP%6%gj{>$mI?N85*RAkxlbL*hl~U_`ZLuM z{8+W|N5;v`knIJ7la?|o?52t7vrS}lL7cD=)_JPJscxJ=2)hL@&t=Qn1Htz%tvuj zCqooSPnp!y$Q-8F81_fyzX$E8@13Df2}Q#1M1e+)zxUV1rA7&7tIM>nGXO+a zqqc|T4C=)C1DpKdsY@y`FIzc8;_ZIS>^dP^4g`q|YtreQEmcR4m?ureS?qR}i1-m8 z`1}6KP33p>oiS0jtw9lt@wK|#RSS!|uRhlccdwo*y6};He@4jIj~!n9HINS}-WQ$R zQniWIIF0bR9u!DPTFtsah!foqE?uHIlUq87d9{y@w9NF@S0osp0I5}diFU(K>Ijn^Va0r*uU&T&e)J^#*g>|pk_U0;EyW;m}GR3fj2mDCy zTb}FjJjeWeVSl}s{#p#sFe0zSxb8@u>W>^IzExlPH|kOQ^!w`+0<9JF*Iz=&W36-V zCoiqwgK}`3jh>DYCdm?WzD@Zq(WO4Kf*hvV|AXW)-acMmd?3LtZo)$+42BN68Ru639F%q5;jY}5y_rY5IaxC z*Tml)LP+reVHiXqbUd=PSpHpXm{Hi3~8Qrcjck;!do1%CvYD&-sE`Bi{@9uOd}d3cla3*Rhim( zE*r~cT&~-bge{IHZrm#;LterD{7liV^Hk*&XT|W+{8e5a?^G3I@+quLkwW@ss&ihx zz9#lZC`AeJT&wW<=RD%IwRGoO6`qrr;BS)#;+3t>>#Rac_kI%(4OFBaeP?r_cjEz- z^B9rBSJjdNC*uKR#&^=$R=WPRV*QSfb9ry(Rw}VwL&bie3K;RQo{cvnt=0+Oj_Zd4a7e#%E71N`rrcr??UNOZUBlrpU)*2J}p+6rlCQ7&`iv}WUfCc zF`U+XD=>@h+vrr-lo#4A7aZ?6i7d$|nI`6G9-v>LH} zbb_{mxz_m;w96Vvh?=^cr{zCsQw<{vLm+_SoqFs ze)GNK)FlU1a&7XNJTO0j4LnKG3eO-YLiD(YGZ9Abr$wnbQD`!d^yc0BjAZx zFU;8^w&J_|JK)7Kr79+>`>%N4lz;$LgZI=T#x&#(oB*t`lYZ%)^Z6$>VMZ+Lugki;huNlx;uhv|-je&(59~nBx?u@bgq-|}i z+>z)(N`DP-@v*`JIVL;*Vql*Bp&q)?$YsWAhUadFTVB9Gk2z_Q=TR5zH3;?-ryZiS zH!W!4TUtl4VkwxM*z@e8-#pdo1CUysET(jQ;Rfor{EuJc&H}{E(CvhaxPz$VI}( z^tDVPkc0RWpL2SjuCwBi^ zJ%x5`&opbs2)np7QEXSF6xAZ5P5UP_kQLI=EE7U%bkJwE4>X3Cpfioelu$&OJi~TCt8}>Mmdx*H$TB2BpP~Q-rfNs zSSGM`u`p7iXyf{e7I>Hu_$fg=gMhuD-EC(n@q3!IfSiDovCt)F@=^2N_g{#Sx_)yC zo>mP&8l9*$lCSP|1C#mEp;(yJ3Wrj9Jl#cj&`vKT7xkr|GRy6j9vRk>ldl{;Q+&o= zZSgQWAB>g`WnXTeT%4gm4`(GJCpWT$yg3j3M=vD%KFB6P_T za5FE2PBRiG%Wm9nv$vG4$RjD|(M2N#kFPPBoFVoVPy8x9v`!h=yltn$g1fG8WEg*Z z!zi=Ar8H(6)e(|2i2Wd^$D8B8Cj+m0T(4opi6+Ukn0p6sJr0Ss+GIQ{I9%5!N|t`J z364lNFCKo)<+|}ZSJ*kF1Hdy&NOz=8ZmnBi8x9OeiDPKG8t8oshrnq=nK*Zfqt*uL z1_2R5sx_>UQ&Vek6!?gMi8FRVDF3t!`-o|dk`bpu@d*F06Drq!L``g}?9nD;3f((+ zcoUBfz0V>fp><=n2sR&(69~0t_fk+dt+2qe6nU~IB}vp6PGgJ4$yn|01pE2=TD-(0 z6z?pgCIwq#;Lcv^aK_17%RL!-|LnNpvdV?*mW_YQGL!@0|vrD8?glc(m- zRF&pK7>F7=*Ps^rn3*_&0PJa(v%L4glhVM`8shsUl!EAHz)xIwtZU$`$o3HIs52+xHiK{>@@rI8vAV;-SuZu?~F20mI9y-gK{U6 zQRr8T@!&FLHE9X2L>k1`tY{oh<(eWe(33Yb96=^kac|ZNzSnLaGjBj&h|_cTZ!)f1 zOhD|{XX`-5{@NfV+FTU@>be_C^qwX3T7_C8e5tWf8jtxyXLOB(QYIY~kraw}kiO!$V7Pkrw%EHq|2AH>myVmzuQgZigGOzR-^i$E#J~l5h_6)#PG(YxI z`Kvsf0CXm%7_Hr(7&P)~)huwb;K$_q$)W&&d;EXtJxuU=Pe&nMED_j)IE=aKsaSQY z_`q@Bz_f-SxqlO@n9m+5X@C{8vf%b5rkU#@0q*sfG%45-HFNaaJJaNAOZ6JVpV=V% zE|Gt!*u5r=TWR>#hbN%!v8FY!B=8cFbh4*(X)^YdIqzkO@o;;>j>7LA zx?rWzq|8QafJ6NlR=SpfBA$!##VW^~%1Gv&_m2?|oK~l9>n_qd0QgyZ<}qfv$On5y z(8bk61?ufAk^~OopEzSc>|nN~Yx>y(|7`#MrV$@Ifi}kxbr4V#^sy-Z1OC(E=9lB5 zC|F~k3GJc)IqP6A3V^edb1wTtj2&gP=KA|m+}9AVJzI_O%7P6qIQbN!9RbYA z$(R~?!oa{bX7aeD`1t{Le7{9inMR9lmZGv)wVmEyHbQ$&iX=~qr~KH2-#h8($W6u` zW^Db5mKGgZyYuMpy$cNxkX{cGf1;~@_?C|W(wye{d6a`JqxY|byE z6Slf-iNO2t!P1kHXX_e&1N4X8Kd+EwX=p&Y>YNr5=s<=E5C^7tH2e1Z6b}%65h2lK zMnF4$#%Af>GVf}g=2f+hz{yO&@f4=8=(?Y0--n@Q%GJ8*>uO??&!(j%Sw=p+w+A8F zDbA}Vex{{6`q;dEI=jofC2zcxdL?-Rw7NWxL$Y(6McYhkhnj8M{^^qIv~YaonBlZg z5pcYjVOmO0{?8bF=SA$*f7+L`EyXX`M)X%a)6VZG$F z1MParLC7sA(@~zT&9wd|>a`|8Qn(`=%I15gf=0Tf+W#Q7K3YGYkGm~x)esnX z$#3?^u=tZ3Y4y^}%F{|T{X3HHvY?BKRy1#Do??z}c~Q+6f4=e>U{UnQ){xw9w`!a1 z=S={`%}8IPb9v!ZImYL`a?FT>V<7s{-tDv2?c=WhEJb?+QmYCe)|0GamMJf$W7Kz{hCUo;QgR{ zMzMn*0I;BKu{$wFYd9v_*4zu{ihCz7SonRz)3*v!WkQeT=(BsR-YFy`%=?Qx?uTw3 zsY&4q#R|L{?Rr#;$ueD>AZB8h+LF6ZE4to#I`^qdV;DsxIcVGx=p!XTVr*jOu z%59fDQl~TD<#tI2XUrCKux%&M3brqKtYVGGyS;r3KRfHYokuls48qOgAIxW(5R(5o zRcrT#cjt{8ojd&G0RfVzZ%$wQ61hj0qojAvJQW6ataTpOL<=U)(c_lc?ymMr^I7>( z^eq-PQbO(u^!?Ti>!tX&-{uoCRXGCLC`25h*q46pPqP~r>BpOIO_2Mwk%B>M5QIDL zOCjp#M(T^1Mx4fdLCz(4rOsxf;5yL}V3ogfvfFywFV~Y^uW{D;E)V|;*ZvFNyVT;v z#tGSnoMqtPPGj+WCi}AK?OV5fp^m!#CunsHT~_Xjfs*J2FZl{^!4TgK_0N}iD(2)M z5B8eJ)_rR7#@8gqqI)ZW&|mE@t9;n4`#9vt0IcSzU4{uJ9;u6=6?cT1y!6xJu_J^R zo_q2{_*|DNk3}u`DNUAiEb4z=jCR=<59w3?4eWv+%!_{|a02$|-|io22j9hYRGl)(+2rt% zC#|<70qeul-vGuUeaG;@JC@X96QxnZrvlr8!Fww!W9@`A0L>aFq3IRnEG$;;xAn1p z(l{A2uL-$+jTK@zK*nrGQ`gJBs-`0x^=(U4${-DYCMuSu*MzQGt8XrByW}iMpo6uL zi3cZZl%%hyvkI6OEFroraZnT4AozEX`e}uyX|IbsVnIGtX_w<(w{F*{a1`E+Ax{tz z`hg4=f0jw&Ht|aLO=wxUZwdU4T;`8b*krl9qcC%*=q!$4`w(e@&f4FsuikY}wa@E| zAF%3eFH^MRMlHi4nEKDRu^(0h;EDRJPru(w9I;)KS~drxh)tYbHl8zW#Fn?=-3jUo zXw4p_ph^Z59!D8NDu7Vtv1>}OB9T@yYW&MZhknqFxQSwva8+G=(5QzHt`7iA9edFe9$8F4HD35Ve| zJni(vFgw0ur;_S+4PERo*2{3%H2&9%s?Mvmx9)iA)t(UtuEKQ{r$KeJSo(|vaTP4F zvX6S#l?9?&V;g_^;fj1qOsJ5-lTnehol6!yYK@uwPvmsiDA$Lq=q5pMpF4`dRB^r^ zqLBOQcE#Z8?uOOH_IiLM_-ek+ppd@Y*I10ixNEMe+uy#Z4-8Uf!4;=&9h5fa`0+7i z>j7f4s4?)dWUHly$LRgXST~}+>u%<`=V^?j*0g|*_sV@6f>lw7;~7}QPX2`CzK^Kn zucZVy8F!|pYYwJwGr8J|0IB{MNwc~?MRN&Vlji@J{Gjx{RzU)=RMO061kO4YW#^yB zA%W@c0Jspx7(_tTDAN8B%+(prQo5mmY8bi?`VajFf&T>oHiXyPz|_5uaDX~3lx*NT zFa`?p>$PBp;`W1uveTNo5Cm~sCFsx%-DBhAwMGzeUM!){8Vq{|KEkF-{O0o4OE;u@ z(P#@)1PgKUhAF)B|%1E^7A?}pc)wNb3C*VmOJn}CCDH0`&s^x>biSF{03D0JO%|pU{6#_ z;_JEf>sg?6SSF+vvh)Ikvb}(wa&ONs#W%!%!scK)57v;}7wr3-Lr^EE3^o8wgiQ2s z?21o<{(!t;;?Tg$ z!2-k-pHa_TT=n{uuKh{1_-F8nt{B;svgN?${A>ELTC&XL*U8=?IMp!&d z7%~m>ex@p|je)U1_3zYP)S%dj&~{KPj0&pua{h=70fEJbKp8N1=qgm_W&YmzW&KEO z2&N9he(8RMJyLb94Z<8>J3qhFp5;DrK*XOw5}`<3B1q&wUnOg7Sc}Vo1jV1FboxT4ploKzFglEU+w<+DwP&w8`k_>+qV7)%b*ew zx9mQGE`oNSc%VRtKE(N?88WdBdsaNc$l+aL{15#Hf&U=z9|Zn`z<&_<4+8%|;6Dib z2Z8_JBCueP!;%FjqcOE*@g6|Xjwx`w-iu?V{Qf3U%S+#Ve-nj^A4)HHY;f?~7bA`h9g&=RK-2+pIG2Qfjj?d+c zkS}untlUG9+}8`vfFuWXQZreSwT>Z*WN%*O6fbTCVzaUS#`*+_b|NQ+?5G69g+^D_ z6N@;9RX@GN}eIJkc3`1z1cmGHT84$Cu^^Q z+5bBLA0MPJ6s;)}>}p1w0$%W~-}~B6@2UNl1vi50-TYdjwbF6W%O^>O(9p!2Mq4mhxts#k0!ej;Sevl~2n* z9PYJl*K7_V9G|&;rft&x4GIsE4W;vybpeiP+K5~5eAGKFe36XYIEnNn&q$6jz`(YH z?OTsgata#ZxctJ82s|D0SRHoy@tkL%QYp+=f%bn7&i~}c547g01^*7Iq;z53UZBgm zvP$rn-CcuC0WvtEa3vZ!#ul&{0sRG)>e_VtUp}~{kS3@UY`9)OM}%gZ5$@+${~V_x za=EPe8`5<1?FjL`L_6n5vawJDxRIy8*9$UWN56of?SD_E|IMguoq1!B4(tYCQ=`QG zPLd;zPD?8PoOiy!#gyA7rwzVb`bO~l5VL)pXgac(Z_^x|HYPI8KcM~2`RTID)h4FY z%hIwWgsNUAi&RPdkTG`#IeDaJSz<^-lsUWcXH-X=@EdycdaEtHg&}IgNCCX@K}EO| zy_WxTn~Kwy{C7O1Kgg06lTDtq2bY83%yy5Xl^awRFxu|%hIJR(>v{GB$8ZKl&rEFwRB&DCbP@Z~ysTS9ll`kmc?^b}31Jh3-H4cb>^}lD*KT4i@g*MGYK2VE z#pen;MA=(@%&ogSo)UGcb)D?n|HV*4&8_2ige&&^*Jtd1-i80K`(5(ZzvI4jDc*a| zE;4P*sv`0?Y;2NS_d2U~Di|iyFj%kp5`hl13*@cB4q&XLxYnO(xUWosi}pmN%p7x* zp}(==Q%+DwvK|+A*gJhK{N`tdxw`DDq7{-X6^D9%qHJI5ry6TfmW2o&O(0EkcpST! zQ;7byfV$PSSauv?911{SHv`Tn?FsME7(4N2IS2Q^O36Fd%PV>Q|T7bbf!7aq<3U#5r~(!K0L69q{H zOOs&RwVhi6RA#!Az+2}9oCR40y#)(BUa$2TZta=>gT1$kjw{KwMa9g_j21I9Gc!vT zvn*zo#mvkWvn*zoEM{i3m@%*W+;dNNHB?of_wznFNB-nTj&^n~IW zQ8(@)_ZO~bZw;I=(mYyQa+JVmpNloC^4OF;Ac1w#rx=j^w8xsurr9+m)^REyWvS$} zMMYyvUIVS~KmvKz@L?!q=3CbxCC^Tinf?~f!x)7ix@FGQR`^KxUcV_B{&BJX7dV6c z`!$(kV1PoGVKiFS$<~02U&>+*g%KekK8GysHF3cL!l%=luy70G5aVE-<>g&q>b6bB zB_XG(fgg`%D-Bm1Y8~IuvKQ!4ViA{dap2#Q%)F2JKc+>EhNkte`E*Aik|KPZXQx&f z1!#IcOXQV4dMNVDcs1q2oB#iuFh5Z%8NqdUM2l4fhmAK{{Ka`ys|ZM{?FGXGfaQ>J7qXg4m2lnvuf$2C6$hW znq)~%OS=luxtHy-uKpu`@awK|-{4c8rrChGB;M+`&pUxO@=mri!g_)rNEy`;gX^X| z#(@B`k=+$dIV(d7JKSLrFz0v!4e#}ftm$l5w7j0_@}6$!z#i6XAhA5+BmVWfcbo3V z!}66=*XirquR;gm2KaT%u3W4%l3GMUh1 zaRFvAzY1v=Bq)5Ogm!!r&FMC8c*>1Y3*I#dv$-#){w1o&1^pWuuJV9oHrF%eA-@fb zzRuO_ZY*RayW9k)5ihKTBSi4MIIOnB{_RORs2gu`XhQMynQ(qmg(q(ibiv@<2XRd9 zpKzg4oo+fp*?p;<(L7It??K%F#N5q%n2<>lj{M-Qm~I)m)pE(Bl$W%2PJlsk;hzbG z+Rakw#J@-E1KZF1M5^@SW_@;;rem}7*G+NVcbFxqmco4WrWGH+neUJZ-8w>v(x0XU zWHk_mfmOq#{~WeU{&APnJX#&d({H0^$rEGRW49cQI~Vw5t^1M_W*>B{iV@vHd~$4# znidva4Hqk)%+t!!zNg@UorU|Q|ay%c)={WW=;PHrjx7rE`XfARNw*)sTotE8_ei#Y)H za{#mQaCwxY^fQJ<1hBKY)-g}sc{3i?ZVR;3rwQ72qgdYRgZ z_v@UC!A`JsjV)sdxz2cX86({y6B;7%lTby}>R`QJfdC)UyC6InAl!+iaT>pH2eZ3} zprlm;oxA0{yH{hXxQ%5)_lg;|tZ)q;j1v9psCG&|O63w<=#h_w!N~uvv-`Vd5TzA6 z(^CTuoBEvu!GqM_!%A%Z7ST1BJ)EDvS$rU(l2|0(VXwN3N$xsKf|prkZ4=AW0m^d zEqvNo1NCuF{@QB&%l$3Gc}hz7@3j}cYB}+;T{G3j+=|`xyG09rZ=5KFx4Eo*2jcZE z5?=*zoW#tuD$u*$@owak9DEV^R|wMj9)prqG7(heyf!c5&Jl`?kPw+lH`uDpgy=bzi)dWIOMYIgJE0ohKsd% zkOxpU#ndRJV*kXHe$~BYkkR!fT2JGT6r2t|+KFi1i1>*}fIMefMLB9ZCX?b^e_{YQ zm9oeH2rt#7``d^)^Euz%qL>CjdGU98i;vl2`@JBF=buK3ObRDME+YVX0Mq<_B@<+e z!;8zsVkvodP{bx`0dvROzX14O-S=OYM4-(PBHf>Fn2g6U&MtNr1WXhCxM*GT=fIr$ z(Vp!O=(iQVee%5e$RK3bEzA2ZLwZIxc`+>V>s;HH+1S^6yMDxlJ;jlBv85=$gs_k4 zO2j7RvuU}S;rgbgNU^yL1SMhc`8VxzNg_IdtkoJv90>(W61O_`$X-AAsY%f^2jY)8 zNAg6-ahLIeyJdU?iI)M>woh5;tbQP?=VxqgcG}GufEXJYB-B)D~|*so$}OOK@VQRh_|dliz1j9nYmK#8^ABm z6nf242cX;r&C?U%Kqj`@oVujZ=DMUE%64;B-7T-g?Gc0u?o)h;)gKAN?yM@Sq_VjH zB9RjCVdNSMljG*J(np>riXttlIH$=xtQGLx|0dS{Urqjhd7*z;14{oMq6dCu`_3$% zm>_*e0}u9-SMNN8Zek~z2ROzL91>6eqft{J78#{KOa2VFH};u-C46A59?uFKa*Lc) zve>5z*zu>=WH3o%zWJ-UE%t0=My6zLPgODlj=z2z|f1Y3_QEvrfaiwa(kCb}tj{ZSI7 z9~T=T8L_zllP45#H49=nfO%Sah!K;w$ec4iRV5z#VUP}5uL+6r5b(UE#DLSG8Wz#q zN$0Tr;3z{~%>LKW)^!loXGpZ z#*EEaP%N@h5yvn^^=JLczoSuqceYj0c`SziWZkj?%vY%4nl5bcO0k)BO(mdvI1j&) z?~^2>%*G<-_tIEMji)O&89iLRZM%xKK3f3`e2u-d4fc4+izHwQvt~VqFp*UBMnUY$ zi(PrMR#Px#}^T;RV!Je?XGa*pGLA8EI6B&-yTem`B9#R3_-=whS(0}lu z{e?vS-O>N1#9e;+^AuX#C(aAE!d}L*&S$kOCFP8+?eTy-9{>e;!Z%^=hN^=gBAW(h zm^%B~r{09tHPA;i^9umEfP`gbl>8u9d|dc7MuQ|e}7^3fXKp)TNt#?Ci+R1Pan zvW?D*2t)&TmC3rBWL6Vfl9`%-^td{}U*)e}mf=3d8{{yuyAT z|5C!Za?e3#=1kML5VXEAuDwMMLN`~GZd9EzSoL%JWEWsC;7HS)h@m7L#FWg2iGE|W zGS3D#jp_lm)KB>dH-JXo6HHoX>1&CO>}`oJ(~3HV#NzVZk`DU6C%gZQy8ld zlD)!@<^9{{V7F*;EOTz9%^}+xAekplI&b|Jg?*}KB)Nx?e;}9q&jkJ#+y9rW9#g>dXG`|51sX7VzOM)7OcVeT zd}+>0#ZSFqM!LAE16S&jFQ@^yA)4-p>D^8jv=<4~lx0OD#!-6QF_S#xsa20Ljf=^Be^firx=w_RXH<2fWp!_YTU`)8*pv zlq*90B$=<#hc3-2jKs|a^R<~UQwDCs3$;&lrI*sBC!R*hISyRihzurn+mhEes^iDv zJ@(>_;-*iH&MSc0&YB75p%49}+wNE{nOiMq0rdo)g!>YFi1nF`C{n#f+#Jh?*>lQA z=+WZ5AmRro?y#?)BFHh;G3dztR9*U;Z4OWR=L&YVUm!F+f%Lu%SFQ{6RdUxA$K~K{ zKm;j3Zd0|MVec=C#Fif?&J zvP;iu0>^Le-5&=NDuIPwyy}w$3b8_DyxPY4FG>29#$x(|6vN(9U*>f3O4DzD$_*Eu zUsn*_)S~+^55z$}G0b33&@aJ~OveoWRQCHP`}*%SIEeT^ z$vD}PeDPPZtKh^Z{JEX-rmfE^0GN-xp5jJ*n4`T(*j^hJUIDyy#A@g>)L$a*RYqHECfk8#s5Jp z#u*C7G?tcupKZx<;F1|5hP^=IQ5Oj$VYGI-eqt`blGuB9Bz6?LP~pg#iEjS^rL~COBKFYq&P2O zE7Mh<*)$Er6E4fjX;C~EDyW&$6DJehOwTn=NjMz1Oy1T_H1@%Nw6ch)jFNm^?8l4$ zU|*md$!ky9$<0Z<)p7J}ej4A8B;JQlV|=;GQb@l~h*<`eMiHM;HYKpkIRaex%g!Q< zV)XhwDgNy$MO;}@^^^+xZ$m|PWBODH?Px@x(f^CXn}gi<=f5hANm;DH<6exu9zD}&8!1X zzTXK8xNHF*N#C7W@}qz9vAv8v4$hSbk<*=jZ3Lo``L~Mr|Al_YU42vk79TFa$C*rCFZCRAjA;f1jwdV4U1**yZjzhTF=K-E~-3CCbV^M@MD(6`P`z2fVX zHdeG>2SE?^J!&$F{k*M3wHQHZ{;05v>ubxhBCV`sAX^2M$6qLJH0A@yf03>YQt3Ks zOv06PAr>w=8(0K`Y*w>xWqpOASW! zHAWaq1LJKHVW12NL<=nUL_63cp%UPy@MDhv}^-TYF zM0RHYICDK^ttU+&BvOsd{i4K_&Fy%jaZ}KK&1PbZqsyuH9-K$X5@2|5!0&Yb`q|@m zn-~vGV_8(4`^$gf{`NhND^*kjB799Q&p2f0?EsXMcALzwJ?Lg#OsECcP`aQz)p* ziB4OyHns!wqr`kjI=^UGs`0a2_b%!C4~19vRIX}W{64})9A~ND;jmOW|Hz^Cw+P+| z3Gv6qKgEF}6mzju;2)H<-fP7cGVtWC&RKLUQZXb`EX4r4NX|9kpR8Loet)YD{55ii zm;c--_qUJnS30h$@z3-tEfzYu!dKrn;3}M0!d@w*j&yh`5#I1^Y`D$`2E{T0*7|aJIg>C(G{`NGDR3hf*>%ywh>g_>m{$NFo$Q95uEv&_g;|UEb=j7pnjuJ4wqaLH4a38OVL8+?5k%)xiw)Z^Cw%Avp?z zkOKwo!%5UUx~U<^P)_AC>?=IGIl1OxkR)vjA2a!?;+4lC^HsumsKz+=`eE@fDC~5) zr5Eg1rQZZ&UgXC1YWU_*EJ_U_j8WeTSTB*7)BZABAhLeQE@SyRl-kOJ7xb$NaQhJ+ z&2Z=JQ#|Pz$qv`XF~>Rf3)U*?Vjmg+G+gz=rFnTvc*K`?YSUe2%^O#e=Ol9l1znwE zx+Cn}Z?F?O=bSDs)l{&i{To(Li1pU+>`ATxk7>=KqdhNKEZBH3^yZw2Qwp(*o6+`X0e_+Ktj zr!5Z~Xhm~Bhc@&TDk~pMf_Yo4hruRX7`b%;CEIK2Zw~r~V>x+c>)veh!=I5pClZe9n6fGdf5C?$>8*r5b1| z#6E^yVaO#*3f*G+NFEA?NI03lorUfXEAF=FURA2LSN&Oj>-ebZrqFFoyDp$&J0>1j zzo}E>&p5^G+sty*$O@?0JCt>8WBEb;z%hGSZaerj(>*2djswD^lgEd;>1d?{!syWJ zM}wU0t`DEm1bKwE44Rh2u}3z_vC=${pl+7!-1Z6CggwqRneofEaFv-lNLTh#ph+%m zHDvxV51d&_l$Be!jiZQEvg&RLg2Ly1QQdE!p; zBlWFA{cZp+v!jo!z0kU`;$J5@!=@XN=84oq%0J`BsRC$cq=EX@xKn3QPCIJ2FVNFX zhRO=iZ8#+Jm;(Bh<8SW@9o%%TT)+h zk&WL1JQv^{oUhBdXrk!(x>;@FKGxJi8)^}pJSJx8S@8ovp4UARZFidB)*2m8Q12J) z7de4`T>?BgsHd~>&{n^o6TG;sb5R!m>xxn&<8)P@L*lngl^Dl5lBN2VonU)v2N=xi zF10OdUFK4$yL(s6pEhJtJ?p0W2<9<{ ze@PO+P&{~@Vr-=@*N26^5Ajuj^MLYc?yUUmdZMRR+_P{9 zHGdqi%=x}>zW`cxo5*5{<4CIFlp~@xSHpU?lQwn zlQeDMWgD+|c1HZB1%%#t18t-nFD2=iuKQp_t(}*@PH;`mvPfUW5j(y`&_O4_?i-zV z(#l17;i=uGqroZSrIDJ2nqtR}u3%~T8X9=oRlQL(8S)`wggLG$r7}}5l}m9~Kt`YG zUg?j53vNmEK*&GD1OV5*x-{! zJ{i94=2OhH1yMbK48ooLCiP!4a+9q{uEu8VAY!Qn;4GtCWikA6ST< zRtus|pfX_zHVVg;Axnnb1^-j2fF&K8?!!tc^(JGEa1~1J@oZvW-Ss)Tmqv8ZI&!pL z8A6=ZAFIH1kjdjQ&od&ZaO14AoxIS0GNdXt*&^JBC2o}R^j72Pv!r=YrQIvx!_J%h zTavzd>dxpgfW689mBn=QWdTe9%&=MnFUv7^nGXQh-5ia4JlY;E)jDuWOUcr1O;qk2 zOk0h91ZR>0QXt3!ja#oC- zAWVlK{9)O{8YkVJ#4=Y#V+2anX>l9Ms(1SYf6(z7oQH_ZWRY=-$WozuNp=9G0KBNC z9_H(`TmmM%kzcc5l@h$dxizhNTFp0B_qKR?gg_=(1e{Iyoz7}t_dFM?SD-mfiHf+j zMz+v{*DJ`z%5GWRoS!1d*HOOQX^_2LD5{^XZ!JjIx@ErUchavbxeAD#<;(R(kaw1v zUaY2OoekRC+iYXNUbRwS&s!u^dl%H0nflAw<1=Aqfp3E@jPzC96eOvZa^N047xZSH z7Ov=j^*})1=W#qA^Z$gWyLfLC(<(pZ&&qE}zbbsmQ@qGUrT03s=tT|fQkg(Qg?X(BRt~qdZFj zZwH=+6xQ&c=tI zJ^$K|ryqveXXK%!rj#KJDuj&6Nn_E}`iayu1L_tKtNv+EfQJulSqZVO`vAhP;*(l#j=3 z-X@}Pttv??lTpElS|&0bN$vzR>1)sSLq_<&n^RVd?hy$qQk;uDi-nUUK4_{CmY6(Ob#jRO6z0leUB3 z3t@!PU)aLncj9#XbDf@I%ZU0K*%Yf#1DGX(&1;)8KB|RbDXbiy1B1cqlk;ru&sJVo z!;B9yl(L$|&UZK6__%z+rBANKR^0IdYj0D!f8bQN!uyw6aC?}TfEr^&-J_n9$RB{6hlx$hyZcw2RLp zj4QGspOq<%321lLLIlNr*vn5RR%z^7AfEtY-cGtfRobY#{N%j$z8DS`mWXbC(;6$0 zLr1z@Mr&*B(wVW<1I0ChrOwEz2G$_eWG8I(E3p*pX6Pzd#Wy+nfulg%%xmR5*@(TL zcMnE>l=xcPLoPD^e(5#}o5fLx=!@iwd}dO9%YPjuB=SDAa+&-wuh7+O9dAHyfb8@G z^cxF1>77QdR%TZB!#L|1Bh}j(Lx!!MX7YAyzC@-U>NXC?^nxd>n#;-9_LK6+ zoEH)gKVX{*ezvF`oo81ehZ^B2fMHM)GTcjxh5>r?#%W?W?;@Ye6IA%j!yEA&7Prb1W!RyZoLp^qSWZ{ zF#3uHI)~5Cl`8(8%0~A+J{&u3K{bG)d^~zA6HM3ON<$GrJO1Z-0B#vs$-X_L02!6{ z-8WKj=HJ{WX@}im&6f z&cQQn*4~DRzP)HUYezXFLJ}c;Omd5tVvB zfd&U>WloULRHLMh0UT|3ux!+}yLCC72Gow351*5N#g;LIGge#d?dX;=Knn+F{nbSD zH7)DY`S1xJY+5j1ytqTi@vqL3<-2y8{5oXkp0(!0&eK$jNfD>3>R^+g>q210<*N

    #hNs0Hi==(skF@zQnWqLcf9%L1!q+oe0U`M-Cd0XX8y#7Q*P?O{E~vD5No=4 zyNj2FZh|?{+7LRvH}ypV&^GQq@Z45;8O559g48mOJUkp#*y1y!It7v6`{uXqdHe^$ zS0;DOn#9SefRncnZwV3IbB7Tr6uLH;itVAiXS(r5fFs*>vxZjc!Nl_yZ9Pi+A!1t` z`sC1&qtXn#sTd{hh=!lZm@;yi3#)U$1wNjbL?tjQZyR z`iic;LN7t{L5g-}_RQ4JjE&$>7*yD<(onI@d6iu{VsF{!51Kv)J=?Sv4w(HZa#RCD z8W6R0QADf6dm%2zWZGB4ku{1F-dl-uk*Kqo4CL9?c^?ASG|a}WOk>_pT~YZc;RN*} zMTb!g@Y1n;+{?F`l%38czWPzl7#tz0(GGojsRC&S&&e`>Rr1jvIz?kHSm$paif#oH z@$9r=IZR$^a$%Nv2O0)~yAw@mtS?6(L#QGKM#0r1g_EeP58GEr9j4b`L?+gfDhcCMPCs z;zT=MO-$8JzyInIo~8Ad$Tvm{@(PC3dA-qsxC+x{?=? z0i`_8yT+OeZ$c0ednRRk>!JZUCE|F6l+Vxj>p|yP9Uvl-aen`$a7=|>Yf_P}hXsn@ z%OQ;Qz4)@6`OZ>-mMs@_^JS4(!Ykd3j`QKknExYnYVX%MzQW8eFJq3EhX72IYk=$2 z`zdmQKC9W?6@?A%i2)p=D9H%?aPZAO5rBPE0q@C*Bf1pQ_G@~Um4QDkmXW^)2}LQV zixzIA5=8b~4j&Q*hZM8RyeV9Lhe|n~*d1ZXcMsIbi0jO|78)_XRcqKLe>O9 z{E?>XbB%Q@xxNL&$gecn1crU4&anUCjBtG41)(m~HI|bjxizSeBSpQ=qBaFnC3rGa z)I<)($kRkQ7>lyr&Qfq__F)3iDA=G0t4f$1cxjYA|G?r~Jv|1?Ui8xnSod5H8oU)D z{s{&5#kW(#$qGr-w>vijR#*&Z$S_-a%EYzD@fb2?I6UL+`Lc7d0rT7#4V4*stSsRF zTOLxNbQCh1*)s!zp`xRTC`;4P+*`dl*dtuL%aI~+CGTalwg!5KUBF=gt{^kl7{1G1 zbd{*(G66DR15P;|Hek*^FN0sJK^f}}>W6z9ixRmXR-P6=ZE%UQQhd30F{Vh$H*6yXS{wj%0+lj=2=TnEYivrK zbiC~8($y>PSmjGeDhMi034%yr1BNR#Or0}P7-c+QlS-3%hMFW+05X68z%SsYXdB*V zMsA8Ry_mJtx4*kEaT6-S1jHPrz-L#mVX zQ_4l-y%dvAu^%o>U%*SD7hA^AaI3as2@@inDupfUDE`fLnQ%s}wO9rYggufibcLJ1 z_GFQJAvp#-pP41A3wj!mSHh6oX{>Yq;&V&QHgfXvB}b>IT}bYLICXHnmjRYpUW~PV zIxRZP9EOuBocz2co8y_a>vxb=TKjW;yjqX^F=PIfCL%+sbz0E%L+=Y*RmHXoiLy@S zJnxgxxa;epMXFU2xp8==hZe^yLGuPxYkgGJ2;9Ut z(I3e``0L@MJG^L+pEGntf%(Q z*2@#>H=TvcjW?j1)C3d_{IlwbC042cxGj%eeFKE6;ISVv0zjKC@fW~sz`{pg4X~1u zpZhx+G)U}vd7vXlICt2sT{W&p3S6Z)IX_Ag$?qbSAmUE8>MiK!lod+%klerTh{Qp9^;lvxpXwT4xa;Ej1ZALE7+bu{oh1H)un4Rf;de2 zsrEN#qbXqiOnkQTwnF>^m|)DMBbRQXmhEIrURV3a2;RRV80f;>63)`Dg%Q?UsH!0# z?d7N7I>D;mvqeU&ne_n5aTJ;V%6#k1$5>cF$HGXE-1@yN61$Tr{_N2Su%)@+OS~F1 z!3vp%j%r~GmVU8G*Qz1cxOjUzc>1~e$q-I z`Zti+|MQOkSe4X~KJpr)R{a zUy}#9Xo&H(Z20WSng|4cxG8+ULG?W^mzpS%J%NSrRBD<(c{gJW)*zYfmkDl2dgH59 zPsbrT%C}OxhrCvB#8(%r0laS@iGlom0d@PkEW>(^ZOaQH|7FULr`2S@n_7vwV4Jd? zziE7R(|{`}(EDhF>IlNcwzW3iYOh)J5V>+bhPI60V)&~3e8p@kr8F+DORb4%ruMi# zWeh@^x~1$2<+HAZ|! zA$JV-?R@pH8$ZC(KjTC)lh{x#gBv4Tv)DXS(#z#UnsJ@4vZ_}hHl;pquPd(35 z6w)e7BGA){CDn) zkFd%MnBC&4uAJDAnv>r@jFD0BGpFY(Qfjx(g({RVMrN@MacFpmz~Z95Z?ATdRyB;U zb}&=n2+`$)oG$Ou&h9LzhE-kg*cWt!-xnTwt?aoF&#n*9fq_^ak{`|BVHgDUQAh3c z3E!2a-~qNqR}V*3HGe#r?lCC*d2(uJn?CnbT|K$)7EvX=o`rSl(%o8+w$DbnEjsSJ zhfGmSDLrLY+}q8GMj>KE1NP%D>Ea$M7%~3lTzlZ#5aua&1bh{Vyf1F=ismDJ>Chir z9ohc5tGTm(zg4V3J%G)gyL}tW1xgjYT^LIkI-O*|R_>gvfkG_ooVeu=X_Wg0SsRJ; ze3-0(Oo~=!jkg;kxa;kgIGs3LdQ2C-WdC#}`ztq6Ap6>omUa#r64|(+?Sfp}Pa>&& zpn`mN9T@A$!sZ^Cp=`Saw|cMaE7fLBuxT&N!8?3!%OAtIvAFghyf9YS(wWuqAvrD< zP~SbC!2nBk$q#K!>S8@eOmYH>Z-VKv;xM#HG95Pc7lu~4_RjDxrhaT}zI09BEubz_ zmy9oghnASjlICKDgX2S}HK=O*wFJ8;NJ$C3mhQ^~uOa9Yu|1N3=>Q`vAjx9esBs&B zSp%M)qwSh<)3jF^VzBgj>6Vb=d%e6pBJ}>4ilFPh6#46}+Aa~QPs=_n+TJjw6g|Dy zjrdAe^As136pY6qwG-#!QrHc0JZH_IG1k$QmO^WrBnufbX0m=42O*iRw+Ibl@?Cr1(M^x_7Jwt5$Add1iund7fb2q$GXxy!#T+$QMMv~o~zCi(#g{j44qXEBAwRT_x}c7nEiKEBb41 zV6gvuQu;U(*{hTcVT3YxQj8;pODEEInt+V@MMdvzK34^EwLJ!=0RTgXa?j^13qt?n zPYA^>giEIO|76)c#+|9|-U0Nh+{7CjIaMV4qHDJzYmdbZm!Z(9yy)3!_1odoLa9(w ztjwtsj$0ar_qiU5twUSni|PvD(#_xF*WiqZ(zM%}u>zGecF@8WY@?0id>A4P`H(&5 zxjjrHnopoze*2_?+gN({bbdss6};Ucidhgq9EXbZK4%*^?%u*whyZhR(0U0>nzd7X zvEBK=njjgC+mWP5pU^sbJUzO!0MrV~!aj}A9y!@(B^mdT2| z-p;WS2s(s+$}A4RAeat~bX8pB_jHZ?9Ve`rX7tG=zU2$*^Qn$@ipLY)ntoJtVkRAg zQ97B_zjK5MzBSB9Z+FLR=#Fc$wauwin*G_G+CdbT?!Jh(J@*P37l#6@M?s0%FUkio zl-08N>n${+au>WMdow%&;y9r->~+D-IU`mXF&VhEhF}mvMGfo?NL z*-X7&CFXS zne7&E zui9#ld~6eIG8XfsGo)3AcGo}tv**Fc_aCna6b4d(D-d$2-NSHwV?$c6FN{9uEzRTyRL~ zrMzgE{LR8QP18)B5ME@o=l~>Xx&@jPWC|mkD)z70!ZAZv*{}MNNoY4TG2CLa67wQ` zy&gI72;2kz1<0`Ekw*yP%9gYr_&ef#WOdZxr^V+rEO$GZY~-HMGD)E2eFpSPR_+NN z>O!Po#;~@)bc^Bo2?bvxUX!Z{h4Ji26wy6FXFcz0l449@D#MdXgMFAE!hG*1=(YAe zq3AY&9^I$=CU@r&mQLoKHlS`a((_3|0>0N3>>4la_`usp`Ojs`w!Mnr{m42Y6lPR5 z8qRm;1X;2fyt=vybas_oFoh86&}{@bBVp!K)v#!)#_#M-wt-UPkCc8by1%J1#oe^$ z47FR%k@a0<7TK?@uDS;MZb4Hso9iy)b4hyi9gcL4NZTK60>^RoP?{@2Yopb+K;ptn zV8jVrD9|Wr*H3$aO7+cQZr5(8^P?P#7-M-z|r; zCOnDtg`$U6MPZbe+&}qg9v(!8JbV#QV_OUp*pTZ1i8C|qHtm&iw$z;#tPCrn+BVa$ z)@0?(EIN6*<>%w%1o5a>9z`Xf%^L6e9QrimDe8o7ch>Vutq)Iv$PZa*lVOv0YkT$g zNefK2#e0jI)B19xV>>5mh@PvHT&T(+FKl?CPXO57-QSPI`vL_xYjxO*sW(19kPxs? zDWkOY2R71MA0pz@BAUUD3&i~uxA!8UJ4xCT(t@l0Y95hLzt}bhlaj>@nNQ3#K84c4 z%JPQ`sM7v%j3^AG?ObL3`l2EW=Z^B#>;75(8ATu-l z8PPEDH}vU8q%9_lpEz4 zOpzC=<93e8JEQE9ek>t^*NPqT-N*jNxXkpO{UP^s`|F+f#NBCEwDue|YJoLJHCFVX z`nSJayQbNgFG$Ug9rRLtUQ^dK-?N0aJ8rF_p+g&U0*?(nIza{AznP%SSHKr<_4wds zyzBp`G1|6!{7eDvxoeS~lQJjg@dA=FH)NeqK&TZ>SI+lQPzl4V zd0lnmZoaHjmVZ*Ui|hLDgCoFQTq5Mgzmo^4q63eVGw(Q6a>0^oqxt3fkStTLh5h61 z^D48kT)eA|S>b9e3!|E}CAT4inuutGCDG&dD&{g-Z{5#trW4ixGqV5K<{>pQBs^@w z?|EybZoRfc;!h~mGg$x6>uDrH&KGRFsCOT5j{BzjwOU-8Mmar#Px4u2#Qy;~AC?!V zg4%D#SQNgq$4YFdbMn<52Htqgvg+~ISSkRu6Z*FbD)iOBx&C9)|5+9);^l5)`Aq9* zw)0hclN_$sFd7JL{GSskd=`K*gg`~A{D4jXOKAQs%x8{lnlPuet*zaaC!gYM&aoxZ z1XxtfF^~2AGd95))O1hy3mTSO7epyF0~PoNgv;-<5t(@(K%J(%lW=vCyH-qs&zFBD zi#1hfyI-h>iX9^Ldt5lOCj4(r`oNqNw1^a|ywO{z1oa1v`n-UL_#^g&FA#z39Qjc5 zIFH7hbd@J(e)SAC+`T?yUyWal9``iJ0+)dY09;&7fGuW;c{Xm&zzBI!J68@6a=_cg z^~A`eQ%g&AIzm3p5d+0>g{-KGPJM&SLtUW^CgdB!*{Y&Q>`THsi99IRoBREu5U$mS z=mfCB0O?&W7LNb54EC^*i1gq90000R|F$5tV0{Q36JV;ivtnTbljvj# zMR5E2*)iiMa;YY4;v>;!=1h1a;gcB7*v4f2(~vjGB2XONh#QP)vM$rF%Zn4QO^EZ0A^r@NB?qq zBOp9rjC*@gA!Y9V&@Spaut9R)5PX{rta?6Rpc+)HK73j5>6d4WPj}oRMo;PAFZYAD zPGJ3X0#3sMpB4Eqj)tFk{(D0-WXm$4|0;A>M8X;KHT7?Orr*gNogpIL8t7hRoD9;w@45ASgZF?bJh~SwQu`w+5pr0V{XnSWvh$(6ITTW@#*UYk0_v>-7YtAKD?gZ za$mGDUbOWM+B*X%$ITs(QXrgqJ}SIo?&h8Ni!IC(+&$e*{V3909&?QS-KwIZI(f0* z2#)G3Y;G0Qw#`;!RPC}Il92tcgCb=u)wn*2?naN5;g6N5EdV`{W;XJ>zfzs#=dzT4 z@Fyx*QKADWjNYr2zp-)(B(CC)IHH{1t$!BvUF}EA#Be5Sa@gGmTtjut(q{5Kq%vX+ zU@uJ25_i9k3K{$b!0wsT)O4w{tKHPI&uv95KTcY4gW)Wg%0sE_I1~U`qIfIxq^~YM z8i3)qirBEpK*_oud7e!&08*Y-2Cf!mM53F5E$UUr3^=1(#p@m`@g3pjjlwbidYq}X z3d95kSGmKr=1b8R$=RLD?LWqPtFj?Mgp)eV`d>wvB)1O(1{lYpk1k0UXhKHneNl-x ze#An4JlpMXC(RF1#@=7{GW5s!$DHzGewF1x)v>miGZTW!*n3}oRum`e`H)g@+TQLQ zIV4tL(=vz510$i!UaMu=v4nshWw&G}{6|!KY4R!^EK#h+NiA?AQyY6ob^u`(qGjiR zUs74(&x=WdEw{4HrL}h2)ZzW{LPS&LDKkY)eT$#%+)-9L>qbGu-zJOV@)30+N~$dB z<7Y6ErC1c70Lx32*)gJb6?VH4>tLS$qvWZlFq!w#S|FGwF@9=YALD~RgPSqcVi;y& zXS~fUFj-1oF;HWh+Z%16%Zk)Q%yr09L>~X{_+i+D`N<}z+4A2?^){+cUhIg%8CK%Q z>}PD7f7qmr?iEl+-I7Pc^+09tL_K!#f70tmmdF-5rUfgYJoaX|K=pjcV+=@%E`PIB zXcAqpMi4sGaAo6)?A`Fx)CQ#VLb+7CQjkSEwzQEWWx>#Oft4#%7iA8&%CQ=7-&eMU5y^7pXksaD3oeP9SL5WvfrD*>gj=XhK=h?5`|If|n z@^~%P4{sY)&EDmK2HLiRaeW+Hvw2HZEFb~7CH+N0b>u>wqY#P=4YVV66QwqH3c35@ zvr#LW4^W!p;Ic3^uu&l`bWSTm1=@m`?v9QCEE;Yh^G7-%K?pt5=g)(5S*FrwZ;#!aDCre4y%+za*6H!VmcQ2Qh%mu5-!)6qt!w>_aKMGlY&yo#Y*)4hCv_v(KaJsK1^;LG8(|!yb4^KATSm-+elgNao z-4OP1fG8X{hZArF$OV(n6!RqVms>L^{t}8!kKbchQ?&=|1Q}GIa0|@hPcrBhdmumU zF*ihv1UD-!K$N-@OBL+sPqSs=fN~PsbhL8@wh|s|GF5>@O{tF>%slx*#nYHp^rSqj z6ReJyoVy?BQBi!BG%?8CMwyTpm*|<{T%wyEYTxL;o2{Sy=Ef+VOHKii<&8ILfQ}lP5!u;a zNV4-))MGYKe3dC3?g=0u>)CmHXml0uToKN4T7uAA>nbc&l4rVW8A^kNq}vVuR(xm@ zRu}$zUd)~hA6>uhS(R?K9rV_Zy1UD+-Hva~zna2sU3-=ZMvD|DbtJbx#IQ6^t}i^q z6syFFJP-%rn+Gxs=e1`|s zTM%IU>&zlFP1tK|qVnWGEItAAV+zGe+3wuin`R_qeJy6mPY;A zm=bIDLnmDh)WDFR<~WX-7~&QSk(sjmJ$BT+jS38hF>at!Ik!1hwXc(SU(>F^NV?0Tapmbof*gs8-#GkGScYis z;z7!UgdE$y=N)TAW{IgCA-@vuLAj>O<#O`^b#r(++KUiUYk?uB3*u9Um^nCt-S2^1 z<+kUXT;WnL?{gMLf7R|W_U!-O8@qwJ7(=A|)4XdQGeZP#I5a1;k1a9LB(F=~@Bm@& zKd$kv?m4b8X|96czw>k=?>v-ef&=^(xBEVVqPQ`{tMwAJxLu8-$NRFB)Vrh%;hXh~ z{4=KizbvImGl_=o@Qt%WpqHbc^;8+$dCs2<*KajD)AQ!5V{xp%|Tvt*c zxU`S~Z;56D#46)5&3d2}ziD}`KElqn=|OOqF%7*qXNM}QI{jJd93LoGb^-;{!7L#( zRD0}P!$Ua&IQMKW=w#u`A^L#))e=yPEZOIFIj&C5mx`;Q_HIXn#0PEGtI9_+P1t9K z;p2Is)p?7)HJIB)0zXZ*<(7DF1xGVeCyk=^3~H}q!0o!bQDC_@FGu2O#Cvi zS?ZCCRz%mzFKnY#c&%6`a^A>l5p|8q&u~)>%JjiEcdKC#NPOR(LcVXio~^E;?7Evm+HX43rE(r?|pN8AK7n8Geu`5|ExVyn>A{>iujo9*L z^qMS*;FJ=FY2>jP`Z`@(r;J8K(l}U=NWvN%OVDC-o0E_%1|5X8DnC>&WS-Um4C|TFU#V z&0lD*5cnbgmOH54&G&h@`EtrDtAGN5R4SA3SRcMH3VQ~F;KfCw9u&Brj&fC~4*Tty zubYkry8_E3l+LUyQBmnk8o&Z}Rh~3?eV=3pWUsv=VRLJu3Z~pSu+n3p(NB>m#PW~H zq7fGI%+ve>iLCO0kl0^yveuk?58k=xp($F~I>Q@YTyhhe$YEQfE}M+mr*12(4UyDxDFwJ!Fscb7%|9oRdWr4-&zI z8fx6awEtARqt8)ok_D&v+&bn?4-7z7A^R4P*rxZ8^dQ6~$x0D#yiD*gV6?f4ZITtr z36k$EUK^Cqak*)hz9$Vx&(|gd_rgHzS>wS{L&|R=ZWcUkuKjD%sI?lcFQNaE!JO+W zfDf=KDaK3Gy>0rJBX{EIQ}Xlf#WknT(B-0QW@w@6F$lNBavZdBk;ECYAqz9draXY# zydC2-r26Xfw$V;pQxi8*{^<8%JYYj?q>}J6&|_oHx@Dh)D+ML%=g&)-^CG9dPEnrj zJ$HmnOv}xwPERE8=G2oyt|`svoRppCrdQuN`HlO$!zSf55m}G4&yJ?0bFnX_DRk16 zd|DI)lvA~u4Z`v=0q+4Zrs)2)8D9_4(4_2Zw`Ct(pa-ZV_acC*do0L;sv zmuc!bz2jht*^(pHfdNg-j&YPy28%R!RW5QM;QP6wX1P3seD0W1P za9r3Z?m4ZRJL5X%FQvh!&bx1k+!R#G+)lf|gmY%+X78i5TJ zG_eeK0xV~uPWW!NpGk}$KuG!Z#2Be&7o~yxf|U~=>#5!y4%2ydGM$#yGi}N z>$P>f%;F*7<$K2=<|p~x&i^T;CSflX3f{`=!)W%aphSL3cM#1MJqw};&rIeEdZagr zH%s7E4M7M4q=a*k4+Eeohawy$-a_ull@{qfA2FYJp!h$H(?+RLa^2^TxT`DP^Td5qcx%anelXnR6mN-qu-bXoAjywLXgah6$*8Pf8 z+EBZ?(uG5NEa(|A4k-DSZ$*ej*0Z)FH#=vVcQIJHVQ6^Z!=jK&)Bn3e%NmB*q+Y17 z(9P@@mQ!VcC*f`tr>S5As9Rh?wWquqB8k1}KvX9NUWgh1h3>;c!PpXc{Cl_0uX^iR z>o?n{1WM+h|A*if$wJE}GDUFBB82S|>`bQlUm{hMP|pQbu9s40mQ(sgF#&W({IK-K zO5aZ^ZP|GbsqhKCGbFQSKtg{n+pA6HS2`CbN@zvq!<&4rr(ZbOvyry*)i=!BHJOwBvVQac+9V1AVzw9Xb&*v5Kh~9y}hI3XS2>9alQ+nR3#8ebB zJjHg?*2VIDJa)Zw;24<=h;DI75orTACJkU15__YQVC-pCKZ=EW?|KDBkl8T}!4jci za>muGRzLs%000R8@mTe-x)7g|p3&QeUy%O*gGX;^c#yP)Sixt1HY# z=@nzCzUk)6H<*8#p?d>En2e(?Oi1IWq^$P9rx9+>JbN11-Ps2W)>JUi z3G-hZXB2``dDj2_eS<$tzQfd23{T~O!FPl>oi?`gHc_c4TmuzWhN%8_0&Al`tQGWr zJTh$2vffQ(>RyxP_4Y5)oHSTL`0fpoaFS)KCI2A!va#4wrM7&_ty1x1_>GUd&84|b zwpURH59bb`UAnA_^2C)Fz2>DXj@CN#Ve%H6WF9@I17QoE%bAIT8|IVVi+dIGU2hj{ z-MIY2<{y|FISq-4VgozHcm`vt-;}*SsX}w!o@Z?sKs=uzv*$oc4w%>EF!9<&I8S0t zTXGx25@rB%Ni`aOd?*myWq;OouXM9AoT6NsZFlH|moPu>U+^XBIF0AluiUpvqSS8B z438#evew>&T$%CqPPaWQKFf!7u8|Q4W3gGllQ6`*mMuX$bNKOV=#UK)2)SFto6AV} z3VeN`TAB|na(s0st6Fd#L%YP-h3NVaHrAD35MR?u7%A%D*f0vT=XPWJ9&~&d3GoO> ztpvxXltr4Ga!4?PTZk@{L3#tjU+*(?1Q#Sd zek>^Uw`WWN<;qwUr#Ad6w_VL$ZBXGb+*d$lU1l%^xq&1xQZ}2=7VJ|jG!7(C!UBam zUgusr3xkPHYt(~hiGIQH@PaWkm2B6-h}6B$^FE}+rI5?(&UFb7r5~-+Qv(^omyd;j zNYao2&i4k>n_OmMEl1oeT9~H)lAu~dONDNa+aXJX@9~!z9Ii9mC9(8!+&8>!v3Qwt!O6SGL{B`MXwJ&>*Z;_K2<~yX4wpV6O zcu8vId0%O*pkPCKgD1{?B1gFxeS{l?iU|03S%|CW*3+-v!G+n0l}o8Varw$D63^|T zW$A!R*gRb=TcmZ__Ld+qBqi5uLvT}~yCsBFNFQA?WptiO*&I$k{1Q$37or6J(gzq7 zzeH2~v}}6nl8x%9!>`U>!@Ro2h?SZFm`sLE-ONX{8yT9!;Of~g4A)&8g1-Ysv|5>V zg&S2{zZ%PlsxWGm|HPRsBMiV>p%@(wv_g5D(tSUPtr*hsdL3Tx``9DMtT#V=dSaj> zymrp+WjWybLE&^2gzQGHpmTx$z>Ja;^q@C~!{o6gjjJGJw?TE`ov z!#yslF9u9MK)e+X2$e-~Mft{Rb>G}Ja3~ymswcPf4TY-s^FTF7*H8myFRH~n-Ju5| zL`{=|LVu*Ndmb~6)|C_n2M+anr^#5Eur6`xPx9g7ue1XO&U9UupSyX8>FJvdPQJ1u zbj^S5!bY(&O^tX@&jtt+$fWDXgI9ebp!mm{(lnd9dz*^0C7?Mvg8k?$i2QC#mm}%S z6wWeS{vBz3x-cb$;V2o(uzAx7h== z9@vOYK;m2(0>~`ri{ZU!k`0(p+IY^qg=~?Bxd^@V#|upl=TY@6x+`0y2cc!G1IG{E z|DA%hcE`FK992(NPxp|d-i<_%!Z8ZTNK?VJ{ECO={x_DwFrqczTECiNP!atcicskI z*qK0%w(ai@vmBv!q%rQ_~rFk$vwmNX(=p7eNdVoPsEX!A(7u715q6kpCBd^j2P2*XKP>!hCIidy5a*H zUj4s+WEM`{L`ZgplVCaVlp6Z4J{C}Q0QLR|=t8837)ttPxdkzz+hK1zn!E3GwNesr za7E!S<~(hP+mP<*?>Lo;<(j>luo3`AZ0zIeEpsuq51zgs5QRIdeRb->&<&R1Pg!(pTP14i8mbm--a%HrXl}{oL2{7~iPdrntdomYN1M7ZZHuvq!$2W8BTq{Cwd% zPs$j|t5Ag~qZIdIA%;Jx+mC#};m3#J!TdTF_alL+F})TcNVh{o8>=o7zs_Sm(5UzF zJq?M#cR2Mf6Xf+vF*3X$Cy)yS;|Ob7?(00DACf`XyCbRRYj zGoGoX1DhezO_qKtvq{bbh9r9TtE^ppBI3BR0>q&Mtfr*)Ac(|^J8&Q5bFitW*LSv7 zollV$89zJ9%-l4-Ru|NuW@k68n%>b|AB;Du5=4+`CWn}6WD>gZiBaRfT^)oREwGXz zr%^wg4^@=2`G8AixoD>msTQ^aN=0C>PZ3hhce8*^xf7IGPo-0BaiL(Fnbu}5Ykhs@ zRw%}gy*xB!<&nuUsEoWfRFwT-MV=o!;P0nDW1b-EGP-?<{cw+!zQbGXk8wmPBzbgD z9RGDoRi{{=v2VKe8RK^3Fait&Yb>68DfiL$Xgd@kZZYSD_T!4dB)ZQPY2!kx|WlG+ilYopweiyv9@Hz@n%i_60@Sb zYu7)Lfe_jHY6qudm;a^!-0L4&HhpL({<~3o&u9ifGITFe^E*OX}qQMJ0>^QXa;X;6HQ5l(4S%Hl~zB27N0TV6$7X&h( z@qiEb7|4r^gd?N6N6D?Yh2u-~cr#o?i0wVq-XkL9`gVC5s=e2x;G%Vfx6G>R)?0oM z3#QhkKpd$MR9|C3%Jb2808EKUFHqGMItgYqhF zLlVFFyyIO9=ik#QtcM3~xlPx)nm)P7DUs49% z$D)%&-6n?SyrSE~ofHp^?8t?4jC?I$4u2SjS8DIEkXS2P6CRuFPZTaz0_RjYjLp;Y zwtD8MzuS(=23c)ML5WD3j1a^<(z$2x`=YLWWeTxo7F?)|iCBz0DV3cr+52!pTD56H*m^s06CXCprD~Mr6k)j##XMtvEOgrtD<#0e^ z-`*z|I~xi#JMJ~!GZYAt*Tw-dLz7az<24ne5YSI0sZ5CEexrN%k)tn8*rOjxOZWj9 z0%Uk(#dp7zgqxQ`F;|imuO8}=2t^k&YzRmWUzQ7T-0MAvfA zAYy-}p9j0p#SAP;u=B_?y9DuaG9E*xY)=7!mH~qi6Y<_i15pCk*A`uHx)s1^0FK1H z0{$~pCI*3-i8ZDCI&K$O449QCpd}_=XPp34hX_yJ#fWmPZq8pAB}z{+Li(~(L(@u< zz$aT`aSiPYG%V!11MoD?`84#(91E31w>leiQ=T%jYX7tHkHN(d*=Ng!0Z|GgE92+< zw)jJ=s11)|n67gr#XRHMa9+`TUv!uTMz; znYDV}*Anew!ysh2Eb8HM@4dR8(2>EloypF2`g*zHv1L2_O3OOzgghP+VgPCdiDIlY z_pK%x_BbovE|98eG0{vspV1m7JOMq0;(zQmxQ$h-j+E3Ymte^5nuEFq@4G@Y4?3|q z^XzlUwJQNeBS+%8tpRZSKR#3TT}Kp7o-M$cKvXN6QEgzL(X(Ju)jh&VwUP01fWdyU8c<-6NUmX^YcAi zM<_(Dhg++!a{fhwNRy$tZ}T`eUqIk%v;CKPdPwNx)AIe6K$2Y(Fg9xHW(~k8IXnqY zd}ZEpGDphePakUbB;986ixzc#1`xhIyiqhT(%LjIcDaYt3K_9P>8yMX&1n=o| z6sQa_GTx=q45XLF0rwk&;PpIS2s#5Gb<7Gz!+d`yQ^0IHf8Z(UeOOvaJcS)eYKW8N z-~rm$e*U`S^~6UqxMZe|%t)vxtpn1H1{#M@y=eRAH2h1==^C)Ikn=ved{{>*zuK6! zypXJw)x!=OD<{f5)eGeh_e(_I40@(WgRDfW=;RwwYQt@aYygLr1!s*t@zYXpq;dBz zn}xVf~3 zF+Z?brZkqZfjO6oxxRTvEaA!a4(ajv5her<1C_YNV^Pb$BKd@uEQGsG%=L|HvYg`O zx43Uk-9HQpAi*w9kxQp9GIMd??WUVAVWQUwas*up`;5)qX(g;e0uD{8HI|;m$mP1l zF_JwfY3RvX4$9r^ULTcM7P71@he2YR{+Nv2{eQjscR#)8w$_zf9pvtGA7K4aV_R1p z=YC2mw3-TyE;#2aB0b_Nw^7}09kjKSR><9g2mt~On%|;TLr5yzsDY*Ak1M)cVsfw` z(RjYtrDlFD#)u38?`uN5Q9MhwI>YbD8n$jsd~5nnZK?g3RhHZiu#jWH+$GP2F8>or zx1)Xg;QDn!Wg!oFMQA$ z|8QG5ojwv^zxnl&NyJ*uNkLhIfvV#aR`=H@+nj1=9;MJ)hW#OAlR|f_gzo_CLN}w; zu4LY08 z3D5io7FxqXKbEthCA~C~pW&(yRE=8XWcBJJ00%QvGhW640rn=3?8o?jC?mNFt1>GGT{I!j-wjkqR>-qtGAlOSn!RtIA^bu$ z4qbTzTGolfK!#lQNq5%IjgBhQq^(Dy{p8V$iCgnO{zC&N{Dq@u?7Ci0%kcbr97w0> z(rfb@V}F5&_aVT3aT5!ws$bVne!dSqk9UjT5??Z*iShrDvpF-Ot*)S~&4A%xdaxn- zaquz5i7mv-VrckC1GWc`v`W!AmeP26*TVEAxaI8#CdD0=Aw7V|tkJ)mkuf3JLDPLg zUwBAB8yH-eNU za9ljTraTDJ1EtDzUB+Y;AZX+S;}E3A8E9rrHGhk5v~Mc1Q^vBHMkC6mzEbkfw~!VO+F;i z+fhE6d~=)w0+l5uM3)u}l@Erp&%nhTz58iiRv4C5)dMun6yh9j)^4!5}OJXQmF zFNBlN-JBCNKYmbB-ud7F0000002Lp`IK9T8Yfsm}JH0R>&$U(Xr;sk6HXxAY<2|oM zi=A1Ayl4bDgap&QtAXw8Y5bav*kO$SInGdCOR~^vK_P?(t$s<0MBpf}4p=l`dMZ&Q z2drO)*dJPHJDZP&9`$+cro%2qq|`FS2A4J1Y8`9MU;lE|8hND(wz|9Q<0l=i*YBfskW6kAOfB`k7XVYs_*Z0kGoi6&S2Ua1Ns0F z)=`jO2(i4kz1=1M)U}9zUl>)xZEHM{NO@*>$-{})1BU-mbjK7oFXZ?XyuE@-nS7dD zlM+F_?z72=ebq-zL83@%^9VSbHJ}3G-vLw8KiQ%P*#IYB1wv)vC6iv(i{OC~s&{(U zb=59Xk6pUF9-#-99->UB&_Rl=Z(9ercFkBsR`^P(&k0+L-g7IGk zqUbmHT@rxWHH`a=nLYux3A?fTjRA(J2eqfKFI8O8sm0-Ibo$8yk1CKVmup@_%var~ zbvk_JQtG7yy_RSlD@iU#L?dI>8_!M{MT9dxg}RG)wNe)-`$TQMh*$ydc&Be7zLY}b;eB_6&@Bmo!RLQ&w1SkMF71hIGZ299%A;!iap39Ia zr_)>`B!J7k#L5(poyuxmp~3|J$RXr>?d~WoYf!qDeFV3xB)?i2fUf2;G;ZX&? z)JwwLP!fa!7$q%JuFq3YWVY=@ioK36~v6WMnipszqWFF5et|F1m_8 zr;|JtC7~jzJeQ@k&3mNJNs#RaYIpK@z^X$4*MjMjbJGev6Gcy%gIWqG-ZCdDKR6cE z(Ow$3`=^czA;42E9EgwS9*&s2*!Ydz0E8+FpbKKi zGdVCwy?5lko9TVaE1vZ`LMc;RHDdpR{iIa5PY|U6R{k3_@JVu&*sqfFq`6idqlyf-5YADWd&Q0ktNvw z!#ULr*UshD!kxX|MS8Xd(>8 zxl+c>7$U4G+TOscXvV~a$JxkPFEOaItKTz=^C6wWzo_ubN#lKmqJj7<@?JK;Gu`e1 z+q;j|eiYMX|6=%l{g)5D5e>B9?i;$_ei$j#%S84tjoXs?NbcJxh-IZ#z2rJ3+BI73 zODw94P`-hBhRy)oCsw=*0wH5wE*^z8UdxK7nx!(d%&2CvX^v1jQB#hLtt#U00%XF2 z)%A({v@2V&7|xd3pr0Rp4bdf(CwKL`z)gW#M}q`CZb_rilNlt{rK`HZHzC{{6~rOT z<2(;k^QtW1NG-ou_5rY+(S*n1@Hk~{ZeCs#zdS{vhk+D0Z|7jXrW9P#;Ih>puV4R- zYUciB^v#QotKAUsKrXonSU83wmCOgSMSG$NWr{5{$uPez=17}58k~)Y^QhIt`I;ft zQK_lw8aCQeWs&O+r7~LVk6xthkm~U)nZ_hgp83bhG5(9I9<_|tJ2;&uu}1-YfsoAg zwz#$~*;TyAKP88C-O)-wvR%4UyW=-$yz_QwYgq_m>MKYnkvw(7Xn1R}IKx91bS1tpQ;cl_8xL~~fJut0S* z6ofMtB5AIf>)m}xVtAnE0@Ved3!{0Le8)(|A81D8xQVR)pl7h1N|lO=kpZ|6GV-;Y zgeXfsL1)P`#E$3q zs0*L|wJoK~fJyztYk5N1Z{TkY`{!x=CBZ{!8bwfEdbOz1XYh6Ce&)>WH8a zdtMyGDyiu8SZY#K*;)c9FMA6|Asg#1X!Q{61JO*#Ed;7)Sm&<>vjG!;?&Rmo>SZ+e z|L$$-S#=x{N4SM*s(qzuSLF%|`>hV)D@`gz7D3GR>RcuhvawQ2{d{vt$bU#tb9X}hp4+g~k1-qUYp36w;pm<26`uz>B`Iy-Mf2D4_Hwd*%X-~1tH#OJJOnM{CMpE9x zgoITreB%qnvC2kPWkafEb66=x!}x3z7^%VjNzR1j1NR*@-km_9t+p|h=)n-d;8uML zohcuDn{w#Nj+zECM}xgHI-Mjn{Rr0qu{Yam6PsKvSPbALB`4DYwmAj9L7!Hkh4EUp zhx<|oOKY|Ux1N{OjA)Xi3WgqteB+@~w9_5LOAC5iV~}$gS5_XV@%inhdm5Jrx#gB! zzLO680(SD>DE#VkIs*XCp{-7S=|~eleObKc((kL*duhhN{i-yR!Y|R$khwBnuC)9P4m=*5-^8a|fn+#x~#RNv62sDt8i8Mgna=TiPn=JQ9v^4%eYq z71yjaQuBM)xs;O)e`03#!@@?;D&%yC3SPRYi z{zQZn{+^N68(>Zrq4&Us%!*YNAwgTEq;HMlchW-zz(<)as-e{f=4Rwi zkz%k@m*0Xn5ktfL!~P6YN0bDYO7T^-M|~Jqa2u6(L^)9bfWU#+h}e{#@w$GciI-up z2}67NY7`Z>Qs{kx?XM`D1Lurb7><~1+@UKXhbjT>TGuGFn$0F(05jb}!*0tlk@+V8 zR)%%e5l>Y3rN6dpur%;~078Li$g|wGoumpgdy>l#D!=0`!LZFo!t)2Ec02KiOsA&v zp0zm%)KmkF6J*pTnG1{;jkom4D3zTmh9;Bak!n|OTUEIW&AsGC3nKt_V3@N!yQ=$A zHH+U*Z{Q_h^>7_MvKK{@42!Z)*I2zs&dNAPNbYmX05(Q3qF`lmDVYioRwK+(su?+? zF<-zCX+|+@W=0O4j7h|+F@D0zKomnz^l5de%(Y;H2>l2FyqEFUjga&qZ>Pu#yB=lo z*1;v*OF0PVP>*kbOI&M6Zlz!scq`yVmHAeEB`LN51^tW0u{suaEm4*@N>XRx?esYe zWQfr_8yA17HE%)dw!M;{=N!H>%_r@v3}SKBO9Z2>JK$`h>Xr8RI4Dn@<`XD1PCHG~ z@X)1fN>1;-r(FE=|HY0}MeO2{V%5rRSFuJBRt@ibba11z2f`qZhFBu6KfW+>8xi0c zRVy8M;5M-S=rm#>=l~IZ2<*zMf(Tr$5$!(6snv(UOH1q2nb`cGJA7HEnZ2&_aS8Wv zczF6SYWBm}?vL=gn8xlTHj6c;nM0_HLcn-IMomO|lK--szm6e32|C^@#5 zU$>}|65s#`3XAr=kyz6RY-4R5cwwC|wRG@bPR-30JOJxI_;5j`2f`J>g-Ji=wK^EkPDPk}*4-WBt8$qQFpvq+b z+`kU#;9pLhrT8zm82Mh*C~x@;deCbVe!r1{)i0M%Hh_D%y_nS9Kvl59pcW52>9aY? z%+9gU+gkR-f&7!uJaqxAlZtJl4CI}4C}=on?>%PEJT4B7hSp}$`d<^t$H4(-UkC{< z^`w+tcXus$d@m!zhyt)c9No*WpMEL*c3N zc=*|=FF_WvpVWtwOxE)b(eOI9^`|{$9=@J?~B_-)l#57$~}$5i_&7E z?al-DPwMwRaO{ss=%W*VMST;y#-IFKc8ZfsvnNOe9*H%?VG3UY$c41ee3+v@oNtDt zak?wYAfleRc(^*&gg4Cp_x8fgh`70mM%ePV?5`(uYS*olmr~@tfLDBg*|(P@H;jqO z$7b`msbBwrVdDzagp4-3_1F;EbjERR5-n8()PA85WiF~$mBY-SPO3T^j5N1r7H>by zme-yKkDmCx59qf^$@>e8ZF(mdP{2I5lMWhGd@YFY07;r56S$8a`NM54{&>yT&uHKJjx9tjsZFG<6uohHOfUZjz`#ad6Rk3|yUG=tr4cm)4P%?K zr*F+&{yUxnH0U#W^Lv%Fb))AKB(Bgq4&i>gf1kR9WKAAVwuy{^+5TNxx2EY58id&c>^9Vzi?xy4Ph)slJHh^^e6>BXl`&aih( zywZ(gyB!@Z3aG&XN%X&g0-AFpeEP@Te>jR9* zUQ8`nRzg1v*BYyUa+H+8UNW_7*v<&c{)%Uh4-+{19g{j94f-#VlhXi=lcbHby8snn zB}b`fRK-Uk`$4NKIQD96Y~I;`xk?lYi_fTFt%LUX3JUK-1|7KAFEH+IH*@WBRRiBV zbL=>Lka@8dD-h@4)wcn3rSN6|v=-NdFD$4Y+=Q(1PbvtbiOyNWHD<#9Dy$00cKX&m z_R#ZKY5(L9hm27tSQOjDstF47gqRB4IX4FLkgCHhWUzRUV)gwDS3hx%eoTdTuea7E z-JC7xfl)-nJ9dd2SM9|t_8So@iA$0=u^<)-Cd|zpp^~Jb{rPpFF~;LtvLK?i6DqC6 zpr)2T&g7C_pmVhn>R_g@e2872MBW1yU5x6SVM7auB~hetO4ezn7O(toYXP6Pm8|uj=HxYU+nD z)x!K+2NR zpRW9qTTG9mhdULn=+xwKj+@xH*PJJe5a02B9sTx0)foS66PwwSHrcQb6TE$A(a*5U zJK{8!J$$f;te&S|SqTBW5`VnFZAtN6Pz72F$G@f~N;foo(R2@VA>fh&@5Ai-eYjgM zuz}TcS2(Ga{ZSEtHIT76#3Ag34)*;t!(A|+!JO<8W~X{jG(C+Xxf`nR0;toBXw)mj z<=_Ym`jCpzvSMog)Z-67RX`33N&p5oGMLr{1cT`o|xPS+^07gwzdH_XUtS$r9;QRvCH>6ubWz0EB z5dlbd_|?N94^rw&B%HxcnS~t(WD?Z&DnbQl`|!dZtP`4L&YF6i+))>wr^W^FdSA(k zV%rng{eY56XPZQ@Gg4#Tp|+qx58@P-xV7x-bza0Fi4y)V<%77QU=1EL)&G$Axm;*E ze191khLQLhxh+jF%7}-6w1T)-TP{R>eiO$Kcq(XsZeXcS17m0&mGh}xVL;9QXaoZ~ ztON|klsQb(3jO!q>H(-J0^=6Q;XVm#`X$?sEEJP(D#Q9T1CV0?s1NXoFb3W_(bm~v@_gY7RNZ9Q&p%C|EsWi7kX%U!y@_x_l(N<-{rb;cHdm z#m}SOac*_f2j@f$=U6u*S%;u5OcQk@EGu@798de_fwX3lltDi6Q%{t46`@&k^;OHJ z94i%~e;zq*y7&8eY#sM9H(H^Ql;)+ri4H@dWjSp!wd&lqqKE4afQLY~1lz;IGS9q` zC8Y2<8}9G0z7D;z)Wr{uPSx|NbvyWsos8l^nOkQS;SNbU6UC64%>lX+8`CIW^^-n5 z+u<=|Q~NlB|I8VkR+a_#&F0XD8I%fHXR?2=lJy(4|3_1)cLLqarzrUIzNwAU{O<_y zuQp&YF!PNo*&e#`T~-@WFT*75k=8 z=)-9JekD~HwbA<>*XAM1&5)ZkWDh0OCN~a!OdvfSj|S7K(P})B1pCjR*Flaj6bwIb zrm3mDOrgrIZ<6;zUOA(>?Y)8_ZjVGKpP9WA`OW0;LWs|I<|xkkRKl8LPxOMhK=ga} z@T6&p@DP5OJVnDxtgl|~Jwwm%VbC2S{LvkyFb0Lr3f)nxY+z{_@=XW`z^bzIifsHSge#pZ)_9{qMyxjG3o8`#BokXKV`Ny0y+tH|)9!fEJFoJHZ z;$wI_@WqUAVHdc?v{S6#Mu> zWgVLaLNH~=J)q*=kPCZP3Qf~LkG$x=uNj0O0-=4pi!%Ql+ca3qCN=8c( zvXNJXG)0pI!xPH$9 z=e6d3;m57d*>q}`6tj_Y43Xk1+99>a$mf2Zj>JqgZzP}4_K&iE+hDk2YB`UdzSg8M zMoEq&T&ep-TQ}^`IK5=rp!*IsN*c7#_bM!FBkj{jRNJa;2!-gufPt^uod-+!2j<8X zl$0ygG`zSTqogt&>QTXy_>gGLF)lP?2_lj^9B33e8>#IIbMD z+WP(W8edmcfbhXG2zYW~26``>@N|0fjLhIhzj?iTB}8MSB2TRksOZd1LZ7Jj;bhXJ z(sod+L=5Nl&%-J$WYc8VrEhD8hsg%$I0ppxp1w{yj>Y<-Zm4jWPeFNzbR}Vz7|>Mq(8_W=6dh><)T#K zIr_5zV8wG<7GV$gv7(3S*8|HbF!uO{_*~YmWPuHo>!|pI^Qw!FPA4?W(@Uewkq|XY zzHtK!$w(^u&|{b0rB){dwlDZ|21}nTYZFQN!<~vC-cMsm{_5ZbqcGHeo+QURT)=PS zX=ZMAr1-IG0G?wpq6i8*sf%k2^#sni6!fPIBmD#^t$8xfh}XF^{FXAP(wh$$?l()) zJMCfJ?MnVwM2MYwxVH%%;n7fP85Yw?x6)gR%9ew}{pom~4yX-r>W2;~_>b*kfRdBS z;Rk0nkBg0EvcJreKtTkH2q>T_KvYnr^dS=M;^D|f(D_rAI`qSKTFvsPm3u5YyoC@y z3y2ibJB?|zaiOZb2|`ZkT&Bn;u6hP+87DiqvwrM$DluoUr^^Ydxf@%5y({R4o*OP% zvDx4E_&{tq|5)+SEn^9+O|)(u{(e$L5A@VmRT&dh7)VdXvwEjeLXsSS-at3lchdd{ z;vpQ1_K*coI0JBWaSP5&cu9wMr^OQZ~MGC4FR};u{N~zu=RfwK(ksdjjA_(X3JMFu&k3=}s|AiZeH5-U#VJzXZ3`0oT3tP3pKN+I( zKvmdee9x#jN~K3+6*Q>VM{1`d+OmmsQ9T6I*}HBCV_KGEex*F-&1N>lk=bnueI+It z!?#kBoX`09(NOU)Q_9fy%P3#19BIKJly!eikzJzG*wFn7PSSxDbhon2$Y&m0XQCu0 z(yko_Ddk}+ZejMG?0|Kan(P8eYQ>{q`Mo>iZ7Ej-Pso!dQ2bTva}ICQnu7iOXY}sK z*H2r3?^aqYP%JO$&V2n{jPhm|z1rqujSB4ll#l8TE*RlSsYGkx#-+dbnN`L5Sn4HX>^vR+rc}T3<5=Apwm8 z$+f2?621 zfsW(D`TfBW7Ho`BkpZx3#pWDYYmss5RPGTqn8uRpp}gaVjvR6cOL!R-|BGc*W)=j{Y^Qa7Xa!2WQfsleLTqODC&=mPw8*|Nt`VQnKW4 zB2gYz2*!^??ZN%ClQT6J7bp?DzjOJoaY+0n62diGGZ$Z)+y?vO z4xpP3uG63Dl+jBPcE2v%a0OsYEv<@Ch+7m)h(b^I2M^P`>bs�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�#I2`Be8 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 Qji;>Ejiy47~I5(8$T-v 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

    TObuNf*d@J&W$)O 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 L5daP_`mg+dY8YQJCuWYnQ2V{C5s}?MMjp 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

    i|3-L=<NFrIc?8^s; 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

    RDD-p#(K;eqMD{uSp@?$-fwi7@>Hwx9j8 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 diff --git a/website/src/img/design_3/section-5-mobile.webp b/website/src/img/design_3/section-5-mobile.webp index 0e4384954b4209ecf20a46031dab9019829c4f6f..914d59d2fffce97517a314f28dfaa935c9897ac1 100644 GIT binary patch literal 156988 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 literal 164294 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%0Diwryvn}R}0`&KZ3 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 z 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 xLZsMj3T@D20l2k{ZIik)

    From 58e35289abe99c675c8003911ac0134beba1fa69 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sat, 11 Apr 2026 23:39:08 +0100 Subject: [PATCH 017/152] website: roadmap labels --- website/langs/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/langs/en.json b/website/langs/en.json index a71ec01e59..51b5b3d547 100644 --- a/website/langs/en.json +++ b/website/langs/en.json @@ -291,10 +291,10 @@ "index-roadmap-1": "2026", "index-roadmap-1-title": "Scale to Large Communities", "index-roadmap-1-desc": "Escaping centralized platforms", - "index-roadmap-2": "H1'2027", + "index-roadmap-2": "Jun 2027", "index-roadmap-2-title": "Sustainable Communities & Servers", "index-roadmap-2-desc": "Launching Community Vouchers", - "index-roadmap-3": "H2'2027", + "index-roadmap-3": "Dec 2027", "index-roadmap-3-title": "Make Your Communities Grow", "index-roadmap-3-desc": "Tools to promote your communities", "index-directory-h2": "Join SimpleX Communities", From 317bb5388beccfb12cbf80c7faaf0b3a5876a606 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sun, 12 Apr 2026 11:08:51 +0100 Subject: [PATCH 018/152] ios: fix syntax --- .../Views/Chat/ChatItem/IntegrityErrorItemView.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift index c816770c76..d831333c20 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/IntegrityErrorItemView.swift @@ -84,12 +84,13 @@ struct RcvMsgErrorItemView: View { var body: some View { CIMsgError(chat: chat, chatItem: chatItem) { - AlertManager.shared.showAlertMsg( - title: "Message error", - message: switch rcvMsgError { + let message: LocalizedStringKey = switch rcvMsgError { case let .dropped(attempts): "The app removed this message after \(attempts) attempts to receive it." case let .parseError(parseError): "\(parseError)" } + AlertManager.shared.showAlertMsg( + title: "Message error", + message: message ) } } From 080a4c2f46e1cf868ca6472f9ca0f4203b0c99f7 Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sun, 12 Apr 2026 18:07:00 +0100 Subject: [PATCH 019/152] ios: update library --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 63191e4fb2..1e5a634a2a 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -182,8 +182,8 @@ 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829982D54AEED006B9E89 /* libgmp.a */; }; 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C829992D54AEEE006B9E89 /* libffi.a */; }; - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */; }; - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */; }; + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a */; }; + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a */; }; 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; 64D0C2C229FA57AB00B38D5F /* UserAddressLearnMore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */; }; @@ -553,8 +553,8 @@ 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64C829982D54AEED006B9E89 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = ""; }; 64C829992D54AEEE006B9E89 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a"; sourceTree = ""; }; - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a"; sourceTree = ""; }; + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a"; sourceTree = ""; }; + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a"; sourceTree = ""; }; 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; 64D0C2C129FA57AB00B38D5F /* UserAddressLearnMore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressLearnMore.swift; sourceTree = ""; }; @@ -716,8 +716,8 @@ 64C8299D2D54AEEE006B9E89 /* libgmp.a in Frameworks */, 64C8299E2D54AEEE006B9E89 /* libffi.a in Frameworks */, 64C829A12D54AEEE006B9E89 /* libgmpxx.a in Frameworks */, - 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a in Frameworks */, - 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a in Frameworks */, + 64C8299F2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a in Frameworks */, + 64C829A02D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a in Frameworks */, CE38A29C2C3FCD72005ED185 /* SwiftyGif in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -803,8 +803,8 @@ 64C829992D54AEEE006B9E89 /* libffi.a */, 64C829982D54AEED006B9E89 /* libgmp.a */, 64C8299C2D54AEEE006B9E89 /* libgmpxx.a */, - 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT-ghc9.6.3.a */, - 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.14-357Qkjfr6Ry4Z1G22pOLpT.a */, + 64C8299A2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re-ghc9.6.3.a */, + 64C8299B2D54AEEE006B9E89 /* libHSsimplex-chat-6.5.0.15-7J6rfC1qLWr8QkAAXzi4Re.a */, ); path = Libraries; sourceTree = ""; From e456da6bc6806873db89a7c449c9c955462b1515 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 12 Apr 2026 22:54:56 +0100 Subject: [PATCH 020/152] ui: translations (#6797) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * desktop: fix chat view processing all mouse move events * Translated using Weblate (Hungarian) Currently translated at 100.0% (2187 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2526 of 2526 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Italian) Currently translated at 100.0% (2187 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/it/ * Translated using Weblate (German) Currently translated at 100.0% (2187 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/de/ * Translated using Weblate (Arabic) Currently translated at 100.0% (2526 of 2526 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/ar/ * Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Italian) Currently translated at 99.9% (2636 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (French) Currently translated at 87.9% (2319 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (French) Currently translated at 88.6% (2339 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2187 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/hu/ * Translated using Weblate (French) Currently translated at 91.1% (2403 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/fr/ * Translated using Weblate (Polish) Currently translated at 100.0% (2187 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/pl/ * Translated using Weblate (German) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * Translated using Weblate (Hungarian) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/hu/ * Translated using Weblate (Italian) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/it/ * Translated using Weblate (Czech) Currently translated at 56.8% (1244 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/cs/ * Translated using Weblate (Czech) Currently translated at 56.8% (1244 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/cs/ * Translated using Weblate (Czech) Currently translated at 95.7% (2526 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (Czech) Currently translated at 95.7% (2526 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (Czech) Currently translated at 95.7% (2524 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (Czech) Currently translated at 95.7% (2524 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (Czech) Currently translated at 56.9% (1245 of 2187 strings) Translation: SimpleX Chat/SimpleX Chat iOS Translate-URL: https://hosted.weblate.org/projects/simplex-chat/ios/cs/ * Translated using Weblate (Czech) Currently translated at 95.7% (2524 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/cs/ * Translated using Weblate (German) Currently translated at 100.0% (2637 of 2637 strings) Translation: SimpleX Chat/SimpleX Chat Android Translate-URL: https://hosted.weblate.org/projects/simplex-chat/android/de/ * fix translations * process localizations * improve --------- Co-authored-by: summoner001 Co-authored-by: Random Co-authored-by: mlanp Co-authored-by: jonnysemon Co-authored-by: 大王叫我来巡山 Co-authored-by: Hosted Weblate user 146276 Co-authored-by: Omikorin Co-authored-by: slrslr Co-authored-by: zenobit Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../bg.xcloc/Localized Contents/bg.xliff | 463 +++++++++++++- .../cs.xcloc/Localized Contents/cs.xliff | 499 ++++++++++++++- .../de.xcloc/Localized Contents/de.xliff | 468 +++++++++++++- .../en.xcloc/Localized Contents/en.xliff | 576 +++++++++++++++++- .../es.xcloc/Localized Contents/es.xliff | 465 +++++++++++++- .../fi.xcloc/Localized Contents/fi.xliff | 463 +++++++++++++- .../fr.xcloc/Localized Contents/fr.xliff | 463 +++++++++++++- .../hu.xcloc/Localized Contents/hu.xliff | 502 ++++++++++++++- .../it.xcloc/Localized Contents/it.xliff | 468 +++++++++++++- .../ja.xcloc/Localized Contents/ja.xliff | 463 +++++++++++++- .../nl.xcloc/Localized Contents/nl.xliff | 463 +++++++++++++- .../pl.xcloc/Localized Contents/pl.xliff | 468 +++++++++++++- .../ru.xcloc/Localized Contents/ru.xliff | 465 +++++++++++++- .../th.xcloc/Localized Contents/th.xliff | 463 +++++++++++++- .../tr.xcloc/Localized Contents/tr.xliff | 465 +++++++++++++- .../uk.xcloc/Localized Contents/uk.xliff | 464 +++++++++++++- .../Localized Contents/zh-Hans.xliff | 465 +++++++++++++- apps/ios/bg.lproj/Localizable.strings | 13 +- apps/ios/cs.lproj/Localizable.strings | 49 +- apps/ios/de.lproj/Localizable.strings | 34 +- apps/ios/es.lproj/Localizable.strings | 25 +- apps/ios/fi.lproj/Localizable.strings | 9 +- apps/ios/fr.lproj/Localizable.strings | 16 +- apps/ios/hu.lproj/Localizable.strings | 68 ++- apps/ios/it.lproj/Localizable.strings | 34 +- apps/ios/ja.lproj/Localizable.strings | 9 +- apps/ios/nl.lproj/Localizable.strings | 16 +- apps/ios/pl.lproj/Localizable.strings | 34 +- apps/ios/ru.lproj/Localizable.strings | 25 +- apps/ios/th.lproj/Localizable.strings | 9 +- apps/ios/tr.lproj/Localizable.strings | 22 +- apps/ios/uk.lproj/Localizable.strings | 19 +- apps/ios/zh-Hans.lproj/Localizable.strings | 25 +- .../commonMain/resources/MR/ar/strings.xml | 1 + .../commonMain/resources/MR/cs/strings.xml | 69 +-- .../commonMain/resources/MR/de/strings.xml | 117 +++- .../commonMain/resources/MR/fr/strings.xml | 98 ++- .../commonMain/resources/MR/hu/strings.xml | 151 ++++- .../commonMain/resources/MR/it/strings.xml | 115 +++- .../resources/MR/zh-rCN/strings.xml | 117 +++- 40 files changed, 8642 insertions(+), 516 deletions(-) diff --git a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff index d1bb5fe716..3cf65c8b54 100644 --- a/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff +++ b/apps/ios/SimpleX Localizations/bg.xcloc/Localized Contents/bg.xliff @@ -185,6 +185,10 @@ %d месеца time interval + + %d relays + channel relay bar + %d sec %d сек. @@ -200,11 +204,37 @@ %d пропуснато(и) съобщение(я) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d седмици time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld избран(и) контакт(а) @@ -365,6 +399,10 @@ **Сканирай / Постави линк**: за свързване чрез получения линк. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Внимание**: Незабавните push известия изискват парола, запазена в Keychain. @@ -1315,6 +1353,10 @@ swipe action Блокирай члена? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Блокиран от админ @@ -1365,6 +1407,10 @@ swipe action И вие, и вашият контакт можете да изпращате гласови съобщения. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Български, финландски, тайландски и украински - благодарение на потребителите и [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1552,6 +1598,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Чат @@ -1637,6 +1727,22 @@ set passcode view Потребителски профил No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Тема на чата @@ -1687,6 +1793,14 @@ set passcode view Проверявай за съобщенията, когато е разрешено. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Проверете адреса на сървъра и опитайте отново. @@ -1832,6 +1946,10 @@ set passcode view Конфигурирай ICE сървъри No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Конфигуриране на сървърни оператори @@ -1895,7 +2013,8 @@ set passcode view Connect Свързване - server test step + relay test step +server test step Connect automatically @@ -2164,7 +2283,7 @@ This is your own one-time link! Correct name to %@? Поправи име на %@? - No comment provided by engineer. + alert message Create @@ -2220,6 +2339,14 @@ This is your own one-time link! Създай профил No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Създай опашка @@ -2253,6 +2380,10 @@ This is your own one-time link! Създаване на архивен линк No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Линкът се създава… @@ -2410,6 +2541,10 @@ This is your own one-time link! Децентрализиран No comment provided by engineer. + + Decode link + relay test step + Decryption error Грешка при декриптиране @@ -2455,6 +2590,14 @@ swipe action Изтрий и уведоми контакт No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat No comment provided by engineer. @@ -2617,6 +2760,10 @@ alert button Изтрий опашка server test step + + Delete relay + No comment provided by engineer. + Delete report No comment provided by engineer. @@ -2964,6 +3111,10 @@ chat item action Редактирай chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Редактирай групов профил @@ -2997,6 +3148,10 @@ chat item action Активирай TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Активиране на автоматично изтриване на съобщения? @@ -3139,6 +3294,10 @@ chat item action Въведете kодa за достъп No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Въведи правилна парола. @@ -3164,6 +3323,10 @@ chat item action Въведете парола по-горе, за да се покаже! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Въведи сървъра ръчно @@ -3217,6 +3380,10 @@ chat item action Грешка при добавяне на член(ове) No comment provided by engineer. + + Error adding relay + alert title + Error adding server alert title @@ -3269,6 +3436,10 @@ chat item action Грешка при създаване на адрес No comment provided by engineer. + + Error creating channel + alert title + Error creating group Грешка при създаване на група @@ -3398,10 +3569,6 @@ chat item action Грешка при отваряне на чата No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file Грешка при получаване на файл @@ -3441,6 +3608,10 @@ chat item action Грешка при запазване на ICE сървърите No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list alert title @@ -3579,7 +3750,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3802,7 +3974,8 @@ snd error text Fingerprint in server address does not match certificate. Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3844,7 +4017,8 @@ snd error text For chat profile %@: - servers error + servers error +servers warning For console @@ -3969,6 +4143,10 @@ Error: %2$@ GIF файлове и стикери No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -4448,7 +4626,15 @@ More improvements are coming soon! Invalid name! Невалидно име! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4558,6 +4744,10 @@ More improvements are coming soon! присъединяване като %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Влез в групата @@ -4643,6 +4833,14 @@ This is your link for group %@! Напусни swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat No comment provided by engineer. @@ -4915,6 +5113,10 @@ This is your link for group %@! Чернова на съобщение No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded item status text @@ -5211,6 +5413,10 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Нова заявка за контакт @@ -5281,6 +5487,14 @@ This is your link for group %@! Приложението няма kод за достъп Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5413,6 +5627,10 @@ This is your link for group %@! Първата платформа без никакви потребителски идентификатори – поверителна по дизайн. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Несъвместим! @@ -5615,6 +5833,10 @@ Requires compatible VPN. Open changes No comment provided by engineer. + + Open channel + new chat action + Open chat Отвори чат @@ -5651,6 +5873,10 @@ Requires compatible VPN. Отвори миграцията към друго устройство authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5730,6 +5956,14 @@ Requires compatible VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING бройка @@ -5928,6 +6162,14 @@ Error: %@ Запазете последната чернова на съобщението с прикачени файлове. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Предварително зададен адрес на сървъра @@ -6002,6 +6244,10 @@ Error: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections Профилни и сървърни връзки @@ -6328,6 +6574,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Реле сървър се използва само ако е необходимо. Друга страна може да наблюдава вашия IP адрес. @@ -6338,6 +6600,10 @@ swipe action Relay сървърът защитава вашия IP адрес, но може да наблюдава продължителността на разговора. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Премахване @@ -6374,6 +6640,14 @@ swipe action Премахване на паролата от keychain? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6610,6 +6884,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6633,6 +6911,14 @@ chat item action Запази и актуализирай профила на групата No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Запази профила на групата @@ -7055,6 +7341,10 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Сървърът изисква оторизация за създаване на опашки, проверете паролата @@ -7233,6 +7523,10 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Сподели този еднократен линк за връзка @@ -7404,8 +7698,8 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7568,6 +7862,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors No comment provided by engineer. @@ -7656,6 +7967,10 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7702,12 +8017,17 @@ report reason Test failed at step %@. Тестът е неуспешен на стъпка %@. - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Тествай сървър @@ -7758,6 +8078,10 @@ It can happen because of some bug or when the connection is compromised.The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). No comment provided by engineer. @@ -7936,6 +8260,14 @@ It can happen because of some bug or when the connection is compromised.Тази група вече не съществува. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -8137,6 +8469,10 @@ You will be prompted to complete authentication before this feature is enabled.< Отблокирай член? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages No comment provided by engineer. @@ -8369,6 +8705,10 @@ To connect, please ask your contact to create another connection link and check Use for messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Използвай за нови връзки @@ -8406,6 +8746,10 @@ To connect, please ask your contact to create another connection link and check Use private routing with unknown servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Използвай сървър @@ -8441,6 +8785,10 @@ To connect, please ask your contact to create another connection link and check Използват се сървърите на SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Потвърди кода с настолното устройство @@ -8558,6 +8906,14 @@ To connect, please ask your contact to create another connection link and check Гласово съобщение… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Изчакване на настолно устройство… @@ -8843,6 +9199,10 @@ Repeat join request? Можете да зададете визуализация на известията на заключен екран през настройките. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Можете да споделите линк или QR код - всеки ще може да се присъедини към групата. Няма да загубите членовете на групата, ако по-късно я изтриете. @@ -8886,6 +9246,10 @@ Repeat join request? Не може да изпращате съобщения! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Не можахте да бъдете потвърдени; Моля, опитайте отново. @@ -8993,6 +9357,10 @@ Repeat connection request? Все още ще получавате обаждания и известия от заглушени профили, когато са активни. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. No comment provided by engineer. @@ -9036,6 +9404,10 @@ Repeat connection request? Вашите обаждания No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Вашата база данни @@ -9115,6 +9487,11 @@ Repeat connection request? Вашият профил No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Вашият профил **%@** ще бъде споделен. @@ -9139,6 +9516,14 @@ Repeat connection request? Вашият автоматично генериран профил No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Вашият адрес на сървъра @@ -9183,6 +9568,10 @@ Repeat connection request? по-горе, след това избери: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -9200,6 +9589,10 @@ Repeat connection request? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin админ @@ -9341,6 +9734,14 @@ marked deleted chat item preview text промяна на адреса… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored цветен @@ -9482,6 +9883,10 @@ pref value изтрит deleted chat item + + deleted channel + rcv group event chat item + deleted contact изтрит контакт @@ -9591,6 +9996,10 @@ pref value грешка No comment provided by engineer. + + error: %@ + receive error chat item + expired No comment provided by engineer. @@ -9715,6 +10124,10 @@ pref value напусна rcv group event chat item + + link + No comment provided by engineer. + marked deleted маркирано като изтрито @@ -9782,6 +10195,10 @@ pref value никога delete after time + + new + No comment provided by engineer. + new message ново съобщение @@ -9897,6 +10314,10 @@ time to disappear отхвърлено повикване call status + + relay + member role + removed отстранен @@ -9907,6 +10328,10 @@ time to disappear отстранен %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address премахнат адрес за контакт @@ -10047,6 +10472,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile актуализиран профил на групата @@ -10067,6 +10496,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link чрез линк с адрес за контакт @@ -10139,6 +10572,10 @@ last received msg: %2$@ вие сте наблюдател No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ вие блокирахте %@ diff --git a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff index b212f42592..e7d0fc2d4b 100644 --- a/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff +++ b/apps/ios/SimpleX Localizations/cs.xcloc/Localized Contents/cs.xliff @@ -185,6 +185,10 @@ %d měsíce time interval + + %d relays + channel relay bar + %d sec %d sek @@ -200,11 +204,37 @@ %d přeskočené zprávy integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d týdnů time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld kontakt(y) vybrané @@ -227,6 +261,7 @@ %lld group events + %lld událostí skupiny No comment provided by engineer. @@ -363,6 +398,10 @@ **Skenovat / Vložit odkaz**: pro připojení pomocí odkazu který jste obdrželi. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Upozornění**: Okamžitě doručovaná oznámení vyžadují přístupové heslo uložené v Klíčence. @@ -515,7 +554,7 @@ time interval A separate TCP connection will be used **for each chat profile you have in the app**. - Samostatné připojení TCP bude použito **pro každý chat profil, který máte v aplikaci**. + Samostatné připojení TCP bude použito **pro každý profil chatu, který máte v aplikaci**. No comment provided by engineer. @@ -764,7 +803,7 @@ swipe action All chats will be removed from the list %@, and the list deleted. - Všechny chaty budou odstraněny ze seznamu %@ a seznam bude odstraněn. + Všechny chaty budou odstraněny ze seznamu %@ a seznam bude smazán. alert message @@ -982,7 +1021,7 @@ swipe action An empty chat profile with the provided name is created, and the app opens as usual. - Vytvořit prázdný chat profil se zadaným názvem a otevřít aplikaci jako obvykle. + Vytvořit prázdný profil chatu se zadaným názvem a otevřít aplikaci jako obvykle. No comment provided by engineer. @@ -1281,6 +1320,10 @@ swipe action Blokovat člena? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Blokován správcem @@ -1329,6 +1372,10 @@ swipe action Hlasové zprávy můžete posílat vy i váš kontakt. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulharský, finský, thajský a ukrajinský - díky uživatelům a [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1353,7 +1400,7 @@ swipe action By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). - Podle chat profilu (výchozí) nebo [podle připojení](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). + Podle profilu chatu (výchozí) nebo [podle připojení](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA). No comment provided by engineer. @@ -1461,7 +1508,7 @@ new chat action Change chat profiles - Změnit chat profily + Změnit profily chatu authentication reason @@ -1510,6 +1557,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat No comment provided by engineer. @@ -1589,6 +1680,22 @@ set passcode view Profil uživatele No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme No comment provided by engineer. @@ -1630,6 +1737,14 @@ set passcode view Check messages when allowed. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Zkontrolujte adresu serveru a zkuste to znovu. @@ -1757,6 +1872,10 @@ set passcode view Konfigurace serverů ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators No comment provided by engineer. @@ -1814,7 +1933,8 @@ set passcode view Connect Připojit - server test step + relay test step +server test step Connect automatically @@ -2060,7 +2180,7 @@ Toto je váš vlastní jednorázový odkaz! Correct name to %@? - No comment provided by engineer. + alert message Create @@ -2113,6 +2233,14 @@ Toto je váš vlastní jednorázový odkaz! Vytvořte si profil No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Vytvořit frontu @@ -2143,6 +2271,10 @@ Toto je váš vlastní jednorázový odkaz! Creating archive link No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… No comment provided by engineer. @@ -2299,6 +2431,10 @@ Toto je váš vlastní jednorázový odkaz! Decentralizované No comment provided by engineer. + + Decode link + relay test step + Decryption error Chyba dešifrování @@ -2342,6 +2478,14 @@ swipe action Delete and notify contact No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat No comment provided by engineer. @@ -2352,12 +2496,12 @@ swipe action Delete chat profile - Smazat chat profil + Smazat profil chatu No comment provided by engineer. Delete chat profile? - Smazat chat profil? + Smazat profil chatu? No comment provided by engineer. @@ -2503,6 +2647,10 @@ alert button Odstranit frontu server test step + + Delete relay + No comment provided by engineer. + Delete report No comment provided by engineer. @@ -2840,6 +2988,10 @@ chat item action Upravit chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Upravit profil skupiny @@ -2873,6 +3025,10 @@ chat item action Povolit TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Povolit automatické mazání zpráv? @@ -3009,6 +3165,10 @@ chat item action Zadat heslo No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Zadejte správnou přístupovou frázi. @@ -3032,6 +3192,10 @@ chat item action Zadejte heslo do hledání! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Zadejte server ručně @@ -3083,6 +3247,10 @@ chat item action Chyba přidávání člena(ů) No comment provided by engineer. + + Error adding relay + alert title + Error adding server alert title @@ -3135,6 +3303,10 @@ chat item action Chyba při vytváření adresy No comment provided by engineer. + + Error creating channel + alert title + Error creating group Chyba při vytváření skupiny @@ -3261,10 +3433,6 @@ chat item action Error opening chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file Chyba při příjmu souboru @@ -3304,6 +3472,10 @@ chat item action Chyba při ukládání serverů ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list alert title @@ -3438,7 +3610,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3655,7 +3828,8 @@ snd error text Fingerprint in server address does not match certificate. Otisk certifikátu v adrese serveru neodpovídá. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3697,7 +3871,8 @@ snd error text For chat profile %@: - servers error + servers error +servers warning For console @@ -3816,6 +3991,10 @@ Error: %2$@ GIFy a nálepky No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -3945,7 +4124,7 @@ Error: %2$@ Hidden chat profiles - Skryté chat profily + Skryté profily chatu No comment provided by engineer. @@ -4279,7 +4458,15 @@ More improvements are coming soon! Invalid name! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4388,6 +4575,10 @@ More improvements are coming soon! připojit se jako %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Připojit ke skupině @@ -4467,6 +4658,14 @@ This is your link for group %@! Opustit swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat No comment provided by engineer. @@ -4735,6 +4934,10 @@ This is your link for group %@! Návrh zprávy No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded item status text @@ -4933,7 +5136,7 @@ This is your link for group %@! Multiple chat profiles - Více chatovacích profilů + Více profilů chatu No comment provided by engineer. @@ -5015,6 +5218,10 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Žádost o nový kontakt @@ -5085,6 +5292,14 @@ This is your link for group %@! Žádné heslo aplikace Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5216,6 +5431,10 @@ This is your link for group %@! Bez uživatelských identifikátorů. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! No comment provided by engineer. @@ -5416,6 +5635,10 @@ Vyžaduje povolení sítě VPN. Open changes No comment provided by engineer. + + Open channel + new chat action + Open chat Otevřete chat @@ -5450,6 +5673,10 @@ Vyžaduje povolení sítě VPN. Open migration to another device authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5523,6 +5750,14 @@ Vyžaduje povolení sítě VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Počet PING @@ -5714,6 +5949,14 @@ Error: %@ Zachování posledního návrhu zprávy s přílohami. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Přednastavená adresa serveru @@ -5787,6 +6030,10 @@ Error: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections Profil a připojení k serveru @@ -5879,7 +6126,7 @@ Enable in *Network & servers* settings. Protect your chat profiles with a password! - Chraňte své chat profily heslem! + Chraňte své profily chatu pomocí hesla! No comment provided by engineer. @@ -5947,6 +6194,7 @@ Enable in *Network & servers* settings. Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). + Více informací v [průvodci uživatele](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode). No comment provided by engineer. @@ -6106,6 +6354,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Přenosový server se používá pouze v případě potřeby. Jiná strana může sledovat vaši IP adresu. @@ -6116,6 +6380,10 @@ swipe action Přenosový server chrání vaši IP adresu, ale může sledovat dobu trvání hovoru. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Odstranit @@ -6152,6 +6420,14 @@ swipe action Odstranit přístupovou frázi z klíčenek? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6274,7 +6550,7 @@ swipe action Restart the app to create a new chat profile - Restartujte aplikaci pro vytvoření nového chat profilu + Restartujte aplikaci pro vytvoření nového profilu chatu No comment provided by engineer. @@ -6383,6 +6659,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6406,6 +6686,14 @@ chat item action Uložit a aktualizovat profil skupiny No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Uložení profilu skupiny @@ -6711,7 +6999,7 @@ chat item action Sending delivery receipts will be enabled for all contacts in all visible chat profiles. - Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných chat profilech. + Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných profilech chatu. No comment provided by engineer. @@ -6821,6 +7109,10 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Server vyžaduje autorizaci pro vytváření front, zkontrolujte heslo. @@ -6996,6 +7288,10 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link No comment provided by engineer. @@ -7162,8 +7458,8 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7322,6 +7618,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors No comment provided by engineer. @@ -7410,6 +7723,10 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7453,12 +7770,17 @@ report reason Test failed at step %@. Test selhal v kroku %@. - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Testovací server @@ -7509,6 +7831,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). No comment provided by engineer. @@ -7603,7 +7929,7 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován The servers for new connections of your current chat profile **%@**. - Servery pro nová připojení vašeho aktuálního chat profilu **%@**. + Servery pro nová připojení vašeho aktuálního profilu chatu **%@**. No comment provided by engineer. @@ -7681,6 +8007,14 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován Tato skupina již neexistuje. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -7695,7 +8029,7 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován This setting applies to messages in your current chat profile **%@**. - Toto nastavení platí pro zprávy ve vašem aktuálním chat profilu **%@**. + Toto nastavení platí pro zprávy ve vašem aktuálním profilu chatu **%@**. No comment provided by engineer. @@ -7773,7 +8107,7 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření. To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page. - Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Chat profily**. + Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Profily chatu**. No comment provided by engineer. @@ -7875,6 +8209,10 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření. Unblock member? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages No comment provided by engineer. @@ -7896,7 +8234,7 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření. Unhide chat profile - Odkrýt chat profil + Odkrýt profil chatu No comment provided by engineer. @@ -8102,6 +8440,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Use for messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Použít pro nová připojení @@ -8137,6 +8479,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Use private routing with unknown servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Použít server @@ -8171,6 +8517,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Používat servery SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop No comment provided by engineer. @@ -8280,6 +8630,14 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu Hlasová zpráva… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... No comment provided by engineer. @@ -8546,6 +8904,10 @@ Repeat join request? Náhled oznámení na zamykací obrazovce můžete změnit v nastavení. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Můžete sdílet odkaz nebo QR kód - ke skupině se bude moci připojit kdokoli. O členy skupiny nepřijdete, pokud ji později odstraníte. @@ -8588,6 +8950,10 @@ Repeat join request? Nemůžete posílat zprávy! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Nemohli jste být ověřeni; Zkuste to prosím znovu. @@ -8692,6 +9058,10 @@ Repeat connection request? Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. No comment provided by engineer. @@ -8735,6 +9105,10 @@ Repeat connection request? Vaše hovory No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Vaše chatovací databáze @@ -8751,7 +9125,7 @@ Repeat connection request? Your chat profiles - Vaše chat profily + Vaše profily chatu No comment provided by engineer. @@ -8813,6 +9187,11 @@ Repeat connection request? Your profile No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Váš profil **%@** bude sdílen. @@ -8837,6 +9216,14 @@ Repeat connection request? Váš náhodný profil No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Adresa vašeho serveru @@ -8881,6 +9268,10 @@ Repeat connection request? výše, pak vyberte: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -8898,6 +9289,10 @@ Repeat connection request? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin správce @@ -9032,6 +9427,14 @@ marked deleted chat item preview text změna adresy… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored barevné @@ -9172,6 +9575,10 @@ pref value smazáno deleted chat item + + deleted channel + rcv group event chat item + deleted contact rcv direct event chat item @@ -9280,6 +9687,10 @@ pref value chyba No comment provided by engineer. + + error: %@ + receive error chat item + expired No comment provided by engineer. @@ -9403,6 +9814,10 @@ pref value opustil rcv group event chat item + + link + No comment provided by engineer. + marked deleted označeno jako smazáno @@ -9469,6 +9884,10 @@ pref value nikdy delete after time + + new + No comment provided by engineer. + new message nová zpráva @@ -9582,6 +10001,10 @@ time to disappear odmítnutý hovor call status + + relay + member role + removed odstraněno @@ -9592,6 +10015,10 @@ time to disappear odstraněno %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address profile update event chat item @@ -9723,6 +10150,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile aktualizoval profil skupiny @@ -9741,6 +10172,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link prostřednictvím odkazu na kontaktní adresu @@ -9812,6 +10247,10 @@ last received msg: %2$@ jste pozorovatel No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ snd group event chat item diff --git a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff index 7ab0535158..5840cff078 100644 --- a/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff +++ b/apps/ios/SimpleX Localizations/de.xcloc/Localized Contents/de.xliff @@ -185,6 +185,10 @@ %d Monate time interval + + %d relays + channel relay bar + %d sec %d s @@ -200,11 +204,37 @@ %d übersprungene Nachricht(en) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d Wochen time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld Kontakt(e) ausgewählt @@ -365,6 +399,10 @@ **Link scannen / einfügen**: Um eine Verbindung über den Link herzustellen, den Sie erhalten haben. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Warnung**: Sofortige Push-Benachrichtigungen erfordern die Eingabe eines Passworts, welches in Ihrem Schlüsselbund gespeichert ist. @@ -1317,6 +1355,10 @@ swipe action Mitglied blockieren? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin wurde vom Administrator blockiert @@ -1367,6 +1409,10 @@ swipe action Sowohl Ihr Kontakt, als auch Sie können Sprachnachrichten senden. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgarisch, Finnisch, Thailändisch und Ukrainisch - Dank der Nutzer und [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Chat @@ -1639,6 +1729,22 @@ set passcode view Benutzerprofil No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Chat-Design @@ -1689,6 +1795,14 @@ set passcode view Wenn es erlaubt ist, Nachrichten überprüfen. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Überprüfen Sie die Serveradresse und versuchen Sie es nochmal. @@ -1834,6 +1948,10 @@ set passcode view ICE-Server konfigurieren No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Server-Betreiber konfigurieren @@ -1897,7 +2015,8 @@ set passcode view Connect Verbinden - server test step + relay test step +server test step Connect automatically @@ -2025,6 +2144,7 @@ Das ist Ihr eigener Einmal-Link! Connection failed + Verbindung fehlgeschlagen No comment provided by engineer. @@ -2177,7 +2297,7 @@ Das ist Ihr eigener Einmal-Link! Correct name to %@? Richtiger Name für %@? - No comment provided by engineer. + alert message Create @@ -2234,6 +2354,14 @@ Das ist Ihr eigener Einmal-Link! Profil erstellen No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Erzeuge Warteschlange @@ -2269,6 +2397,10 @@ Das ist Ihr eigener Einmal-Link! Archiv-Link erzeugen No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Link wird erstellt… @@ -2432,6 +2564,10 @@ Das ist Ihr eigener Einmal-Link! Dezentral No comment provided by engineer. + + Decode link + relay test step + Decryption error Entschlüsselungsfehler @@ -2478,6 +2614,14 @@ swipe action Kontakt löschen und benachrichtigen No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Chat löschen @@ -2649,6 +2793,10 @@ alert button Lösche Warteschlange server test step + + Delete relay + No comment provided by engineer. + Delete report Meldung löschen @@ -3025,6 +3173,10 @@ chat item action Bearbeiten chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Gruppenprofil bearbeiten @@ -3060,6 +3212,10 @@ chat item action TCP-Keep-alive aktivieren No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Automatisches Löschen von Nachrichten aktivieren? @@ -3205,6 +3361,10 @@ chat item action Zugangscode eingeben No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Geben Sie das korrekte Passwort ein. @@ -3230,6 +3390,10 @@ chat item action Für die Anzeige das Passwort im Suchfeld eingeben! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Geben Sie den Server manuell ein @@ -3285,6 +3449,10 @@ chat item action Fehler beim Hinzufügen von Mitgliedern No comment provided by engineer. + + Error adding relay + alert title + Error adding server Fehler beim Hinzufügen des Servers @@ -3345,6 +3513,10 @@ chat item action Fehler beim Erstellen der Adresse No comment provided by engineer. + + Error creating channel + alert title + Error creating group Fehler beim Erzeugen der Gruppe @@ -3480,11 +3652,6 @@ chat item action Fehler beim Öffnen des Chat No comment provided by engineer. - - Error opening group - Fehler beim Vorbereiten der Gruppe - No comment provided by engineer. - Error receiving file Fehler beim Herunterladen der Datei @@ -3530,6 +3697,10 @@ chat item action Fehler beim Speichern der ICE-Server No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Fehler beim Speichern der Chat-Liste @@ -3675,7 +3846,8 @@ snd error text Error: %@. Fehler: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3919,7 +4091,8 @@ snd error text Fingerprint in server address does not match certificate. Fingerabdruck in der Serveradresse stimmt nicht mit dem Zertifikat überein. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3964,7 +4137,8 @@ snd error text For chat profile %@: Für das Chat-Profil %@: - servers error + servers error +servers warning For console @@ -4105,6 +4279,10 @@ Fehler: %2$@ GIFs und Sticker No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Bei Erwähnung benachrichtigt werden. @@ -4347,6 +4525,7 @@ Fehler: %2$@ If you joined or created channels, they will stop working permanently. + Kanäle, welche Sie erstellt haben oder denen Sie beigetreten sind, werden dauerhaft deaktiviert. down migration warning @@ -4606,7 +4785,15 @@ Weitere Verbesserungen sind bald verfügbar! Invalid name! Ungültiger Name! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4719,6 +4906,10 @@ Weitere Verbesserungen sind bald verfügbar! Als %@ beitreten No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Treten Sie der Gruppe bei @@ -4806,6 +4997,14 @@ Das ist Ihr Link für die Gruppe %@! Verlassen swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Chat verlassen @@ -5101,6 +5300,10 @@ Das ist Ihr Link für die Gruppe %@! Nachrichtenentwurf No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Nachricht weitergeleitet @@ -5421,6 +5624,10 @@ Das ist Ihr Link für die Gruppe %@! Neue Chat-Erfahrung 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Neue Kontaktanfrage @@ -5496,6 +5703,14 @@ Das ist Ihr Link für die Gruppe %@! Kein App-Passwort Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Keine Chats @@ -5646,6 +5861,10 @@ Das ist Ihr Link für die Gruppe %@! Keine Benutzerkennungen. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Nicht kompatibel! @@ -5861,6 +6080,10 @@ Dies erfordert die Aktivierung eines VPNs. Änderungen öffnen No comment provided by engineer. + + Open channel + new chat action + Open chat Chat öffnen @@ -5901,6 +6124,10 @@ Dies erfordert die Aktivierung eines VPNs. Migration auf ein anderes Gerät öffnen authentication reason + + Open new channel + new chat action + Open new chat Neuen Chat öffnen @@ -5993,6 +6220,14 @@ Dies erfordert die Aktivierung eines VPNs. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING-Zähler @@ -6202,6 +6437,14 @@ Fehler: %@ Den letzten Nachrichtenentwurf, auch mit seinen Anhängen, aufbewahren. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Voreingestellte Serveradresse @@ -6287,6 +6530,10 @@ Fehler: %@ Zeitüberschreitung der privaten Routing-Sitzung alert title + + Proceed + alert action + Profile and server connections Profil und Serververbindungen @@ -6636,6 +6883,22 @@ swipe action Mitglied ablehnen? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Relais-Server werden nur genutzt, wenn sie benötigt werden. Ihre IP-Adresse kann von Anderen erfasst werden. @@ -6646,6 +6909,10 @@ swipe action Relais-Server schützen Ihre IP-Adresse, aber sie können die Anrufdauer erfassen. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Entfernen @@ -6686,6 +6953,14 @@ swipe action Passwort aus dem Schlüsselbund entfernen? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Entfernt Nachrichten und blockiert Mitglieder. @@ -6947,6 +7222,10 @@ chat item action Speichern (und Mitglieder benachrichtigen) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Speichern der Aufnahme-Einstellungen? @@ -6972,6 +7251,14 @@ chat item action Gruppen-Profil sichern und aktualisieren No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Gruppenprofil speichern @@ -7432,6 +7719,10 @@ chat item action Das Server-Protokoll wurde geändert. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Der Server erfordert zum Erstellen von Warteschlangen eine Autorisierung. Bitte überprüfen Sie das Passwort. @@ -7628,6 +7919,10 @@ chat item action Profil teilen No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Teilen Sie diesen Einmal-Einladungslink @@ -7813,9 +8108,8 @@ chat item action Die SimpleX-Protokolle wurden von Trail of Bits überprüft. No comment provided by engineer. - - SimpleX relay link - SimpleX Relais-Link + + SimpleX relay address simplex link type @@ -7991,6 +8285,23 @@ report reason Abonniert No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Fehler beim Abonnieren @@ -8091,6 +8402,10 @@ report reason Tippen Sie im Menü auf SimpleX-Adresse erstellen, um sie später zu erstellen. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Tippen, um der Gruppe beizutreten @@ -8139,13 +8454,18 @@ report reason Test failed at step %@. Der Test ist beim Schritt %@ fehlgeschlagen. - server test failure + relay test failure +server test failure Test notifications Benachrichtigungen testen No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Teste Server @@ -8198,6 +8518,10 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro Durch Verwendung verschiedener Netzwerk-Betreiber für jede Unterhaltung schützt die App Ihre Privatsphäre. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Die App wird eine Bestätigung bei Downloads von unbekannten Datei-Servern anfordern (außer bei .onion). @@ -8388,6 +8712,14 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro Diese Gruppe existiert nicht mehr. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Für diesen Link wird eine neuere App-Version benötigt. Bitte aktualisieren Sie die App oder bitten Sie Ihren Kontakt einen kompatiblen Link zu senden. @@ -8610,6 +8942,10 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt Mitglied freigeben? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Nicht ausgelieferte Nachrichten @@ -8862,6 +9198,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Für Nachrichten verwenden No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Für neue Verbindungen nutzen @@ -8902,6 +9242,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Sie nutzen privates Routing mit unbekannten Servern. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Server nutzen @@ -8942,6 +9286,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Verwendung von SimpleX-Chat-Servern. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Code mit dem Desktop überprüfen @@ -9062,6 +9410,14 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s Sprachnachrichten… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Es wird auf den Desktop gewartet... @@ -9364,6 +9720,10 @@ Verbindungsanfrage wiederholen? Über die Geräte-Einstellungen können Sie die Benachrichtigungsvorschau im Sperrbildschirm erlauben. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Sie können diesen Link oder QR-Code teilen - Damit kann jede Person der Gruppe beitreten. Wenn Sie den Link später löschen, werden Sie keine Gruppenmitglieder verlieren, die der Gruppe darüber beigetreten sind. @@ -9409,6 +9769,10 @@ Verbindungsanfrage wiederholen? Sie können keine Nachrichten versenden! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Sie konnten nicht überprüft werden; bitte versuchen Sie es erneut. @@ -9521,6 +9885,10 @@ Verbindungsanfrage wiederholen? Sie können Anrufe und Benachrichtigungen auch von stummgeschalteten Profilen empfangen, solange diese aktiv sind. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Sie werden von diesem Chat keine Nachrichten mehr erhalten. Der Nachrichtenverlauf bleibt erhalten. @@ -9566,6 +9934,10 @@ Verbindungsanfrage wiederholen? Anrufe No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Chat-Datenbank @@ -9651,6 +10023,11 @@ Verbindungsanfrage wiederholen? Mein Profil No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Ihr Profil **%@** wird geteilt. @@ -9676,6 +10053,14 @@ Verbindungsanfrage wiederholen? Ihr Zufallsprofil No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Ihre Serveradresse @@ -9721,6 +10106,10 @@ Verbindungsanfrage wiederholen? Danach die gewünschte Aktion auswählen: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ %@ angenommen @@ -9741,6 +10130,10 @@ Verbindungsanfrage wiederholen? hat Sie angenommen rcv group event chat item + + active + No comment provided by engineer. + admin Admin @@ -9887,6 +10280,14 @@ marked deleted chat item preview text Wechsel der Empfängeradresse wurde gestartet… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored farbig @@ -10033,6 +10434,10 @@ pref value Gelöscht deleted chat item + + deleted channel + rcv group event chat item + deleted contact Gelöschter Kontakt @@ -10143,6 +10548,10 @@ pref value Fehler No comment provided by engineer. + + error: %@ + receive error chat item + expired Abgelaufen @@ -10150,6 +10559,7 @@ pref value failed + Fehlgeschlagen No comment provided by engineer. @@ -10272,6 +10682,10 @@ pref value hat die Gruppe verlassen rcv group event chat item + + link + No comment provided by engineer. + marked deleted als gelöscht markiert @@ -10342,6 +10756,10 @@ pref value nie delete after time + + new + No comment provided by engineer. + new message Neue Nachricht @@ -10465,6 +10883,10 @@ time to disappear Abgelehnter Anruf call status + + relay + member role + removed entfernt @@ -10475,6 +10897,10 @@ time to disappear hat %@ aus der Gruppe entfernt rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address Die Kontaktadresse wurde entfernt @@ -10629,6 +11055,10 @@ Zuletzt empfangene Nachricht: %2$@ Ungeschützt No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile Aktualisiertes Gruppenprofil @@ -10649,6 +11079,10 @@ Zuletzt empfangene Nachricht: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link über einen Kontaktadressen-Link @@ -10724,6 +11158,10 @@ Zuletzt empfangene Nachricht: %2$@ Sie sind Beobachter No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ Sie haben %@ blockiert diff --git a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff index fbc3b2dfa8..88b9939944 100644 --- a/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff +++ b/apps/ios/SimpleX Localizations/en.xcloc/Localized Contents/en.xliff @@ -185,6 +185,11 @@ %d months time interval + + %d relays + %d relays + channel relay bar + %d sec %d sec @@ -200,11 +205,43 @@ %d skipped message(s) integrity error chat item + + %d subscriber + %d subscriber + channel subscriber count + + + %d subscribers + %d subscribers + channel subscriber count + %d weeks %d weeks time interval + + %1$d/%2$d relays active + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +252,11 @@ %lld %@ No comment provided by engineer. + + %lld channel events + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld contact(s) selected @@ -365,6 +407,11 @@ **Scan / Paste link**: to connect via a link you received. No comment provided by engineer. + + **Test relay** to retrieve its name. + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Warning**: Instant push notifications require passphrase saved in Keychain. @@ -1317,6 +1364,11 @@ swipe action Block member? No comment provided by engineer. + + Block subscriber for all? + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Blocked by admin @@ -1367,6 +1419,11 @@ swipe action Both you and your contact can send voice messages. No comment provided by engineer. + + Broadcast + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1611,61 @@ new chat action authentication reason set passcode view + + Channel + Channel + No comment provided by engineer. + + + Channel display name + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + Channel full name (optional) + No comment provided by engineer. + + + Channel image + Channel image + No comment provided by engineer. + + + Channel link + Channel link + No comment provided by engineer. + + + Channel profile + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Chat @@ -1639,6 +1751,26 @@ set passcode view Chat profile No comment provided by engineer. + + Chat relay + Chat relay + No comment provided by engineer. + + + Chat relays + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Chat theme @@ -1689,6 +1821,16 @@ set passcode view Check messages when allowed. No comment provided by engineer. + + Check relay address and try again. + Check relay address and try again. + alert message + + + Check relay name and try again. + Check relay name and try again. + alert message + Check server address and try again. Check server address and try again. @@ -1834,6 +1976,11 @@ set passcode view Configure ICE servers No comment provided by engineer. + + Configure relays + Configure relays + No comment provided by engineer. + Configure server operators Configure server operators @@ -1897,7 +2044,8 @@ set passcode view Connect Connect - server test step + relay test step +server test step Connect automatically @@ -2178,7 +2326,7 @@ This is your own one-time link! Correct name to %@? Correct name to %@? - No comment provided by engineer. + alert message Create @@ -2235,6 +2383,16 @@ This is your own one-time link! Create profile No comment provided by engineer. + + Create public channel + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + Create public channel (BETA) + No comment provided by engineer. + Create queue Create queue @@ -2270,6 +2428,11 @@ This is your own one-time link! Creating archive link No comment provided by engineer. + + Creating channel + Creating channel + No comment provided by engineer. + Creating link… Creating link… @@ -2433,6 +2596,11 @@ This is your own one-time link! Decentralized No comment provided by engineer. + + Decode link + Decode link + relay test step + Decryption error Decryption error @@ -2479,6 +2647,16 @@ swipe action Delete and notify contact No comment provided by engineer. + + Delete channel + Delete channel + No comment provided by engineer. + + + Delete channel? + Delete channel? + No comment provided by engineer. + Delete chat Delete chat @@ -2650,6 +2828,11 @@ alert button Delete queue server test step + + Delete relay + Delete relay + No comment provided by engineer. + Delete report Delete report @@ -3026,6 +3209,11 @@ chat item action Edit chat item action + + Edit channel profile + Edit channel profile + No comment provided by engineer. + Edit group profile Edit group profile @@ -3061,6 +3249,11 @@ chat item action Enable TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Enable automatic message deletion? @@ -3206,6 +3399,11 @@ chat item action Enter Passcode No comment provided by engineer. + + Enter channel name… + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Enter correct passphrase. @@ -3231,6 +3429,11 @@ chat item action Enter password above to show! No comment provided by engineer. + + Enter relay name… + Enter relay name… + No comment provided by engineer. + Enter server manually Enter server manually @@ -3286,6 +3489,11 @@ chat item action Error adding member(s) No comment provided by engineer. + + Error adding relay + Error adding relay + alert title + Error adding server Error adding server @@ -3346,6 +3554,11 @@ chat item action Error creating address No comment provided by engineer. + + Error creating channel + Error creating channel + alert title + Error creating group Error creating group @@ -3481,11 +3694,6 @@ chat item action Error opening chat No comment provided by engineer. - - Error opening group - Error opening group - No comment provided by engineer. - Error receiving file Error receiving file @@ -3531,6 +3739,11 @@ chat item action Error saving ICE servers No comment provided by engineer. + + Error saving channel profile + Error saving channel profile + No comment provided by engineer. + Error saving chat list Error saving chat list @@ -3676,7 +3889,8 @@ snd error text Error: %@. Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3920,7 +4134,8 @@ snd error text Fingerprint in server address does not match certificate. Fingerprint in server address does not match certificate. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3965,7 +4180,8 @@ snd error text For chat profile %@: For chat profile %@: - servers error + servers error +servers warning For console @@ -4106,6 +4322,11 @@ Error: %2$@ GIFs and stickers No comment provided by engineer. + + Get link + Get link + relay test step + Get notified when mentioned. Get notified when mentioned. @@ -4608,7 +4829,17 @@ More improvements are coming soon! Invalid name! Invalid name! - No comment provided by engineer. + alert title + + + Invalid relay address! + Invalid relay address! + alert title + + + Invalid relay name! + Invalid relay name! + alert title Invalid response @@ -4721,6 +4952,11 @@ More improvements are coming soon! Join as %@ No comment provided by engineer. + + Join channel + Join channel + No comment provided by engineer. + Join group Join group @@ -4808,6 +5044,16 @@ This is your link for group %@! Leave swipe action + + Leave channel + Leave channel + No comment provided by engineer. + + + Leave channel? + Leave channel? + No comment provided by engineer. + Leave chat Leave chat @@ -5103,6 +5349,11 @@ This is your link for group %@! Message draft No comment provided by engineer. + + Message error + Message error + No comment provided by engineer. + Message forwarded Message forwarded @@ -5423,6 +5674,11 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + New chat relay + No comment provided by engineer. + New contact request New contact request @@ -5498,6 +5754,16 @@ This is your link for group %@! No app password Authentication unavailable + + No chat relays + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + No chat relays enabled. + servers warning + No chats No chats @@ -5648,6 +5914,11 @@ This is your link for group %@! No user identifiers. No comment provided by engineer. + + Not all relays connected + Not all relays connected + alert title + Not compatible! Not compatible! @@ -5863,6 +6134,11 @@ Requires compatible VPN. Open changes No comment provided by engineer. + + Open channel + Open channel + new chat action + Open chat Open chat @@ -5903,6 +6179,11 @@ Requires compatible VPN. Open migration to another device authentication reason + + Open new channel + Open new channel + new chat action + Open new chat Open new chat @@ -5995,6 +6276,16 @@ Requires compatible VPN. %@ alert message + + Owner + Owner + No comment provided by engineer. + + + Owners + Owners + No comment provided by engineer. + PING count PING count @@ -6204,6 +6495,16 @@ Error: %@ Preserve the last message draft, with attachments. No comment provided by engineer. + + Preset relay address + Preset relay address + No comment provided by engineer. + + + Preset relay name + Preset relay name + No comment provided by engineer. + Preset server address Preset server address @@ -6289,6 +6590,11 @@ Error: %@ Private routing timeout alert title + + Proceed + Proceed + alert action + Profile and server connections Profile and server connections @@ -6638,6 +6944,26 @@ swipe action Reject member? alert title + + Relay + Relay + No comment provided by engineer. + + + Relay address + Relay address + alert title + + + Relay connection failed + Relay connection failed + alert title + + + Relay link + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Relay server is only used if necessary. Another party can observe your IP address. @@ -6648,6 +6974,11 @@ swipe action Relay server protects your IP address, but it can observe the duration of the call. No comment provided by engineer. + + Relay test failed! + Relay test failed! + No comment provided by engineer. + Remove Remove @@ -6688,6 +7019,16 @@ swipe action Remove passphrase from keychain? No comment provided by engineer. + + Remove subscriber + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + Remove subscriber? + alert title + Removes messages and blocks members. Removes messages and blocks members. @@ -6949,6 +7290,11 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + Save (and notify subscribers) + alert button + Save admission settings? Save admission settings? @@ -6974,6 +7320,16 @@ chat item action Save and update group profile No comment provided by engineer. + + Save channel profile + Save channel profile + No comment provided by engineer. + + + Save channel profile? + Save channel profile? + alert title + Save group profile Save group profile @@ -7434,6 +7790,11 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Server requires authorization to create queues, check password. @@ -7630,6 +7991,11 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + Share relay address + No comment provided by engineer. + Share this 1-time invite link Share this 1-time invite link @@ -7815,9 +8181,9 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link - SimpleX relay link + + SimpleX relay address + SimpleX relay address simplex link type @@ -7993,6 +8359,28 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Subscription errors @@ -8093,6 +8481,11 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + Tap Join channel + No comment provided by engineer. + Tap Join group Tap Join group @@ -8141,13 +8534,19 @@ report reason Test failed at step %@. Test failed at step %@. - server test failure + relay test failure +server test failure Test notifications Test notifications No comment provided by engineer. + + Test relay + Test relay + No comment provided by engineer. + Test server Test server @@ -8200,6 +8599,11 @@ It can happen because of some bug or when the connection is compromised.The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). The app will ask to confirm downloads from unknown file servers (except .onion). @@ -8390,6 +8794,16 @@ It can happen because of some bug or when the connection is compromised.This group no longer exists. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. @@ -8612,6 +9026,11 @@ You will be prompted to complete authentication before this feature is enabled.< Unblock member? No comment provided by engineer. + + Unblock subscriber for all? + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Undelivered messages @@ -8864,6 +9283,11 @@ To connect, please ask your contact to create another connection link and check Use for messages No comment provided by engineer. + + Use for new channels + Use for new channels + No comment provided by engineer. + Use for new connections Use for new connections @@ -8904,6 +9328,11 @@ To connect, please ask your contact to create another connection link and check Use private routing with unknown servers. No comment provided by engineer. + + Use relay + Use relay + No comment provided by engineer. + Use server Use server @@ -8944,6 +9373,11 @@ To connect, please ask your contact to create another connection link and check Using SimpleX Chat servers. No comment provided by engineer. + + Verify + Verify + relay test step + Verify code with desktop Verify code with desktop @@ -9064,6 +9498,16 @@ To connect, please ask your contact to create another connection link and check Voice message… No comment provided by engineer. + + Wait + Wait + alert action + + + Wait response + Wait response + relay test step + Waiting for desktop... Waiting for desktop... @@ -9366,6 +9810,11 @@ Repeat join request? You can set lock screen notification preview via settings. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. @@ -9411,6 +9860,11 @@ Repeat join request? You can't send messages! alert title + + You connected to the channel via this relay link. + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. You could not be verified; please try again. @@ -9523,6 +9977,11 @@ Repeat connection request? You will still receive calls and notifications from muted profiles when they are active. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. You will stop receiving messages from this chat. Chat history will be preserved. @@ -9568,6 +10027,11 @@ Repeat connection request? Your calls No comment provided by engineer. + + Your channel + Your channel + No comment provided by engineer. + Your chat database Your chat database @@ -9653,6 +10117,13 @@ Repeat connection request? Your profile No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Your profile **%@** will be shared. @@ -9678,6 +10149,16 @@ Repeat connection request? Your random profile No comment provided by engineer. + + Your relay address + Your relay address + No comment provided by engineer. + + + Your relay name + Your relay name + No comment provided by engineer. + Your server address Your server address @@ -9723,6 +10204,11 @@ Repeat connection request? above, then choose: No comment provided by engineer. + + accepted + accepted + No comment provided by engineer. + accepted %@ accepted %@ @@ -9743,6 +10229,11 @@ Repeat connection request? accepted you rcv group event chat item + + active + active + No comment provided by engineer. + admin admin @@ -9889,6 +10380,16 @@ marked deleted chat item preview text changing address… chat item text + + channel + channel + shown as sender role for channel messages + + + channel profile updated + channel profile updated + snd group event chat item + colored colored @@ -10035,6 +10536,11 @@ pref value deleted deleted chat item + + deleted channel + deleted channel + rcv group event chat item + deleted contact deleted contact @@ -10145,6 +10651,11 @@ pref value error No comment provided by engineer. + + error: %@ + error: %@ + receive error chat item + expired expired @@ -10275,6 +10786,11 @@ pref value left rcv group event chat item + + link + link + No comment provided by engineer. + marked deleted marked deleted @@ -10345,6 +10861,11 @@ pref value never delete after time + + new + new + No comment provided by engineer. + new message new message @@ -10468,6 +10989,11 @@ time to disappear rejected call call status + + relay + relay + member role + removed removed @@ -10478,6 +11004,11 @@ time to disappear removed %@ rcv group event chat item + + removed (%d attempts) + removed (%d attempts) + receive error chat item + removed contact address removed contact address @@ -10632,6 +11163,11 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + updated channel profile + rcv group event chat item + updated group profile updated group profile @@ -10652,6 +11188,11 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + via %@ + relay hostname + via contact address link via contact address link @@ -10727,6 +11268,11 @@ last received msg: %2$@ you are observer No comment provided by engineer. + + you are subscriber + you are subscriber + No comment provided by engineer. + you blocked %@ you blocked %@ diff --git a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff index 61734f2480..fe6234e16b 100644 --- a/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff +++ b/apps/ios/SimpleX Localizations/es.xcloc/Localized Contents/es.xliff @@ -185,6 +185,10 @@ %d mes(es) time interval + + %d relays + channel relay bar + %d sec %d segundo(s) @@ -200,11 +204,37 @@ %d mensaje(s) omitido(s) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d semana(s) time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld contacto(s) seleccionado(s) @@ -365,6 +399,10 @@ **Escanear / Pegar enlace**: para conectar mediante un enlace recibido. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Advertencia**: Las notificaciones automáticas instantáneas requieren una contraseña guardada en Keychain. @@ -1317,6 +1355,10 @@ swipe action ¿Bloquear miembro? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Bloqueado por administrador @@ -1367,6 +1409,10 @@ swipe action Tanto tú como tu contacto podéis enviar mensajes de voz. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Búlgaro, Finlandés, Tailandés y Ucraniano - gracias a los usuarios y [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Chat @@ -1639,6 +1729,22 @@ set passcode view Perfil de usuario No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Tema de chat @@ -1689,6 +1795,14 @@ set passcode view Comprobar mensajes cuando se permita. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Comprueba la dirección del servidor e inténtalo de nuevo. @@ -1834,6 +1948,10 @@ set passcode view Configure servidores ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Configurar operadores de servidores @@ -1897,7 +2015,8 @@ set passcode view Connect Conectar - server test step + relay test step +server test step Connect automatically @@ -2177,7 +2296,7 @@ This is your own one-time link! Correct name to %@? ¿Corregir el nombre a %@? - No comment provided by engineer. + alert message Create @@ -2234,6 +2353,14 @@ This is your own one-time link! Crear perfil No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Crear cola @@ -2269,6 +2396,10 @@ This is your own one-time link! Creando enlace al archivo No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Creando enlace… @@ -2432,6 +2563,10 @@ This is your own one-time link! Descentralizada No comment provided by engineer. + + Decode link + relay test step + Decryption error Error descifrado @@ -2478,6 +2613,14 @@ swipe action Eliminar y notificar contacto No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Eliminar chat @@ -2649,6 +2792,10 @@ alert button Eliminar cola server test step + + Delete relay + No comment provided by engineer. + Delete report Eliminar informe @@ -3025,6 +3172,10 @@ chat item action Editar chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Editar perfil de grupo @@ -3060,6 +3211,10 @@ chat item action Activar TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? ¿Activar eliminación automática de mensajes? @@ -3205,6 +3360,10 @@ chat item action Introduce Código No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Introduce la contraseña correcta. @@ -3230,6 +3389,10 @@ chat item action ¡Introduce la contraseña arriba para mostrar! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Añadir manualmente @@ -3285,6 +3448,10 @@ chat item action Error al añadir miembro(s) No comment provided by engineer. + + Error adding relay + alert title + Error adding server Error al añadir servidor @@ -3345,6 +3512,10 @@ chat item action Error al crear dirección No comment provided by engineer. + + Error creating channel + alert title + Error creating group Error al crear grupo @@ -3480,11 +3651,6 @@ chat item action Error al abrir chat No comment provided by engineer. - - Error opening group - Error al abrir el grupo - No comment provided by engineer. - Error receiving file Error al recibir archivo @@ -3530,6 +3696,10 @@ chat item action Error al guardar servidores ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Error al guardar listas @@ -3675,7 +3845,8 @@ snd error text Error: %@. Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3919,7 +4090,8 @@ snd error text Fingerprint in server address does not match certificate. La huella en la dirección del servidor no coincide con el certificado. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3964,7 +4136,8 @@ snd error text For chat profile %@: Para el perfil de chat %@: - servers error + servers error +servers warning For console @@ -4105,6 +4278,10 @@ Error: %2$@ GIFs y stickers No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Las menciones ahora se notifican. @@ -4606,7 +4783,15 @@ More improvements are coming soon! Invalid name! ¡Nombre no válido! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4719,6 +4904,10 @@ More improvements are coming soon! Unirme como %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Unirme al grupo @@ -4806,6 +4995,14 @@ This is your link for group %@! Salir swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Salir del chat @@ -5101,6 +5298,10 @@ This is your link for group %@! Borrador de mensaje No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Mensaje reenviado @@ -5421,6 +5622,10 @@ This is your link for group %@! Nueva experiencia de chat 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Nueva solicitud de contacto @@ -5496,6 +5701,14 @@ This is your link for group %@! Sin contraseña de la aplicación Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Sin chats @@ -5646,6 +5859,10 @@ This is your link for group %@! Sin identificadores de usuario. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! ¡No compatible! @@ -5861,6 +6078,10 @@ Requiere activación de la VPN. Abrir cambios No comment provided by engineer. + + Open channel + new chat action + Open chat Abrir chat @@ -5901,6 +6122,10 @@ Requiere activación de la VPN. Abrir menú migración a otro dispositivo authentication reason + + Open new channel + new chat action + Open new chat Abrir chat nuevo @@ -5993,6 +6218,14 @@ Requiere activación de la VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Contador PING @@ -6202,6 +6435,14 @@ Error: %@ Conserva el último borrador del mensaje con los datos adjuntos. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Dirección predefinida del servidor @@ -6287,6 +6528,10 @@ Error: %@ Timeout enrutamiento privado alert title + + Proceed + alert action + Profile and server connections Eliminar perfil y conexiones @@ -6636,6 +6881,22 @@ swipe action ¿Rechazar al miembro? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. El servidor de retransmisión sólo se usa en caso de necesidad. Un tercero podría ver tu IP. @@ -6646,6 +6907,10 @@ swipe action El servidor de retransmisión protege tu IP pero puede ver la duración de la llamada. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Eliminar @@ -6686,6 +6951,14 @@ swipe action ¿Eliminar contraseña de Keychain? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Elimina mensajes y bloquea miembros. @@ -6947,6 +7220,10 @@ chat item action Guardar (y notificar miembros) alert button + + Save (and notify subscribers) + alert button + Save admission settings? ¿Guardar configuración? @@ -6972,6 +7249,14 @@ chat item action Guardar y actualizar perfil del grupo No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Guardar perfil de grupo @@ -7432,6 +7717,10 @@ chat item action El protocolo del servidor ha cambiado. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. El servidor requiere autorización para crear colas, comprueba la contraseña. @@ -7628,6 +7917,10 @@ chat item action Perfil a compartir No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Comparte este enlace de un solo uso @@ -7813,9 +8106,8 @@ chat item action Protocolos de SimpleX auditados por Trail of Bits. No comment provided by engineer. - - SimpleX relay link - Enlace de servidor SimpleX + + SimpleX relay address simplex link type @@ -7991,6 +8283,23 @@ report reason Suscritas No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Errores de suscripción @@ -8091,6 +8400,10 @@ report reason Pulsa Crear dirección SimpleX en el menú para crearla más tarde. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Pulsa Unirme al grupo @@ -8139,13 +8452,18 @@ report reason Test failed at step %@. Prueba no superada en el paso %@. - server test failure + relay test failure +server test failure Test notifications Probar notificaciones No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Probar servidor @@ -8198,6 +8516,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. La aplicación protege tu privacidad mediante el uso de diferentes operadores en cada conversación. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). La aplicación pedirá que confirmes las descargas desde servidores de archivos desconocidos (excepto si son .onion). @@ -8388,6 +8710,14 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida. Este grupo ya no existe. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Este enlace requiere una versión más reciente de la aplicación. Por favor, actualiza la aplicación o pide a tu contacto un enlace compatible. @@ -8610,6 +8940,10 @@ Se te pedirá que completes la autenticación antes de activar esta función.¿Desbloquear miembro? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Mensajes no entregados @@ -8862,6 +9196,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Uso para mensajes No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Para conexiones nuevas @@ -8902,6 +9240,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Usar enrutamiento privado con servidores de mensaje desconocidos. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Usar servidor @@ -8942,6 +9284,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Usar servidores SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Verificar código con ordenador @@ -9062,6 +9408,14 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión Mensaje de voz… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Esperando ordenador... @@ -9364,6 +9718,10 @@ Repeat join request? Puedes configurar las notificaciones de la pantalla de bloqueo desde Configuración. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Puedes compartir el enlace o el código QR para que cualquiera pueda unirse al grupo. Si más tarde lo eliminas, no afectará a los miembros del grupo. @@ -9409,6 +9767,10 @@ Repeat join request? ¡No puedes enviar mensajes! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. No has podido ser autenticado. Inténtalo de nuevo. @@ -9521,6 +9883,10 @@ Repeat connection request? Seguirás recibiendo llamadas y notificaciones de los perfiles silenciados cuando estén activos. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Dejarás de recibir mensajes del chat. El historial del chat se conserva. @@ -9566,6 +9932,10 @@ Repeat connection request? Llamadas No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Base de datos @@ -9651,6 +10021,11 @@ Repeat connection request? Tu perfil No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. El perfil **%@** será compartido. @@ -9676,6 +10051,14 @@ Repeat connection request? Tu perfil aleatorio No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Dirección del servidor @@ -9721,6 +10104,10 @@ Repeat connection request? y después elige: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ %@ aceptado @@ -9741,6 +10128,10 @@ Repeat connection request? te ha admitido rcv group event chat item + + active + No comment provided by engineer. + admin administrador @@ -9887,6 +10278,14 @@ marked deleted chat item preview text cambiando de servidor… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored coloreado @@ -10033,6 +10432,10 @@ pref value eliminado deleted chat item + + deleted channel + rcv group event chat item + deleted contact contacto eliminado @@ -10143,6 +10546,10 @@ pref value error No comment provided by engineer. + + error: %@ + receive error chat item + expired expirados @@ -10272,6 +10679,10 @@ pref value ha salido rcv group event chat item + + link + No comment provided by engineer. + marked deleted marcado eliminado @@ -10342,6 +10753,10 @@ pref value nunca delete after time + + new + No comment provided by engineer. + new message mensaje nuevo @@ -10465,6 +10880,10 @@ time to disappear llamada rechazada call status + + relay + member role + removed expulsado @@ -10475,6 +10894,10 @@ time to disappear ha expulsado a %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address dirección de contacto eliminada @@ -10629,6 +11052,10 @@ last received msg: %2$@ desprotegida No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile ha actualizado el perfil del grupo @@ -10649,6 +11076,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link mediante enlace de dirección de contacto @@ -10724,6 +11155,10 @@ last received msg: %2$@ Tu rol es observador No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ has bloqueado a %@ diff --git a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff index 5a7813dfe5..89bea61cee 100644 --- a/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff +++ b/apps/ios/SimpleX Localizations/fi.xcloc/Localized Contents/fi.xliff @@ -172,6 +172,10 @@ %d kuukautta time interval + + %d relays + channel relay bar + %d sec %d sek @@ -186,11 +190,37 @@ %d ohitettua viestiä integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d viikkoa time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -201,6 +231,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld kontaktia valittu @@ -340,6 +374,10 @@ **Scan / Paste link**: to connect via a link you received. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Varoitus**: Välittömät push-ilmoitukset vaativat tunnuslauseen, joka on tallennettu Keychainiin. @@ -1195,6 +1233,10 @@ swipe action Block member? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin No comment provided by engineer. @@ -1240,6 +1282,10 @@ swipe action Sekä sinä että kontaktisi voitte lähettää ääniviestejä. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! No comment provided by engineer. @@ -1407,6 +1453,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat No comment provided by engineer. @@ -1483,6 +1573,22 @@ set passcode view Käyttäjäprofiili No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme No comment provided by engineer. @@ -1524,6 +1630,14 @@ set passcode view Check messages when allowed. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Tarkista palvelimen osoite ja yritä uudelleen. @@ -1651,6 +1765,10 @@ set passcode view Määritä ICE-palvelimet No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators No comment provided by engineer. @@ -1707,7 +1825,8 @@ set passcode view Connect Yhdistä - server test step + relay test step +server test step Connect automatically @@ -1950,7 +2069,7 @@ This is your own one-time link! Correct name to %@? - No comment provided by engineer. + alert message Create @@ -2003,6 +2122,14 @@ This is your own one-time link! Luo profiilisi No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Luo jono @@ -2033,6 +2160,10 @@ This is your own one-time link! Creating archive link No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… No comment provided by engineer. @@ -2189,6 +2320,10 @@ This is your own one-time link! Hajautettu No comment provided by engineer. + + Decode link + relay test step + Decryption error Salauksen purkuvirhe @@ -2232,6 +2367,14 @@ swipe action Delete and notify contact No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat No comment provided by engineer. @@ -2393,6 +2536,10 @@ alert button Poista jono server test step + + Delete relay + No comment provided by engineer. + Delete report No comment provided by engineer. @@ -2730,6 +2877,10 @@ chat item action Muokkaa chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Muokkaa ryhmäprofiilia @@ -2763,6 +2914,10 @@ chat item action Ota TCP-säilytys käyttöön No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Ota automaattinen viestien poisto käyttöön? @@ -2898,6 +3053,10 @@ chat item action Syötä pääsykoodi No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Anna oikea tunnuslause. @@ -2921,6 +3080,10 @@ chat item action Kirjoita yllä oleva salasana näyttääksesi! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Syötä palvelin manuaalisesti @@ -2972,6 +3135,10 @@ chat item action Virhe lisättäessä jäseniä No comment provided by engineer. + + Error adding relay + alert title + Error adding server alert title @@ -3024,6 +3191,10 @@ chat item action Virhe osoitteen luomisessa No comment provided by engineer. + + Error creating channel + alert title + Error creating group Virhe ryhmän luomisessa @@ -3149,10 +3320,6 @@ chat item action Error opening chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file Virhe tiedoston vastaanottamisessa @@ -3192,6 +3359,10 @@ chat item action Virhe ICE-palvelimien tallentamisessa No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list alert title @@ -3325,7 +3496,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3542,7 +3714,8 @@ snd error text Fingerprint in server address does not match certificate. Palvelimen osoitteen varmenteen sormenjälki on mahdollisesti virheellinen - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3584,7 +3757,8 @@ snd error text For chat profile %@: - servers error + servers error +servers warning For console @@ -3703,6 +3877,10 @@ Error: %2$@ GIFit ja tarrat No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -4166,7 +4344,15 @@ More improvements are coming soon! Invalid name! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4275,6 +4461,10 @@ More improvements are coming soon! Liity %@:nä No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Liity ryhmään @@ -4354,6 +4544,14 @@ This is your link for group %@! Poistu swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat No comment provided by engineer. @@ -4622,6 +4820,10 @@ This is your link for group %@! Viestiluonnos No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded item status text @@ -4902,6 +5104,10 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Uusi kontaktipyyntö @@ -4971,6 +5177,14 @@ This is your link for group %@! Ei sovelluksen salasanaa Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5102,6 +5316,10 @@ This is your link for group %@! Ensimmäinen alusta ilman käyttäjätunnisteita – suunniteltu yksityiseksi. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! No comment provided by engineer. @@ -5301,6 +5519,10 @@ Edellyttää VPN:n sallimista. Open changes No comment provided by engineer. + + Open channel + new chat action + Open chat Avaa keskustelu @@ -5335,6 +5557,10 @@ Edellyttää VPN:n sallimista. Open migration to another device authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5408,6 +5634,14 @@ Edellyttää VPN:n sallimista. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING-määrä @@ -5599,6 +5833,14 @@ Error: %@ Säilytä viimeinen viestiluonnos liitteineen. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Esiasetettu palvelimen osoite @@ -5672,6 +5914,10 @@ Error: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections Profiili- ja palvelinyhteydet @@ -5991,6 +6237,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Välityspalvelinta käytetään vain tarvittaessa. Toinen osapuoli voi tarkkailla IP-osoitettasi. @@ -6001,6 +6263,10 @@ swipe action Välityspalvelin suojaa IP-osoitteesi, mutta se voi tarkkailla puhelun kestoa. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Poista @@ -6037,6 +6303,14 @@ swipe action Poista tunnuslause avainnipusta? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6268,6 +6542,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6291,6 +6569,14 @@ chat item action Tallenna ja päivitä ryhmäprofiili No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Tallenna ryhmäprofiili @@ -6705,6 +6991,10 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Palvelin vaatii valtuutuksen jonojen luomiseen, tarkista salasana @@ -6880,6 +7170,10 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link No comment provided by engineer. @@ -7046,8 +7340,8 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7205,6 +7499,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors No comment provided by engineer. @@ -7293,6 +7604,10 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7336,12 +7651,17 @@ report reason Test failed at step %@. Testi epäonnistui vaiheessa %@. - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Testipalvelin @@ -7392,6 +7712,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). No comment provided by engineer. @@ -7564,6 +7888,14 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.Tätä ryhmää ei enää ole olemassa. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -7757,6 +8089,10 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote Unblock member? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages No comment provided by engineer. @@ -7984,6 +8320,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Use for messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Käytä uusiin yhteyksiin @@ -8019,6 +8359,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Use private routing with unknown servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Käytä palvelinta @@ -8053,6 +8397,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Käyttää SimpleX Chat -palvelimia. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop No comment provided by engineer. @@ -8162,6 +8510,14 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja Ääniviesti… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... No comment provided by engineer. @@ -8428,6 +8784,10 @@ Repeat join request? Voit määrittää lukitusnäytön ilmoituksen esikatselun asetuksista. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Voit jakaa linkin tai QR-koodin - kuka tahansa voi liittyä ryhmään. Et menetä ryhmän jäseniä, jos poistat sen myöhemmin. @@ -8470,6 +8830,10 @@ Repeat join request? Et voi lähettää viestejä! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Sinua ei voitu todentaa; yritä uudelleen. @@ -8574,6 +8938,10 @@ Repeat connection request? Saat edelleen puheluita ja ilmoituksia mykistetyiltä profiileilta, kun ne ovat aktiivisia. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. No comment provided by engineer. @@ -8617,6 +8985,10 @@ Repeat connection request? Puhelusi No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Keskustelut-tietokantasi @@ -8695,6 +9067,11 @@ Repeat connection request? Your profile No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Profiilisi **%@** jaetaan. @@ -8719,6 +9096,14 @@ Repeat connection request? Satunnainen profiilisi No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Palvelimesi osoite @@ -8763,6 +9148,10 @@ Repeat connection request? edellä, valitse sitten: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -8780,6 +9169,10 @@ Repeat connection request? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin ylläpitäjä @@ -8914,6 +9307,14 @@ marked deleted chat item preview text muuttamassa osoitetta… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored värillinen @@ -9054,6 +9455,10 @@ pref value poistettu deleted chat item + + deleted channel + rcv group event chat item + deleted contact rcv direct event chat item @@ -9162,6 +9567,10 @@ pref value virhe No comment provided by engineer. + + error: %@ + receive error chat item + expired No comment provided by engineer. @@ -9285,6 +9694,10 @@ pref value poistunut rcv group event chat item + + link + No comment provided by engineer. + marked deleted merkitty poistetuksi @@ -9351,6 +9764,10 @@ pref value ei koskaan delete after time + + new + No comment provided by engineer. + new message uusi viesti @@ -9464,6 +9881,10 @@ time to disappear hylätty puhelu call status + + relay + member role + removed poistettu @@ -9474,6 +9895,10 @@ time to disappear %@ poistettu rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address profile update event chat item @@ -9605,6 +10030,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile päivitetty ryhmäprofiili @@ -9623,6 +10052,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link kontaktiosoitelinkillä @@ -9694,6 +10127,10 @@ last received msg: %2$@ olet tarkkailija No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ snd group event chat item diff --git a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff index 7e386fe50c..5fcada4ccf 100644 --- a/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff +++ b/apps/ios/SimpleX Localizations/fr.xcloc/Localized Contents/fr.xliff @@ -185,6 +185,10 @@ %d mois time interval + + %d relays + channel relay bar + %d sec %d sec @@ -200,11 +204,37 @@ %d message·s sauté·s integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d semaines time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld contact·s sélectionné·s @@ -365,6 +399,10 @@ **Scanner / Coller** : pour vous connecter via un lien que vous avez reçu. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Avertissement** : les notifications push instantanées nécessitent une phrase secrète enregistrée dans la keychain. @@ -1312,6 +1350,10 @@ swipe action Bloquer ce membre ? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Bloqué par l'administrateur @@ -1360,6 +1402,10 @@ swipe action Vous et votre contact êtes tous deux en mesure d'envoyer des messages vocaux. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgare, finnois, thaïlandais et ukrainien - grâce aux utilisateurs et à [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat) ! @@ -1545,6 +1591,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Discussions @@ -1630,6 +1720,22 @@ set passcode view Profil d'utilisateur No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Thème de chat @@ -1676,6 +1782,14 @@ set passcode view Consulter les messages quand c'est possible. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Vérifiez l'adresse du serveur et réessayez. @@ -1821,6 +1935,10 @@ set passcode view Configurer les serveurs ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Configurer les opérateurs de serveur @@ -1884,7 +2002,8 @@ set passcode view Connect Se connecter - server test step + relay test step +server test step Connect automatically @@ -2162,7 +2281,7 @@ Il s'agit de votre propre lien unique ! Correct name to %@? Corriger le nom pour %@ ? - No comment provided by engineer. + alert message Create @@ -2219,6 +2338,14 @@ Il s'agit de votre propre lien unique ! Créer le profil No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Créer une file d'attente @@ -2253,6 +2380,10 @@ Il s'agit de votre propre lien unique ! Création d'un lien d'archive No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Création d'un lien… @@ -2416,6 +2547,10 @@ Il s'agit de votre propre lien unique ! Décentralisé No comment provided by engineer. + + Decode link + relay test step + Decryption error Erreur de déchiffrement @@ -2462,6 +2597,14 @@ swipe action Supprimer et en informer le contact No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Supprimer la discussion @@ -2630,6 +2773,10 @@ alert button Supprimer la file d'attente server test step + + Delete relay + No comment provided by engineer. + Delete report Supprimer le rapport @@ -3004,6 +3151,10 @@ chat item action Modifier chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Modifier le profil du groupe @@ -3038,6 +3189,10 @@ chat item action Activer le TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Activer la suppression automatique des messages ? @@ -3182,6 +3337,10 @@ chat item action Entrer le code d'accès No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Entrez la phrase secrète correcte. @@ -3207,6 +3366,10 @@ chat item action Entrez ci-dessus le mot de passe pour afficher le profil ! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Entrer un serveur manuellement @@ -3261,6 +3424,10 @@ chat item action Erreur lors de l'ajout de membre·s No comment provided by engineer. + + Error adding relay + alert title + Error adding server Erreur lors de l'ajout du serveur @@ -3318,6 +3485,10 @@ chat item action Erreur lors de la création de l'adresse No comment provided by engineer. + + Error creating channel + alert title + Error creating group Erreur lors de la création du groupe @@ -3452,10 +3623,6 @@ chat item action Erreur lors de l'ouverture du chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file Erreur lors de la réception du fichier @@ -3500,6 +3667,10 @@ chat item action Erreur lors de la sauvegarde des serveurs ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Erreur lors de l'enregistrement de la liste des chats @@ -3643,7 +3814,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3883,7 +4055,8 @@ snd error text Fingerprint in server address does not match certificate. Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3926,7 +4099,8 @@ snd error text For chat profile %@: Pour le profil de discussion %@ : - servers error + servers error +servers warning For console @@ -4066,6 +4240,10 @@ Erreur : %2$@ GIFs et stickers No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -4554,7 +4732,15 @@ D'autres améliorations sont à venir ! Invalid name! Nom invalide ! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4666,6 +4852,10 @@ D'autres améliorations sont à venir ! rejoindre entant que %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Rejoindre le groupe @@ -4752,6 +4942,14 @@ Voici votre lien pour le groupe %@ ! Quitter swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Quitter la discussion @@ -5033,6 +5231,10 @@ Voici votre lien pour le groupe %@ ! Brouillon de message No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Message transféré @@ -5347,6 +5549,10 @@ Voici votre lien pour le groupe %@ ! Nouvelle expérience de discussion 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Nouvelle demande de contact @@ -5420,6 +5626,14 @@ Voici votre lien pour le groupe %@ ! Pas de mot de passe pour l'app Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5562,6 +5776,10 @@ Voici votre lien pour le groupe %@ ! Aucun identifiant d'utilisateur. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Non compatible ! @@ -5770,6 +5988,10 @@ Nécessite l'activation d'un VPN. Ouvrir les modifications No comment provided by engineer. + + Open channel + new chat action + Open chat Ouvrir le chat @@ -5807,6 +6029,10 @@ Nécessite l'activation d'un VPN. Ouvrir le transfert vers un autre appareil authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5892,6 +6118,14 @@ Nécessite l'activation d'un VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Nombre de PING @@ -6097,6 +6331,14 @@ Erreur : %@ Conserver le brouillon du dernier message, avec les pièces jointes. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Adresse du serveur prédéfinie @@ -6178,6 +6420,10 @@ Erreur : %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections Profil et connexions au serveur @@ -6521,6 +6767,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Le serveur relais n'est utilisé que si nécessaire. Un tiers peut observer votre adresse IP. @@ -6531,6 +6793,10 @@ swipe action Le serveur relais protège votre adresse IP, mais il peut observer la durée de l'appel. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Supprimer @@ -6569,6 +6835,14 @@ swipe action Supprimer la phrase secrète de la keychain ? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6814,6 +7088,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6838,6 +7116,14 @@ chat item action Enregistrer et mettre à jour le profil du groupe No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Enregistrer le profil du groupe @@ -7286,6 +7572,10 @@ chat item action Le protocole du serveur a été modifié. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Le serveur requiert une autorisation pour créer des files d'attente, vérifiez le mot de passe @@ -7476,6 +7766,10 @@ chat item action Partager le profil No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Partagez ce lien d'invitation unique @@ -7656,8 +7950,8 @@ chat item action Protocoles SimpleX audité par Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7831,6 +8125,23 @@ report reason Inscriptions No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Erreurs d'inscription @@ -7926,6 +8237,10 @@ report reason Appuyez sur Créer une adresse SimpleX dans le menu pour la créer ultérieurement. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7973,12 +8288,17 @@ report reason Test failed at step %@. Échec du test à l'étape %@. - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Tester le serveur @@ -8030,6 +8350,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. L'application protège votre vie privée en utilisant des opérateurs différents pour chaque conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). L'application demandera de confirmer les téléchargements à partir de serveurs de fichiers inconnus (sauf .onion). @@ -8218,6 +8542,14 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise. Ce groupe n'existe plus. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -8432,6 +8764,10 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s Débloquer ce membre ? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Messages non distribués @@ -8674,6 +9010,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Utiliser pour les messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Utiliser pour les nouvelles connexions @@ -8713,6 +9053,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Utiliser le routage privé avec des serveurs inconnus. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Utiliser ce serveur @@ -8752,6 +9096,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Vous utilisez les serveurs SimpleX. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Vérifier le code avec le bureau @@ -8871,6 +9219,14 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien Message vocal… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... En attente du bureau... @@ -9170,6 +9526,10 @@ Répéter la demande d'adhésion ? Vous pouvez configurer l'aperçu des notifications sur l'écran de verrouillage via les paramètres. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Vous pouvez partager un lien ou un code QR - n'importe qui pourra rejoindre le groupe. Vous ne perdrez pas les membres du groupe si vous le supprimez par la suite. @@ -9214,6 +9574,10 @@ Répéter la demande d'adhésion ? Vous ne pouvez pas envoyer de messages ! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Vous n'avez pas pu être vérifié·e ; veuillez réessayer. @@ -9324,6 +9688,10 @@ Répéter la demande de connexion ? Vous continuerez à recevoir des appels et des notifications des profils mis en sourdine lorsqu'ils sont actifs. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Vous ne recevrez plus de messages de cette discussion. L'historique sera préservé. @@ -9368,6 +9736,10 @@ Répéter la demande de connexion ? Vos appels No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Votre base de données de chat @@ -9450,6 +9822,11 @@ Répéter la demande de connexion ? Votre profil No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Votre profil **%@** sera partagé. @@ -9475,6 +9852,14 @@ Répéter la demande de connexion ? Votre profil aléatoire No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Votre adresse de serveur @@ -9520,6 +9905,10 @@ Répéter la demande de connexion ? ci-dessus, puis choisissez : No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -9538,6 +9927,10 @@ Répéter la demande de connexion ? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin admin @@ -9681,6 +10074,14 @@ marked deleted chat item preview text changement d'adresse… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored coloré @@ -9823,6 +10224,10 @@ pref value supprimé deleted chat item + + deleted channel + rcv group event chat item + deleted contact contact supprimé @@ -9933,6 +10338,10 @@ pref value erreur No comment provided by engineer. + + error: %@ + receive error chat item + expired expiré @@ -10060,6 +10469,10 @@ pref value a quitté rcv group event chat item + + link + No comment provided by engineer. + marked deleted supprimé @@ -10128,6 +10541,10 @@ pref value jamais delete after time + + new + No comment provided by engineer. + new message nouveau message @@ -10245,6 +10662,10 @@ time to disappear appel rejeté call status + + relay + member role + removed supprimé @@ -10255,6 +10676,10 @@ time to disappear a retiré %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address suppression de l'adresse de contact @@ -10402,6 +10827,10 @@ dernier message reçu : %2$@ non protégé No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile mise à jour du profil de groupe @@ -10422,6 +10851,10 @@ dernier message reçu : %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link via le lien d'adresse du contact @@ -10496,6 +10929,10 @@ dernier message reçu : %2$@ vous êtes observateur No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ vous avez bloqué %@ diff --git a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff index 0ed5dc19ea..4837804697 100644 --- a/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff +++ b/apps/ios/SimpleX Localizations/hu.xcloc/Localized Contents/hu.xliff @@ -185,6 +185,10 @@ %d hónap time interval + + %d relays + channel relay bar + %d sec %d mp @@ -200,11 +204,37 @@ %d üzenet kihagyva integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d hét time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld partner kiválasztva @@ -365,6 +399,10 @@ **Hivatkozás beolvasása / beillesztése**: egy kapott hivatkozáson keresztüli kapcsolódáshoz. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Figyelmeztetés:** Az azonnali leküldéses értesítésekhez a kulcstartóban tárolt jelmondat megadása szükséges. @@ -844,7 +882,7 @@ swipe action All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays. - Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-továbbítókiszolgálókra. + Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-átjátszókra. No comment provided by engineer. @@ -994,7 +1032,7 @@ swipe action Always use relay - Mindig legyen használva továbbítókiszolgáló + Mindig legyen használva átjátszó No comment provided by engineer. @@ -1317,6 +1355,10 @@ swipe action Letiltja a tagot? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Letiltva az adminisztrátor által @@ -1367,6 +1409,10 @@ swipe action Mindkét fél küldhet hangüzeneteket. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bolgár, finn, thai és ukrán – köszönet a felhasználóknak és a [Weblate-nek](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Csevegés @@ -1639,6 +1729,22 @@ set passcode view Csevegési profil No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Csevegés témája @@ -1689,6 +1795,14 @@ set passcode view Üzenetek ellenőrzése, amikor engedélyezett. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Kiszolgáló címének ellenőrzése és újrapróbálkozás. @@ -1834,6 +1948,10 @@ set passcode view ICE-kiszolgálók beállítása No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Kiszolgálóüzemeltetők beállítása @@ -1897,7 +2015,8 @@ set passcode view Connect Kapcsolódás - server test step + relay test step +server test step Connect automatically @@ -2025,6 +2144,7 @@ Ez a saját egyszer használható meghívója! Connection failed + Nem sikerült létrehozni a kapcsolatot No comment provided by engineer. @@ -2177,7 +2297,7 @@ Ez a saját egyszer használható meghívója! Correct name to %@? Helyesbíti a nevet a következőre: %@? - No comment provided by engineer. + alert message Create @@ -2234,6 +2354,14 @@ Ez a saját egyszer használható meghívója! Profil létrehozása No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Várólista létrehozása @@ -2269,6 +2397,10 @@ Ez a saját egyszer használható meghívója! Archívum hivatkozás létrehozása No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Hivatkozás létrehozása… @@ -2432,6 +2564,10 @@ Ez a saját egyszer használható meghívója! Decentralizált No comment provided by engineer. + + Decode link + relay test step + Decryption error Titkosítás-visszafejtési hiba @@ -2478,6 +2614,14 @@ swipe action Törlés, és a partner értesítése No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Csevegés törlése @@ -2649,6 +2793,10 @@ alert button Várólista törlése server test step + + Delete relay + No comment provided by engineer. + Delete report Jelentés törlése @@ -2741,7 +2889,7 @@ alert button Destination server address of %@ is incompatible with forwarding server %@ settings. - A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbítókiszolgáló beállításaival. + A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbító kiszolgáló beállításaival. No comment provided by engineer. @@ -2751,7 +2899,7 @@ alert button Destination server version of %@ is incompatible with forwarding server %@. - A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbítókiszolgálóval. + A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbító kiszolgálóval. No comment provided by engineer. @@ -3025,6 +3173,10 @@ chat item action Szerkesztés chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Csoportprofil szerkesztése @@ -3060,6 +3212,10 @@ chat item action TCP életben tartása No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Engedélyezi az automatikus üzenettörlést? @@ -3205,6 +3361,10 @@ chat item action Adja meg a jelkódot No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Adja meg a helyes jelmondatot. @@ -3230,6 +3390,10 @@ chat item action Adja meg a jelszót fentebb a megjelenítéshez! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Kiszolgáló megadása kézzel @@ -3285,6 +3449,10 @@ chat item action Hiba történt a tag(ok) hozzáadásakor No comment provided by engineer. + + Error adding relay + alert title + Error adding server Hiba történt a kiszolgáló hozzáadásakor @@ -3332,7 +3500,7 @@ chat item action Error connecting to forwarding server %@. Please try later. - Hiba történt a(z) %@ továbbítókiszolgálóhoz való kapcsolódáskor. Próbálja meg később. + Hiba történt a(z) %@ továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később. alert message @@ -3345,6 +3513,10 @@ chat item action Hiba történt a cím létrehozásakor No comment provided by engineer. + + Error creating channel + alert title + Error creating group Hiba történt a csoport létrehozásakor @@ -3480,11 +3652,6 @@ chat item action Hiba történt a csevegés megnyitásakor No comment provided by engineer. - - Error opening group - Hiba történt a csoport megnyitásakor - No comment provided by engineer. - Error receiving file Hiba történt a fájl fogadásakor @@ -3530,6 +3697,10 @@ chat item action Hiba történt az ICE-kiszolgálók mentésekor No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Hiba történt a csevegési lista mentésekor @@ -3675,7 +3846,8 @@ snd error text Error: %@. Hiba: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3913,13 +4085,14 @@ snd error text Fingerprint in forwarding server address does not match certificate: %@. - A továbbítókiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@. + A továbbító kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@. No comment provided by engineer. Fingerprint in server address does not match certificate. A kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3964,7 +4137,8 @@ snd error text For chat profile %@: A(z) %@ nevű csevegési profilhoz: - servers error + servers error +servers warning For console @@ -4038,30 +4212,30 @@ snd error text Forwarding server %1$@ failed to connect to destination server %2$@. Please try later. - A(z) %1$@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később. + A(z) %1$@ továbbító kiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később. alert message Forwarding server address is incompatible with network settings: %@. - A továbbítókiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@. + A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@. No comment provided by engineer. Forwarding server version is incompatible with network settings: %@. - A továbbítókiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@. + A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@. No comment provided by engineer. Forwarding server: %1$@ Destination server error: %2$@ - Továbbítókiszolgáló: %1$@ + Továbbító kiszolgáló: %1$@ Célkiszolgáló-hiba: %2$@ snd error text Forwarding server: %1$@ Error: %2$@ - Továbbítókiszolgáló: %1$@ + Továbbító kiszolgáló: %1$@ Hiba: %2$@ snd error text @@ -4105,6 +4279,10 @@ Hiba: %2$@ GIF-ek és matricák No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Kapjon értesítést, ha megemlítik. @@ -4347,6 +4525,7 @@ Hiba: %2$@ If you joined or created channels, they will stop working permanently. + Ha csatornákat hozott létre vagy csak csatlakozott hozzájuk, akkor azok véglegesen le fognak állni. down migration warning @@ -4606,7 +4785,15 @@ További fejlesztések hamarosan! Invalid name! Érvénytelen név! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4719,6 +4906,10 @@ További fejlesztések hamarosan! Csatlakozás mint: %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Csatlakozás a csoporthoz @@ -4806,6 +4997,14 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Elhagyás swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Csevegés elhagyása @@ -5101,6 +5300,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Piszkozatok No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Továbbított üzenet @@ -5421,6 +5624,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Új csevegési élmény 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Új partneri kapcsolatkérés @@ -5496,6 +5703,14 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Nincs alkalmazás jelszó Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Nincsenek csevegések @@ -5646,6 +5861,10 @@ Ez a saját hivatkozása a(z) %@ nevű csoporthoz! Nincsenek felhasználói azonosítók. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Nem kompatibilis! @@ -5861,6 +6080,10 @@ VPN engedélyezése szükséges. Módosítások megtekintése No comment provided by engineer. + + Open channel + new chat action + Open chat Csevegés megnyitása @@ -5901,6 +6124,10 @@ VPN engedélyezése szükséges. Átköltöztetés indítása egy másik eszközre authentication reason + + Open new channel + new chat action + Open new chat Új csevegés megnyitása @@ -5993,6 +6220,14 @@ VPN engedélyezése szükséges. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING-ek száma @@ -6202,9 +6437,17 @@ Hiba: %@ Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address - Az előre beállított kiszolgáló címe + Előre beállított kiszolgáló címe No comment provided by engineer. @@ -6287,6 +6530,10 @@ Hiba: %@ Privát útválasztás időtúllépése alert title + + Proceed + alert action + Profile and server connections Profil és kiszolgálókapcsolatok @@ -6380,7 +6627,7 @@ Hiba: %@ Protect your IP address from the messaging relays chosen by your contacts. Enable in *Network & servers* settings. - Védje az IP-címét a partnerei által kiválasztott üzenetváltási továbbítókiszolgálókkal szemben. + Védje az IP-címét a partnerei által kiválasztott üzenetváltási átjátszókkal szemben. Engedélyezze a *Hálózat és kiszolgálók* menüben. No comment provided by engineer. @@ -6636,14 +6883,34 @@ swipe action Elutasítja a tagot? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. - A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. + Az átjátszó csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. No comment provided by engineer. Relay server protects your IP address, but it can observe the duration of the call. - A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát. + Az átjátszó megvédi az IP-címét, de megfigyelheti a hívás időtartamát. + No comment provided by engineer. + + + Relay test failed! No comment provided by engineer. @@ -6686,6 +6953,14 @@ swipe action Eltávolítja a jelmondatot a kulcstartóból? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Üzenetek eltávolítása és a tagok tiltása. @@ -6947,6 +7222,10 @@ chat item action Mentés (és a tagok értesítése) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Menti a befogadási beállításokat? @@ -6972,6 +7251,14 @@ chat item action Mentés és a csoportprofil frissítése No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Csoportprofil mentése @@ -7432,6 +7719,10 @@ chat item action A kiszolgálóprotokoll módosult. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. A kiszolgálónak engedélyre van szüksége a várólisták létrehozásához, ellenőrizze a jelszavát. @@ -7628,6 +7919,10 @@ chat item action Profil megosztása No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Ennek az egyszer használható meghívónak a megosztása @@ -7813,9 +8108,8 @@ chat item action A SimpleX protokollokat a Trail of Bits auditálta. No comment provided by engineer. - - SimpleX relay link - SimpleX továbbítókiszolgáló-hivatkozás + + SimpleX relay address simplex link type @@ -7991,6 +8285,23 @@ report reason Feliratkozva No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Feliratkozási hibák @@ -8091,6 +8402,10 @@ report reason Koppintson a SimpleX-cím létrehozása menüpontra a későbbi létrehozáshoz. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Koppintson a „Csatlakozás a csoporthoz” gombra @@ -8139,13 +8454,18 @@ report reason Test failed at step %@. A teszt a(z) %@ lépésnél sikertelen volt. - server test failure + relay test failure +server test failure Test notifications Értesítések tesztelése No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Kiszolgáló tesztelése @@ -8198,6 +8518,10 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. Az alkalmazás úgy védi az adatait, hogy minden egyes beszélgetéshez más-más üzemeltetőt használ. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Az alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról (kivéve .onion) történő letöltések megerősítését. @@ -8388,6 +8712,14 @@ Ez valamilyen hiba vagy sérült kapcsolat esetén fordulhat elő. Ez a csoport már nem létezik. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Ez a hivatkozás újabb alkalmazásverziót igényel. Frissítse az alkalmazást vagy kérjen egy kompatibilis hivatkozást a partnerétől. @@ -8610,6 +8942,10 @@ A funkció bekapcsolása előtt a rendszer felszólítja a képernyőzár beáll Feloldja a tag letiltását? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Kézbesítetlen üzenetek @@ -8862,6 +9198,10 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Használat az üzenetekhez No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Használat új kapcsolatokhoz @@ -8902,6 +9242,10 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Privát útválasztás használata az ismeretlen kiszolgálókhoz. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Kiszolgáló használata @@ -8942,6 +9286,10 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso SimpleX Chat kiszolgálók használatban. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Kód ellenőrzése a számítógépen @@ -9062,6 +9410,14 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Hangüzenet… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Várakozás a számítógép-alkalmazásra… @@ -9189,7 +9545,7 @@ A kapcsolódáshoz kérje meg a partnerét, hogy hozzon létre egy másik kapcso Without Tor or VPN, your IP address will be visible to these XFTP relays: %@. - Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-átjátszók számára: %@. alert message @@ -9364,6 +9720,10 @@ Megismétli a csatlakozási kérést? A lezárási képernyő értesítési előnézetét az „Értesítések” menüben állíthatja be. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Megoszthat egy hivatkozást vagy QR-kódot – így bárki csatlakozhat a csoporthoz. Ha a csoporthivatkozást később törli, akkor nem fogja elveszíteni a csoport meglévő tagjait. @@ -9409,6 +9769,10 @@ Megismétli a csatlakozási kérést? Ön nem tud üzeneteket küldeni! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Nem sikerült ellenőrizni; próbálja meg újra. @@ -9521,6 +9885,10 @@ Megismétli a kapcsolódási kérést? Továbbra is kap hívásokat és értesítéseket a némított profiloktól, ha azok aktívak. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Nem fog több üzenetet kapni ebből a csevegésből, de a csevegés előzményei megmaradnak. @@ -9566,6 +9934,10 @@ Megismétli a kapcsolódási kérést? Hívások No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Csevegési adatbázis @@ -9651,6 +10023,11 @@ Megismétli a kapcsolódási kérést? Saját profil No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. A(z) **%@** nevű profilja meg lesz osztva. @@ -9676,6 +10053,14 @@ Megismétli a kapcsolódási kérést? Véletlenszerű profil No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Saját SMP-kiszolgálójának címe @@ -9721,6 +10106,10 @@ Megismétli a kapcsolódási kérést? gombra fent, majd válassza ki: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ befogadta őt: %@ @@ -9741,6 +10130,10 @@ Megismétli a kapcsolódási kérést? befogadta Önt rcv group event chat item + + active + No comment provided by engineer. + admin adminisztrátor @@ -9887,6 +10280,14 @@ marked deleted chat item preview text cím módosítása… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored színezett @@ -10033,6 +10434,10 @@ pref value törölve deleted chat item + + deleted channel + rcv group event chat item + deleted contact törölt partner @@ -10143,6 +10548,10 @@ pref value hiba No comment provided by engineer. + + error: %@ + receive error chat item + expired lejárt @@ -10150,6 +10559,7 @@ pref value failed + sikertelen No comment provided by engineer. @@ -10272,6 +10682,10 @@ pref value elhagyta a csoportot rcv group event chat item + + link + No comment provided by engineer. + marked deleted törlésre jelölve @@ -10342,6 +10756,10 @@ pref value soha delete after time + + new + No comment provided by engineer. + new message új üzenet @@ -10465,6 +10883,10 @@ time to disappear elutasított hívás call status + + relay + member role + removed eltávolítva @@ -10475,6 +10897,10 @@ time to disappear eltávolította őt: %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address eltávolította a kapcsolattartási címet @@ -10629,6 +11055,10 @@ utoljára fogadott üzenet: %2$@ nem védett No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile frissítette a csoportprofilt @@ -10649,6 +11079,10 @@ utoljára fogadott üzenet: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link a kapcsolattartási címhivatkozáson keresztül @@ -10666,7 +11100,7 @@ utoljára fogadott üzenet: %2$@ via relay - továbbítókiszolgálón keresztül + átjátszón keresztül No comment provided by engineer. @@ -10724,6 +11158,10 @@ utoljára fogadott üzenet: %2$@ Ön megfigyelő No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ Ön letiltotta őt: %@ diff --git a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff index 97061054e8..2d0566afc6 100644 --- a/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff +++ b/apps/ios/SimpleX Localizations/it.xcloc/Localized Contents/it.xliff @@ -185,6 +185,10 @@ %d mesi time interval + + %d relays + channel relay bar + %d sec %d sec @@ -200,11 +204,37 @@ %d messaggio/i saltato/i integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d settimane time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld contatto/i selezionato/i @@ -365,6 +399,10 @@ **Scansiona / Incolla link**: per connetterti tramite un link che hai ricevuto. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Attenzione**: le notifiche push istantanee richiedono una password salvata nel portachiavi. @@ -1317,6 +1355,10 @@ swipe action Bloccare il membro? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Bloccato dall'amministratore @@ -1367,6 +1409,10 @@ swipe action Sia tu che il tuo contatto potete inviare messaggi vocali. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgaro, finlandese, tailandese e ucraino - grazie agli utenti e a [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Chat @@ -1639,6 +1729,22 @@ set passcode view Profilo utente No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Tema della chat @@ -1689,6 +1795,14 @@ set passcode view Controlla i messaggi quando consentito. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Controlla l'indirizzo del server e riprova. @@ -1834,6 +1948,10 @@ set passcode view Configura server ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Configura gli operatori dei server @@ -1897,7 +2015,8 @@ set passcode view Connect Connetti - server test step + relay test step +server test step Connect automatically @@ -2025,6 +2144,7 @@ Questo è il tuo link una tantum! Connection failed + Connessione fallita No comment provided by engineer. @@ -2177,7 +2297,7 @@ Questo è il tuo link una tantum! Correct name to %@? Correggere il nome a %@? - No comment provided by engineer. + alert message Create @@ -2234,6 +2354,14 @@ Questo è il tuo link una tantum! Crea profilo No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Crea coda @@ -2269,6 +2397,10 @@ Questo è il tuo link una tantum! Creazione link dell'archivio No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Creazione link… @@ -2432,6 +2564,10 @@ Questo è il tuo link una tantum! Decentralizzato No comment provided by engineer. + + Decode link + relay test step + Decryption error Errore di decifrazione @@ -2478,6 +2614,14 @@ swipe action Elimina e avvisa il contatto No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Elimina chat @@ -2649,6 +2793,10 @@ alert button Elimina coda server test step + + Delete relay + No comment provided by engineer. + Delete report Elimina la segnalazione @@ -3025,6 +3173,10 @@ chat item action Modifica chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Modifica il profilo del gruppo @@ -3060,6 +3212,10 @@ chat item action Attiva il keep-alive TCP No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Attivare l'eliminazione automatica dei messaggi? @@ -3205,6 +3361,10 @@ chat item action Inserisci il codice di accesso No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Inserisci la password giusta. @@ -3230,6 +3390,10 @@ chat item action Inserisci la password sopra per mostrare! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Inserisci il server a mano @@ -3285,6 +3449,10 @@ chat item action Errore di aggiunta membro/i No comment provided by engineer. + + Error adding relay + alert title + Error adding server Errore di aggiunta del server @@ -3345,6 +3513,10 @@ chat item action Errore nella creazione dell'indirizzo No comment provided by engineer. + + Error creating channel + alert title + Error creating group Errore nella creazione del gruppo @@ -3480,11 +3652,6 @@ chat item action Errore di apertura della chat No comment provided by engineer. - - Error opening group - Errore di preparazione del gruppo - No comment provided by engineer. - Error receiving file Errore nella ricezione del file @@ -3530,6 +3697,10 @@ chat item action Errore nel salvataggio dei server ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Errore nel salvataggio dell'elenco di chat @@ -3675,7 +3846,8 @@ snd error text Error: %@. Errore: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3919,7 +4091,8 @@ snd error text Fingerprint in server address does not match certificate. L'impronta digitale nell'indirizzo del server non corrisponde al certificato. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3964,7 +4137,8 @@ snd error text For chat profile %@: Per il profilo di chat %@: - servers error + servers error +servers warning For console @@ -4105,6 +4279,10 @@ Errore: %2$@ GIF e adesivi No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Ricevi una notifica quando menzionato. @@ -4347,6 +4525,7 @@ Errore: %2$@ If you joined or created channels, they will stop working permanently. + Se sei dentro canali o ne hai creati, essi smetteranno di funzionare definitivamente. down migration warning @@ -4606,7 +4785,15 @@ Altri miglioramenti sono in arrivo! Invalid name! Nome non valido! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4719,6 +4906,10 @@ Altri miglioramenti sono in arrivo! entra come %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Entra nel gruppo @@ -4806,6 +4997,14 @@ Questo è il tuo link per il gruppo %@! Esci swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Esci dalla chat @@ -5101,6 +5300,10 @@ Questo è il tuo link per il gruppo %@! Bozza del messaggio No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Messaggio inoltrato @@ -5421,6 +5624,10 @@ Questo è il tuo link per il gruppo %@! Una nuova esperienza di chat 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Nuova richiesta di contatto @@ -5496,6 +5703,14 @@ Questo è il tuo link per il gruppo %@! Nessuna password dell'app Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Nessuna chat @@ -5646,6 +5861,10 @@ Questo è il tuo link per il gruppo %@! Nessun identificatore utente. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Non compatibile! @@ -5861,6 +6080,10 @@ Richiede l'attivazione della VPN. Apri le modifiche No comment provided by engineer. + + Open channel + new chat action + Open chat Apri chat @@ -5901,6 +6124,10 @@ Richiede l'attivazione della VPN. Apri migrazione ad un altro dispositivo authentication reason + + Open new channel + new chat action + Open new chat Apri una chat nuova @@ -5993,6 +6220,14 @@ Richiede l'attivazione della VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Conteggio PING @@ -6202,6 +6437,14 @@ Errore: %@ Conserva la bozza dell'ultimo messaggio, con gli allegati. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Indirizzo server preimpostato @@ -6287,6 +6530,10 @@ Errore: %@ Scadenza dell'instradamento privato alert title + + Proceed + alert action + Profile and server connections Profilo e connessioni al server @@ -6636,6 +6883,22 @@ swipe action Rifiutare il membro? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Il server relay viene usato solo se necessario. Un altro utente può osservare il tuo indirizzo IP. @@ -6646,6 +6909,10 @@ swipe action Il server relay protegge il tuo indirizzo IP, ma può osservare la durata della chiamata. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Rimuovi @@ -6686,6 +6953,14 @@ swipe action Rimuovere la password dal portachiavi? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Rimuove i messaggi e blocca i membri. @@ -6947,6 +7222,10 @@ chat item action Salva (e informa i membri) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Salvare le impostazioni di ammissione? @@ -6972,6 +7251,14 @@ chat item action Salva e aggiorna il profilo del gruppo No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Salva il profilo del gruppo @@ -7432,6 +7719,10 @@ chat item action Il protocollo del server è cambiato. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Il server richiede l'autorizzazione di creare code, controlla la password. @@ -7628,6 +7919,10 @@ chat item action Condividi il profilo No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Condividi questo link di invito una tantum @@ -7813,9 +8108,8 @@ chat item action Protocolli di SimpleX esaminati da Trail of Bits. No comment provided by engineer. - - SimpleX relay link - Link del relay SimpleX + + SimpleX relay address simplex link type @@ -7991,6 +8285,23 @@ report reason Iscritto No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Errori di iscrizione @@ -8091,6 +8402,10 @@ report reason Tocca Crea indirizzo SimpleX nel menu per crearlo più tardi. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Tocca Entra nel gruppo @@ -8139,13 +8454,18 @@ report reason Test failed at step %@. Test fallito al passo %@. - server test failure + relay test failure +server test failure Test notifications Prova le notifiche No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Prova server @@ -8198,6 +8518,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.L'app protegge la tua privacy usando diversi operatori in ogni conversazione. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). L'app chiederà di confermare i download da server di file sconosciuti (eccetto .onion). @@ -8388,6 +8712,14 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.Questo gruppo non esiste più. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Questo link richiede una versione più recente dell'app. Aggiornala o chiedi al tuo contatto di inviare un link compatibile. @@ -8610,6 +8942,10 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio Sbloccare il membro? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Messaggi non consegnati @@ -8862,6 +9198,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Usa per i messaggi No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Usa per connessioni nuove @@ -8902,6 +9242,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Usa l'instradamento privato con server sconosciuti. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Usa il server @@ -8942,6 +9286,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Utilizzo dei server SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Verifica il codice con il desktop @@ -9062,6 +9410,14 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e Messaggio vocale… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... In attesa del desktop... @@ -9364,6 +9720,10 @@ Ripetere la richiesta di ingresso? Puoi impostare l'anteprima della notifica nella schermata di blocco tramite le impostazioni. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Puoi condividere un link o un codice QR: chiunque potrà unirsi al gruppo. Non perderai i membri del gruppo se in seguito lo elimini. @@ -9409,6 +9769,10 @@ Ripetere la richiesta di ingresso? Non puoi inviare messaggi! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Non è stato possibile verificarti, riprova. @@ -9521,6 +9885,10 @@ Ripetere la richiesta di connessione? Continuerai a ricevere chiamate e notifiche da profili silenziati quando sono attivi. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Non riceverai più messaggi da questa chat. La cronologia della chat verrà conservata. @@ -9566,6 +9934,10 @@ Ripetere la richiesta di connessione? Le tue chiamate No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Il tuo database della chat @@ -9651,6 +10023,11 @@ Ripetere la richiesta di connessione? Il tuo profilo No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Verrà condiviso il tuo profilo **%@**. @@ -9676,6 +10053,14 @@ Ripetere la richiesta di connessione? Il tuo profilo casuale No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address L'indirizzo del tuo server @@ -9721,6 +10106,10 @@ Ripetere la richiesta di connessione? sopra, quindi scegli: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ %@ accettato @@ -9741,6 +10130,10 @@ Ripetere la richiesta di connessione? ti ha accettato/a rcv group event chat item + + active + No comment provided by engineer. + admin amministratore @@ -9887,6 +10280,14 @@ marked deleted chat item preview text cambio indirizzo… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored colorato @@ -10033,6 +10434,10 @@ pref value eliminato deleted chat item + + deleted channel + rcv group event chat item + deleted contact contatto eliminato @@ -10143,6 +10548,10 @@ pref value errore No comment provided by engineer. + + error: %@ + receive error chat item + expired scaduto @@ -10150,6 +10559,7 @@ pref value failed + fallito No comment provided by engineer. @@ -10272,6 +10682,10 @@ pref value è uscito/a rcv group event chat item + + link + No comment provided by engineer. + marked deleted contrassegnato eliminato @@ -10342,6 +10756,10 @@ pref value mai delete after time + + new + No comment provided by engineer. + new message messaggio nuovo @@ -10465,6 +10883,10 @@ time to disappear chiamata rifiutata call status + + relay + member role + removed rimosso @@ -10475,6 +10897,10 @@ time to disappear ha rimosso %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address indirizzo di contatto rimosso @@ -10629,6 +11055,10 @@ ultimo msg ricevuto: %2$@ non protetto No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile ha aggiornato il profilo del gruppo @@ -10649,6 +11079,10 @@ ultimo msg ricevuto: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link via link indirizzo del contatto @@ -10724,6 +11158,10 @@ ultimo msg ricevuto: %2$@ sei un osservatore No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ hai bloccato %@ diff --git a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff index ddec6c47f6..a95203da15 100644 --- a/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff +++ b/apps/ios/SimpleX Localizations/ja.xcloc/Localized Contents/ja.xliff @@ -185,6 +185,10 @@ %d 月 time interval + + %d relays + channel relay bar + %d sec %d 秒 @@ -200,11 +204,37 @@ %d 件のスキップされたメッセージ integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d 週 time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld No comment provided by engineer. @@ -214,6 +244,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld 件の連絡先が選択されました @@ -364,6 +398,10 @@ **QRスキャン / リンクの貼り付け**: 受け取ったリンクで接続する。 No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **警告**: 即時の プッシュ通知には、キーチェーンに保存されたパスフレーズが必要です。 @@ -1266,6 +1304,10 @@ swipe action Block member? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin No comment provided by engineer. @@ -1311,6 +1353,10 @@ swipe action あなたと連絡相手が音声メッセージを送信できます。 No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! ブルガリア語、フィンランド語、タイ語、ウクライナ語 - ユーザーと [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)に感謝します! @@ -1482,6 +1528,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat チャット @@ -1560,6 +1650,22 @@ set passcode view ユーザープロフィール No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme チャットテーマ @@ -1603,6 +1709,14 @@ set passcode view Check messages when allowed. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. サーバのアドレスを確認してから再度試してください。 @@ -1735,6 +1849,10 @@ set passcode view ICEサーバを設定 No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators No comment provided by engineer. @@ -1791,7 +1909,8 @@ set passcode view Connect 接続 - server test step + relay test step +server test step Connect automatically @@ -2045,7 +2164,7 @@ This is your own one-time link! Correct name to %@? - No comment provided by engineer. + alert message Create @@ -2098,6 +2217,14 @@ This is your own one-time link! プロフィールを作成する No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue キューの作成 @@ -2128,6 +2255,10 @@ This is your own one-time link! Creating archive link No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… No comment provided by engineer. @@ -2287,6 +2418,10 @@ This is your own one-time link! 分散型 No comment provided by engineer. + + Decode link + relay test step + Decryption error 復号化エラー @@ -2330,6 +2465,14 @@ swipe action Delete and notify contact No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat No comment provided by engineer. @@ -2491,6 +2634,10 @@ alert button 待ち行列を削除 server test step + + Delete relay + No comment provided by engineer. + Delete report No comment provided by engineer. @@ -2830,6 +2977,10 @@ chat item action 編集する chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile グループのプロフィールを編集 @@ -2863,6 +3014,10 @@ chat item action TCP keep-aliveを有効にする No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? 自動メッセージ削除を有効にしますか? @@ -2999,6 +3154,10 @@ chat item action パスコードを入力 No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. 正しいパスフレーズを入力してください。 @@ -3022,6 +3181,10 @@ chat item action 上にパスワードを入力すると表示されます! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually サーバを手動で入力 @@ -3073,6 +3236,10 @@ chat item action メンバー追加にエラー発生 No comment provided by engineer. + + Error adding relay + alert title + Error adding server alert title @@ -3125,6 +3292,10 @@ chat item action アドレス作成にエラー発生 No comment provided by engineer. + + Error creating channel + alert title + Error creating group グループの作成エラー @@ -3250,10 +3421,6 @@ chat item action Error opening chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file ファイル受信にエラー発生 @@ -3293,6 +3460,10 @@ chat item action ICEサーバ保存にエラー発生 No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list alert title @@ -3426,7 +3597,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3643,7 +3815,8 @@ snd error text Fingerprint in server address does not match certificate. サーバアドレスの証明証IDが正しくないかもしれません - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3685,7 +3858,8 @@ snd error text For chat profile %@: - servers error + servers error +servers warning For console @@ -3804,6 +3978,10 @@ Error: %2$@ GIFとステッカー No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -4267,7 +4445,15 @@ More improvements are coming soon! Invalid name! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4376,6 +4562,10 @@ More improvements are coming soon! %@ として参加 No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group グループに参加 @@ -4455,6 +4645,14 @@ This is your link for group %@! 脱退 swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat No comment provided by engineer. @@ -4722,6 +4920,10 @@ This is your link for group %@! メッセージの下書き No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded item status text @@ -5005,6 +5207,10 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request 新しい繋がりのリクエスト @@ -5075,6 +5281,14 @@ This is your link for group %@! アプリのパスワードはありません Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5206,6 +5420,10 @@ This is your link for group %@! 世界初のユーザーIDのないプラットフォーム|設計も元からプライベート。 No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! No comment provided by engineer. @@ -5406,6 +5624,10 @@ VPN を有効にする必要があります。 Open changes No comment provided by engineer. + + Open channel + new chat action + Open chat チャットを開く @@ -5440,6 +5662,10 @@ VPN を有効にする必要があります。 Open migration to another device authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5513,6 +5739,14 @@ VPN を有効にする必要があります。 %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING回数 @@ -5704,6 +5938,14 @@ Error: %@ 添付を含めて、下書きを保存する。 No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address プレセットサーバのアドレス @@ -5778,6 +6020,10 @@ Error: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections プロフィールとサーバ接続 @@ -6096,6 +6342,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. 中継サーバーは必要な場合にのみ使用されます。 別の当事者があなたの IP アドレスを監視できます。 @@ -6106,6 +6368,10 @@ swipe action リレー サーバーは IP アドレスを保護しますが、通話時間は監視されます。 No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove 削除 @@ -6142,6 +6408,14 @@ swipe action キーチェーンからパスフレーズを削除しますか? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6373,6 +6647,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6396,6 +6674,14 @@ chat item action グループプロファイルの保存と更新 No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile グループプロフィールの保存 @@ -6803,6 +7089,10 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. キューを作成するにはサーバーの認証が必要です。パスワードを確認してください @@ -6978,6 +7268,10 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link No comment provided by engineer. @@ -7144,8 +7438,8 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7304,6 +7598,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors No comment provided by engineer. @@ -7392,6 +7703,10 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7435,12 +7750,17 @@ report reason Test failed at step %@. テストはステップ %@ で失敗しました。 - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server テストサーバ @@ -7491,6 +7811,10 @@ It can happen because of some bug or when the connection is compromised.The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). No comment provided by engineer. @@ -7662,6 +7986,14 @@ It can happen because of some bug or when the connection is compromised.このグループはもう存在しません。 No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -7855,6 +8187,10 @@ You will be prompted to complete authentication before this feature is enabled.< Unblock member? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages No comment provided by engineer. @@ -8082,6 +8418,10 @@ To connect, please ask your contact to create another connection link and check Use for messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections 新しい接続に使う @@ -8117,6 +8457,10 @@ To connect, please ask your contact to create another connection link and check Use private routing with unknown servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server サーバを使う @@ -8151,6 +8495,10 @@ To connect, please ask your contact to create another connection link and check SimpleX チャット サーバーを使用する。 No comment provided by engineer. + + Verify + relay test step + Verify code with desktop No comment provided by engineer. @@ -8260,6 +8608,14 @@ To connect, please ask your contact to create another connection link and check 音声メッセージ… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... No comment provided by engineer. @@ -8527,6 +8883,10 @@ Repeat join request? 設定からロック画面の通知プレビューを設定できます。 No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. リンク、またはQRコードを共有できます。誰でもグループに参加できます。後で削除しても、グループのメンバーがそのままのこります。 @@ -8569,6 +8929,10 @@ Repeat join request? メッセージを送信できませんでした! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. 確認できませんでした。 もう一度お試しください。 @@ -8673,6 +9037,10 @@ Repeat connection request? ミュートされたプロフィールがアクティブな場合でも、そのプロフィールからの通話や通知は引き続き受信します。 No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. No comment provided by engineer. @@ -8716,6 +9084,10 @@ Repeat connection request? あなたの通話 No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database あなたのチャットデータベース @@ -8794,6 +9166,11 @@ Repeat connection request? Your profile No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. あなたのプロファイル **%@** が共有されます。 @@ -8818,6 +9195,14 @@ Repeat connection request? あなたのランダム・プロフィール No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address あなたのサーバアドレス @@ -8862,6 +9247,10 @@ Repeat connection request? 上で選んでください: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -8879,6 +9268,10 @@ Repeat connection request? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin 管理者 @@ -9013,6 +9406,14 @@ marked deleted chat item preview text アドレスを変更しています… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored 色付き @@ -9153,6 +9554,10 @@ pref value 削除完了 deleted chat item + + deleted channel + rcv group event chat item + deleted contact rcv direct event chat item @@ -9261,6 +9666,10 @@ pref value エラー No comment provided by engineer. + + error: %@ + receive error chat item + expired No comment provided by engineer. @@ -9384,6 +9793,10 @@ pref value 脱退 rcv group event chat item + + link + No comment provided by engineer. + marked deleted 削除済みとマーク @@ -9450,6 +9863,10 @@ pref value 一度も delete after time + + new + No comment provided by engineer. + new message 新しいメッセージ @@ -9563,6 +9980,10 @@ time to disappear 拒否した通話 call status + + relay + member role + removed 除名されました @@ -9573,6 +9994,10 @@ time to disappear %@ を除名されました rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address profile update event chat item @@ -9704,6 +10129,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile グループプロフィールを更新しました @@ -9722,6 +10151,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link 連絡先アドレスリンク経由 @@ -9793,6 +10226,10 @@ last received msg: %2$@ あなたはオブザーバーです No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ snd group event chat item diff --git a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff index e12cb0a483..60d888e309 100644 --- a/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff +++ b/apps/ios/SimpleX Localizations/nl.xcloc/Localized Contents/nl.xliff @@ -185,6 +185,10 @@ %d maanden time interval + + %d relays + channel relay bar + %d sec %d sec @@ -200,11 +204,37 @@ %d overgeslagen bericht(en) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d weken time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld contact(en) geselecteerd @@ -365,6 +399,10 @@ **Link scannen/plakken**: om verbinding te maken via een link die u hebt ontvangen. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Waarschuwing**: voor directe push meldingen is een wachtwoord vereist dat is opgeslagen in de Keychain. @@ -1309,6 +1347,10 @@ swipe action Lid blokkeren? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Geblokkeerd door beheerder @@ -1357,6 +1399,10 @@ swipe action Zowel jij als je contact kunnen spraak berichten verzenden. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgaars, Fins, Thais en Oekraïens - dankzij de gebruikers en [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1542,6 +1588,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Chat @@ -1627,6 +1717,22 @@ set passcode view Gebruikers profiel No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Chat thema @@ -1676,6 +1782,14 @@ set passcode view Controleer berichten indien toegestaan. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Controleer het server adres en probeer het opnieuw. @@ -1821,6 +1935,10 @@ set passcode view ICE servers configureren No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Serveroperators configureren @@ -1884,7 +2002,8 @@ set passcode view Connect Verbind - server test step + relay test step +server test step Connect automatically @@ -2162,7 +2281,7 @@ Dit is uw eigen eenmalige link! Correct name to %@? Juiste naam voor %@? - No comment provided by engineer. + alert message Create @@ -2219,6 +2338,14 @@ Dit is uw eigen eenmalige link! Maak een profiel aan No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Maak een wachtrij @@ -2253,6 +2380,10 @@ Dit is uw eigen eenmalige link! Archief link maken No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Link maken… @@ -2416,6 +2547,10 @@ Dit is uw eigen eenmalige link! Gedecentraliseerd No comment provided by engineer. + + Decode link + relay test step + Decryption error Decodering fout @@ -2462,6 +2597,14 @@ swipe action Verwijderen en contact op de hoogte stellen No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Chat verwijderen @@ -2631,6 +2774,10 @@ alert button Wachtrij verwijderen server test step + + Delete relay + No comment provided by engineer. + Delete report Rapport verwijderen @@ -3005,6 +3152,10 @@ chat item action Bewerk chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Groep profiel bewerken @@ -3039,6 +3190,10 @@ chat item action Schakel TCP keep-alive in No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Automatisch verwijderen van berichten aanzetten? @@ -3183,6 +3338,10 @@ chat item action Voer toegangscode in No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Voer het juiste wachtwoord in. @@ -3208,6 +3367,10 @@ chat item action Voer hier boven het wachtwoord in om weer te geven! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Voer de server handmatig in @@ -3263,6 +3426,10 @@ chat item action Fout bij het toevoegen van leden No comment provided by engineer. + + Error adding relay + alert title + Error adding server Fout bij toevoegen server @@ -3320,6 +3487,10 @@ chat item action Fout bij aanmaken van adres No comment provided by engineer. + + Error creating channel + alert title + Error creating group Fout bij maken van groep @@ -3455,10 +3626,6 @@ chat item action Fout bij het openen van de chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file Fout bij ontvangen van bestand @@ -3503,6 +3670,10 @@ chat item action Fout bij opslaan van ICE servers No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Fout bij het opslaan van chatlijst @@ -3646,7 +3817,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3886,7 +4058,8 @@ snd error text Fingerprint in server address does not match certificate. Mogelijk is de certificaat vingerafdruk in het server adres onjuist - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3930,7 +4103,8 @@ snd error text For chat profile %@: Voor chatprofiel %@: - servers error + servers error +servers warning For console @@ -4071,6 +4245,10 @@ Fout: %2$@ GIF's en stickers No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Ontvang een melding als u vermeld wordt. @@ -4570,7 +4748,15 @@ Binnenkort meer verbeteringen! Invalid name! Ongeldige naam! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4682,6 +4868,10 @@ Binnenkort meer verbeteringen! deelnemen als %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Word lid van groep @@ -4768,6 +4958,14 @@ Dit is jouw link voor groep %@! Verlaten swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Chat verlaten @@ -5057,6 +5255,10 @@ Dit is jouw link voor groep %@! Concept bericht No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Bericht doorgestuurd @@ -5375,6 +5577,10 @@ Dit is jouw link voor groep %@! Nieuwe chatervaring 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Nieuw contactverzoek @@ -5449,6 +5655,14 @@ Dit is jouw link voor groep %@! Geen app wachtwoord Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Geen chats @@ -5598,6 +5812,10 @@ Dit is jouw link voor groep %@! Geen gebruikers-ID's. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Niet compatibel! @@ -5811,6 +6029,10 @@ Vereist het inschakelen van VPN. Wijzigingen openen No comment provided by engineer. + + Open channel + new chat action + Open chat Chat openen @@ -5849,6 +6071,10 @@ Vereist het inschakelen van VPN. Open de migratie naar een ander apparaat authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5935,6 +6161,14 @@ Vereist het inschakelen van VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING count @@ -6144,6 +6378,14 @@ Fout: %@ Bewaar het laatste berichtconcept, met bijlagen. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Vooraf ingesteld server adres @@ -6228,6 +6470,10 @@ Fout: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections Profiel- en serververbindingen @@ -6576,6 +6822,22 @@ swipe action Lid afwijzen? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Relay server wordt alleen gebruikt als dat nodig is. Een andere partij kan uw IP-adres zien. @@ -6586,6 +6848,10 @@ swipe action Relay server beschermt uw IP-adres, maar kan de duur van het gesprek observeren. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Verwijderen @@ -6624,6 +6890,14 @@ swipe action Wachtwoord van de keychain verwijderen? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6882,6 +7156,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Toegangsinstellingen opslaan? @@ -6907,6 +7185,14 @@ chat item action Groep profiel opslaan en bijwerken No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Groep profiel opslaan @@ -7357,6 +7643,10 @@ chat item action Serverprotocol gewijzigd. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Server vereist autorisatie om wachtrijen te maken, controleer wachtwoord @@ -7550,6 +7840,10 @@ chat item action Profiel delen No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Deel deze eenmalige uitnodigingslink @@ -7732,8 +8026,8 @@ chat item action SimpleX-protocollen beoordeeld door Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7909,6 +8203,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Subscription fouten @@ -8005,6 +8316,10 @@ report reason Tik op SimpleX-adres maken in het menu om het later te maken. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -8052,13 +8367,18 @@ report reason Test failed at step %@. Test mislukt bij stap %@. - server test failure + relay test failure +server test failure Test notifications Testmeldingen No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Server test @@ -8110,6 +8430,10 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. De app beschermt uw privacy door in elk gesprek andere operatoren te gebruiken. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). De app vraagt om downloads van onbekende bestandsservers (behalve .onion) te bevestigen. @@ -8299,6 +8623,14 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast. Deze groep bestaat niet meer. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Voor deze link is een nieuwere app-versie vereist. Werk de app bij of vraag je contactpersoon om een compatibele link te sturen. @@ -8516,6 +8848,10 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc Lid deblokkeren? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Niet afgeleverde berichten @@ -8762,6 +9098,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruik voor berichten No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Gebruik voor nieuwe verbindingen @@ -8801,6 +9141,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruik privéroutering met onbekende servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Gebruik server @@ -8841,6 +9185,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Gebruik SimpleX Chat servers. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Code verifiëren met desktop @@ -8960,6 +9308,14 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak Spraakbericht… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Wachten op desktop... @@ -9259,6 +9615,10 @@ Deelnameverzoek herhalen? U kunt een voorbeeld van een melding op het vergrendeld scherm instellen via instellingen. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. U kunt een link of een QR-code delen. Iedereen kan lid worden van de groep. U verliest geen leden van de groep als u deze later verwijdert. @@ -9304,6 +9664,10 @@ Deelnameverzoek herhalen? Je kunt geen berichten versturen! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. U kon niet worden geverifieerd; probeer het opnieuw. @@ -9415,6 +9779,10 @@ Verbindingsverzoek herhalen? U ontvangt nog steeds oproepen en meldingen van gedempte profielen wanneer deze actief zijn. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. U ontvangt geen berichten meer van deze chat. De chatgeschiedenis blijft bewaard. @@ -9459,6 +9827,10 @@ Verbindingsverzoek herhalen? Uw oproepen No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Uw chat database @@ -9541,6 +9913,11 @@ Verbindingsverzoek herhalen? Jouw profiel No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Uw profiel **%@** wordt gedeeld. @@ -9566,6 +9943,14 @@ Verbindingsverzoek herhalen? Je willekeurige profiel No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Uw server adres @@ -9611,6 +9996,10 @@ Verbindingsverzoek herhalen? hier boven, kies dan: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ geaccepteerd %@ @@ -9631,6 +10020,10 @@ Verbindingsverzoek herhalen? heb je geaccepteerd rcv group event chat item + + active + No comment provided by engineer. + admin Beheerder @@ -9777,6 +10170,14 @@ marked deleted chat item preview text adres wijzigen… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored gekleurd @@ -9922,6 +10323,10 @@ pref value verwijderd deleted chat item + + deleted channel + rcv group event chat item + deleted contact verwijderd contact @@ -10032,6 +10437,10 @@ pref value fout No comment provided by engineer. + + error: %@ + receive error chat item + expired verlopen @@ -10160,6 +10569,10 @@ pref value is vertrokken rcv group event chat item + + link + No comment provided by engineer. + marked deleted gemarkeerd als verwijderd @@ -10230,6 +10643,10 @@ pref value nooit delete after time + + new + No comment provided by engineer. + new message nieuw bericht @@ -10352,6 +10769,10 @@ time to disappear geweigerde oproep call status + + relay + member role + removed verwijderd @@ -10362,6 +10783,10 @@ time to disappear verwijderd %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address contactadres verwijderd @@ -10513,6 +10938,10 @@ laatst ontvangen bericht: %2$@ onbeschermd No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile bijgewerkt groep profiel @@ -10533,6 +10962,10 @@ laatst ontvangen bericht: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link via contact adres link @@ -10608,6 +11041,10 @@ laatst ontvangen bericht: %2$@ je bent waarnemer No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ je hebt %@ geblokkeerd diff --git a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff index ee17f807ba..57d22dd63b 100644 --- a/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff +++ b/apps/ios/SimpleX Localizations/pl.xcloc/Localized Contents/pl.xliff @@ -185,6 +185,10 @@ %d miesięcy time interval + + %d relays + channel relay bar + %d sec %d sek @@ -200,11 +204,37 @@ %d pominięte wiadomość(i) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d tygodni time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld wybrany(e) kontakt(y) @@ -365,6 +399,10 @@ **Zeskanuj / Wklej link**: aby połączyć się za pomocą otrzymanego linku. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Uwaga**: Natychmiastowe powiadomienia push wymagają zapisania kodu dostępu w Keychain. @@ -1317,6 +1355,10 @@ swipe action Zablokować członka? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Zablokowany przez admina @@ -1367,6 +1409,10 @@ swipe action Zarówno Ty, jak i Twój kontakt możecie wysyłać wiadomości głosowe. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bułgarski, fiński, tajski i ukraiński – dzięki użytkownikom i [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Czat @@ -1639,6 +1729,22 @@ set passcode view Profil użytkownika No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Motyw czatu @@ -1689,6 +1795,14 @@ set passcode view Sprawdź wiadomości, gdy będzie to dopuszczone. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Sprawdź adres serwera i spróbuj ponownie. @@ -1834,6 +1948,10 @@ set passcode view Skonfiguruj serwery ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Skonfiguruj operatorów serwerów @@ -1897,7 +2015,8 @@ set passcode view Connect Połącz - server test step + relay test step +server test step Connect automatically @@ -2025,6 +2144,7 @@ To jest twój jednorazowy link! Connection failed + Połączenie nie powiodło się No comment provided by engineer. @@ -2177,7 +2297,7 @@ To jest twój jednorazowy link! Correct name to %@? Poprawić imię na %@? - No comment provided by engineer. + alert message Create @@ -2234,6 +2354,14 @@ To jest twój jednorazowy link! Utwórz profil No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Utwórz kolejkę @@ -2269,6 +2397,10 @@ To jest twój jednorazowy link! Tworzenie linku archiwum No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Tworzenie linku… @@ -2432,6 +2564,10 @@ To jest twój jednorazowy link! Zdecentralizowane No comment provided by engineer. + + Decode link + relay test step + Decryption error Błąd odszyfrowania @@ -2478,6 +2614,14 @@ swipe action Usuń i powiadom kontakt No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Usuń czat @@ -2649,6 +2793,10 @@ alert button Usuń kolejkę server test step + + Delete relay + No comment provided by engineer. + Delete report Usuń raport @@ -3025,6 +3173,10 @@ chat item action Edytuj chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Edytuj profil grupy @@ -3060,6 +3212,10 @@ chat item action Włącz utrzymywanie aktywności TCP No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Czy włączyć automatyczne usuwanie wiadomości? @@ -3205,6 +3361,10 @@ chat item action Wprowadź Pin No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Wprowadź poprawne hasło. @@ -3230,6 +3390,10 @@ chat item action Wprowadź hasło powyżej, aby pokazać! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Wprowadź serwer ręcznie @@ -3285,6 +3449,10 @@ chat item action Błąd dodawania członka(ów) No comment provided by engineer. + + Error adding relay + alert title + Error adding server Błąd podczas dodawania serwera @@ -3345,6 +3513,10 @@ chat item action Błąd tworzenia adresu No comment provided by engineer. + + Error creating channel + alert title + Error creating group Błąd tworzenia grupy @@ -3480,11 +3652,6 @@ chat item action Błąd otwierania czatu No comment provided by engineer. - - Error opening group - Błąd otwierania grupy - No comment provided by engineer. - Error receiving file Błąd odbioru pliku @@ -3530,6 +3697,10 @@ chat item action Błąd zapisu serwerów ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Błąd zapisywania listy czatów @@ -3675,7 +3846,8 @@ snd error text Error: %@. Błąd: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3919,7 +4091,8 @@ snd error text Fingerprint in server address does not match certificate. Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3964,7 +4137,8 @@ snd error text For chat profile %@: Dla profilu czatu %@: - servers error + servers error +servers warning For console @@ -4105,6 +4279,10 @@ Błąd: %2$@ GIF-y i naklejki No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Otrzymuj powiadomienia, gdy ktoś wspomni o Tobie. @@ -4347,6 +4525,7 @@ Błąd: %2$@ If you joined or created channels, they will stop working permanently. + Jeśli dołączyłeś do kanałów lub je utworzyłeś, przestaną one działać na stałe. down migration warning @@ -4606,7 +4785,15 @@ Wkrótce pojawią się kolejne ulepszenia! Invalid name! Nieprawidłowa nazwa! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4719,6 +4906,10 @@ Wkrótce pojawią się kolejne ulepszenia! dołącz jako %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Dołącz do grupy @@ -4806,6 +4997,14 @@ To jest twój link do grupy %@! Opuść swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Opuść czat @@ -5101,6 +5300,10 @@ To jest twój link do grupy %@! Wersja robocza wiadomości No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Wiadomość przekazana @@ -5421,6 +5624,10 @@ To jest twój link do grupy %@! Nowe możliwości czatu 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Nowa prośba o kontakt @@ -5496,6 +5703,14 @@ To jest twój link do grupy %@! Brak hasła aplikacji Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Żadnych czatów @@ -5646,6 +5861,10 @@ To jest twój link do grupy %@! Brak identyfikatorów użytkownika. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Nie kompatybilny! @@ -5861,6 +6080,10 @@ Wymaga włączenia VPN. Otwórz zmiany No comment provided by engineer. + + Open channel + new chat action + Open chat Otwórz czat @@ -5901,6 +6124,10 @@ Wymaga włączenia VPN. Otwórz migrację na innym urządzeniu authentication reason + + Open new channel + new chat action + Open new chat Otwórz nowy czat @@ -5993,6 +6220,14 @@ Wymaga włączenia VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Liczba PINGÓW @@ -6202,6 +6437,14 @@ Błąd: %@ Zachowaj ostatnią wersję roboczą wiadomości wraz z załącznikami. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Wstępnie ustawiony adres serwera @@ -6287,6 +6530,10 @@ Błąd: %@ Limit czasu routingu prywatnego alert title + + Proceed + alert action + Profile and server connections Profil i połączenia z serwerem @@ -6636,6 +6883,22 @@ swipe action Odrzucić członka? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Serwer przekaźnikowy jest używany tylko w razie potrzeby. Inna strona może obserwować Twój adres IP. @@ -6646,6 +6909,10 @@ swipe action Serwer przekaźnikowy chroni Twój adres IP, ale może obserwować czas trwania połączenia. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Usuń @@ -6686,6 +6953,14 @@ swipe action Usunąć hasło z pęku kluczy? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Usuwa wiadomości i blokuje członków. @@ -6947,6 +7222,10 @@ chat item action Zapisz (i powiadom członków) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Zapisać ustawienia wstępu? @@ -6972,6 +7251,14 @@ chat item action Zapisz i zaktualizuj profil grupowy No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Zapisz profil grupy @@ -7432,6 +7719,10 @@ chat item action Protokół serwera zmieniony. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Serwer wymaga autoryzacji do tworzenia kolejek, sprawdź hasło. @@ -7628,6 +7919,10 @@ chat item action Udostępnij profil No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Udostępnij ten jednorazowy link @@ -7813,9 +8108,8 @@ chat item action Protokoły SimpleX sprawdzone przez Trail of Bits. No comment provided by engineer. - - SimpleX relay link - łącze przekaźnikowe SimpleX + + SimpleX relay address simplex link type @@ -7991,6 +8285,23 @@ report reason Zasubskrybowano No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Błędy subskrypcji @@ -8091,6 +8402,10 @@ report reason Dotknij Stwórz adres SimpleX w menu aby utworzyć go później. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Dotknij Dołącz do grupy @@ -8139,13 +8454,18 @@ report reason Test failed at step %@. Test nie powiódł się na etapie %@. - server test failure + relay test failure +server test failure Test notifications Powiadomienia testowe No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Przetestuj serwer @@ -8198,6 +8518,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom Aplikacja chroni Twoją prywatność, korzystając z różnych operatorów w każdej rozmowie. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Aplikacja zapyta o potwierdzenie pobierania od nieznanych serwerów plików (poza .onion). @@ -8388,6 +8712,14 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom Ta grupa już nie istnieje. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Ten link wymaga nowszej wersji aplikacji. Zaktualizuj aplikację lub poproś osobę kontaktową o przesłanie kompatybilnego łącza. @@ -8610,6 +8942,10 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.Odblokować członka? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Niedostarczone wiadomości @@ -8862,6 +9198,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Użyj dla wiadomości No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Użyj dla nowych połączeń @@ -8902,6 +9242,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Używaj prywatnego trasowania z nieznanymi serwerami. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Użyj serwera @@ -8942,6 +9286,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Używanie serwerów SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Zweryfikuj kod z komputera @@ -9062,6 +9410,14 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc Wiadomość głosowa… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Oczekiwanie na komputer... @@ -9364,6 +9720,10 @@ Powtórzyć prośbę dołączenia? Podgląd powiadomień na ekranie blokady można ustawić w ustawieniach. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Możesz udostępnić link lub kod QR - każdy będzie mógł dołączyć do grupy. Nie stracisz członków grupy, jeśli później ją usuniesz. @@ -9409,6 +9769,10 @@ Powtórzyć prośbę dołączenia? Nie możesz wysyłać wiadomości! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Nie można zweryfikować użytkownika; proszę spróbować ponownie. @@ -9521,6 +9885,10 @@ Powtórzyć prośbę połączenia? Nadal będziesz otrzymywać połączenia i powiadomienia z wyciszonych profili, gdy są one aktywne. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Przestaniesz otrzymywać wiadomości z tego czatu. Historia czatu zostanie zachowana. @@ -9566,6 +9934,10 @@ Powtórzyć prośbę połączenia? Twoje połączenia No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Twoja baza danych czatu @@ -9651,6 +10023,11 @@ Powtórzyć prośbę połączenia? Twój profil No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Twój profil **%@** zostanie udostępniony. @@ -9676,6 +10053,14 @@ Powtórzyć prośbę połączenia? Twój losowy profil No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Twój adres serwera @@ -9721,6 +10106,10 @@ Powtórzyć prośbę połączenia? powyżej, a następnie wybierz: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ zaakceptowano %@ @@ -9741,6 +10130,10 @@ Powtórzyć prośbę połączenia? przyjął cię rcv group event chat item + + active + No comment provided by engineer. + admin administrator @@ -9887,6 +10280,14 @@ marked deleted chat item preview text zmiana adresu… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored kolorowy @@ -10033,6 +10434,10 @@ pref value usunięty deleted chat item + + deleted channel + rcv group event chat item + deleted contact usunięto kontakt @@ -10143,6 +10548,10 @@ pref value błąd No comment provided by engineer. + + error: %@ + receive error chat item + expired wygasły @@ -10150,6 +10559,7 @@ pref value failed + nieudane No comment provided by engineer. @@ -10272,6 +10682,10 @@ pref value opuścił rcv group event chat item + + link + No comment provided by engineer. + marked deleted zaznaczona jako usunięta @@ -10342,6 +10756,10 @@ pref value nigdy delete after time + + new + No comment provided by engineer. + new message nowa wiadomość @@ -10465,6 +10883,10 @@ time to disappear odrzucone połączenie call status + + relay + member role + removed usunięty @@ -10475,6 +10897,10 @@ time to disappear usunięto %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address usunięto adres kontaktu @@ -10629,6 +11055,10 @@ ostatnia otrzymana wiadomość: %2$@ niezabezpieczony No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile zaktualizowano profil grupy @@ -10649,6 +11079,10 @@ ostatnia otrzymana wiadomość: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link przez link adresu kontaktu @@ -10724,6 +11158,10 @@ ostatnia otrzymana wiadomość: %2$@ jesteś obserwatorem No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ zablokowałeś %@ diff --git a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff index d9a5c48dda..64f2546b30 100644 --- a/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff +++ b/apps/ios/SimpleX Localizations/ru.xcloc/Localized Contents/ru.xliff @@ -185,6 +185,10 @@ %d мес. time interval + + %d relays + channel relay bar + %d sec %d сек @@ -200,11 +204,37 @@ %d пропущенных сообщение(й) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d недель time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected Выбрано контактов: %lld @@ -365,6 +399,10 @@ **Сканировать / Вставить ссылку**: чтобы соединиться через полученную ссылку. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Внимание**: для работы мгновенных уведомлений пароль должен быть сохранен в Keychain. @@ -1315,6 +1353,10 @@ swipe action Заблокировать члена группы? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Заблокирован администратором @@ -1365,6 +1407,10 @@ swipe action Вы и Ваш контакт можете отправлять голосовые сообщения. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Болгарский, финский, тайский и украинский - благодаря пользователям и [Weblate] (https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1552,6 +1598,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Разговор @@ -1637,6 +1727,22 @@ set passcode view Профиль чата No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Тема чата @@ -1687,6 +1793,14 @@ set passcode view Проверять сообщения по возможности. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Проверьте адрес сервера и попробуйте снова. @@ -1832,6 +1946,10 @@ set passcode view Настройка ICE серверов No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Настроить операторов серверов @@ -1895,7 +2013,8 @@ set passcode view Connect Соединиться - server test step + relay test step +server test step Connect automatically @@ -2175,7 +2294,7 @@ This is your own one-time link! Correct name to %@? Исправить имя на %@? - No comment provided by engineer. + alert message Create @@ -2232,6 +2351,14 @@ This is your own one-time link! Создать профиль No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Создание очереди @@ -2267,6 +2394,10 @@ This is your own one-time link! Создание ссылки на архив No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Создаётся ссылка… @@ -2430,6 +2561,10 @@ This is your own one-time link! Децентрализованный No comment provided by engineer. + + Decode link + relay test step + Decryption error Ошибка расшифровки @@ -2476,6 +2611,14 @@ swipe action Удалить и уведомить контакт No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Удалить разговор @@ -2645,6 +2788,10 @@ alert button Удаление очереди server test step + + Delete relay + No comment provided by engineer. + Delete report Удалить сообщение о нарушении @@ -3021,6 +3168,10 @@ chat item action Редактировать chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Редактировать профиль группы @@ -3056,6 +3207,10 @@ chat item action Включить TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Включить автоматическое удаление сообщений? @@ -3201,6 +3356,10 @@ chat item action Введите Код No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Введите правильный пароль. @@ -3226,6 +3385,10 @@ chat item action Введите пароль выше, чтобы раскрыть! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Ввести сервер вручную @@ -3281,6 +3444,10 @@ chat item action Ошибка при добавлении членов группы No comment provided by engineer. + + Error adding relay + alert title + Error adding server Ошибка добавления сервера @@ -3341,6 +3508,10 @@ chat item action Ошибка при создании адреса No comment provided by engineer. + + Error creating channel + alert title + Error creating group Ошибка при создании группы @@ -3476,11 +3647,6 @@ chat item action Ошибка при открытии чата No comment provided by engineer. - - Error opening group - Ошибка при открытии группы - No comment provided by engineer. - Error receiving file Ошибка при получении файла @@ -3526,6 +3692,10 @@ chat item action Ошибка при сохранении ICE серверов No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Ошибка сохранения списка чатов @@ -3671,7 +3841,8 @@ snd error text Error: %@. Ошибка: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3914,7 +4085,8 @@ snd error text Fingerprint in server address does not match certificate. Возможно, хэш сертификата в адресе сервера неверный. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3959,7 +4131,8 @@ snd error text For chat profile %@: Для профиля чата %@: - servers error + servers error +servers warning For console @@ -4100,6 +4273,10 @@ Error: %2$@ ГИФ файлы и стикеры No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Уведомления, когда Вас упомянули. @@ -4599,7 +4776,15 @@ More improvements are coming soon! Invalid name! Неверное имя! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4711,6 +4896,10 @@ More improvements are coming soon! вступить как %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Вступить в группу @@ -4798,6 +4987,14 @@ This is your link for group %@! Выйти swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Покинуть разговор @@ -5091,6 +5288,10 @@ This is your link for group %@! Черновик сообщения No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Сообщение переслано @@ -5411,6 +5612,10 @@ This is your link for group %@! Новый интерфейс 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Новый запрос на соединение @@ -5486,6 +5691,14 @@ This is your link for group %@! Нет кода доступа Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Нет чатов @@ -5636,6 +5849,10 @@ This is your link for group %@! Без идентификаторов пользователей. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Несовместимая версия! @@ -5851,6 +6068,10 @@ Requires compatible VPN. Открыть изменения No comment provided by engineer. + + Open channel + new chat action + Open chat Открыть чат @@ -5891,6 +6112,10 @@ Requires compatible VPN. Открытие миграции на другое устройство authentication reason + + Open new channel + new chat action + Open new chat Открыть новый чат @@ -5983,6 +6208,14 @@ Requires compatible VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Количество PING @@ -6192,6 +6425,14 @@ Error: %@ Сохранить последний черновик, вместе с вложениями. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Адрес сервера по умолчанию @@ -6277,6 +6518,10 @@ Error: %@ Таймаут конфиденциальной доставки alert title + + Proceed + alert action + Profile and server connections Профиль и соединения на сервере @@ -6626,6 +6871,22 @@ swipe action Отклонить участника? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Relay сервер используется только при необходимости. Другая сторона может видеть Ваш IP адрес. @@ -6636,6 +6897,10 @@ swipe action Relay сервер защищает Ваш IP адрес, но может отслеживать продолжительность звонка. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Удалить @@ -6675,6 +6940,14 @@ swipe action Удалить пароль из Keychain? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Может удалять сообщения и блокировать членов. @@ -6936,6 +7209,10 @@ chat item action Сохранить (и уведомить членов) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Сохранить настройки вступления? @@ -6961,6 +7238,14 @@ chat item action Сохранить сообщение и обновить группу No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Сохранить профиль группы @@ -7416,6 +7701,10 @@ chat item action Протокол сервера изменен. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Сервер требует авторизации для создания очередей, проверьте пароль. @@ -7612,6 +7901,10 @@ chat item action Поделиться профилем No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Поделиться одноразовой ссылкой-приглашением @@ -7797,9 +8090,8 @@ chat item action Аудит SimpleX протоколов от Trail of Bits. No comment provided by engineer. - - SimpleX relay link - Ссылка SimpleX relay + + SimpleX relay address simplex link type @@ -7975,6 +8267,23 @@ report reason Подписано No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Ошибки подписки @@ -8075,6 +8384,10 @@ report reason Нажмите Создать адрес SimpleX в меню, чтобы создать его позже. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Нажмите Вступить в группу @@ -8123,13 +8436,18 @@ report reason Test failed at step %@. Ошибка теста на шаге %@. - server test failure + relay test failure +server test failure Test notifications Протестировать уведомления No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Тестировать сервер @@ -8182,6 +8500,10 @@ It can happen because of some bug or when the connection is compromised.Приложение улучшает конфиденциальность используя разных операторов в каждом разговоре. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Приложение будет запрашивать подтверждение загрузки с неизвестных серверов (за исключением .onion адресов). @@ -8372,6 +8694,14 @@ It can happen because of some bug or when the connection is compromised.Эта группа больше не существует. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Эта ссылка требует новую версию. Обновите приложение или попросите Ваш контакт прислать совместимую ссылку. @@ -8594,6 +8924,10 @@ You will be prompted to complete authentication before this feature is enabled.< Разблокировать члена группы? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Недоставленные сообщения @@ -8846,6 +9180,10 @@ To connect, please ask your contact to create another connection link and check Использовать для сообщений No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Использовать для новых соединений @@ -8886,6 +9224,10 @@ To connect, please ask your contact to create another connection link and check Использовать конфиденциальную доставку с неизвестными серверами. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Использовать сервер @@ -8926,6 +9268,10 @@ To connect, please ask your contact to create another connection link and check Используются серверы, предоставленные SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Сверьте код с компьютером @@ -9045,6 +9391,14 @@ To connect, please ask your contact to create another connection link and check Голосовое сообщение… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Ожидается подключение компьютера... @@ -9347,6 +9701,10 @@ Repeat join request? Вы можете установить просмотр уведомлений на экране блокировки в настройках. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Вы можете поделиться ссылкой или QR кодом - через них можно присоединиться к группе. Вы сможете удалить ссылку, сохранив членов группы, которые через нее соединились. @@ -9392,6 +9750,10 @@ Repeat join request? Вы не можете отправлять сообщения! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Верификация не удалась; пожалуйста, попробуйте ещё раз. @@ -9504,6 +9866,10 @@ Repeat connection request? Вы все равно получите звонки и уведомления в профилях без звука, когда они активные. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Вы прекратите получать сообщения в этом разговоре. История будет сохранена. @@ -9549,6 +9915,10 @@ Repeat connection request? Ваши звонки No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database База данных @@ -9634,6 +10004,11 @@ Repeat connection request? Ваш профиль No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Будет отправлен Ваш профиль **%@**. @@ -9659,6 +10034,14 @@ Repeat connection request? Случайный профиль No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Адрес Вашего сервера @@ -9704,6 +10087,10 @@ Repeat connection request? наверху, затем выберите: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ принят %@ @@ -9724,6 +10111,10 @@ Repeat connection request? Вы приняты rcv group event chat item + + active + No comment provided by engineer. + admin админ @@ -9870,6 +10261,14 @@ marked deleted chat item preview text смена адреса… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored цвет @@ -10016,6 +10415,10 @@ pref value удалено deleted chat item + + deleted channel + rcv group event chat item + deleted contact удалил(а) контакт @@ -10126,6 +10529,10 @@ pref value ошибка No comment provided by engineer. + + error: %@ + receive error chat item + expired истекло @@ -10255,6 +10662,10 @@ pref value покинул(а) группу rcv group event chat item + + link + No comment provided by engineer. + marked deleted помечено к удалению @@ -10325,6 +10736,10 @@ pref value никогда delete after time + + new + No comment provided by engineer. + new message новое сообщение @@ -10448,6 +10863,10 @@ time to disappear отклонённый звонок call status + + relay + member role + removed удален(а) @@ -10458,6 +10877,10 @@ time to disappear удалил(а) %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address удалён адрес контакта @@ -10612,6 +11035,10 @@ last received msg: %2$@ незащищённый No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile обновил(а) профиль группы @@ -10632,6 +11059,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link через ссылку-контакт @@ -10707,6 +11138,10 @@ last received msg: %2$@ только чтение сообщений No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ Вы заблокировали %@ diff --git a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff index 13d3240daf..6ffea9646d 100644 --- a/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff +++ b/apps/ios/SimpleX Localizations/th.xcloc/Localized Contents/th.xliff @@ -167,6 +167,10 @@ %d เดือน time interval + + %d relays + channel relay bar + %d sec %d วินาที @@ -181,11 +185,37 @@ %d ข้อความที่ถูกข้าม integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d สัปดาห์ time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -196,6 +226,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected % ผู้ติดต่อ LLD ที่เลือกไว้ @@ -334,6 +368,10 @@ **Scan / Paste link**: to connect via a link you received. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **คำเตือน**: การแจ้งเตือนแบบพุชทันทีจำเป็นต้องบันทึกรหัสผ่านไว้ใน Keychain @@ -1187,6 +1225,10 @@ swipe action Block member? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin No comment provided by engineer. @@ -1232,6 +1274,10 @@ swipe action ทั้งคุณและผู้ติดต่อของคุณสามารถส่งข้อความเสียงได้ No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! No comment provided by engineer. @@ -1399,6 +1445,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat No comment provided by engineer. @@ -1475,6 +1565,22 @@ set passcode view โปรไฟล์ผู้ใช้ No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme No comment provided by engineer. @@ -1516,6 +1622,14 @@ set passcode view Check messages when allowed. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. ตรวจสอบที่อยู่เซิร์ฟเวอร์แล้วลองอีกครั้ง @@ -1643,6 +1757,10 @@ set passcode view กำหนดค่าเซิร์ฟเวอร์ ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators No comment provided by engineer. @@ -1699,7 +1817,8 @@ set passcode view Connect เชื่อมต่อ - server test step + relay test step +server test step Connect automatically @@ -1941,7 +2060,7 @@ This is your own one-time link! Correct name to %@? - No comment provided by engineer. + alert message Create @@ -1992,6 +2111,14 @@ This is your own one-time link! Create profile No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue สร้างคิว @@ -2022,6 +2149,10 @@ This is your own one-time link! Creating archive link No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… No comment provided by engineer. @@ -2178,6 +2309,10 @@ This is your own one-time link! กระจายอำนาจแล้ว No comment provided by engineer. + + Decode link + relay test step + Decryption error ข้อผิดพลาดในการ decrypt @@ -2221,6 +2356,14 @@ swipe action Delete and notify contact No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat No comment provided by engineer. @@ -2382,6 +2525,10 @@ alert button ลบคิว server test step + + Delete relay + No comment provided by engineer. + Delete report No comment provided by engineer. @@ -2717,6 +2864,10 @@ chat item action แก้ไข chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile แก้ไขโปรไฟล์กลุ่ม @@ -2750,6 +2901,10 @@ chat item action เปิดใช้งาน TCP Keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? เปิดใช้งานการลบข้อความอัตโนมัติ? @@ -2884,6 +3039,10 @@ chat item action ใส่รหัสผ่าน No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. ใส่รหัสผ่านที่ถูกต้อง @@ -2907,6 +3066,10 @@ chat item action ใส่รหัสผ่านด้านบนเพื่อแสดง! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually ใส่เซิร์ฟเวอร์ด้วยตนเอง @@ -2958,6 +3121,10 @@ chat item action เกิดข้อผิดพลาดในการเพิ่มสมาชิก No comment provided by engineer. + + Error adding relay + alert title + Error adding server alert title @@ -3010,6 +3177,10 @@ chat item action เกิดข้อผิดพลาดในการสร้างที่อยู่ No comment provided by engineer. + + Error creating channel + alert title + Error creating group เกิดข้อผิดพลาดในการสร้างกลุ่ม @@ -3134,10 +3305,6 @@ chat item action Error opening chat No comment provided by engineer. - - Error opening group - No comment provided by engineer. - Error receiving file เกิดข้อผิดพลาดในการรับไฟล์ @@ -3177,6 +3344,10 @@ chat item action เกิดข้อผิดพลาดในการบันทึกเซิร์ฟเวอร์ ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list alert title @@ -3310,7 +3481,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3527,7 +3699,8 @@ snd error text Fingerprint in server address does not match certificate. อาจเป็นไปได้ว่าลายนิ้วมือของ certificate ในที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3569,7 +3742,8 @@ snd error text For chat profile %@: - servers error + servers error +servers warning For console @@ -3688,6 +3862,10 @@ Error: %2$@ GIFs และสติกเกอร์ No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. No comment provided by engineer. @@ -4150,7 +4328,15 @@ More improvements are coming soon! Invalid name! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4258,6 +4444,10 @@ More improvements are coming soon! เข้าร่วมเป็น %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group เข้าร่วมกลุ่ม @@ -4337,6 +4527,14 @@ This is your link for group %@! ออกจาก swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat No comment provided by engineer. @@ -4605,6 +4803,10 @@ This is your link for group %@! ร่างข้อความ No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded item status text @@ -4884,6 +5086,10 @@ This is your link for group %@! New chat experience 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request คำขอติดต่อใหม่ @@ -4953,6 +5159,14 @@ This is your link for group %@! ไม่มีรหัสผ่านสำหรับแอป Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats No comment provided by engineer. @@ -5083,6 +5297,10 @@ This is your link for group %@! แพลตฟอร์มแรกที่ไม่มีตัวระบุผู้ใช้ - ถูกออกแบบให้เป็นส่วนตัว No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! No comment provided by engineer. @@ -5280,6 +5498,10 @@ Requires compatible VPN. Open changes No comment provided by engineer. + + Open channel + new chat action + Open chat เปิดแชท @@ -5314,6 +5536,10 @@ Requires compatible VPN. Open migration to another device authentication reason + + Open new channel + new chat action + Open new chat new chat action @@ -5387,6 +5613,14 @@ Requires compatible VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count จํานวน PING @@ -5578,6 +5812,14 @@ Error: %@ เก็บข้อความที่ร่างไว้ล่าสุดพร้อมไฟล์แนบ No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address ที่อยู่เซิร์ฟเวอร์ที่ตั้งไว้ล่วงหน้า @@ -5651,6 +5893,10 @@ Error: %@ Private routing timeout alert title + + Proceed + alert action + Profile and server connections การเชื่อมต่อโปรไฟล์และเซิร์ฟเวอร์ @@ -5968,6 +6214,22 @@ swipe action Reject member? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. ใช้เซิร์ฟเวอร์รีเลย์ในกรณีที่จำเป็นเท่านั้น บุคคลอื่นสามารถสังเกตที่อยู่ IP ของคุณได้ @@ -5978,6 +6240,10 @@ swipe action เซิร์ฟเวอร์รีเลย์ปกป้องที่อยู่ IP ของคุณ แต่สามารถสังเกตระยะเวลาของการโทรได้ No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove ลบ @@ -6014,6 +6280,14 @@ swipe action ลบรหัสผ่านออกจาก keychain หรือไม่? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. No comment provided by engineer. @@ -6245,6 +6519,10 @@ chat item action Save (and notify members) alert button + + Save (and notify subscribers) + alert button + Save admission settings? alert title @@ -6268,6 +6546,14 @@ chat item action บันทึกและอัปเดตโปรไฟล์กลุ่ม No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile บันทึกโปรไฟล์กลุ่ม @@ -6680,6 +6966,10 @@ chat item action Server protocol changed. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. เซิร์ฟเวอร์ต้องการการอนุญาตในการสร้างคิว โปรดตรวจสอบรหัสผ่าน @@ -6855,6 +7145,10 @@ chat item action Share profile No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link No comment provided by engineer. @@ -7020,8 +7314,8 @@ chat item action SimpleX protocols reviewed by Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7178,6 +7472,23 @@ report reason Subscribed No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors No comment provided by engineer. @@ -7266,6 +7577,10 @@ report reason Tap Create SimpleX address in the menu to create it later. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group No comment provided by engineer. @@ -7309,12 +7624,17 @@ report reason Test failed at step %@. การทดสอบล้มเหลวในขั้นตอน %@ - server test failure + relay test failure +server test failure Test notifications No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server เซิร์ฟเวอร์ทดสอบ @@ -7366,6 +7686,10 @@ It can happen because of some bug or when the connection is compromised.The app protects your privacy by using different operators in each conversation. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). No comment provided by engineer. @@ -7536,6 +7860,14 @@ It can happen because of some bug or when the connection is compromised.ไม่มีกลุ่มนี้แล้ว No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. No comment provided by engineer. @@ -7729,6 +8061,10 @@ You will be prompted to complete authentication before this feature is enabled.< Unblock member? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages No comment provided by engineer. @@ -7955,6 +8291,10 @@ To connect, please ask your contact to create another connection link and check Use for messages No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections ใช้สำหรับการเชื่อมต่อใหม่ @@ -7989,6 +8329,10 @@ To connect, please ask your contact to create another connection link and check Use private routing with unknown servers. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server ใช้เซิร์ฟเวอร์ @@ -8023,6 +8367,10 @@ To connect, please ask your contact to create another connection link and check กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่ No comment provided by engineer. + + Verify + relay test step + Verify code with desktop No comment provided by engineer. @@ -8132,6 +8480,14 @@ To connect, please ask your contact to create another connection link and check ข้อความเสียง… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... No comment provided by engineer. @@ -8398,6 +8754,10 @@ Repeat join request? คุณสามารถตั้งค่าแสดงตัวอย่างการแจ้งเตือนบนหน้าจอล็อคผ่านการตั้งค่า No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. คุณสามารถแชร์ลิงก์หรือคิวอาร์โค้ดได้ ทุกคนจะสามารถเข้าร่วมกลุ่มได้ คุณจะไม่สูญเสียสมาชิกของกลุ่มหากคุณลบในภายหลัง @@ -8440,6 +8800,10 @@ Repeat join request? คุณไม่สามารถส่งข้อความได้! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. เราไม่สามารถตรวจสอบคุณได้ กรุณาลองอีกครั้ง. @@ -8543,6 +8907,10 @@ Repeat connection request? คุณจะยังได้รับสายเรียกเข้าและการแจ้งเตือนจากโปรไฟล์ที่ปิดเสียงเมื่อโปรไฟล์ของเขามีการใช้งาน No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. No comment provided by engineer. @@ -8586,6 +8954,10 @@ Repeat connection request? การโทรของคุณ No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database ฐานข้อมูลการแชทของคุณ @@ -8664,6 +9036,11 @@ Repeat connection request? Your profile No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. No comment provided by engineer. @@ -8687,6 +9064,14 @@ Repeat connection request? โปรไฟล์แบบสุ่มของคุณ No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address ที่อยู่เซิร์ฟเวอร์ของคุณ @@ -8731,6 +9116,10 @@ Repeat connection request? ด้านบน จากนั้นเลือก: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -8748,6 +9137,10 @@ Repeat connection request? accepted you rcv group event chat item + + active + No comment provided by engineer. + admin ผู้ดูแลระบบ @@ -8882,6 +9275,14 @@ marked deleted chat item preview text กำลังเปลี่ยนที่อยู่… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored มีสี @@ -9022,6 +9423,10 @@ pref value ลบแล้ว deleted chat item + + deleted channel + rcv group event chat item + deleted contact rcv direct event chat item @@ -9129,6 +9534,10 @@ pref value ผิดพลาด No comment provided by engineer. + + error: %@ + receive error chat item + expired No comment provided by engineer. @@ -9252,6 +9661,10 @@ pref value ออกแล้ว rcv group event chat item + + link + No comment provided by engineer. + marked deleted ทำเครื่องหมายว่าลบแล้ว @@ -9318,6 +9731,10 @@ pref value ไม่เคย delete after time + + new + No comment provided by engineer. + new message ข้อความใหม่ @@ -9431,6 +9848,10 @@ time to disappear สายถูกปฏิเสธ call status + + relay + member role + removed ถูกลบแล้ว @@ -9441,6 +9862,10 @@ time to disappear ถูกลบแล้ว %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address profile update event chat item @@ -9572,6 +9997,10 @@ last received msg: %2$@ unprotected No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile อัปเดตโปรไฟล์กลุ่มแล้ว @@ -9590,6 +10019,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link ผ่านลิงค์ที่อยู่ติดต่อ @@ -9661,6 +10094,10 @@ last received msg: %2$@ คุณเป็นผู้สังเกตการณ์ No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ snd group event chat item diff --git a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff index c97da9e0b5..f8890ca077 100644 --- a/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff +++ b/apps/ios/SimpleX Localizations/tr.xcloc/Localized Contents/tr.xliff @@ -185,6 +185,10 @@ %d ay time interval + + %d relays + channel relay bar + %d sec %d saniye @@ -200,11 +204,37 @@ %d okunmamış mesaj(lar) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d hafta time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld kişi seçildi @@ -365,6 +399,10 @@ edindiğiniz bağlantı aracılığıyla bağlanmak için **Linki tarayın/yapıştırın**. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Dikkat**: Anında iletilen bildirimlere Anahtar Zinciri'nde kaydedilmiş parola gereklidir. @@ -1315,6 +1353,10 @@ swipe action Üyeyi engelle? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Yönetici tarafından engellendi @@ -1365,6 +1407,10 @@ swipe action Sen ve konuştuğun kişi sesli mesaj gönderebilir. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Bulgarca, Fince, Tayca ve Ukraynaca - kullanıcılara ve [Weblate] e teşekkürler! (https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1552,6 +1598,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Sohbet @@ -1637,6 +1727,22 @@ set passcode view Kullanıcı profili No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Sohbet teması @@ -1687,6 +1793,14 @@ set passcode view İzin verildiğinde mesajları kontrol et. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Sunucu adresini kontrol edip tekrar deneyin. @@ -1832,6 +1946,10 @@ set passcode view ICE sunucularını ayarla No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Sunucu operatörlerini yapılandır @@ -1895,7 +2013,8 @@ set passcode view Connect Bağlan - server test step + relay test step +server test step Connect automatically @@ -2175,7 +2294,7 @@ Bu senin kendi tek kullanımlık bağlantın! Correct name to %@? İsim %@ olarak düzeltilsin mi? - No comment provided by engineer. + alert message Create @@ -2232,6 +2351,14 @@ Bu senin kendi tek kullanımlık bağlantın! Profil oluştur No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Sıra oluştur @@ -2267,6 +2394,10 @@ Bu senin kendi tek kullanımlık bağlantın! Arşiv bağlantısı oluşturuluyor No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Link oluşturuluyor… @@ -2430,6 +2561,10 @@ Bu senin kendi tek kullanımlık bağlantın! Merkezi Olmayan No comment provided by engineer. + + Decode link + relay test step + Decryption error Şifre çözme hatası @@ -2476,6 +2611,14 @@ swipe action Sil ve kişiye bildir No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Sohbeti sil @@ -2645,6 +2788,10 @@ alert button Sırayı sil server test step + + Delete relay + No comment provided by engineer. + Delete report Raporu sil @@ -3021,6 +3168,10 @@ chat item action Düzenle chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Grup profilini düzenle @@ -3056,6 +3207,10 @@ chat item action TCP canlı tutmayı etkinleştir No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Otomatik mesaj silme etkinleştirilsin mi? @@ -3201,6 +3356,10 @@ chat item action Şifre gir No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Doğru şifreyi gir. @@ -3226,6 +3385,10 @@ chat item action Göstermek için yukarıdaki şifreyi gir! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Sunucuya manuel olarak gir @@ -3281,6 +3444,10 @@ chat item action Üye(ler) eklenirken hata oluştu No comment provided by engineer. + + Error adding relay + alert title + Error adding server Sunucu eklenirken hata oluştu @@ -3340,6 +3507,10 @@ chat item action Adres oluşturulurken hata oluştu No comment provided by engineer. + + Error creating channel + alert title + Error creating group Grup oluşturulurken hata oluştu @@ -3475,11 +3646,6 @@ chat item action Kişiyi hazırlama hatası No comment provided by engineer. - - Error opening group - Grubu hazırlama hatası - No comment provided by engineer. - Error receiving file Dosya alınırken sorun oluştu @@ -3525,6 +3691,10 @@ chat item action ICE sunucularını kaydedirken sorun oluştu No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Sohbet listesini kaydetme hatası @@ -3669,7 +3839,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3910,7 +4081,8 @@ snd error text Fingerprint in server address does not match certificate. Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3954,7 +4126,8 @@ snd error text For chat profile %@: Sohbet profili için %@: - servers error + servers error +servers warning For console @@ -4095,6 +4268,10 @@ Hata: %2$@ GİFler ve çıkartmalar No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Bahsedildiğinde bildirim alın. @@ -4595,7 +4772,15 @@ Daha fazla iyileştirme yakında geliyor! Invalid name! Geçersiz isim! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4707,6 +4892,10 @@ Daha fazla iyileştirme yakında geliyor! %@ olarak katıl No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Gruba katıl @@ -4794,6 +4983,14 @@ Bu senin grup için bağlantın %@! Ayrıl swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Sohbetten ayrıl @@ -5087,6 +5284,10 @@ Bu senin grup için bağlantın %@! Mesaj taslağı No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Mesaj iletildi @@ -5407,6 +5608,10 @@ Bu senin grup için bağlantın %@! Yeni bir sohbet deneyimi 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Yeni bağlantı isteği @@ -5482,6 +5687,14 @@ Bu senin grup için bağlantın %@! Uygulama şifresi yok Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Hiç sohbet yok @@ -5632,6 +5845,10 @@ Bu senin grup için bağlantın %@! Herhangi bir kullanıcı tanımlayıcısı yok. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Uyumlu değil! @@ -5847,6 +6064,10 @@ VPN'nin etkinleştirilmesi gerekir. Açık değişiklikler No comment provided by engineer. + + Open channel + new chat action + Open chat Sohbeti aç @@ -5887,6 +6108,10 @@ VPN'nin etkinleştirilmesi gerekir. Başka bir cihaza açık geçiş authentication reason + + Open new channel + new chat action + Open new chat Yeni sohbet aç @@ -5979,6 +6204,14 @@ VPN'nin etkinleştirilmesi gerekir. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING sayısı @@ -6188,6 +6421,14 @@ Hata: %@ Son mesaj taslağını ekleriyle birlikte koru. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Ön ayarlı sunucu adresi @@ -6273,6 +6514,10 @@ Hata: %@ Özel yönlendirme zaman aşımı alert title + + Proceed + alert action + Profile and server connections Profil ve sunucu bağlantıları @@ -6622,6 +6867,22 @@ swipe action Üyeyi reddet? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Yönlendirici sunucusu yalnızca gerekli olduğunda kullanılır. Başka bir taraf IP adresinizi gözlemleyebilir. @@ -6632,6 +6893,10 @@ swipe action Yönlendirici sunucu IP adresinizi korur, ancak aramanın süresini gözlemleyebilir. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Sil @@ -6671,6 +6936,14 @@ swipe action Anahtar Zinciri'ndeki parola silinsin mi? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Mesajları kaldırır ve üyeleri engeller. @@ -6932,6 +7205,10 @@ chat item action Kaydet (ve üyelere bildir) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Kabul ayarlarını kaydet? @@ -6957,6 +7234,14 @@ chat item action Kaydet ve grup profilini güncelle No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Grup profilini kaydet @@ -7412,6 +7697,10 @@ chat item action Sunucu protokolü değişti. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Sunucunun sıra oluşturması için yetki gereklidir, şifreyi kontrol edin @@ -7608,6 +7897,10 @@ chat item action Profil paylaş No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Bu tek kullanımlık bağlantı davetini paylaş @@ -7793,9 +8086,8 @@ chat item action SimpleX protokolleri Trail of Bits tarafından incelenmiştir. No comment provided by engineer. - - SimpleX relay link - SimpleX aktarıcı bağlantısı + + SimpleX relay address simplex link type @@ -7971,6 +8263,23 @@ report reason Abone olundu No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Abone olurken hata @@ -8071,6 +8380,10 @@ report reason Daha sonra oluşturmak için menüden BasitX adresi oluştur'a dokunun. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Gruba katıl'a dokunun @@ -8119,13 +8432,18 @@ report reason Test failed at step %@. Test %@ adımında başarısız oldu. - server test failure + relay test failure +server test failure Test notifications Bildirimleri test et No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Sunucuyu test et @@ -8178,6 +8496,10 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. Uygulama, her sohbette farklı operatörler kullanarak gizliliğinizi korur. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Uygulama bilinmeyen dosya sunucularından indirmeleri onaylamanızı isteyecektir (.onion hariç). @@ -8368,6 +8690,14 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir. Bu grup artık mevcut değildir. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Bu bağlantı daha yeni bir uygulama sürümü gerektiriyor. Lütfen uygulamayı güncelleyin veya kişinizden uyumlu bir bağlantı göndermesini isteyin. @@ -8589,6 +8919,10 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec Üyenin engeli kaldırılsın mı? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Teslim edilmemiş mesajlar @@ -8841,6 +9175,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Mesajlar için kullan No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Yeni bağlantılar için kullan @@ -8881,6 +9219,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Bilinmeyen sunucularla gizli yönlendirme kullan. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Sunucu kullan @@ -8921,6 +9263,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste SimpleX Chat sunucuları kullanılıyor. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Bilgisayarla kodu doğrula @@ -9040,6 +9386,14 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste Sesli mesaj… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Bilgisayar için bekleniyor... @@ -9340,6 +9694,10 @@ Katılma isteği tekrarlansın mı? Kilit ekranı bildirim önizlemesini ayarlar üzerinden ayarlayabilirsiniz. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Bir bağlantı veya QR kodu paylaşabilirsiniz - bu durumda herkes gruba katılabilir. Daha sonra silseniz bile grubun üyelerini kaybetmezsiniz. @@ -9385,6 +9743,10 @@ Katılma isteği tekrarlansın mı? Mesajlar gönderemezsiniz! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Doğrulanamadınız; lütfen tekrar deneyin. @@ -9497,6 +9859,10 @@ Bağlantı isteği tekrarlansın mı? Aktif olduklarında sessize alınmış profillerden arama ve bildirim almaya devam edersiniz. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Bu sohbetten mesaj almaya son vereceksiniz. Sohbet geçmişi korunacaktır. @@ -9542,6 +9908,10 @@ Bağlantı isteği tekrarlansın mı? Aramaların No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Sohbet veritabanınız @@ -9627,6 +9997,11 @@ Bağlantı isteği tekrarlansın mı? Profiliniz No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Profiliniz **%@** paylaşılacaktır. @@ -9652,6 +10027,14 @@ Bağlantı isteği tekrarlansın mı? Rasgele profiliniz No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Sunucu adresiniz @@ -9697,6 +10080,10 @@ Bağlantı isteği tekrarlansın mı? yukarı çıkın, ardından seçin: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ kabul edildi %@ @@ -9717,6 +10104,10 @@ Bağlantı isteği tekrarlansın mı? seni kabul etti rcv group event chat item + + active + No comment provided by engineer. + admin yönetici @@ -9863,6 +10254,14 @@ marked deleted chat item preview text adres değiştiriliyor… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored renklendirilmiş @@ -10009,6 +10408,10 @@ pref value silindi deleted chat item + + deleted channel + rcv group event chat item + deleted contact silinmiş kişi @@ -10119,6 +10522,10 @@ pref value hata No comment provided by engineer. + + error: %@ + receive error chat item + expired süresi dolmuş @@ -10248,6 +10655,10 @@ pref value ayrıldı rcv group event chat item + + link + No comment provided by engineer. + marked deleted silinmiş olarak işaretlenmiş @@ -10318,6 +10729,10 @@ pref value asla delete after time + + new + No comment provided by engineer. + new message yeni mesaj @@ -10440,6 +10855,10 @@ time to disappear geri çevrilmiş çağrı call status + + relay + member role + removed kaldırıldı @@ -10450,6 +10869,10 @@ time to disappear %@ kaldırıldı rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address kişi adresi silindi @@ -10604,6 +11027,10 @@ son alınan msj: %2$@ korumasız No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile grup profili güncellendi @@ -10624,6 +11051,10 @@ son alınan msj: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link bağlantı adres uzantısı ile @@ -10699,6 +11130,10 @@ son alınan msj: %2$@ gözlemcisiniz No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ engelledin %@ diff --git a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff index 9cc95a6085..839b4e2652 100644 --- a/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff +++ b/apps/ios/SimpleX Localizations/uk.xcloc/Localized Contents/uk.xliff @@ -185,6 +185,10 @@ %d місяців time interval + + %d relays + channel relay bar + %d sec %d сек @@ -200,11 +204,37 @@ %d пропущено повідомлення(ь) integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d тижнів time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld контакт(и) вибрані @@ -365,6 +399,10 @@ **Відсканувати / Вставити посилання**: підключитися за отриманим посиланням. No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **Попередження**: Для отримання миттєвих пуш-сповіщень потрібна парольна фраза, збережена у брелоку. @@ -1313,6 +1351,10 @@ swipe action Заблокувати користувача? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin Заблокований адміністратором @@ -1361,6 +1403,10 @@ swipe action Надсилати голосові повідомлення можете як ви, так і ваш контакт. No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! Болгарською, фінською, тайською та українською мовами - завдяки користувачам та [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1548,6 +1594,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat Чат @@ -1633,6 +1723,22 @@ set passcode view Профіль користувача No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme Тема чату @@ -1683,6 +1789,14 @@ set passcode view Перевірте повідомлення, коли це дозволено. No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. Перевірте адресу сервера та спробуйте ще раз. @@ -1828,6 +1942,10 @@ set passcode view Налаштування серверів ICE No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators Налаштувати операторів сервера @@ -1891,7 +2009,8 @@ set passcode view Connect Підключіться - server test step + relay test step +server test step Connect automatically @@ -2170,7 +2289,7 @@ This is your own one-time link! Correct name to %@? Виправити ім'я на %@? - No comment provided by engineer. + alert message Create @@ -2227,6 +2346,14 @@ This is your own one-time link! Створити профіль No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue Створити чергу @@ -2262,6 +2389,10 @@ This is your own one-time link! Створення архівного посилання No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… Створення посилання… @@ -2425,6 +2556,10 @@ This is your own one-time link! Децентралізований No comment provided by engineer. + + Decode link + relay test step + Decryption error Помилка розшифровки @@ -2471,6 +2606,14 @@ swipe action Видалити та повідомити контакт No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat Видалити чат @@ -2640,6 +2783,10 @@ alert button Видалити чергу server test step + + Delete relay + No comment provided by engineer. + Delete report Видалити скаргу @@ -3015,6 +3162,10 @@ chat item action Редагувати chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile Редагування профілю групи @@ -3050,6 +3201,10 @@ chat item action Увімкнути TCP keep-alive No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? Увімкнути автоматичне видалення повідомлень? @@ -3195,6 +3350,10 @@ chat item action Введіть пароль No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. Введіть правильну парольну фразу. @@ -3220,6 +3379,10 @@ chat item action Введіть пароль вище, щоб показати! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually Увійдіть на сервер вручну @@ -3275,6 +3438,10 @@ chat item action Помилка додавання користувача(ів) No comment provided by engineer. + + Error adding relay + alert title + Error adding server Помилка додавання сервера @@ -3334,6 +3501,10 @@ chat item action Помилка створення адреси No comment provided by engineer. + + Error creating channel + alert title + Error creating group Помилка створення групи @@ -3469,11 +3640,6 @@ chat item action Помилка відкриття чату No comment provided by engineer. - - Error opening group - Помилка відкриття групи - No comment provided by engineer. - Error receiving file Помилка отримання файлу @@ -3519,6 +3685,10 @@ chat item action Помилка збереження серверів ICE No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list Помилка під час збереження списку чатів @@ -3662,7 +3832,8 @@ snd error text Error: %@. - server test error + relay test error +server test error Error: URL is invalid @@ -3902,7 +4073,8 @@ snd error text Fingerprint in server address does not match certificate. Відбиток в адресі сервера не співпадає з сертифікатом. - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3946,7 +4118,8 @@ snd error text For chat profile %@: Для профілю чату %@: - servers error + servers error +servers warning For console @@ -4087,6 +4260,10 @@ Error: %2$@ GIF-файли та наклейки No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. Отримуйте сповіщення, коли вас згадують. @@ -4587,7 +4764,15 @@ More improvements are coming soon! Invalid name! Неправильне ім'я! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4699,6 +4884,10 @@ More improvements are coming soon! приєднатися як %@ No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group Приєднуйтесь до групи @@ -4786,6 +4975,14 @@ This is your link for group %@! Залишити swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat Вийти з чату @@ -5077,6 +5274,10 @@ This is your link for group %@! Чернетка повідомлення No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded Повідомлення переслано @@ -5397,6 +5598,10 @@ This is your link for group %@! Новий досвід спілкування в чаті 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request Новий запит на контакт @@ -5472,6 +5677,14 @@ This is your link for group %@! Немає пароля програми Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats Без чатів @@ -5622,6 +5835,10 @@ This is your link for group %@! Ніяких ідентифікаторів користувачів. No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! Не сумісні! @@ -5835,6 +6052,10 @@ Requires compatible VPN. Відкриті зміни No comment provided by engineer. + + Open channel + new chat action + Open chat Відкритий чат @@ -5873,6 +6094,10 @@ Requires compatible VPN. Відкрита міграція на інший пристрій authentication reason + + Open new channel + new chat action + Open new chat Відкрити новий чат @@ -5964,6 +6189,14 @@ Requires compatible VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count Кількість PING @@ -6173,6 +6406,14 @@ Error: %@ Зберегти чернетку останнього повідомлення з вкладеннями. No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address Попередньо встановлена адреса сервера @@ -6258,6 +6499,10 @@ Error: %@ Тайм-аут приватної маршрутизації alert title + + Proceed + alert action + Profile and server connections З'єднання профілю та сервера @@ -6607,6 +6852,22 @@ swipe action Відхилити учасника? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. Релейний сервер використовується тільки в разі потреби. Інша сторона може бачити вашу IP-адресу. @@ -6617,6 +6878,10 @@ swipe action Сервер ретрансляції захищає вашу IP-адресу, але він може спостерігати за тривалістю дзвінка. No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove Видалити @@ -6655,6 +6920,14 @@ swipe action Видалити парольну фразу з брелока? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. Видаляє повідомлення та блокує користувачів. @@ -6916,6 +7189,10 @@ chat item action Зберегти (і повідомити учасникам) alert button + + Save (and notify subscribers) + alert button + Save admission settings? Зберегти налаштування входу? @@ -6941,6 +7218,14 @@ chat item action Збереження та оновлення профілю групи No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile Зберегти профіль групи @@ -7396,6 +7681,10 @@ chat item action Протокол сервера змінено. alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. Сервер вимагає авторизації для створення черг, перевірте пароль. @@ -7592,6 +7881,10 @@ chat item action Поділіться профілем No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link Поділіться цим одноразовим посиланням-запрошенням @@ -7777,8 +8070,8 @@ chat item action Протоколи SimpleX, розглянуті Trail of Bits. No comment provided by engineer. - - SimpleX relay link + + SimpleX relay address simplex link type @@ -7954,6 +8247,23 @@ report reason Підписано No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors Помилки підписки @@ -8053,6 +8363,10 @@ report reason Натисніть «Створити адресу SimpleX» у меню, щоб створити її пізніше. No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group Натисніть Приєднатися до групи @@ -8101,13 +8415,18 @@ report reason Test failed at step %@. Тест завершився невдало на кроці %@. - server test failure + relay test failure +server test failure Test notifications Тестові сповіщення No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server Тестовий сервер @@ -8160,6 +8479,10 @@ It can happen because of some bug or when the connection is compromised.Додаток захищає вашу конфіденційність, використовуючи різних операторів у кожній розмові. No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). Програма попросить підтвердити завантаження з невідомих файлових серверів (крім .onion). @@ -8350,6 +8673,14 @@ It can happen because of some bug or when the connection is compromised.Цієї групи більше не існує. No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. Це посилання вимагає новішої версії додатку. Будь ласка, оновіть додаток або попросіть вашого контакту надіслати сумісне посилання. @@ -8569,6 +8900,10 @@ You will be prompted to complete authentication before this feature is enabled.< Розблокувати учасника? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages Недоставлені повідомлення @@ -8821,6 +9156,10 @@ To connect, please ask your contact to create another connection link and check Використовуйте для повідомлень No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections Використовуйте для нових з'єднань @@ -8861,6 +9200,10 @@ To connect, please ask your contact to create another connection link and check Використовуйте приватну маршрутизацію з невідомими серверами. No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server Використовувати сервер @@ -8901,6 +9244,10 @@ To connect, please ask your contact to create another connection link and check Використання серверів SimpleX Chat. No comment provided by engineer. + + Verify + relay test step + Verify code with desktop Перевірте код на робочому столі @@ -9020,6 +9367,14 @@ To connect, please ask your contact to create another connection link and check Голосове повідомлення… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... Чекаємо на десктопну версію... @@ -9320,6 +9675,10 @@ Repeat join request? Ви можете налаштувати попередній перегляд сповіщень на екрані блокування за допомогою налаштувань. No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. Ви можете поділитися посиланням або QR-кодом - будь-хто зможе приєднатися до групи. Ви не втратите учасників групи, якщо згодом видалите її. @@ -9365,6 +9724,10 @@ Repeat join request? Ви не можете надсилати повідомлення! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. Вас не вдалося верифікувати, спробуйте ще раз. @@ -9477,6 +9840,10 @@ Repeat connection request? Ви все одно отримуватимете дзвінки та сповіщення від вимкнених профілів, якщо вони активні. No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. Ви більше не будете отримувати повідомлення з цього чату. Історія чату буде збережена. @@ -9522,6 +9889,10 @@ Repeat connection request? Твої дзвінки No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database Ваша база даних чату @@ -9607,6 +9978,11 @@ Repeat connection request? Ваш профіль No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. Ваш профіль **%@** буде опублікований. @@ -9632,6 +10008,14 @@ Repeat connection request? Ваш випадковий профіль No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address Адреса вашого сервера @@ -9677,6 +10061,10 @@ Repeat connection request? вище, а потім обирайте: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ прийнято %@ @@ -9697,6 +10085,10 @@ Repeat connection request? прийняв(ла) вас rcv group event chat item + + active + No comment provided by engineer. + admin адмін @@ -9843,6 +10235,14 @@ marked deleted chat item preview text змінює адресу… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored кольоровий @@ -9989,6 +10389,10 @@ pref value видалено deleted chat item + + deleted channel + rcv group event chat item + deleted contact видалений контакт @@ -10099,6 +10503,10 @@ pref value помилка No comment provided by engineer. + + error: %@ + receive error chat item + expired закінчився @@ -10228,6 +10636,10 @@ pref value ліворуч rcv group event chat item + + link + No comment provided by engineer. + marked deleted з позначкою видалено @@ -10298,6 +10710,10 @@ pref value ніколи delete after time + + new + No comment provided by engineer. + new message нове повідомлення @@ -10420,6 +10836,10 @@ time to disappear відхилений виклик call status + + relay + member role + removed видалено @@ -10430,6 +10850,10 @@ time to disappear видалено %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address видалено контактну адресу @@ -10582,6 +11006,10 @@ last received msg: %2$@ незахищені No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile оновлений профіль групи @@ -10602,6 +11030,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link за посиланням на контактну адресу @@ -10677,6 +11109,10 @@ last received msg: %2$@ ви спостерігач No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ ви заблокували %@ diff --git a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff index fbb118774a..d981147cfe 100644 --- a/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff +++ b/apps/ios/SimpleX Localizations/zh-Hans.xcloc/Localized Contents/zh-Hans.xliff @@ -185,6 +185,10 @@ %d 月 time interval + + %d relays + channel relay bar + %d sec %d 秒 @@ -200,11 +204,37 @@ 跳过的 %d 条消息 integrity error chat item + + %d subscriber + channel subscriber count + + + %d subscribers + channel subscriber count + %d weeks %d 星期 time interval + + %1$d/%2$d relays active + channel creation progress +channel relay bar progress + + + %1$d/%2$d relays active, %3$d failed + channel creation progress with errors +channel relay bar progress with errors + + + %1$d/%2$d relays connected + channel subscriber relay bar progress + + + %1$d/%2$d relays connected, %3$d errors + channel subscriber relay bar progress with errors + %lld %lld @@ -215,6 +245,10 @@ %lld %@ No comment provided by engineer. + + %lld channel events + No comment provided by engineer. + %lld contact(s) selected %lld 联系人已选择 @@ -365,6 +399,10 @@ **扫描/粘贴链接**:用您收到的链接连接。 No comment provided by engineer. + + **Test relay** to retrieve its name. + No comment provided by engineer. + **Warning**: Instant push notifications require passphrase saved in Keychain. **警告**:及时推送通知需要保存在钥匙串的密码。 @@ -1317,6 +1355,10 @@ swipe action 封禁成员吗? No comment provided by engineer. + + Block subscriber for all? + No comment provided by engineer. + Blocked by admin 由管理员封禁 @@ -1367,6 +1409,10 @@ swipe action 您和您的联系人都可以发送语音消息。 No comment provided by engineer. + + Broadcast + compose placeholder for channel owner + Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! 保加利亚语、芬兰语、泰语和乌克兰语——感谢用户和[Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)! @@ -1554,6 +1600,50 @@ new chat action authentication reason set passcode view + + Channel + No comment provided by engineer. + + + Channel display name + No comment provided by engineer. + + + Channel full name (optional) + No comment provided by engineer. + + + Channel image + No comment provided by engineer. + + + Channel link + No comment provided by engineer. + + + Channel profile + No comment provided by engineer. + + + Channel profile is stored on subscribers' devices and on the chat relays. + No comment provided by engineer. + + + Channel profile was changed. If you save it, the updated profile will be sent to channel subscribers. + alert message + + + Channel will be deleted for all subscribers - this cannot be undone! + No comment provided by engineer. + + + Channel will be deleted for you - this cannot be undone! + No comment provided by engineer. + + + Channel will start working with %1$d of %2$d relays. Proceed? + alert message + Chat 聊天 @@ -1639,6 +1729,22 @@ set passcode view 用户资料 No comment provided by engineer. + + Chat relay + No comment provided by engineer. + + + Chat relays + No comment provided by engineer. + + + Chat relays forward messages in channels you create. + No comment provided by engineer. + + + Chat relays forward messages to channel subscribers. + No comment provided by engineer. + Chat theme 聊天主题 @@ -1689,6 +1795,14 @@ set passcode view 在被允许时检查消息。 No comment provided by engineer. + + Check relay address and try again. + alert message + + + Check relay name and try again. + alert message + Check server address and try again. 检查服务器地址并再试一次。 @@ -1834,6 +1948,10 @@ set passcode view 配置 ICE 服务器 No comment provided by engineer. + + Configure relays + No comment provided by engineer. + Configure server operators 配置服务器运营方 @@ -1897,7 +2015,8 @@ set passcode view Connect 连接 - server test step + relay test step +server test step Connect automatically @@ -2176,7 +2295,7 @@ This is your own one-time link! Correct name to %@? 将名称更正为 %@? - No comment provided by engineer. + alert message Create @@ -2233,6 +2352,14 @@ This is your own one-time link! 创建个人资料 No comment provided by engineer. + + Create public channel + No comment provided by engineer. + + + Create public channel (BETA) + No comment provided by engineer. + Create queue 创建队列 @@ -2268,6 +2395,10 @@ This is your own one-time link! 正在创建存档链接 No comment provided by engineer. + + Creating channel + No comment provided by engineer. + Creating link… 创建链接中… @@ -2431,6 +2562,10 @@ This is your own one-time link! 分散式 No comment provided by engineer. + + Decode link + relay test step + Decryption error 解密错误 @@ -2477,6 +2612,14 @@ swipe action 删除并通知联系人 No comment provided by engineer. + + Delete channel + No comment provided by engineer. + + + Delete channel? + No comment provided by engineer. + Delete chat 删除聊天 @@ -2647,6 +2790,10 @@ alert button 删除队列 server test step + + Delete relay + No comment provided by engineer. + Delete report 删除举报 @@ -3023,6 +3170,10 @@ chat item action 编辑 chat item action + + Edit channel profile + No comment provided by engineer. + Edit group profile 编辑群组资料 @@ -3058,6 +3209,10 @@ chat item action 启用 TCP 保持活跃状态 No comment provided by engineer. + + Enable at least one chat relay in Network & Servers. + channel creation warning + Enable automatic message deletion? 启用自动删除消息? @@ -3203,6 +3358,10 @@ chat item action 输入密码 No comment provided by engineer. + + Enter channel name… + No comment provided by engineer. + Enter correct passphrase. 输入正确密码。 @@ -3228,6 +3387,10 @@ chat item action 在上面输入密码以显示! No comment provided by engineer. + + Enter relay name… + No comment provided by engineer. + Enter server manually 手动输入服务器 @@ -3283,6 +3446,10 @@ chat item action 添加成员错误 No comment provided by engineer. + + Error adding relay + alert title + Error adding server 添加服务器出错 @@ -3342,6 +3509,10 @@ chat item action 创建地址错误 No comment provided by engineer. + + Error creating channel + alert title + Error creating group 创建群组错误 @@ -3477,11 +3648,6 @@ chat item action 打开聊天时出错 No comment provided by engineer. - - Error opening group - 打开群时出错 - No comment provided by engineer. - Error receiving file 接收文件错误 @@ -3527,6 +3693,10 @@ chat item action 保存 ICE 服务器错误 No comment provided by engineer. + + Error saving channel profile + No comment provided by engineer. + Error saving chat list 保存聊天列表出错 @@ -3672,7 +3842,8 @@ snd error text Error: %@. 错误:%@。 - server test error + relay test error +server test error Error: URL is invalid @@ -3916,7 +4087,8 @@ snd error text Fingerprint in server address does not match certificate. 服务器地址中的证书指纹可能不正确 - server test error + relay test error +server test error Fingerprint in server address does not match certificate: %@. @@ -3961,7 +4133,8 @@ snd error text For chat profile %@: 为聊天资料 %@: - servers error + servers error +servers warning For console @@ -4102,6 +4275,10 @@ Error: %2$@ GIF 和贴纸 No comment provided by engineer. + + Get link + relay test step + Get notified when mentioned. 被提及时收到通知。 @@ -4603,7 +4780,15 @@ More improvements are coming soon! Invalid name! 无效名称! - No comment provided by engineer. + alert title + + + Invalid relay address! + alert title + + + Invalid relay name! + alert title Invalid response @@ -4716,6 +4901,10 @@ More improvements are coming soon! 以 %@ 身份加入 No comment provided by engineer. + + Join channel + No comment provided by engineer. + Join group 加入群组 @@ -4803,6 +4992,14 @@ This is your link for group %@! 离开 swipe action + + Leave channel + No comment provided by engineer. + + + Leave channel? + No comment provided by engineer. + Leave chat 离开聊天 @@ -5097,6 +5294,10 @@ This is your link for group %@! 消息草稿 No comment provided by engineer. + + Message error + No comment provided by engineer. + Message forwarded 消息已转发 @@ -5417,6 +5618,10 @@ This is your link for group %@! 新的聊天体验 🎉 No comment provided by engineer. + + New chat relay + No comment provided by engineer. + New contact request 新联系人请求 @@ -5492,6 +5697,14 @@ This is your link for group %@! 没有应用程序密码 Authentication unavailable + + No chat relays + No comment provided by engineer. + + + No chat relays enabled. + servers warning + No chats 无聊天 @@ -5642,6 +5855,10 @@ This is your link for group %@! 没有用户标识符。 No comment provided by engineer. + + Not all relays connected + alert title + Not compatible! 不兼容! @@ -5857,6 +6074,10 @@ Requires compatible VPN. 打开更改 No comment provided by engineer. + + Open channel + new chat action + Open chat 打开聊天 @@ -5897,6 +6118,10 @@ Requires compatible VPN. 打开迁移到另一台设备 authentication reason + + Open new channel + new chat action + Open new chat 打开新聊天 @@ -5989,6 +6214,14 @@ Requires compatible VPN. %@ alert message + + Owner + No comment provided by engineer. + + + Owners + No comment provided by engineer. + PING count PING 次数 @@ -6198,6 +6431,14 @@ Error: %@ 保留最后的消息草稿及其附件。 No comment provided by engineer. + + Preset relay address + No comment provided by engineer. + + + Preset relay name + No comment provided by engineer. + Preset server address 预设服务器地址 @@ -6283,6 +6524,10 @@ Error: %@ 私密路由超时 alert title + + Proceed + alert action + Profile and server connections 资料和服务器连接 @@ -6631,6 +6876,22 @@ swipe action 拒绝成员? alert title + + Relay + No comment provided by engineer. + + + Relay address + alert title + + + Relay connection failed + alert title + + + Relay link + No comment provided by engineer. + Relay server is only used if necessary. Another party can observe your IP address. 中继服务器仅在必要时使用。其他人可能会观察到您的IP地址。 @@ -6641,6 +6902,10 @@ swipe action 中继服务器保护您的 IP 地址,但它可以观察通话的持续时间。 No comment provided by engineer. + + Relay test failed! + No comment provided by engineer. + Remove 移除 @@ -6681,6 +6946,14 @@ swipe action 从钥匙串中删除密码? No comment provided by engineer. + + Remove subscriber + No comment provided by engineer. + + + Remove subscriber? + alert title + Removes messages and blocks members. 删除消息并封禁成员。 @@ -6941,6 +7214,10 @@ chat item action 保存(并通知成员) alert button + + Save (and notify subscribers) + alert button + Save admission settings? 保存入群设置? @@ -6966,6 +7243,14 @@ chat item action 保存和更新组配置文件 No comment provided by engineer. + + Save channel profile + No comment provided by engineer. + + + Save channel profile? + alert title + Save group profile 保存群组资料 @@ -7426,6 +7711,10 @@ chat item action 服务器协议已更改。 alert title + + Server requires authorization to connect to relay, check password. + relay test error + Server requires authorization to create queues, check password. 服务器需要授权才能创建队列,检查密码 @@ -7622,6 +7911,10 @@ chat item action 分享资料 No comment provided by engineer. + + Share relay address + No comment provided by engineer. + Share this 1-time invite link 分享此一次性邀请链接 @@ -7807,9 +8100,8 @@ chat item action SimpleX 协议由 Trail of Bits 审阅。 No comment provided by engineer. - - SimpleX relay link - SimpleX 中继链接 + + SimpleX relay address simplex link type @@ -7984,6 +8276,23 @@ report reason 已订阅 No comment provided by engineer. + + Subscriber + No comment provided by engineer. + + + Subscriber will be removed from channel - this cannot be undone! + alert message + + + Subscribers + No comment provided by engineer. + + + Subscribers use relay link to connect to the channel. +Relay address was used to set up this relay for the channel. + No comment provided by engineer. + Subscription errors 订阅错误 @@ -8084,6 +8393,10 @@ report reason 要稍后创建 SimpleX 地址,请在菜单中轻按“创建 SimpleX 地址” No comment provided by engineer. + + Tap Join channel + No comment provided by engineer. + Tap Join group 轻按加入群 @@ -8132,13 +8445,18 @@ report reason Test failed at step %@. 在步骤 %@ 上测试失败。 - server test failure + relay test failure +server test failure Test notifications 测试通知 No comment provided by engineer. + + Test relay + No comment provided by engineer. + Test server 测试服务器 @@ -8191,6 +8509,10 @@ It can happen because of some bug or when the connection is compromised.应用通过在每个对话中使用不同运营方保护你的隐私。 No comment provided by engineer. + + The app removed this message after %lld attempts to receive it. + No comment provided by engineer. + The app will ask to confirm downloads from unknown file servers (except .onion). 该应用程序将要求确认从未知文件服务器(.onion 除外)下载。 @@ -8379,6 +8701,14 @@ It can happen because of some bug or when the connection is compromised.该群组已不存在。 No comment provided by engineer. + + This is a chat relay address, it cannot be used to connect. + alert message + + + This is your link for channel %@! + new chat action + This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. 此链接需要更新的应用版本。请升级应用或请求你的联系人发送相容的链接。 @@ -8600,6 +8930,10 @@ You will be prompted to complete authentication before this feature is enabled.< 解封成员吗? No comment provided by engineer. + + Unblock subscriber for all? + No comment provided by engineer. + Undelivered messages 未送达的消息 @@ -8852,6 +9186,10 @@ To connect, please ask your contact to create another connection link and check 用于消息 No comment provided by engineer. + + Use for new channels + No comment provided by engineer. + Use for new connections 用于新连接 @@ -8892,6 +9230,10 @@ To connect, please ask your contact to create another connection link and check 对未知服务器使用私有路由。 No comment provided by engineer. + + Use relay + No comment provided by engineer. + Use server 使用服务器 @@ -8932,6 +9274,10 @@ To connect, please ask your contact to create another connection link and check 使用 SimpleX Chat 服务器。 No comment provided by engineer. + + Verify + relay test step + Verify code with desktop 用桌面端验证代码 @@ -9052,6 +9398,14 @@ To connect, please ask your contact to create another connection link and check 语音消息…… No comment provided by engineer. + + Wait + alert action + + + Wait response + relay test step + Waiting for desktop... 正在等待桌面... @@ -9354,6 +9708,10 @@ Repeat join request? 您可以通过设置来设置锁屏通知预览。 No comment provided by engineer. + + You can share a link or a QR code - anybody will be able to join the channel. + No comment provided by engineer. + You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it. 您可以共享链接或二维码——任何人都可以加入该群组。如果您稍后将其删除,您不会失去该组的成员。 @@ -9399,6 +9757,10 @@ Repeat join request? 您无法发送消息! alert title + + You connected to the channel via this relay link. + No comment provided by engineer. + You could not be verified; please try again. 您的身份无法验证,请再试一次。 @@ -9510,6 +9872,10 @@ Repeat connection request? 当静音配置文件处于活动状态时,您仍会收到来自静音配置文件的电话和通知。 No comment provided by engineer. + + You will stop receiving messages from this channel. Chat history will be preserved. + No comment provided by engineer. + You will stop receiving messages from this chat. Chat history will be preserved. 你将停止从这个聊天收到消息。聊天历史将被保留。 @@ -9555,6 +9921,10 @@ Repeat connection request? 您的通话 No comment provided by engineer. + + Your channel + No comment provided by engineer. + Your chat database 您的聊天数据库 @@ -9638,6 +10008,11 @@ Repeat connection request? 您的个人资料 No comment provided by engineer. + + Your profile **%@** will be shared with channel relays and subscribers. +Relays can access channel messages. + No comment provided by engineer. + Your profile **%@** will be shared. 您的个人资料 **%@** 将被共享。 @@ -9663,6 +10038,14 @@ Repeat connection request? 您的随机资料 No comment provided by engineer. + + Your relay address + No comment provided by engineer. + + + Your relay name + No comment provided by engineer. + Your server address 您的服务器地址 @@ -9708,6 +10091,10 @@ Repeat connection request? 上面,然后选择: No comment provided by engineer. + + accepted + No comment provided by engineer. + accepted %@ rcv group event chat item @@ -9727,6 +10114,10 @@ Repeat connection request? 接受了你 rcv group event chat item + + active + No comment provided by engineer. + admin 管理员 @@ -9873,6 +10264,14 @@ marked deleted chat item preview text 更改地址… chat item text + + channel + shown as sender role for channel messages + + + channel profile updated + snd group event chat item + colored 彩色 @@ -10019,6 +10418,10 @@ pref value 已删除 deleted chat item + + deleted channel + rcv group event chat item + deleted contact 已删除联系人 @@ -10129,6 +10532,10 @@ pref value 错误 No comment provided by engineer. + + error: %@ + receive error chat item + expired 过期 @@ -10258,6 +10665,10 @@ pref value 已离开 rcv group event chat item + + link + No comment provided by engineer. + marked deleted 标记为已删除 @@ -10328,6 +10739,10 @@ pref value 从不 delete after time + + new + No comment provided by engineer. + new message 新消息 @@ -10450,6 +10865,10 @@ time to disappear 拒接来电 call status + + relay + member role + removed 已删除 @@ -10460,6 +10879,10 @@ time to disappear 已删除 %@ rcv group event chat item + + removed (%d attempts) + receive error chat item + removed contact address 删除了联系地址 @@ -10614,6 +11037,10 @@ last received msg: %2$@ 未受保护 No comment provided by engineer. + + updated channel profile + rcv group event chat item + updated group profile 已更新的群组资料 @@ -10634,6 +11061,10 @@ last received msg: %2$@ v%@ (%@) No comment provided by engineer. + + via %@ + relay hostname + via contact address link 通过联系地址链接 @@ -10709,6 +11140,10 @@ last received msg: %2$@ 您是观察者 No comment provided by engineer. + + you are subscriber + No comment provided by engineer. + you blocked %@ 你阻止了%@ diff --git a/apps/ios/bg.lproj/Localizable.strings b/apps/ios/bg.lproj/Localizable.strings index fb8529fb88..323c5c6985 100644 --- a/apps/ios/bg.lproj/Localizable.strings +++ b/apps/ios/bg.lproj/Localizable.strings @@ -1218,7 +1218,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Потвърдено"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Свързване"; /* No comment provided by engineer. */ @@ -1389,7 +1390,7 @@ set passcode view */ /* No comment provided by engineer. */ "Core version: v%@" = "Версия на ядрото: v%@"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Поправи име на %@?"; /* No comment provided by engineer. */ @@ -2211,7 +2212,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Намирайте чатове по-бързо"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен"; /* No comment provided by engineer. */ @@ -2532,7 +2534,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Невалидно потвърждение за мигриране"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Невалидно име!"; /* No comment provided by engineer. */ @@ -3975,7 +3977,8 @@ chat item action */ /* No comment provided by engineer. */ "TCP_KEEPINTVL" = "TCP_KEEPINTVL"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Тестът е неуспешен на стъпка %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/cs.lproj/Localizable.strings b/apps/ios/cs.lproj/Localizable.strings index 9e1fe7139c..0031c2421b 100644 --- a/apps/ios/cs.lproj/Localizable.strings +++ b/apps/ios/cs.lproj/Localizable.strings @@ -196,6 +196,9 @@ /* No comment provided by engineer. */ "%lld file(s) with total size of %@" = "%lld soubor(y) s celkovou velikostí %@"; +/* No comment provided by engineer. */ +"%lld group events" = "%lld událostí skupiny"; + /* No comment provided by engineer. */ "%lld members" = "%lld členové"; @@ -305,7 +308,7 @@ time interval */ "A new random profile will be shared." = "Nový náhodný profil bude sdílen."; /* No comment provided by engineer. */ -"A separate TCP connection will be used **for each chat profile you have in the app**." = "Samostatné připojení TCP bude použito **pro každý chat profil, který máte v aplikaci**."; +"A separate TCP connection will be used **for each chat profile you have in the app**." = "Samostatné připojení TCP bude použito **pro každý profil chatu, který máte v aplikaci**."; /* No comment provided by engineer. */ "A separate TCP connection will be used **for each contact and group member**.\n**Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." = "**pro každý kontakt a člena skupiny** bude použito samostatné připojení TCP.\n**Upozornění**: Pokud máte mnoho připojení, spotřeba baterie a provozu může být podstatně vyšší a některá připojení mohou selhat."; @@ -453,7 +456,7 @@ swipe action */ "All chats and messages will be deleted - this cannot be undone!" = "Všechny chaty a zprávy budou smazány – tuto akci nelze vrátit zpět!"; /* alert message */ -"All chats will be removed from the list %@, and the list deleted." = "Všechny chaty budou odstraněny ze seznamu %@ a seznam bude odstraněn."; +"All chats will be removed from the list %@, and the list deleted." = "Všechny chaty budou odstraněny ze seznamu %@ a seznam bude smazán."; /* No comment provided by engineer. */ "All data is erased when it is entered." = "Všechna data se při zadání vymažou."; @@ -570,7 +573,7 @@ swipe action */ "Always use relay" = "Spojení přes relé"; /* No comment provided by engineer. */ -"An empty chat profile with the provided name is created, and the app opens as usual." = "Vytvořit prázdný chat profil se zadaným názvem a otevřít aplikaci jako obvykle."; +"An empty chat profile with the provided name is created, and the app opens as usual." = "Vytvořit prázdný profil chatu se zadaným názvem a otevřít aplikaci jako obvykle."; /* report reason */ "Another reason" = "Jiný důvod"; @@ -747,7 +750,7 @@ swipe action */ "Business address" = "Obchodní adresa"; /* No comment provided by engineer. */ -"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Podle chat profilu (výchozí) nebo [podle připojení](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)."; +"By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." = "Podle profilu chatu (výchozí) nebo [podle připojení](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)."; /* No comment provided by engineer. */ "Call already ended!" = "Hovor již skončil!"; @@ -821,7 +824,7 @@ new chat action */ "Change automatic message deletion?" = "Změnit automatické mazání zpráv?"; /* authentication reason */ -"Change chat profiles" = "Změnit chat profily"; +"Change chat profiles" = "Změnit profily chatu"; /* No comment provided by engineer. */ "Change database passphrase?" = "Změnit přístupovou frázi databáze?"; @@ -959,7 +962,8 @@ set passcode view */ /* No comment provided by engineer. */ "Confirm upload" = "Potvrdit nahrání"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Připojit"; /* No comment provided by engineer. */ @@ -1208,10 +1212,10 @@ swipe action */ "Delete all files" = "Odstranit všechny soubory"; /* No comment provided by engineer. */ -"Delete chat profile" = "Smazat chat profil"; +"Delete chat profile" = "Smazat profil chatu"; /* No comment provided by engineer. */ -"Delete chat profile?" = "Smazat chat profil?"; +"Delete chat profile?" = "Smazat profil chatu?"; /* No comment provided by engineer. */ "Delete connection" = "Smazat připojení"; @@ -1753,7 +1757,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Najděte chaty rychleji"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Otisk certifikátu v adrese serveru neodpovídá."; /* No comment provided by engineer. */ @@ -1859,7 +1864,7 @@ snd error text */ "Hidden" = "Skryté"; /* No comment provided by engineer. */ -"Hidden chat profiles" = "Skryté chat profily"; +"Hidden chat profiles" = "Skryté profily chatu"; /* No comment provided by engineer. */ "Hidden profile password" = "Hesla skrytých profilů"; @@ -2291,7 +2296,7 @@ snd error text */ "Most likely this connection is deleted." = "Pravděpodobně je toto spojení smazáno."; /* No comment provided by engineer. */ -"Multiple chat profiles" = "Více chatovacích profilů"; +"Multiple chat profiles" = "Více profilů chatu"; /* notification label action */ "Mute" = "Ztlumit"; @@ -2632,7 +2637,7 @@ new chat action */ "Protect app screen" = "Ochrana obrazovky aplikace"; /* No comment provided by engineer. */ -"Protect your chat profiles with a password!" = "Chraňte své chat profily heslem!"; +"Protect your chat profiles with a password!" = "Chraňte své profily chatu pomocí hesla!"; /* No comment provided by engineer. */ "Protocol timeout" = "Časový limit protokolu"; @@ -2655,6 +2660,9 @@ new chat action */ /* No comment provided by engineer. */ "Read more" = "Přečíst více"; +/* No comment provided by engineer. */ +"Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode)." = "Více informací v [průvodci uživatele](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode)."; + /* No comment provided by engineer. */ "Read more in [User Guide](https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses)." = "Další informace naleznete v [Uživatelské příručce](https://simplex.chat/docs/guide/making-connections.html#comparison-of-1-time-invitation-links-and-simplex-contact-addresses)."; @@ -2775,7 +2783,7 @@ swipe action */ "Reset to defaults" = "Obnovení výchozího nastavení"; /* No comment provided by engineer. */ -"Restart the app to create a new chat profile" = "Restartujte aplikaci pro vytvoření nového chat profilu"; +"Restart the app to create a new chat profile" = "Restartujte aplikaci pro vytvoření nového profilu chatu"; /* No comment provided by engineer. */ "Restart the app to use imported chat database" = "Restartujte aplikaci pro použití importované databáze chatu"; @@ -2944,7 +2952,7 @@ chat item action */ "Sender may have deleted the connection request." = "Odesílatel možná smazal požadavek připojení."; /* No comment provided by engineer. */ -"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných chat profilech."; +"Sending delivery receipts will be enabled for all contacts in all visible chat profiles." = "Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných profilech chatu."; /* No comment provided by engineer. */ "Sending delivery receipts will be enabled for all contacts." = "Odesílání potvrzení o doručení bude povoleno pro všechny kontakty."; @@ -3184,7 +3192,8 @@ chat item action */ /* No comment provided by engineer. */ "TCP_KEEPINTVL" = "TCP_KEEPINTVL"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Test selhal v kroku %@."; /* No comment provided by engineer. */ @@ -3248,7 +3257,7 @@ chat item action */ "The sender will NOT be notified" = "Odesílatel NEBUDE informován"; /* No comment provided by engineer. */ -"The servers for new connections of your current chat profile **%@**." = "Servery pro nová připojení vašeho aktuálního chat profilu **%@**."; +"The servers for new connections of your current chat profile **%@**." = "Servery pro nová připojení vašeho aktuálního profilu chatu **%@**."; /* No comment provided by engineer. */ "These settings are for your current profile **%@**." = "Toto nastavení je pro váš aktuální profil **%@**."; @@ -3275,7 +3284,7 @@ chat item action */ "This group no longer exists." = "Tato skupina již neexistuje."; /* No comment provided by engineer. */ -"This setting applies to messages in your current chat profile **%@**." = "Toto nastavení platí pro zprávy ve vašem aktuálním chat profilu **%@**."; +"This setting applies to messages in your current chat profile **%@**." = "Toto nastavení platí pro zprávy ve vašem aktuálním profilu chatu **%@**."; /* No comment provided by engineer. */ "To ask any questions and to receive updates:" = "Chcete-li položit jakékoli dotazy a dostávat aktuality:"; @@ -3299,7 +3308,7 @@ chat item action */ "To record voice message please grant permission to use Microphone." = "Chcete-li nahrávat hlasové zprávy, udělte povolení k použití mikrofonu."; /* No comment provided by engineer. */ -"To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Chat profily**."; +"To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." = "Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce **Profily chatu**."; /* No comment provided by engineer. */ "To support instant push notifications the chat database has to be migrated." = "Pro podporu doručování okamžitých upozornění musí být přenesena chat databáze."; @@ -3332,7 +3341,7 @@ chat item action */ "Unhide" = "Odkrýt"; /* No comment provided by engineer. */ -"Unhide chat profile" = "Odkrýt chat profil"; +"Unhide chat profile" = "Odkrýt profil chatu"; /* No comment provided by engineer. */ "Unhide profile" = "Odkrýt profil"; @@ -3680,7 +3689,7 @@ chat item action */ "Your chat database is not encrypted - set passphrase to encrypt it." = "Vaše chat databáze není šifrována – nastavte přístupovou frázi pro její šifrování."; /* No comment provided by engineer. */ -"Your chat profiles" = "Vaše chat profily"; +"Your chat profiles" = "Vaše profily chatu"; /* No comment provided by engineer. */ "Your contact sent a file that is larger than currently supported maximum size (%@)." = "Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@)."; diff --git a/apps/ios/de.lproj/Localizable.strings b/apps/ios/de.lproj/Localizable.strings index e3979abc37..7137ccac8b 100644 --- a/apps/ios/de.lproj/Localizable.strings +++ b/apps/ios/de.lproj/Localizable.strings @@ -1248,7 +1248,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Bestätigt"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Verbinden"; /* No comment provided by engineer. */ @@ -1353,6 +1354,9 @@ set passcode view */ /* chat list item title (it should not be shown */ "connection established" = "Verbindung hergestellt"; +/* No comment provided by engineer. */ +"Connection failed" = "Verbindung fehlgeschlagen"; + /* No comment provided by engineer. */ "Connection is blocked by server operator:\n%@" = "Die Verbindung wurde vom Serverbetreiber blockiert:\n%@"; @@ -1464,7 +1468,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Abrundung Ecken"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Richtiger Name für %@?"; /* No comment provided by engineer. */ @@ -2338,9 +2342,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Fehler beim Öffnen des Chat"; -/* No comment provided by engineer. */ -"Error opening group" = "Fehler beim Vorbereiten der Gruppe"; - /* alert title */ "Error receiving file" = "Fehler beim Herunterladen der Datei"; @@ -2454,7 +2455,8 @@ file error text snd error text */ "Error: %@" = "Fehler: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Fehler: %@."; /* No comment provided by engineer. */ @@ -2502,6 +2504,9 @@ snd error text */ /* No comment provided by engineer. */ "Exporting database archive…" = "Exportieren des Datenbank-Archivs…"; +/* No comment provided by engineer. */ +"failed" = "Fehlgeschlagen"; + /* No comment provided by engineer. */ "Failed to remove passphrase" = "Das Entfernen des Passworts ist fehlgeschlagen"; @@ -2604,7 +2609,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "Fingerabdruck in der Serveradresse stimmt nicht mit dem Zertifikat überein: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Fingerabdruck in der Serveradresse stimmt nicht mit dem Zertifikat überein."; /* No comment provided by engineer. */ @@ -2628,7 +2634,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Für alle Moderatoren"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Für das Chat-Profil %@:"; /* No comment provided by engineer. */ @@ -2871,6 +2878,9 @@ snd error text */ /* No comment provided by engineer. */ "If you enter your self-destruct passcode while opening the app:" = "Wenn Sie Ihren Selbstzerstörungs-Zugangscode während des Öffnens der App eingeben:"; +/* down migration warning */ +"If you joined or created channels, they will stop working permanently." = "Kanäle, welche Sie erstellt haben oder denen Sie beigetreten sind, werden dauerhaft deaktiviert."; + /* No comment provided by engineer. */ "If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Tippen Sie unten auf **Später wiederholen**, wenn Sie den Chat jetzt benötigen (es wird Ihnen angeboten, die Datenbank bei einem Neustart der App zu migrieren)."; @@ -3042,7 +3052,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Migrations-Bestätigung ungültig"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Ungültiger Name!"; /* No comment provided by engineer. */ @@ -5172,9 +5182,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "Die SimpleX-Protokolle wurden von Trail of Bits überprüft."; -/* simplex link type */ -"SimpleX relay link" = "SimpleX Relais-Link"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Vereinfachter Inkognito-Modus"; @@ -5380,7 +5387,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Temporärer Datei-Fehler"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Der Test ist beim Schritt %@ fehlgeschlagen."; /* No comment provided by engineer. */ diff --git a/apps/ios/es.lproj/Localizable.strings b/apps/ios/es.lproj/Localizable.strings index a05bc9f4b6..42ed52c412 100644 --- a/apps/ios/es.lproj/Localizable.strings +++ b/apps/ios/es.lproj/Localizable.strings @@ -1248,7 +1248,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Confirmado"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Conectar"; /* No comment provided by engineer. */ @@ -1464,7 +1465,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Esquina"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "¿Corregir el nombre a %@?"; /* No comment provided by engineer. */ @@ -2338,9 +2339,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Error al abrir chat"; -/* No comment provided by engineer. */ -"Error opening group" = "Error al abrir el grupo"; - /* alert title */ "Error receiving file" = "Error al recibir archivo"; @@ -2454,7 +2452,8 @@ file error text snd error text */ "Error: %@" = "Error: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Error: %@."; /* No comment provided by engineer. */ @@ -2604,7 +2603,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "La huella en la dirección del servidor no coincide con el certificado: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "La huella en la dirección del servidor no coincide con el certificado."; /* No comment provided by engineer. */ @@ -2628,7 +2628,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Para todos los moderadores"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Para el perfil de chat %@:"; /* No comment provided by engineer. */ @@ -3042,7 +3043,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Confirmación de migración no válida"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "¡Nombre no válido!"; /* No comment provided by engineer. */ @@ -5172,9 +5173,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "Protocolos de SimpleX auditados por Trail of Bits."; -/* simplex link type */ -"SimpleX relay link" = "Enlace de servidor SimpleX"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Modo incógnito simplificado"; @@ -5380,7 +5378,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Error en archivo temporal"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Prueba no superada en el paso %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/fi.lproj/Localizable.strings b/apps/ios/fi.lproj/Localizable.strings index ea3f9c4386..5f81f94fb8 100644 --- a/apps/ios/fi.lproj/Localizable.strings +++ b/apps/ios/fi.lproj/Localizable.strings @@ -650,7 +650,8 @@ set passcode view */ /* No comment provided by engineer. */ "Confirm password" = "Vahvista salasana"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Yhdistä"; /* No comment provided by engineer. */ @@ -1429,7 +1430,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Löydä keskustelut nopeammin"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Palvelimen osoitteen varmenteen sormenjälki on mahdollisesti virheellinen"; /* No comment provided by engineer. */ @@ -2848,7 +2850,8 @@ chat item action */ /* No comment provided by engineer. */ "TCP_KEEPINTVL" = "TCP_KEEPINTVL"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Testi epäonnistui vaiheessa %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/fr.lproj/Localizable.strings b/apps/ios/fr.lproj/Localizable.strings index 2b2a1e98e5..30f28c6b8c 100644 --- a/apps/ios/fr.lproj/Localizable.strings +++ b/apps/ios/fr.lproj/Localizable.strings @@ -1194,7 +1194,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Confirmé"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Se connecter"; /* No comment provided by engineer. */ @@ -1392,7 +1393,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Coin"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Corriger le nom pour %@ ?"; /* No comment provided by engineer. */ @@ -2466,7 +2467,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Recherche de message plus rapide"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte"; /* No comment provided by engineer. */ @@ -2487,7 +2489,8 @@ snd error text */ /* No comment provided by engineer. */ "Fix not supported by group member" = "Correction non prise en charge par un membre du groupe"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Pour le profil de discussion %@ :"; /* No comment provided by engineer. */ @@ -2853,7 +2856,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Confirmation de migration invalide"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Nom invalide !"; /* No comment provided by engineer. */ @@ -4803,7 +4806,8 @@ chat item action */ /* file error alert title */ "Temporary file error" = "Erreur de fichier temporaire"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Échec du test à l'étape %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/hu.lproj/Localizable.strings b/apps/ios/hu.lproj/Localizable.strings index 56277f4fd3..93eb633dd7 100644 --- a/apps/ios/hu.lproj/Localizable.strings +++ b/apps/ios/hu.lproj/Localizable.strings @@ -543,7 +543,7 @@ swipe action */ "All your contacts will remain connected. Profile update will be sent to your contacts." = "Az összes partnerével továbbra is kapcsolatban marad. A profilfrissítés el lesz küldve a partnerei számára."; /* No comment provided by engineer. */ -"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-továbbítókiszolgálókra."; +"All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." = "Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-átjátszókra."; /* No comment provided by engineer. */ "Allow" = "Engedélyezés"; @@ -636,7 +636,7 @@ swipe action */ "Always use private routing." = "Mindig legyen használva privát útválasztás."; /* No comment provided by engineer. */ -"Always use relay" = "Mindig legyen használva továbbítókiszolgáló"; +"Always use relay" = "Mindig legyen használva átjátszó"; /* No comment provided by engineer. */ "An empty chat profile with the provided name is created, and the app opens as usual." = "Egy üres csevegési profil lesz létrehozva a megadott névvel, és az alkalmazás a szokásos módon megnyílik."; @@ -1248,7 +1248,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Megerősítve"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Kapcsolódás"; /* No comment provided by engineer. */ @@ -1353,6 +1354,9 @@ set passcode view */ /* chat list item title (it should not be shown */ "connection established" = "kapcsolat létrehozva"; +/* No comment provided by engineer. */ +"Connection failed" = "Nem sikerült létrehozni a kapcsolatot"; + /* No comment provided by engineer. */ "Connection is blocked by server operator:\n%@" = "A kiszolgáló üzemeltetője letiltotta a kapcsolatot:\n%@"; @@ -1464,7 +1468,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Sarok"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Helyesbíti a nevet a következőre: %@?"; /* No comment provided by engineer. */ @@ -1834,13 +1838,13 @@ alert button */ "Desktop devices" = "Számítógépek"; /* No comment provided by engineer. */ -"Destination server address of %@ is incompatible with forwarding server %@ settings." = "A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbítókiszolgáló beállításaival."; +"Destination server address of %@ is incompatible with forwarding server %@ settings." = "A(z) %@ célkiszolgáló címe nem kompatibilis a(z) %@ továbbító kiszolgáló beállításaival."; /* snd error text */ "Destination server error: %@" = "Célkiszolgáló-hiba: %@"; /* No comment provided by engineer. */ -"Destination server version of %@ is incompatible with forwarding server %@." = "A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbítókiszolgálóval."; +"Destination server version of %@ is incompatible with forwarding server %@." = "A(z) %@ célkiszolgáló verziója nem kompatibilis a(z) %@ továbbító kiszolgálóval."; /* No comment provided by engineer. */ "Detailed statistics" = "Részletes statisztikák"; @@ -2249,7 +2253,7 @@ chat item action */ "Error checking token status" = "Hiba történt a token állapotának ellenőrzésekor"; /* alert message */ -"Error connecting to forwarding server %@. Please try later." = "Hiba történt a(z) %@ továbbítókiszolgálóhoz való kapcsolódáskor. Próbálja meg később."; +"Error connecting to forwarding server %@. Please try later." = "Hiba történt a(z) %@ továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később."; /* subscription status explanation */ "Error connecting to the server used to receive messages from this connection: %@" = "Hiba történt a kapcsolódáskor ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál: %@"; @@ -2338,9 +2342,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Hiba történt a csevegés megnyitásakor"; -/* No comment provided by engineer. */ -"Error opening group" = "Hiba történt a csoport megnyitásakor"; - /* alert title */ "Error receiving file" = "Hiba történt a fájl fogadásakor"; @@ -2454,7 +2455,8 @@ file error text snd error text */ "Error: %@" = "Hiba: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Hiba: %@."; /* No comment provided by engineer. */ @@ -2502,6 +2504,9 @@ snd error text */ /* No comment provided by engineer. */ "Exporting database archive…" = "Adatbázis-archívum exportálása…"; +/* No comment provided by engineer. */ +"failed" = "sikertelen"; + /* No comment provided by engineer. */ "Failed to remove passphrase" = "Nem sikerült eltávolítani a jelmondatot"; @@ -2599,12 +2604,13 @@ snd error text */ "Fingerprint in destination server address does not match certificate: %@." = "A célkiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@."; /* No comment provided by engineer. */ -"Fingerprint in forwarding server address does not match certificate: %@." = "A továbbítókiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@."; +"Fingerprint in forwarding server address does not match certificate: %@." = "A továbbító kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@."; /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "A kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "A kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal."; /* No comment provided by engineer. */ @@ -2628,7 +2634,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Az összes moderátor számára"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "A(z) %@ nevű csevegési profilhoz:"; /* No comment provided by engineer. */ @@ -2677,19 +2684,19 @@ snd error text */ "Forwarding %lld messages" = "%lld üzenet továbbítása"; /* alert message */ -"Forwarding server %@ failed to connect to destination server %@. Please try later." = "A(z) %1$@ továbbítókiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később."; +"Forwarding server %@ failed to connect to destination server %@. Please try later." = "A(z) %1$@ továbbító kiszolgáló nem tudott kapcsolódni a(z) %2$@ célkiszolgálóhoz. Próbálja meg később."; /* No comment provided by engineer. */ -"Forwarding server address is incompatible with network settings: %@." = "A továbbítókiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@."; +"Forwarding server address is incompatible with network settings: %@." = "A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %@."; /* No comment provided by engineer. */ -"Forwarding server version is incompatible with network settings: %@." = "A továbbítókiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@."; +"Forwarding server version is incompatible with network settings: %@." = "A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %@."; /* snd error text */ -"Forwarding server: %@\nDestination server error: %@" = "Továbbítókiszolgáló: %1$@\nCélkiszolgáló-hiba: %2$@"; +"Forwarding server: %@\nDestination server error: %@" = "Továbbító kiszolgáló: %1$@\nCélkiszolgáló-hiba: %2$@"; /* snd error text */ -"Forwarding server: %@\nError: %@" = "Továbbítókiszolgáló: %1$@\nHiba: %2$@"; +"Forwarding server: %@\nError: %@" = "Továbbító kiszolgáló: %1$@\nHiba: %2$@"; /* No comment provided by engineer. */ "Found desktop" = "Megtalált számítógép"; @@ -2871,6 +2878,9 @@ snd error text */ /* No comment provided by engineer. */ "If you enter your self-destruct passcode while opening the app:" = "Ha az alkalmazás megnyitásakor megadja az önmegsemmisítő jelkódot:"; +/* down migration warning */ +"If you joined or created channels, they will stop working permanently." = "Ha csatornákat hozott létre vagy csak csatlakozott hozzájuk, akkor azok véglegesen le fognak állni."; + /* No comment provided by engineer. */ "If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Ha most kell használnia a csevegést, koppintson lentebb a **Befejezés később** beállításra (az alkalmazás újraindításakor fel lesz ajánlva az adatbázis átköltöztetése)."; @@ -3042,7 +3052,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Érvénytelen átköltöztetési visszaigazolás"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Érvénytelen név!"; /* No comment provided by engineer. */ @@ -4128,7 +4138,7 @@ new chat action */ "Preserve the last message draft, with attachments." = "Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt."; /* No comment provided by engineer. */ -"Preset server address" = "Az előre beállított kiszolgáló címe"; +"Preset server address" = "Előre beállított kiszolgáló címe"; /* No comment provided by engineer. */ "Preset servers" = "Előre beállított kiszolgálók"; @@ -4236,7 +4246,7 @@ new chat action */ "Protect your chat profiles with a password!" = "Védje meg a csevegési profiljait egy jelszóval!"; /* No comment provided by engineer. */ -"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje az IP-címét a partnerei által kiválasztott üzenetváltási továbbítókiszolgálókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben."; +"Protect your IP address from the messaging relays chosen by your contacts.\nEnable in *Network & servers* settings." = "Védje az IP-címét a partnerei által kiválasztott üzenetváltási átjátszókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben."; /* No comment provided by engineer. */ "Protocol background timeout" = "Protokoll időtúllépése a háttérben"; @@ -4403,10 +4413,10 @@ swipe action */ "rejected call" = "elutasított hívás"; /* No comment provided by engineer. */ -"Relay server is only used if necessary. Another party can observe your IP address." = "A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét."; +"Relay server is only used if necessary. Another party can observe your IP address." = "Az átjátszó csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét."; /* No comment provided by engineer. */ -"Relay server protects your IP address, but it can observe the duration of the call." = "A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát."; +"Relay server protects your IP address, but it can observe the duration of the call." = "Az átjátszó megvédi az IP-címét, de megfigyelheti a hívás időtartamát."; /* alert action */ "Remove" = "Eltávolítás"; @@ -5172,9 +5182,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "A SimpleX protokollokat a Trail of Bits auditálta."; -/* simplex link type */ -"SimpleX relay link" = "SimpleX továbbítókiszolgáló-hivatkozás"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Egyszerűsített inkognitómód"; @@ -5380,7 +5387,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Ideiglenes fájlhiba"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "A teszt a(z) %@ lépésnél sikertelen volt."; /* No comment provided by engineer. */ @@ -5924,7 +5932,7 @@ report reason */ "via one-time link" = "egy egyszer használható meghívón keresztül"; /* No comment provided by engineer. */ -"via relay" = "továbbítókiszolgálón keresztül"; +"via relay" = "átjátszón keresztül"; /* No comment provided by engineer. */ "Via secure quantum resistant protocol." = "Biztonságos kvantumbiztos protokollon keresztül."; @@ -6071,7 +6079,7 @@ report reason */ "Without Tor or VPN, your IP address will be visible to file servers." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a fájlkiszolgálók számára."; /* alert message */ -"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára: %@."; +"Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." = "Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-átjátszók számára: %@."; /* No comment provided by engineer. */ "Wrong database passphrase" = "Érvénytelen adatbázis-jelmondat"; diff --git a/apps/ios/it.lproj/Localizable.strings b/apps/ios/it.lproj/Localizable.strings index 3955f267ce..69045c9c23 100644 --- a/apps/ios/it.lproj/Localizable.strings +++ b/apps/ios/it.lproj/Localizable.strings @@ -1248,7 +1248,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Confermato"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Connetti"; /* No comment provided by engineer. */ @@ -1353,6 +1354,9 @@ set passcode view */ /* chat list item title (it should not be shown */ "connection established" = "connessione stabilita"; +/* No comment provided by engineer. */ +"Connection failed" = "Connessione fallita"; + /* No comment provided by engineer. */ "Connection is blocked by server operator:\n%@" = "La connessione è bloccata dall'operatore del server:\n%@"; @@ -1464,7 +1468,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Angolo"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Correggere il nome a %@?"; /* No comment provided by engineer. */ @@ -2338,9 +2342,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Errore di apertura della chat"; -/* No comment provided by engineer. */ -"Error opening group" = "Errore di preparazione del gruppo"; - /* alert title */ "Error receiving file" = "Errore nella ricezione del file"; @@ -2454,7 +2455,8 @@ file error text snd error text */ "Error: %@" = "Errore: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Errore: %@."; /* No comment provided by engineer. */ @@ -2502,6 +2504,9 @@ snd error text */ /* No comment provided by engineer. */ "Exporting database archive…" = "Esportazione archivio database…"; +/* No comment provided by engineer. */ +"failed" = "fallito"; + /* No comment provided by engineer. */ "Failed to remove passphrase" = "Rimozione della password fallita"; @@ -2604,7 +2609,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "L'impronta digitale nell'indirizzo del server non corrisponde al certificato: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "L'impronta digitale nell'indirizzo del server non corrisponde al certificato."; /* No comment provided by engineer. */ @@ -2628,7 +2634,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Per tutti i moderatori"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Per il profilo di chat %@:"; /* No comment provided by engineer. */ @@ -2871,6 +2878,9 @@ snd error text */ /* No comment provided by engineer. */ "If you enter your self-destruct passcode while opening the app:" = "Se inserisci il tuo codice di autodistruzione mentre apri l'app:"; +/* down migration warning */ +"If you joined or created channels, they will stop working permanently." = "Se sei dentro canali o ne hai creati, essi smetteranno di funzionare definitivamente."; + /* No comment provided by engineer. */ "If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Se devi usare la chat adesso, tocca **Fallo più tardi** qui sotto (ti verrà offerto di migrare il database quando riavvii l'app)."; @@ -3042,7 +3052,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Conferma di migrazione non valida"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Nome non valido!"; /* No comment provided by engineer. */ @@ -5172,9 +5182,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "Protocolli di SimpleX esaminati da Trail of Bits."; -/* simplex link type */ -"SimpleX relay link" = "Link del relay SimpleX"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Modalità incognito semplificata"; @@ -5380,7 +5387,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Errore del file temporaneo"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Test fallito al passo %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/ja.lproj/Localizable.strings b/apps/ios/ja.lproj/Localizable.strings index 480eb39d36..38f90a2cad 100644 --- a/apps/ios/ja.lproj/Localizable.strings +++ b/apps/ios/ja.lproj/Localizable.strings @@ -890,7 +890,8 @@ set passcode view */ /* No comment provided by engineer. */ "Confirm password" = "パスワードを確認"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "接続"; /* No comment provided by engineer. */ @@ -1720,7 +1721,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "チャットを素早く検索"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "サーバアドレスの証明証IDが正しくないかもしれません"; /* No comment provided by engineer. */ @@ -3133,7 +3135,8 @@ chat item action */ /* No comment provided by engineer. */ "TCP_KEEPINTVL" = "TCP_KEEPINTVL"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "テストはステップ %@ で失敗しました。"; /* No comment provided by engineer. */ diff --git a/apps/ios/nl.lproj/Localizable.strings b/apps/ios/nl.lproj/Localizable.strings index 29f8bb5b3f..d4ace22665 100644 --- a/apps/ios/nl.lproj/Localizable.strings +++ b/apps/ios/nl.lproj/Localizable.strings @@ -1209,7 +1209,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Bevestigd"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Verbind"; /* No comment provided by engineer. */ @@ -1416,7 +1417,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Hoek"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Juiste naam voor %@?"; /* No comment provided by engineer. */ @@ -2499,7 +2500,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Vind chats sneller"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Mogelijk is de certificaat vingerafdruk in het server adres onjuist"; /* No comment provided by engineer. */ @@ -2523,7 +2525,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Voor alle moderators"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Voor chatprofiel %@:"; /* No comment provided by engineer. */ @@ -2928,7 +2931,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Ongeldige migratie bevestiging"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Ongeldige naam!"; /* No comment provided by engineer. */ @@ -5101,7 +5104,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Tijdelijke bestandsfout"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Test mislukt bij stap %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/pl.lproj/Localizable.strings b/apps/ios/pl.lproj/Localizable.strings index ed1f8850d8..7c28c9591c 100644 --- a/apps/ios/pl.lproj/Localizable.strings +++ b/apps/ios/pl.lproj/Localizable.strings @@ -1248,7 +1248,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Potwierdzony"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Połącz"; /* No comment provided by engineer. */ @@ -1353,6 +1354,9 @@ set passcode view */ /* chat list item title (it should not be shown */ "connection established" = "połączenie ustanowione"; +/* No comment provided by engineer. */ +"Connection failed" = "Połączenie nie powiodło się"; + /* No comment provided by engineer. */ "Connection is blocked by server operator:\n%@" = "Połączenie zostało zablokowane przez operatora serwera:\n%@"; @@ -1464,7 +1468,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Róg"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Poprawić imię na %@?"; /* No comment provided by engineer. */ @@ -2338,9 +2342,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Błąd otwierania czatu"; -/* No comment provided by engineer. */ -"Error opening group" = "Błąd otwierania grupy"; - /* alert title */ "Error receiving file" = "Błąd odbioru pliku"; @@ -2454,7 +2455,8 @@ file error text snd error text */ "Error: %@" = "Błąd: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Błąd: %@."; /* No comment provided by engineer. */ @@ -2502,6 +2504,9 @@ snd error text */ /* No comment provided by engineer. */ "Exporting database archive…" = "Eksportowanie archiwum bazy danych…"; +/* No comment provided by engineer. */ +"failed" = "nieudane"; + /* No comment provided by engineer. */ "Failed to remove passphrase" = "Nie udało się usunąć hasła"; @@ -2604,7 +2609,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "Odcisk palca w adresie serwera nie zgadza się z certyfikatem: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Możliwe, że odcisk palca certyfikatu w adresie serwera jest nieprawidłowy."; /* No comment provided by engineer. */ @@ -2628,7 +2634,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Dla wszystkich moderatorów"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Dla profilu czatu %@:"; /* No comment provided by engineer. */ @@ -2871,6 +2878,9 @@ snd error text */ /* No comment provided by engineer. */ "If you enter your self-destruct passcode while opening the app:" = "Jeśli wpiszesz swój pin samodestrukcji podczas otwierania aplikacji:"; +/* down migration warning */ +"If you joined or created channels, they will stop working permanently." = "Jeśli dołączyłeś do kanałów lub je utworzyłeś, przestaną one działać na stałe."; + /* No comment provided by engineer. */ "If you need to use the chat now tap **Do it later** below (you will be offered to migrate the database when you restart the app)." = "Jeśli potrzebujesz użyć czatu teraz, dotknij **Zrób to później** poniżej (zostanie Ci zaproponowana migracja bazy danych po ponownym uruchomieniu aplikacji)."; @@ -3042,7 +3052,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Nieprawidłowe potwierdzenie migracji"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Nieprawidłowa nazwa!"; /* No comment provided by engineer. */ @@ -5172,9 +5182,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "Protokoły SimpleX sprawdzone przez Trail of Bits."; -/* simplex link type */ -"SimpleX relay link" = "łącze przekaźnikowe SimpleX"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Uproszczony tryb incognito"; @@ -5380,7 +5387,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Tymczasowy błąd pliku"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Test nie powiódł się na etapie %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/ru.lproj/Localizable.strings b/apps/ios/ru.lproj/Localizable.strings index 87a47ec2ab..eee33cc574 100644 --- a/apps/ios/ru.lproj/Localizable.strings +++ b/apps/ios/ru.lproj/Localizable.strings @@ -1242,7 +1242,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Подтвержденный"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Соединиться"; /* No comment provided by engineer. */ @@ -1458,7 +1459,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Угол"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Исправить имя на %@?"; /* No comment provided by engineer. */ @@ -2326,9 +2327,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Ошибка при открытии чата"; -/* No comment provided by engineer. */ -"Error opening group" = "Ошибка при открытии группы"; - /* alert title */ "Error receiving file" = "Ошибка при получении файла"; @@ -2442,7 +2440,8 @@ file error text snd error text */ "Error: %@" = "Ошибка: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "Ошибка: %@."; /* No comment provided by engineer. */ @@ -2589,7 +2588,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "Хэш в адресе сервера не соответствует сертификату: %@."; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Возможно, хэш сертификата в адресе сервера неверный."; /* No comment provided by engineer. */ @@ -2613,7 +2613,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Для всех модераторов"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Для профиля чата %@:"; /* No comment provided by engineer. */ @@ -3024,7 +3025,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Ошибка подтверждения миграции"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Неверное имя!"; /* No comment provided by engineer. */ @@ -5127,9 +5128,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "Аудит SimpleX протоколов от Trail of Bits."; -/* simplex link type */ -"SimpleX relay link" = "Ссылка SimpleX relay"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Упрощенный режим Инкогнито"; @@ -5335,7 +5333,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Временная ошибка файла"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Ошибка теста на шаге %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/th.lproj/Localizable.strings b/apps/ios/th.lproj/Localizable.strings index d4b4dfd949..ffdd2006a6 100644 --- a/apps/ios/th.lproj/Localizable.strings +++ b/apps/ios/th.lproj/Localizable.strings @@ -626,7 +626,8 @@ set passcode view */ /* No comment provided by engineer. */ "Confirm password" = "ยืนยันรหัสผ่าน"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "เชื่อมต่อ"; /* No comment provided by engineer. */ @@ -1381,7 +1382,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "ค้นหาแชทได้เร็วขึ้น"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "อาจเป็นไปได้ว่าลายนิ้วมือของ certificate ในที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง"; /* No comment provided by engineer. */ @@ -2770,7 +2772,8 @@ chat item action */ /* No comment provided by engineer. */ "TCP_KEEPINTVL" = "TCP_KEEPINTVL"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "การทดสอบล้มเหลวในขั้นตอน %@"; /* No comment provided by engineer. */ diff --git a/apps/ios/tr.lproj/Localizable.strings b/apps/ios/tr.lproj/Localizable.strings index 5cccb67170..30d83d16dd 100644 --- a/apps/ios/tr.lproj/Localizable.strings +++ b/apps/ios/tr.lproj/Localizable.strings @@ -1242,7 +1242,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Onaylandı"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Bağlan"; /* No comment provided by engineer. */ @@ -1458,7 +1459,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Köşeleri yuvarlama"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "İsim %@ olarak düzeltilsin mi?"; /* No comment provided by engineer. */ @@ -2323,9 +2324,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Kişiyi hazırlama hatası"; -/* No comment provided by engineer. */ -"Error opening group" = "Grubu hazırlama hatası"; - /* alert title */ "Error receiving file" = "Dosya alınırken sorun oluştu"; @@ -2574,7 +2572,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Sohbetleri daha hızlı bul"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil"; /* No comment provided by engineer. */ @@ -2598,7 +2597,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Tüm moderatörler için"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Sohbet profili için %@:"; /* No comment provided by engineer. */ @@ -3009,7 +3009,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Geçersiz taşıma onayı"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Geçersiz isim!"; /* No comment provided by engineer. */ @@ -5109,9 +5109,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "SimpleX protokolleri Trail of Bits tarafından incelenmiştir."; -/* simplex link type */ -"SimpleX relay link" = "SimpleX aktarıcı bağlantısı"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "Basitleştirilmiş gizli mod"; @@ -5317,7 +5314,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Geçici dosya hatası"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Test %@ adımında başarısız oldu."; /* No comment provided by engineer. */ diff --git a/apps/ios/uk.lproj/Localizable.strings b/apps/ios/uk.lproj/Localizable.strings index 305e64fbcf..bf86d6a339 100644 --- a/apps/ios/uk.lproj/Localizable.strings +++ b/apps/ios/uk.lproj/Localizable.strings @@ -1230,7 +1230,8 @@ set passcode view */ /* token status text */ "Confirmed" = "Підтверджений"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "Підключіться"; /* No comment provided by engineer. */ @@ -1443,7 +1444,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "Кут"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "Виправити ім'я на %@?"; /* No comment provided by engineer. */ @@ -2305,9 +2306,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "Помилка відкриття чату"; -/* No comment provided by engineer. */ -"Error opening group" = "Помилка відкриття групи"; - /* alert title */ "Error receiving file" = "Помилка отримання файлу"; @@ -2550,7 +2548,8 @@ snd error text */ /* No comment provided by engineer. */ "Find chats faster" = "Швидше знаходьте чати"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "Відбиток в адресі сервера не співпадає з сертифікатом."; /* No comment provided by engineer. */ @@ -2574,7 +2573,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "Для всіх модераторів"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "Для профілю чату %@:"; /* No comment provided by engineer. */ @@ -2985,7 +2985,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "Недійсне підтвердження міграції"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "Неправильне ім'я!"; /* No comment provided by engineer. */ @@ -5257,7 +5257,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "Тимчасова помилка файлу"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "Тест завершився невдало на кроці %@."; /* No comment provided by engineer. */ diff --git a/apps/ios/zh-Hans.lproj/Localizable.strings b/apps/ios/zh-Hans.lproj/Localizable.strings index d5afea745d..43a0f665e4 100644 --- a/apps/ios/zh-Hans.lproj/Localizable.strings +++ b/apps/ios/zh-Hans.lproj/Localizable.strings @@ -1245,7 +1245,8 @@ set passcode view */ /* token status text */ "Confirmed" = "已确定"; -/* server test step */ +/* relay test step +server test step */ "Connect" = "连接"; /* No comment provided by engineer. */ @@ -1461,7 +1462,7 @@ set passcode view */ /* No comment provided by engineer. */ "Corner" = "拐角"; -/* No comment provided by engineer. */ +/* alert message */ "Correct name to %@?" = "将名称更正为 %@?"; /* No comment provided by engineer. */ @@ -2329,9 +2330,6 @@ chat item action */ /* No comment provided by engineer. */ "Error opening chat" = "打开聊天时出错"; -/* No comment provided by engineer. */ -"Error opening group" = "打开群时出错"; - /* alert title */ "Error receiving file" = "接收文件错误"; @@ -2445,7 +2443,8 @@ file error text snd error text */ "Error: %@" = "错误: %@"; -/* server test error */ +/* relay test error +server test error */ "Error: %@." = "错误:%@。"; /* No comment provided by engineer. */ @@ -2595,7 +2594,8 @@ snd error text */ /* No comment provided by engineer. */ "Fingerprint in server address does not match certificate: %@." = "服务器的指纹与证书不符:%@。"; -/* server test error */ +/* relay test error +server test error */ "Fingerprint in server address does not match certificate." = "服务器地址中的证书指纹可能不正确"; /* No comment provided by engineer. */ @@ -2619,7 +2619,8 @@ snd error text */ /* No comment provided by engineer. */ "For all moderators" = "所有 moderators"; -/* servers error */ +/* servers error +servers warning */ "For chat profile %@:" = "为聊天资料 %@:"; /* No comment provided by engineer. */ @@ -3033,7 +3034,7 @@ snd error text */ /* No comment provided by engineer. */ "Invalid migration confirmation" = "迁移确认无效"; -/* No comment provided by engineer. */ +/* alert title */ "Invalid name!" = "无效名称!"; /* No comment provided by engineer. */ @@ -5151,9 +5152,6 @@ chat item action */ /* No comment provided by engineer. */ "SimpleX protocols reviewed by Trail of Bits." = "SimpleX 协议由 Trail of Bits 审阅。"; -/* simplex link type */ -"SimpleX relay link" = "SimpleX 中继链接"; - /* No comment provided by engineer. */ "Simplified incognito mode" = "简化的隐身模式"; @@ -5356,7 +5354,8 @@ report reason */ /* file error alert title */ "Temporary file error" = "临时文件错误"; -/* server test failure */ +/* relay test failure +server test failure */ "Test failed at step %@." = "在步骤 %@ 上测试失败。"; /* No comment provided by engineer. */ diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml index 2a76fa292a..3045f3035d 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/ar/strings.xml @@ -2541,4 +2541,5 @@ ابحث عن رسائل صوتية فيديوهات رسائل صوتية + إذا انضممت إلى قنوات أو أنشأتها، فستتوقف عن العمل نهائيًا. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml index b559431261..43afc3be04 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/cs/strings.xml @@ -49,7 +49,7 @@ Vytvoření tajné skupiny Zadejte název skupiny: Úplný název skupiny: - Váš chat profil bude zaslán členům skupiny + Váš profil chatu bude zaslán členům skupiny Profil skupiny je uložen v zařízeních členů, nikoli na serverech. Uložit Aktualizovat nastavení sítě\? @@ -228,7 +228,7 @@ Použít proxy server SOCKS\? Použít přímé připojení k internetu\? Ne - Chat profil + Profil chatu Připojení simplexmq: v%s (%2s) Vytvořit adresu @@ -276,9 +276,9 @@ Chyba při exportu databáze chatu Import Restartujte aplikaci, abyste mohli používat importovanou databázi chatu. - Smazat chat profil\? + Smazat profil chatu? Tuto akci nelze vzít zpět! Váš profil, kontakty, zprávy a soubory budou nenávratně ztraceny. - Restartujte aplikaci a vytvořte nový chat profil. + Restartujte aplikaci a vytvořte nový profil chatu. Nejnovější verzi databáze chatu musíte používat POUZE v jednom zařízení, jinak se může stát, že přestanete přijímat zprávy od některých kontaktů. Soubory a média Smazat soubory a média\? @@ -315,7 +315,7 @@ změnila se vaše adresa Rozšířit výběr rolí Nelze pozvat kontakt! - Již máte chat profil se stejným názvem. Zvolte prosím jiné jméno. + Již máte profil chatu se stejným názvem. Zvolte prosím jiné jméno. Vytvořit frontu Zabezpečit frontu Okamžitá oznámení! @@ -372,7 +372,7 @@ Vaše nastavení Vaše SimpleX adresa Přístupová fráze k databázi a export - Vaše chat profily + Profily chatu Zaslat otázky a nápady Test serveru Servery ICE (jeden na řádek) @@ -462,7 +462,7 @@ Chyba při odebrání člena Chyba při ukládání profilu skupiny vteřiny - Umožňuje mít v jednom chat profilu mnoho anonymních spojení bez sdílení údajů mezi nimi. + Umožňuje mít v jednom profilu chatu mnoho anonymních spojení bez sdílení údajů mezi nimi. Pokud s někým sdílíte inkognito profil, bude použit pro skupiny, do kterých vás pozve. Systémové Hlasové zprávy @@ -484,7 +484,7 @@ Ověření zabezpečení připojení Francouzské rozhraní Díky uživatelům - překládejte prostřednictvím Weblate! - Více chat profilů + Více profilů chatu Různá jména, avataři a izolace přenosu. Návrh zprávy Zachování posledního návrhu zprávy s přílohami. @@ -615,7 +615,7 @@ Adresa vašeho serveru Použít server Použít pro nová připojení - Servery pro nová připojení vašeho aktuálního chat profilu. + Servery pro nová připojení v rámci vašeho aktuálního profilu chatu. Použít SimpleX Chat servery\? Použití SimpleX Chat serverů. Uložené servery WebRTC ICE budou odstraněny. @@ -629,7 +629,7 @@ Onion hostitelé budou použiti, pokud jsou k dispozici. Onion hostitelé nebudou použiti. Izolace přenosu - for each chat profile you have in the app.]]> + pro každý profil chatu, který máte v aplikaci.]]> pro všechny kontakty a členy skupin. \nUpozornění: Pokud máte mnoho připojení, může být spotřeba baterie a provoz podstatně vyšší a některá připojení mohou selhat.]]> Vzhled Verze aplikace @@ -726,7 +726,7 @@ Chyba při mazání databáze chatu Chyba při importu databáze chatu Databáze chatu odstraněna - Odstranit soubory všech chat profilů + Odstranit soubory všech profilů chatu Odstranit všechny soubory Tuto akci nelze vrátit zpět - všechny přijaté a odeslané soubory a média budou smazány. Obrázky s nízkým rozlišením zůstanou zachovány. Žádné přijaté ani odeslané soubory @@ -734,7 +734,7 @@ nikdy %s sekund(y) Zprávy - Toto nastavení se vztahuje na zprávy ve vašem aktuálním chat profilu. + Toto nastavení se vztahuje na zprávy ve vašem aktuálním profilu chatu. Smazat zprávy po Povolit automatické mazání zpráv\? Tuto akci nelze vzít zpět - zprávy odeslané a přijaté dříve, než bylo zvoleno, budou smazány. Může to trvat několik minut. @@ -862,7 +862,7 @@ Povolit TCP keep-alive Aktualizovat Smazat profil chatu? - Smazat chat profil pro + Smazat profil chatu pro Profil a připojení k serveru Pouze místní data profilu Režim inkognito chrání vaše soukromí používáním nového náhodného profilu pro každý kontakt. @@ -872,7 +872,7 @@ Kontakt povolil zaplé vyplé - Chat předvolby + Předvolby chatu Předvolby kontaktu Předvolby skupiny Přímé zprávy @@ -923,8 +923,7 @@ Italské rozhraní Díky uživatelům - překládejte prostřednictvím Weblate! Budete připojeni, jakmile bude zařízení vašeho kontaktu online, vyčkejte prosím nebo se podívejte později! - Váš chat profil bude odeslán -\nvašemu kontaktu + Váš profil chatu bude odeslán \nvašemu kontaktu Konverzace Sdílet jednorázovou pozvánku koncově šifrované @@ -953,7 +952,7 @@ Chyba aktualizace soukromí uživatele Správa skupin Uvítací zpráva skupin - Skryté chat profily + Skryté profily chatu Hesla skrytých profilů Skrýt Skrýt profil @@ -964,7 +963,7 @@ \n- zakázat členy (role "pozorovatel") Uložit heslo profilu Ztlumit - Chraňte své chat profily heslem! + Chraňte své profily chatu pomocí hesla! Uložit a aktualizovat profil skupiny Ztlumit při neaktivitě! Heslo k zobrazení @@ -976,7 +975,7 @@ Uvítací zpráva Uvítací zpráva Zrušit ztlumení - Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce Chat profily. + Chcete-li odhalit svůj skrytý profil, zadejte celé heslo do vyhledávacího pole na stránce Profily chatu. Stále budete přijímat volání a upozornění od umlčených profilů pokud budou aktivní. Můžete skrýt nebo ztlumit uživatelský profil - Podržte pro menu. Odkrýt @@ -998,10 +997,10 @@ Zobrazit: ID databáze a možnost Izolace přenosu. Soubor bude přijat, jakmile váš kontakt dokončí nahrávání. - Smazat chat profil + Smazat profil chatu Smazat profil Heslo profilu - Odkrýt chat profil + Odkrýt profil chatu Odkrýt profil Žádost o přijetí videa Současně lze odeslat pouze 10 videí @@ -1104,7 +1103,7 @@ Heslo pro sebedestrukci změněno! Další zbarvení Sekundární - Vytvořit prázdný chat profil se zadaným názvem a otevřít aplikaci jako obvykle. + Vytvořit prázdný profil chatu se zadaným názvem a otevřít aplikaci jako obvykle. Pokud tento přístupový kód zadáte při otevření aplikace, všechna data budou nenávratně smazána! Další sekundární Pozadí @@ -1114,10 +1113,10 @@ Chyba načítání podrobností Info Hledat - Změnit chat profily + Změnit profily chatu Historie Přijatá zpráva - Poslaná zpráva + Odeslaná zpráva Mizící zpráva Poslat mizící zprávu 1 minutu @@ -1248,7 +1247,7 @@ šifrování povoleno pro %s vyžadováno opětovné vyjednávání šifrování pro %s Odesílání potvrzení o doručení je vypnuto pro %d kontakty. - Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných chat profilech. + Odesílání potvrzení o doručení bude povoleno pro všechny kontakty ve všech viditelných profilech chatu. Toto nastavení je pro váš aktuální profil opětovné vyjednávání šifrování povoleno opětovné vyjednávání šifrování povoleno pro %s @@ -1406,7 +1405,7 @@ Odpojit počítač? Vytvořit skupinu Kód relace - Vložit adres počítače + Vložit adresu počítače Blokovaný Lepší skupiny Rozbalit @@ -1471,7 +1470,7 @@ Blokovat člena Použít z PC Opakovat požadavek na připojení? - Vytvořit chat profil + Vytvořit profil chatu Zobrazit havarované Smazat a informovat kontakt Již se připojujete přes tento jednorázový odkaz! @@ -1744,7 +1743,7 @@ Kamera Kamera a mikrofon SimpleX odkazy jsou zakázány. - koncovým šifrováním s dokonalým dopředným utajením, odmítnutím a obnovením po vloupání.]]> + koncovým šifrováním

    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 literal 167638 zcmeFYbyS=|vNw#o1c%@-I0ScsySuv+f)gADcOBdzcyO2C7Tnzl?gaOF*?aGI-@SX@ zySuM^|LvSJ=RDI>-A{FORrRl`yHsT)B`0E`AhaYzl{J-lw2>enAU?c*C*dJ3kRU|l zm8I=DARr(C19p^jiEpEZJcC-|@(>41tD?_}^|!NMSCZsj2A*>5GP$Uls=6gZ>G$cs zfWBjkP-A3%`JiH+%pqN$=VT3up<)?XW`kQcZu(U<0C)LRm$qCLRTDur@{oeV6_#rL z<9CHa2`hs8o9j391to8`)?9s|_P%?+&HGLz-;2cOWyyY+(g*+@pT+&f$VR^EGeY!5k7=fViB z3xv($y+fKxMEKXJ7et?(@P0Gi^$|zA44^N5l%n?D4jnLw!$Ye*%;nz;StXg0&%)&3L$9dqi|w_0eBb2=u?4 zp+b``9NE@{ub2HOLj4b_lGNhTXrmd!pXEo>Xm>|&^d{8f)Ut$|N($KyqUC>_bSmT5`?V9b?AbdklA04zl*<)B^VkmhFO^lZS zwbB$OSkMm1oc`WJ&T@)GO<^WnPJpUmSnO!NH|Z|1K?fFW_Qj;VP^~&{*9t&)*G*g& z5^>ajAOL8XXf1;+#CoM{n8NP!F5?*I7OnkIjK4BdI>~QZvbxd`Zs#IEt4qQYdrN$*p#IL9Ln`qC!Z(Cq&e;1$TqcvmOYNe`zA&R@V@vY)O+{v z)#34jqVk$~oiy=*R_zqHnW)0Dr+=dGZOcZ&BaSWuY0TZyIwmF%{6SEc!Jq20boOXxnb7>vnz3~ZbQ9VD$)^nA$RZB!%umyrG#;7Ol|uJiw|b-O8`L0EnywpOonyBP{qp7` zTif(qyW^%5m5pNGCW=e0alnA=p#v1tZJ>MA_>Sv}A`D4Mgxk!4%SRKM&4;Xo6+~af zX2v~Upc*PuW8Y@Ox@PA!_c!I!;J4zgDNQ_&%(pL0E*%OlU`y>ICrmk=bEmrbqK#I9 zjn*$0M1IHmCGPf3i!v23Z^dtfp8r}bd7zl=0e*JNffZMk9mmB9LHnnO<($jh-w;pwcQGI(aOT|)TE?x2Shmb&&( zfYPzKk+ycifr!BUWckCooc6Xc4*&H4CkkX!z_J}6;g^0d^O1o-S2v23XJZq~ereE6 zz1t>o(jUcC>x@%KL*3Y4N!V`*gvOc|>M-$FCZrQ#MJF!%rgZtkPA&HZ_nLpZN7MPW zF#4@T&A7I}6gso~3KIpLM6qWj_v^eRcA(@MqNrnYJt!2r6SWN<#)WE0woF<%M>&P; zc8(y7TN(}jj3y;p#1o-M*zK+t1SNB)Uncd_2Vsh!aXd*L>+~b{CAK(~i+%t%80}I= zWpz6Ul?ul@Jc*&ja|~=B2ihB!OJ7Pxk?!K8?Eiq$)=8qx_=G-WjjLw*M-sN6yQ4Es zk8xWT5qt%j-0{U-@7E4nQd6J`dTAP1WCh1DTJ#(BM;1m<2$3A`;J>oU{q!e?RCA(r zEC=pj%dKDs3lF&D8149`yhVjb!}j|a>`kV5MeRMDrSX_)lYjo*+)_hhI;Iesp-S1T zrH=yd_RN4g9d8Q-PiIoZXtFy=DLkVt90=|5f^BxeLff37Rj;pr0RN-!Nn7OX<8l52 z<#0XauUB@njG081tAY4)*|2_!RbQ-&#M5*HWACiGbA+`rSM1I;n%Zb{FdKwNOxYvf zrF~II)>%}VS0X?PLfbXd2I*xn68Y!L2X2CPgQ&7s`Nc>S&n0k8O4&NRk9x#*w{w@+ zDrx$LmOnZJ+ir8>3#x{^8P+XgagC|>z+z42kstb5G7eVM+LoF2Ktop;Is*f&&`Ybs zHeE4TOYe!EZ#PJ{x>v$-Yg5o_;66`io2Nh_<4=mZ&(Jr&U@d&DnbXY)ureft)g$_k z3l_>fT{{bDLEkYKM^HWpvVG;ow@3;K!0!up;=sBREE9SA$=pKIwBMk3ztX3zf1gE9 z=tuPwK!C+yfN(>>SsIa3pTefD5Iv4wdbctE$$&--J!QWzXtOnqOWAXa|2cy}uy_ok04B?y5=Hwon2T7A{W{-oxP$t^!d;>dWDip`*jZFA4Nnfc zRX90Q76kvn=Qk!YhYwpoG5=UmSLw`-Vq!Z748)+3DTox$HLCU2iRzq8MlfLOr@WVE zMdH{~*K15MCKaTcjboIwGixBTs=Vs%_wa*rmXnLvuSM$LdzDTc=9^{g#V)C+naJC< zp^atH>y19?n-%E}k=#}WnIA~Q*kDF^dJOvQuSgDk+Oy-7;UaH|(qzK|j z$MDIdqHi+R?m3@Xi%k>=GhWxoz#ML+nks2c*rkS`d^*H5TwEJ;Pgvuy|9tiwHIhtT zZEfGJ=1$vi=`BUC1yDM)@21xMsa_#Cy}>fFLcjR=m=NkW8bbA9d_{91EaF5<*s;fw06w=D8G`M;KH`+W;8E8NmtJ->;k0yX_A^GRo8+p4T~xx z&3 zW(+TA)4nOMW@bSnt_AV)vB^^fxD$u;jwQU>3JeusP2 zFuxW!@!%uyO8-?U$9C+Xt=(nUtD}m%ddDbd{`lC1|H?U8aWQ@;!CSp;P(Mz;cxry% z=f$I#@7`lW%8x@oy?pXHc-PXPiuD57sA8D21=2jxU9oMhMbgS2y83x95Sl@~#Vgf+ z7Y4R!nstj6n1#6WYGmVpI*1c)Q1X*=Mq;hFO~DOw$SzVZv7lRz>5E=Rxv-n(!BSBJ zCm#x4LkV4_?fuPK=RmLb0$RSb^BX;sN}){=)!*5wVE_gba4D> zj*jNH3DI&d^~Th)&Y#i8*&(eX({oDcPwS0)Y{M!aCe&kaU(?f<*40Vk_>qyZ3l1(= z*&T!o(G+5#c=ebv+~d-pN@|N1w-^P=v17Vqv8d>%S%+pPh6J(?eUa!emLHuX=HEMV ze7A%PS@vEo~fo$ z{hb@nHf5U1%W+H_N8J4%qKneCkZvu6qRzF{9KyB&dYCbaqK=&uuE_w23jbBP{9zsK zJa|@h>xdJg*w!youo?cJn{cZqbkeF}8)x~Xa4LIrtTh6Ut#e-`%H44-8AKYUKM#Cy z#m$)xP}GYUqg73;pDKn@D9FCUD;v{PbKl&Vg4D5&Ij7wi`Q&S1;NNuji75V~a{OlW7p^ z6I6LV)T})zb1w({HXUtG%C#j%#u~JB4<*w<6TeA|ISAEW^8bc z;-6*3NCjdyK6H*p{EO7G&>byp=Us&5n@CK(DYgG11G8K>RV;N^3?=`x4HsQt(7JA{s|s zvyq-w`mEoWiiOyIBtLg7Sa52g1+^M77=vH(yj9cas1M~zMMEcKR=Ed>1RPB-Rr51u zlHXEz=k|(y?YkmB7FIH8{9wugFP7OYsh+~t;)HmN=AE|5uj~k~S1Cr=kX$ml!H~4l zmuM;*MjLp8VW*Kv$FCBd1D3{Ckjahp+4wA$@nddHc;cpn~9@sVJ9!-5dAP9UN= zD*|z368MngwvyZb$?Ci2Bf*4nEgE(0YH~c^UP(q_eoU;iaXEv?*@363btZKUUjXVv zzxiHCHWxhrOcy};&i<9lfMD=8VucI!aZ+x{03U5c$F_X5n%}W?CE}?o^%o9K4D=aY zZvxGwOu%~h`+Q8jMYahKWxoj3loJ1z<**Spr37_zy>qz|H>HWSv?m{}<+l&!)@#k_ zM*0g&J)U|x$q@Pxlv93IF#V#TQ~^PX{jP^ykc1Mw@L6G6`H*0Ae%?gv3sCR-Y!wB>MItp>l|Q04k*;HNQ4OsyO~|Kw@>WQ%OZ280Z6X1& zUzcpy+g8@)3{fzQ-;hYcsC|ZYtFTddb|IvPL`!?IF7%M)AjAa2DIfJ6NgKA4x!?sb zEYen$`~|*tN$i z&tHb*PitllGSoL?9xsC3HJ23iL!DnTRK8+r)wbqV-$4e}rZUGReY_ma`ikvprfYWu ziRWActsHy5I^Mz7U24X=_@(sM{aNT9gh0BLU8rAsRDvnp>L`?Uiq@@saNt;8{y++% zqsUchjB>*2e)aOAl3quH5iPhn=O8ann~-@;7bRgP}>t^g1pit6zV51nMnw2Odj z6hWJi`M>~`GaXl7L$SM7K-%LQ)6Fg&7e`0?)D^GHu=^6Sf~P@RZH9#fT!rbxDm&7X zqmhxFvsLeDQ^Bdf+s9#toB+W!MGzjQnS3n{xf(=Ece@+L%{CP@;1TChQM5eAA-ldN zu`oaR&F`&O2U)8G>LXY?ewV^vD)g7%Amm{CvpPl3aYw^K(7g1t5e_J7L6p!h7uJY4 zyF356Vcq-HY6glYx1PwKt34}ZlUfPeEte~cr29Y=Q96A0%)u~}^<1JK_L93Hq+*0QH>gzoNiY~LmGkjF&H8)< zE_SBf$R^aJrGZ>N;Z!8>O+i;aaeqk1gGuMSIoGrMod|40JzJE zL{n- zW%pf1SuhM1*h5RTTh@%;D=Htl`HyQqUCLQe_-(`DH%{6=Pxlw^)=LS3@*}mRcd>Zs zIS`*CwF3u4M6m)qt;|jFNknIM=>W{utf?~B;ea^c zFJ~jElh2x>nNKoEGKu123Qj40ey#4Z*epBt(&tabNbKmI1!yhfB3F^B=`YZfAUrs{ z;Kq2-I$ICyOKO>60}?tG9Sv|B48$kY6zOxukojo32noY%guKLQelv&zmo(D()M0MA zQwV=95Ql|1MStv2sH@F$3G&FP_{<$hJPi#koc zTS3Dr!nV~)JBuhECvul0#AF|r?_ze*SYRgyAr?H@b!Eh6;(PP9x1PVU*=@2D-~WP$ z^Eali?4n$te?1oTg8L z-dp&D2^3oRKzvuHnhSHu<|5B&F#*AFCxr?5=?P9!NLND_t4f95efLG2<)T8?7f~b*vne_K(MoOYW;M zPXv48vGd)PG$9gsn5B|ig-(ePH<*&oNj&CKY)U@;)`^4&kCGJlej4Ce zuc=rqL+w`!V*vlkfv1NJgNvBCRp}wJf=(lQd>Gvug*{W}*ijZ&8NaIv@l*Sl zT8dnW8tP@1>>T)otJ?{b+uqaetwvGWDa=mG9}NDnYJAhhhTip=6Vdpp3)>h@q&Ie3 z*}>lvINmd~kst#x`Wsc3Y6Kw{f`e#I#hJxfiK4r+Cyr(RYcM@e-tfTCUWD<|c#q;( zP`J7y7Yhyd?k>Q8z^I=!C^d&%*~L=8IOlCT9^j9|3Re_rey`rIVITU9)nPLop~itl ztPb_hw@g$N**7Yuhtz?HJWCcAh>$N_O8EQN=wA{c_WKh>#4nU-`J~cTb7f&XK2K~Z zL)9nbS20rdcwe6gkzv1- z75|yGO1J(O2AL3XI!w((hJ0}U*8E4>&%cr4e_=w#>Z*dGR9qV^nGJfI#9597VnXaB z5Pxu|hcs4PkNb?y5X%@Izy{0)il;Ql8jx-bYOGCJPQ9yozq3V!eI};MC z6cFZivZClVInjy4H1c@ftUm^>15v&96r}>t_1(o9OH$J@hB-ED|(-Fcs^!I zW3Gl6mEaa_jk^Ch`7%AZvmIU1@68sH?muIQLePy5{?7p!jC>FS9;wh!6%Q0{8#10qkCDHiv!hYg-bey{t`E=#$To4q2`&;an;V_MxvU zo>dWAO$$C|8ais*y1~PB8a9+7K+2iU)!N;JK-KH3^J<<1DZqv(xLo?rkvrxQAvC8K zLw5hiLT_(IM4J!_-ysPPv?H)z^p>r1(WX1P8yQyS@2ns;-zi?6$O?TTH$Onb(We9d zs5+=aj14cuW7iYBbI9d1oNkuV+1Vr7oCy?PFQN5;d-Wz?*N1|DE6FZe3H7fUT z4TkI`>~Q)9oX8dnKN`&!hDz|n$CM3rah<3fI#I{l?|OcYtoqO@7xk3LFFrAwe~3Z= zO8sT6+`LZKHzXF(Kr6?cO=hx&3d{6l(p)D#!y~lG(sbFXo%l2a{RE;+|AN9z4ycX| z=aUm7xv5PTE{qo-sEf#l_xXzG2d3BUvhw(e_o?cVJBQb~+TA`EcqUTow_{{hd+&YV zcaXh9ZM1UvWVQJ9={1`l$VBqUKDm6e$X{JQ=Ma0Jq@eGTU0B07`Si<8z`V5P>mt2O zXkiQUx3ISnWs`IyneA5_`Wb~b&|bsg#~{pbjv_$7VU-Hf4AbJ?qY?oJ<0dT@8Tzpl zcXrB?UvYkL0tbryZ0uo8yH^;jY%9RC(~z_6DD=|9L=2sMT?_B(W>fcujE`a$`Ol!f z@lzLxl{o2RA;}H%1VUGN+(+l6wRZx?2a7zAn4Zf@Lyp-4`id1(H)A9R$xKo)$=k)R3m|(1uDHWML2E zOn&pFnPwHSNm{YBdfwE?I6YO0_{ee$9OfAy(HsiRH|rySDrI7dzHLkc{bN4$ivZrV zqT*R5H2wYis``q^rG227ZUT^kkL|;H9N8j0dL*@rpdi(Vp~!81w?}@Tkp))6K-wBW zn!K>no_q1WeE2De zvGSH61c661Ll_MRNA;CiPJ<%))Us4M$MRv10|hSSM7(?VTzG0%mm1ed(grB^kw3iv z2eMjfcemG$_LiBpL1i1zfxtsV@woJeLHmf@pqh^|8_jZu>vHvT@;i$A5~2+4uUT5& zrFE{PJ&q#OC6Ja(^fj%P-eZR!jO)JI^g&quSJHS>%6bmK+{SQq=NAbAhws^KiVL}u1a@kuN6iJ9r>(48@1`&Nz=S0?wGk)^n8Um;?mV70jY+*w?dd)5pC=-E<+ay;Itc9}a98t}as5XD22lNWbq?W#hUm=q{8mnioc36&!eEhxpRYd?hjKuQ5#R?z>x=&EP(~w` zR~_n{HjHhVB%{PzFTDN4*r=t`pCjt_vWMmOdz>dc+UJyVrJ6kT6I1^FGvj$6PdzP) z{f+4j1;f1xZ4)JmfeJ;RLwq5?0!2mBP2fa zGY(Kvvr|DYH+79yRW@%Zck)I>UP7{I9oKdTJ`uDm3MyV3+Q8_HNFExJ`HT`7LjV%U z?T(V4TsK6(szuaUR(clF>^>AMKK4Qve;D{;zGq8>;>RmA;Z%Iqr{fo%J~U?603;ut zq*!2&DS0Fg#;y{vwBO%y`euCYTYUAk3wl^?XbcyPdav)#PTCCH=(QsditQQ-J`5Ar zs8^mqMquKOzk!0C8D!}g{}h^)4@Bh4?GHs^*6aM324vWKk)QIhgC%#c#%JsD~L?msCwHmk@QD4_K= zj004A(kpQx%Nbx#;sc1YfO+w<=j@RfQzVlpGoL7+jR2la)y^DZoV`;MJVDn1Wzt|) zqxxO}DQ+k~CvRm-3Qcn8``X_x4Q?>)-nJib{qPBvBtfEOwBrkL{^vbu+l{Q!;Du@e zCY(Ym4nQ=SMa_U@A-Hr>+Y=X5uK_TABeOMTV!LEyn6FO)7+V07P$cDv#7HFJs!SwS z;zM2L09(%edG2{|M@IbJNOvj{h@4u|vS}!~Z|x8SOPz_yXSqi*-Gs02*MGK+Z<)-E z`6o$!I64^z=fIq9=QUxy%ORl{BtfE?Nn&xSse>W#2u^k; zf2{e`iVBwxs8cjzccF@Dq8-{MB#5A(&BTgW|q0W&}(hPTa1 zSeCXhr}-!yAUEy9-CKJfTD13841)v2wE%^V30;cuzscJlM*0M=Ej82vEmWUuq|IdW6t>BkP3CTt0{=ObnV5z>|2;` zVT4Aa!!3ENI`hQ`c&CLKY9#p!Ey*t;6oSWQ$7ImyWlPU%;UYls0guw)+C}$QYIIiY ztJSXAM1QMiru->`p>E3ERymGGsa?FCTYxb!l`LaEF@cAFsOJf+1ma7M zHH=fgoYo{zK_CR>)Vy$)9@}s62MuIpQw=OZOUQKSqpeYL4ot&pH>dd){eH(Y4%L?Y zfAeWVt#Ckf>e^FXi94@lo6P}at&n)q@|FC!zZ~^G z+4F23QQ7XoQReu7l5`+YuaXARj#c#$itSQie}|M-w%bIea^jCPm=1buAY{MVfljvc zM5*jZ8vFxt|0oliYO9E2B@kt;+vgQg1JOe$wy;;ieCs>YqD$lLRO+N;(RO2mG&mIU zt&>^mByeQShlaz z%xlu0aP{PhGy|NI*}sJ6q%k%mKy4t0-YnX6@~IJZfik32&^eWavnMpJvNw&dn9lNd zOX+<4f-nO#A$4)b3M2iYi2wQ%lo^2X65a~-8%Ol$EQB+Zf}5~XhN9-iLQ-J#`%7JK?^|2?piodM~(; z4{~xdHX-kFL&SW`uPtkNMe{tdf%Xne?pUqWo;^NMu$61-(5U>0rn9jHcwm zsc#$r+qs5uSE`e_2BwLA4^F#!c9nzda;@2oZ`9OfHknxweE-%~U3~U_XfW5{3y8r| zDKG924$~=rmDzY_N4yVJ z&R}vp*Kk$^L-WH1{@?f~d_Q>kGT-3V2GaPlLOs)hVK(1T=?WNs=Om1wN0Rdl#|p~p z329M88mU!71^UxZ)cohX3hp+vb>*epGnxS%>(Ge}MXg#mFK?g#mg!ZOed)Qvs}qs1 zSRLWPu^T{eSeBgFYZN3)Zy2Hyiw)|kbdl`y}w`=Gh+!5 zp8mDe#R*_^5~?e7uc%(-*9x2QdcwPwICcJhKM_+K6&CmvNMebPM%Bd$kKDln>*eQ7 zvT%*$`pVv_#W45U#_yR7b0@k76fB{5oQxAY*-TV>MTrE**FPqF>pgUS89AUx5E zlryk>;2b-C$uiNBVT6wsmg{8Dy^Aq^$!%ykVJ$uK#e?{l;V@p{rQpOQ!B)uH`w-el zM!U7NWv6FhQgu~A72h|ZCwE7INYVoe-@SCVa=%&$KEG$KZ*d_$x1tOqzd^|l+dLF^ zL1@#qj#1`9Is)PzrycxRwWKqALd;&_x}$%N>2<(&i(C*nZt#Z<=f)2*z>mFxa(K6V z-k6+Oly<|wFZiJQ~GNOom z_zTh!4lXlP^eQp`@*1KXjx_%p?OHB05!JY{89V6aDDQ~`J~b?%LJL0a8OH_=d0pcY z5;6>5?bIF;^Zp#7L>jU7adfgEoP;&@Ds>YZCZD$ueduKzf$|V70^|I#u*QDKoif0VJNdrhTxf7M|>pJ&C*8vF~4SPYf z%l`%wI?;`}WXwc%lza66vv2G^dF9p}pC`XJ;Qa*_JQ>{^1<~9?0cK$fFC4 z+ch~q5kOMdWHajpMI8Fyw;may3^z!7hSHG5;+L<*LI`fLy1Sa$2V-B#Zj4z(}zMt z!Bgh+Y~o9Ety>TW2K7MO_OxLyV-`}^UDcc(6!>mk-J96(e7{=tu+# zU8xA&DDc2r++pN26#iw{JIOh*bZ7oDsB54h3kmp8rrv^5{cu@5V$a{cBgFhU!mO%W z?oG06AP3Fp@saJw|5tmlk*q9~)E4iiwrUT}wvdpr?4o5~oL_@D%4B!uhI2FE4kbv* z*Aua!x7n{o`l7c_@I^KpVBCU}b4TE=lZSYMj|_ZXWeuL5?78q`Apq)7yl|!`6r5Xs-fTOkjVIS zp&(e0k+UJ`r{FJ<1XXAgBnw)FO3CLB)h>|`t?a?O2k&04QzA4=w~Dg@{72}1-P|Yh zwz?ztXV*U0hwEl_zZTo(@lLB}tDD>bp_S@C8zpZ8uO&CRFW_DG?A%@W9*67Afw*C& z;jY(JzDHluWMvAP=qr<6!0oO};QH&*1L`aK3-=r8Rc;sXTrj_D54;0bIe&h! zdImoOkH8x~0bolo4Os1ZbpQEn6AXSPg##W4{Q+LxBfcfPS%Do6z=Mlm;63oH>;3)D zd~c0!&*0|g%{wqy=;AdLEb;!+x5*ax7bWoPp3rXB zu%Ebh`D5xIqtnhEU&@!RW8ebN7t9KFd660g@1}uI!6%z)UDJbC&2Tmn9M8&ctTB-@rD4<1~{G_#LjZ5B^k z{Vs1eP0e+fNa!jP(+2q0AO8}`zm(zcn}P0ZvfU$1#TLbk!BR+J-?XAe$!<=)f0T^7 zDQ+UV1g~Z;$ZGc558)&DMeLQ&z*T4b59 z?^)$a!=J4naY5((Ow=Ti&Xq!d+bkGext|{z(!A(K8eS3?95HM@or=zw9G1|}UMcBx zOZ*dEJuW31KX?WUh~VT##szWrU`e^BaTqpU8XAd@IyEi|A#`I=?Tz_~PiG>z z9*td7U_XeY{r3n_PyQdO)L--WAKGYr_rJl+-{Bgt;3tS)X0EYIfV5Gzkpf?^7m^zn zbgYBp2`Ae8!@Vfr@X^F-XX`0N!cZi>@;Lj**h^4b=ix!HC_yXUoWZNaOPeGv1^3?v z2^aeHS#$IM(tiFIll@QALk9kzTIJsx^?&*TwG;6FohkhzD=b+kU=I8LQ${!-q!mt} z=k%1^ulB=3s+|p2SIj>be0+!=_u0hn=N=QWfrg(Cq(qoWt_$)~V>B6j0OHNuW_D(D_P$zGQZh7sBbo(0J8m}Xm7>$0)m}ebQ?zK>-A#luUs54RS|d_ z#a$3sW{s}b;f~T2Sg|2W627hfs?|GB`abzL=t+Sh1>51r>Obo!|FXI_TIXiJw$i}5 zH~zISid;%Em?%DnqVCV2}ixv0x zSCy0H>yoe8!v!rIg38GEcCsw)p`o_lU<&WP4?SD1)}=Zhx+H3#_udNH0u-BaO+$7( zNTma^zRwfP!KN{=-N^do*7U9y(71rnvDnk9+kN4Pmw)ezjDa9L^SuzX*@VTB$!sAcx9 zvQc4yOX@J#{ILh-!l{>rsni+K~~Gjg}xUw zde?6lZ; zcfIed@xRi<`Y{y|scy_bHp7g2S}Rc&T>2De5$*)!nG?o=K@>C~8dI^cF#aK2E<*kf zI5>{BixAwcMo7gA^J16BfT4MZ>x^?pu~$Po^%Wokp`xVCBxE*6;lzE_--HO>|8DdD zK#e%kHD&m1p?_$`&__WnV~;?-g3`$Je3%hcww2whr8IOGKu7GCjpnG-PIbnQvjI!EmQY?{TE!Q1umK;g?5A1O6IpEp(FrBz z9+_(|qV9#ZgZ{m>-)wk>c*r^-5Kj$~{tejMJUTv5<3GRMcQdyc&qBM)g<=kjhYiCc z$)NmIlyp@Wc`o+9383__+e$D!wQRt!yjwzJSJc!FxlAs&w@=(@Vtoz7`Ze79vYIf( z+V!)(a;B-fJuMz2A)aa)90stxdVSx6T-QJA4|8IbSFNdNDn4z-&lv5F=t@mZ3D5gh zxp(|+?6#bt@s2Z#uV-xDA)UGpuQ&dl-v0+f$*vLV2W1&rQT_w*fu2~0Id;LaDkhm* z>(b^yD)V;8yDoi$_N0dq!R%R1B&E6KH?R%>=@sI1&Aq*zDXLBn=8n6w_GqnL)aKm+ z9u7?EA7ZHWlpAA1VdnP-Dx6%fJ%np2x&>mX z;*Fe_>D00dsroY&ij~58?)QMEpRf9m=c$R2>W{Nk)x7RdKgjU_N? zDwn0+<{xcn$P{bNa<;npAnubSy)N_GIu2hg>82FSXF?q!x)|h*^ydo$(5MdD(P90AM?c(|lX^JDLmJ7V z^94~kf=NxSOBNy9ZcgF>P;3EXqzZde=9PTD{hD&rr$XRfEn3W#;Ssy{imsOVP_9zhs+iJrC4NSh7| zP7J-&9Xy=z$yIz2^N;IK${4X}-P|umn~$z60eTZ@73uBeCkbhYh zcADzu4poB#33tZUPvU+?F+mhZu73A@|Hb{cn`vYIbK%m=iO}f6tz-s@k|3oW6xC_& ztBL@3zo)Xl?||P6@<~tAq#=>7!w$+^Rc1~uc-=?n#XXk!Mx}m3XycK>oio%57dgyW zqps590FP`ImSlx2VXXJZV>8L;g>doOBQ~hs#X)Q@8Wo6~6A$9W)n(T|R$1JOWhjId zLV5TB)|t4d&l~(P(M*XPwb7LoH8N9Hid%gQCJJa7dV*_O5Sv1*CVFI`RJl1`<%E*C zg3H;xoi}$Cb-du*QUk61z!t>eDNhvj3OG_!)i#swB^>72!!%o-|LxYiGw_)^r`+M6 zi6?jZ00eCg@;_IWMj9YB#{@((X+sdRglURC^6}WZKa0&MJ&$Rc!Q+xH8Gk0~>Xek0ssx_^XFj2tp6viP7EXfG#3g6o(K|+VOG2~43hz*28 zu;2YL6@OYcF8Y+H`wQEs#OHWWcAFyBWFeE`8ES=s2TaeySMPStrXpMk1LVyI!(` zip`ANJ1T%9*rO67On0zahwd=zpKfCQF_TL=qi0GBRZZQAUS=YB#>1kf_OYwymXQw8 zdm^s#?}xzXV!n#jA3`6Z$IIoYj1xWlI3gD4}as*rViCOrjGTKfeUyWG}o z%&*Q2vTH>KHOCs}My{0G-Xsj^n6y_FkRpeTeyByH*Z*A-Na5z6&K8B)PsV=7UL zK+jphuw+(uve|W*D`(pgS34Me&^Yu|0C%(AWq9zkqSZ?G5bqVfeWir2SX zoj&rtAo;J6CwEr+-$_5nA${z7OX?1GFYHIII%^|ap6Skh(clg=gq}GlW=<}SM~;tK z3HnLLEpY#{u9yD3BoY0LAwrT2XH^&F=v4u3ATm>bA?31l_`(Oaw1Ugl_Om|9yAqc}VG)Po zE7>}n=p`~5hBLkmW_2bc}Z^IWzc!tUZlRPzY!n* z2YY879aoa2c`-Ai#mvl-#mutEB8!=2F*CDdF*7qWGlOL@Gc)D7ws#t;tGcUacV^Dn z)9UPea5z4!ZlZ!P`K%V%ApAQELyVxo@}o$mhQak~s5nKU|BI2u4MqlJrE z2zhi${-GC3f1zn(R9-hE0P*GcQQ#ap3vX6cnvUZ3E7VHHCTf!kd}<#4)CH+Z4><|I zVE!f!cRBS7M`FNFr!Pu!5VX@P3~Y%#zUDHZ-gQ@*#`=}-grviR%TDFW;j#;&>0yET zlm}%-fG#+o{ew+Rg*u^Wg%>qmI{}F~gH^6od3ZO3of(Ht?R@d1*X54P2_wLGOy2J% zSjE4|zM&*=OwQIq3a&}b>g3lJlb~lXwqzGp_v}H3$1S1}lj_=b91&$}FX9R@dpB5a zM*t({3r*o@j$>+Ctfw@IR5)C0l%bnsBbk=R&TxI0jd@D;+rT1P`xur0OvjT5zAn^c z68r-$F|hqCM4Pvv%F3g}z+^VBhDZCoZw4N#oQ0EdCPtyrIl-<=1J=3!OSwLWSFGi5 z-{R2o1i<-PnIpR)0Bvpa5o^#u?VLkX=jD6&M45FtF;a`cx^ z_?^rli1jx6H$2Sq^JiHjQgjQUo!NOgd_im}(*a~WoxBdIUzBSU~4HxETP|Y z^JqlTNNe)?o#|mO5T#@B4kV$Z5PFq}L(IDvLIWw9Z#Z%_MULgmyh23ozzr>A$Pf}m|G7(h6ud0j*UP$rEfWM>oQ zP_!>3pTzio5pP1Jp+tO5=D>CsFjZ(#j)jacm^#e#2V2QTE}b*&ZH(0Y+iY6(!EdD0 zehCqHK-=B*rt!Zw^aW8WK7J>MlO(m0kVJw3cI*MF))LuAe^#u5uo!(6u)*ISdomK@ zdU^lB5D6(9VyQVptN|ei@)it-$9l{PReilK>phCTLkMV_9EP6Z$gXF(opW~kWbX6B z_uV)00`v=8#8HXnSlh5~MLcqvpDMUD8eO=+jF&RGaA~@Lu*jV8WX{D&w3-uFJ^d7~ zc}A_QCZ--eu&_Cj4G8cKd#eh6*T)u>y@(6tv)U_mw9E&+<#YjbtWn8}8c8Thy#fmb zd#GLS_du{HkdmA#_=!j(6FnFf!9;ZN^#yCFE_@S}(K@*!le%wp^?YR2NjZ zR9Wb#FO08jyMx=Zb=%{5kS#T&ezB zBnplBh3u#Y*c}I+ZcMlKu3WOCRq^Zvmn&X8$rvuGC{cEFF~*5q_l?M`qdv-;+V_VC zOGn_oa7!{B^A~~FPrA~>xCw$}=&M1$QI>L2s)cGKqqP0a0!sK?CfoEdR;3D+Kr5sI zGbyLO?ZM)b)(pWdDd<7<4y^q`YCM#*q2(Zi2i0wU(gHjHy>+PH?CqjGf_RD(5cWb5Ghd zM-n=O-u;Mk4v8zQz@DQq5;0q)n_!xs&i4&~@`mj>bEI2Oj+*$2JO$EmIP0G4a2)Cbs zqnWorf_s=CRfHL~C$72U2uqjc_$ObDpK+8uV#|-Nak~<*K-#6?iD(pWs=_&s+?RP8 z|BP?n`aEX+In15HR6z-hvVWs~6X^QSYMkiuu1FuB@?-Xae92h@6cE0dHvN(U5;xWxK=*UH4am-4Ic|sMXW1^5)r@awL|dv@+VxA|;5%rm8$;G1 z7vkosKr;G%#t5wYTq#>lHRj&Y`fbxrmB}oHGWV{CT(F$fJnVN(lQJ7SE(yp&X=`jI0_{hWT-cT++~{n;+yoe7I$&^RQNa`w z+aAGw6qyY(+0mdUlyx3^r8+k&ih-W@6XVNF4WBT3A%Oj}AxlpE;+#&$Ln8z*R`!QW z`@mC}HVXQ~a@VJfbenqC94ciRXse@w??Iru+x-~r+@JbmS1^Oh zaC_3pJ6_Shy>NIpFeYJZ5&krSaU{N*zZ#Q5@uMxiVz$&23$U9ywb5q@8tu?{`QNn(@qtQ z;T#X|6tUuZXz#%*rZ}Dh>TwsKysc<*G{!E0lK?19=>03t95WFH9*B!&{Cc)N42F=l zek={5+43f=j#YA5H38s(1^qNj4@+8av`Fs?vlt}gE<~h}A;;5&$-qE^WIByYY6YU% zx^lO!=9*jQQ>Zf#K2-N3dR9P0wo?EsmwMQO`YIth4FR zl0OQWQt>mS%{WkZ;%=p3dw21npQy%xm@?WxFFIp6nPyA}v22VDhuWH8#A$ydFzhQ7 z>!;N#bj;v5!f9M1dD5fx_{()@{AH=YjP<+-LcF~Ln3y|GKM|MJWW^-2vEv~AIW^6? z1~a&i?fj(I<%smGe0V27a|`Kn3W4_MJ-XJ-`TcLbT~2-zmWYJHI|3aFpPbjGF2n$l zhXc_FX8TYz8OO{{B9y3pl#dLun*s4+f;GN%3ty2A>vXcH?9Sdu6a*3{RWH4@R;ng8 z-&-1V(|X<<%)2Ok}m%(Sv9vw*M5cP6|+izAnB4Njm4g7W1VzRa=G9^)` z{$pC+jR|lQ&U`a_^}^@bFYIg`f!p6@Mph54>|Re~wF=51ThUhr&p~vl#6E-OQs_Uz zM4+E$_#+wT=a43pdJB49$$G%{-aJip5~|DT7#z5Cp(#@c&t+;U83R()wlZvD9Z$`& zDcrqA037$Mh!pUhC$Zm*op1~le=3q1Un~BmC?%>V{+9e(@}pIXd;loFYpbAWsQKOK zcQZ=1uM$i{(3tk9_E}!&vFqv1#_c_jP3bU-3(hlij*Z6{8&6iVpU1!DVwGuYtr5Gk z1Zv>gl#!RNY(2j?>Q`K<7WoiY^@H(|h@gn>Z9;&Df`>w2e6s)OJlXRV9&RAK2~hog zY}J)RtBl2KdAD))GDmjk>?n#a>zQxd|G}C9a~mAKd)#xdON5pZLT06(2|RprC>v~G zd)TUsiYK=JoMdI|B}?}}OTgje^=S4#N^yUkH~y2DY)~ti74dJh7TU%L`$OZxeU$!} zUGWZjgB6l5p$l5D@Jk>R^@J(|O-ZS=Pt!r@!5g}d6c1x8cWG%w0W}$lj^r+ER&KH48>KO~@Mkv)dC&x&f_!hXKy>rZ zB6$`vA$0`!dBCZkb02lvDO&+DUC{Lm4w?2<1U+2J9?qiZk3#lRm|c-FJ#dOx*Na*p z`x#mPh{!ChI0@^wQtEv4^+;qWdSc=S+C8*E>n`^!u|vZRk!ZzP2zvPXHEtzw6p1^G z>)keYJBzMf#K2l*E$({pFIdj5V&!_!xQ%bOx&w4E7acw)`$aLwL?8`%?*gH?IQuL= z>ou58xV@3~P?hf2E46v`GrI9;{GD;x3vO%ORv=H1{`4U-qUM4G;NuS_bu0|jmNkjf zBWU2dE@D;-H9N+*x@5MX)NJ8_7diu?BXb5)Lm!|Y98N#`pi__WAY4Ug^TvTba9uq5 zR{DA$KJ>Y8(Wd#$C7Su&{S+Z&s#0*MaQzV>9=dnZZ>#uHq3p@C%FRNcd#&fi(Ie{E z4tw8fJPFA@((}xE%Hx*rozok=Su7P*wb4^29A8%rS-eX&KwV>s2KtyD@U{$1I4n`U z5HsHXI3L8P_C8LiJ;!cM>0I9?Ri9k*049RY?z!HU4{1rk5sa|q7xQ&HnyYj*&Jk6> z^Mrt-;xTz$l;&(RY0YERI7 z5fz?$KJm8xu6glVJZdC^k|u}VB|-{jOOY97Z17#;>y()WnO3miIMb7ZURk(xFFb@#x&p>VLJ=VD($z_ z3X7Pz@t+RC7{~nqHPu>JTFLw%EzCt-9mx9 zGRQwu)GmlbkHElxkoVgbpzXwx2NoDHkx_GI*fHI05wMlJtl9G2J9vaG#VWs!i zOJ3t14xudd5f8-fyw;&<3`p=gv|nIPwfQ`?A6#0<1G?O^ll?q$kBTJ>Azc%AT~R<~ z>=;+y3q1d+2dTZ#E{vQ=S~`;h)f-T`)uc=3uDy11nf$7ios(>|^7V5bGw#zDINL4Q zEI^^dCcf_bjcr*4yy>)&_)>5nhOs=A9DjtaC$fM1aB1-Sw08m8Y5G!Jz>{XD9^P|5 z(^(oj zi_3&_qY2=K`v#KQ#Nhpn=wcu4h{b+k6N0E`P&f zAPUUNvJS*OPUFDS8^br>qAHYgixb6kq_+xuw+y#`uKNZ5JykP7)!JUJwZ(v9_8kBL z2U9FDXW*>B&_+%48+hX<+1;PF4nb43<{Qs$HA%m$#fpQB^iI*M$kiqzWJsMax_NAa zqE-f4G~3JbL`TgS4j9b3=q@7(-{KL2;F5cMqQdnc>Zhk*O^K=YWAcx4lA-biD-+cv z<{N>@$dE$lETq# zj@jQ?z8b3QwV=sY-BiNlGma}Ggj>$pXeTBTdwu_5*`#AKJZagqVk%R9WmuQvog*#J z^y97A-^Qu!jBIf8CVoCd+AdHNP-&&M|65!4*i^yKVt-PlJPz;-wV!-_b;FPG?UH;R zDBqIV8xo7kmaCeoS^a$3?BuELoB@LF0Kus97|v7&QJ6a|Rk4+bLVdUqS9^nd1ngwi zHNDRHUZS)vn_~c~-2@a$uCa7c=UK`pTn-8T?U==$|7cM>l`CgEfp)wTS{xO6*ZUq* zR}2U2eeE>SqvJz8MnmspgMb>e12F4Q4$z^9JQ|;pJS&wkCU4#xn6}k(YXeK#wgV#! zf?2+BG8un-lvE3e4!?`wWNAWU5Du zZGKGepV=0b(chM~TSwe0ObLE@TGG>0GEPyv@sa{&^zHva=Q|-h9=kFFgC+DjUleN? zlW`wa{C;dTAV-U7F$G650y-s^z~1T8Nd_78(e8ocs$j$j8J5R!oQf!Ill~EHHjrg* zf=o*;P5-{K9zl9$k965X`Dz}js*y_>X-toI!No^q5b-R;r(`eQ8Bg_vH6RcMzRxocF*5gBLPs-s^y8NQ#3{cm7#) z1}1>c2b^ET2x&fD3--ndL;s~xc>C)G5HYkHY{Ry5YGzQ{(FnLB)ORi?6r(#Gx!4_P zQ7MuZoAG(Zdb2LxoeA18<1}_LVb%(f_-+}*%3eUwJguNm+QyPEhxZ}j^$S+o>iriGz7mTCpF)~v#Jy+af_)auu~Dy7GJVb33Idg#N9du7r_QQ!K}_CY zXj3(<>XS3^1M#T+0W!>BOcHZ4oXT$8#+Rwq_%Ht1(L>9nd5VB7UXVZ^50ht0+5`~+ z$7|9!bC|^Z3Dz|%OG)eE{QP@xSopVA#%Cqam=H_UQc^mP$;WN8?@3gVF~7P7O(G?K zr@mLjAz0?BQa@BV4V&j|e_fTQ`JPZV2X`D`!_uv`fG9zCRD3T*MHaqy1vyq67aR#_ zTl+FgVvibx7XRoYv)=?C_*Sj9Ah6@|qwcJT0_LH_TUeV_B2MigxnAputj$<>;oT$8x!vX`~!HhDx29l7Yxn>zXh+{Ep8d}7`WrTaw zcFOoT`yqLP?XdX6_TAyq$%Nt9@&=s(*WeJ?o=g(Ous#f3{%dc+l*m|P-rCS#N#?%) zT9l1b3%JAf;5tUr#!~O%O=3UAtfw>}ybcE!0vk9Z@%+eR6!>OeH^h+;EINo4lK^@DCdE2L3;qiUP@%mTeb73%7u8CrQ31vH$W?`5X2^N|rWS5Zv2)aQ#huE!9oJejqI z8LtkT4Q*-7a?Pw3#vDCYaR%>g4G95~t?8Wi_g&Qc1+V%IzzgbhKCXYtncH7fuRjH# zza=|$g1=*O_clWK3Zk*-SEg;;t38>QfYB_S(9U%>s>O!J?q~&kVd7US>@@d-^H|B; zh(;rKBa!=ZU!G4P zhzql_b#XV@Uuv2O4Bl6@u!mjSZrLp|^57AdqEF~lhKxC*s3K@15GV!Ser-m~W2717 z^kDKL%sr4MTtE15+IyCn^Q?BOPP>ZtkhMGbN&wQC<&5{&fiY{??=c{B5t$w=hjvS9 zPz_L;AFu%#w5k^8h=7T`bots|yE7R26+nv!pyyqX0DH~#xnahg$j4_*v z6;pN6DjliNZDusTY9GXo*Xg?_-XD(*l?dPUT=je`lk9r-qgY`-tTgnBQO{vl{ z0uQzQ<*G76rd`GhU(auYfahr-c9Q=kCF8O0JFu^TD@`5fPan;>d>l)Lh7zW-Fg~K3 zxGEX0jF+58x`|hXtHqX6n-Ry2Q8Gfa?s?OMW&J$zj2K8tA}-%)K{r8+`LnH-r=;8f z{b)nS-kEpy&cwU-9wY1$!UMJuOR+4JQ9>sC+=m&Z{1Ni1t92|H zu7=~34(8%yeMCaBm&|6QG6oO>WC@OOr&u$xuB@e0cDE7NkxgC1O9JIf)L!>qHUriM zIYi&Aj(syfT_#imq`uyFzE_(CCGbHz$y}=IHszUhY*kz!t1>dU)|R>*;)9W8t}>PT z=&+1-Pta`D9`AT!roV7}RMd~?sMR(vjI5`YQ`nMR5?D)|uZyhMJoBu3ae${jgQi|8 zc6%R~l&&I#3zx=}L%Liuo(myq@%pFt6H1YI=wvJLwkXyA07`#=Hzo?I(-xtL3j!8sspN3gwGp*Bt=o0OrlCY%3J4G#|Az;e{?6$L6Sc^LP z`1l$03`6w-KTZ#fi-h>bSHr~z3Esl1%X%{7F6v@QVa-PfFtuQ+8;~0?A`xm8<9N~X z*681mLaC}n0K5l)0Eb zYZ__$peDr{PQdUYZu{ePrWUB3C_rxM@98vM)IZEGp)+4MY#UoiJ=oFCrGml}FrNb- zoZe#8>Q=xoQ?YR=Z`4s_HtM;caPICdTtFb@*8?-^`bNJ>sR3USW`n{fE8`X@usMi- z3kchHT+(yvF{P$t3%tQpCO^Egd>mUeG}Z)02Jk7Q?G9xi^3SwL5j+X6!o5 zAAyH-cCq9_LCSjJjt1sqK*quQ-4LhzC!_QG9G)j>ctr;qzN0&`>d!sj`>CO z;8?DV^_NiAM^;8Y|`Ke6!Em) z+7C6PkJwv#n75%TD%2I`K)>)~t1DhgyXXdDzJzZ$wi}R0(bqQdcFcN)Tz14lzDup8?!~VU>TO}d zR6N3PKkpdDaJZzj7|0UaY|F_o+x!^2DF$hBeQ|)$EckS=Mmj1y5tx~~9>^>lT8oP~ z;=S)xeK@!;gn~#}oT@d+O->AxTD-{IhxhxCfpim5(!T=o#=>kG+ljZhxi&-a?g+6W z0Q|(#)&jBe?w~(?RtVfbcR++rp^BX9^M0R}#uW_lHd>MpYrNuf=gS-ijzCxc=*<06 zUe%SIvGuYb<@aeS#*=~EoFW>Wm)u4nY@LKRbnfA|66gOrdTrINM^Diiq|tke`ei?4 z#{gHJvr}J69OEow_v46E^KpPLSHY|U^3*v*bf%@shPyF&b~M7hX%u-Hn97k$0MJD= z7p>_f1!14_IKEIAcY4u}X$$Vz4QPq(nmOgpNDYC?GWYm zJ4^d1=ff|8iLriz~2Og9!J;>+&Bd1qQqo3O+8PKltg2u4@~O29{9T^liv?0 z)|U`hp8?!|$(Nr5pL=>|*uG8ujEo6d?%tjHerfv4-r(tH(>JLgEsN&el19jE59Br+(7laC!V=smjlPC`a|Xjb2ao%JL_c5W53@$r}9q zwfPq=<1-+k^8bce|L1gU-pYRpgZ{Pj7cBlCLDRo({da}9|G=;@oBuha^GAr%2<872 zF#r2?{$FAGebJ#(c>f~d{?A}|Rlq<0wSJ{B_*bUG{Jud4pF1X3lo;7u+1OO!s2|G$ zlrBdY9mo3DWQ1uVX(X({_)XPb3Rkmq?(+k?QiANE>|$mJJT`i-IXn594<+Hl34T^6 zmJzdfU)OscA51^|M3Ao;@-aOFDbD=_{F-0m9u7KmwIN@uE;cf{2-BV})RqL_f4Dy! z*bI}uyD!{LdpEAXJ^i?b?#jILbR;-y>hk*f>SyzRI-O7c$G-GmbU-Qm$He|09DLzN zm474x`p;W4SeO2x+2;@VI{eNsWt#Z=ed8Z=HTdgmB=h~Bdtv-vjnqNk#JGLmUs!cw zC4{3Wo}XJiU96vm>hK)d|8%`93IFjD>SAPsh+m+H=HF@%wIOkU@VgtG|0m8G(TO$d zg$y?5WLt@G2ZVphaQuT6{qMh_B=OQ9)ftMv?4f``hm6ixP?WOKAE~hZCmletczJ)Be|Z zxAm`R^S{xL{JY1mG)Dj8()H(($iMBr{ynb#JsAGR9OWO|ef@h{`uCLa?Xn}!NRLn2*J%O_=tA(+#hyK9r*^Q58WekrXO&H|7%WbTym4SFENC3$JW+| zVZ;i}Qfi9AO5~WK(GdscEBrruDbL%{0DI86>hFJ8?sTbDZWRws^v!7@0!O$AjO+mZ zLu@QMK`75@W=2gvq?c?%y#_F%hmXTO=1{`tzOjDuNWp8MB;dtFh^-J}unPZTx6&Hr zm~R-SDgtfe0LceNrOov#zOEEpA%9Kd{r32Cy@H;OZFg^G_CSdGi3wMV)gEbo_x}5L zLn|0~v$WJ}`4+!qh=}A5XFMlx&6879;%oFj~0l6iqiI zrV17^t4nd7<7mws?eaGJV$<1+DJ@l`FW;zaZCppI-^F5k%B%KjQI${5*0$D3Z7pb? zECc4BUz}Z>L-BA%-#-(v@prDR<8O;Y)OIBe%gR?ZIS0G^|J-Sd^ffi42fP1u!oaEX z1osA}>GOF_7h~D~z!N5>E1Wk5YBrV_3R-H?=J-|4$ZaZkyVsY!@-XWhh;7 z+s#9Sagdf@aa)c*3t2hZ1zZk1cx0;G%|lf7&cpXQ8tW#Ext_v_>^rAK_R90fa%Wjp z29G6F*MvV2vC3!Xoz{-@gtnzMi{`=?!Ht=gyD4O?=Xq~p&1c*B;0&>+dEDl$;#Q=aVo2N47%i0D`(uOT?MtfbO{{NjWC!r3jb=L+b_#z2Yf(YC zT^csePNw!W%R0?fhj5(SO{mWl;S=}Q! za>r9#xX?pusrJtmM?*?}=0o)sY~q;h0q_s?PY~Ykh7x1xA!wiq9lk#WX`% z%iw}*U}f=;M?8P>Y5)H>?b`Li|m*@YGlu;z!M>HY|v(iT!FQu^weAWftORX4s| z-*%VXY~0sd&!;!oj`9==UD$BxjV6bML~)dN4$nSE$WUI%R;B=L#o}@XGJJ%4mX*Lx zwt}m=>{CpbFDL%wb~0&8-F@xI^4BD2OeE)rW2IjYupkU)G4+b06cX|yPHrMAy$IL@ z2;$)^^w?Qb+NF)1-D7NkyGTJTMt2G>?f8h`>@{^mQFaihhI_d!uHi-WNepZjk949g zJm-HIc;F>d;ZS{~{NjPBE(i!t!aY#cknJNvI+;up+hUZj9u4>&rw$_YjJ9Zp- z%D^^y=Sro?hU3CVAK$VAv=>)0YVL_!sL~Lx2M^KBgLAKR6fx0LnlZ&bNGl&2yv;3S zM16o5wQ}HRAW=q3#?Or{R^{beu@_TZ)xGgrTM9jS;vs}_Di4#zT3|v-?|U%JnEeQ< zOE3GFB7q9+nZtj~N6|9>BO>S98q2_D{pfhk4;j#49D-UZ*&?(!$tz>8n+^Z7Zss!qh-%=l!scfqEjBwcmLMkw+~D<79EHA<=UCpOm?z$uu{iLoqy(l&|yAS$k8O$F1a8Sa4)M7WpVozL{%1+ zkupI5*s=cv*un_1eI!pRNgC@w{2P${Y;2L$qh)a981hR$lCyp^N9i|XOrp5KWLD{5 zj%)C(YP#vBZQOAV5|VorS-0pX{JgRA)cf+@FcPlJ)Zy7Rs*A zh7C4ICfr+F1CrumdKt|**G2?*k%?2*YBm*-IWJ#*-vc(K=y;SN;1 zU^j9ugj<<^bQ+@`ZWyYwX4OS*9bj7liIMQYLiYtx8S0z>1v)6>K2Pf^XkY>45e4?yfg+Yf!BFTG zlTxG<;E&Bq1M7kcz?h^Cbn9!9w4T`djPp%s%E?iutkXem0cf?#ri;Uos)PL*wmrM)mDxv>RAYEM2~gq+L}_ zp1>c?Xi~tAF!l4b_f411HA2BH>yl2kcxuXtaD&C=jY(jrgj~$_8cWx)u^Q*5eUiVQ z#>kuiIe<#{vv9$nX--Z@+=`Uf7QZh`B_8EaefYcv>gRm`yOleM_(8>FNwEegQjygF zx+f0=T_#6w8Lc$Y%PTbbF6gIct`(hEao1)ow`l1$MhfgDG=5{N5Lk-#9VM8|M_dN>b1Y^u^^1z|O zX^F*i;UQ|RCVZhYxoA~(^|a#HWM^}ZY{z)JBsB7`&5s?xGW{1>l0XWAzEVbsRc#+H zWtL)&g>6c3ia)XpW7|@|BGi$yX5JqU$%j3;nS3mHx-^LxVdOkBJLyrIekr&zO24Q5 zN=vV%z7EH8;%QBnXM4U+YtZPpK58bm_J+@-ov0(qZCA8hPSddeFfQGqor7n@vuR|Y zvRmnIS$;wI4TtfLaZ!Nrj5C!irz8~(LoUSw|FWB#{hqZ8>M}~pQdIb(O^_l1U8nA? zDO+@Y9=ABMsM|=vsEUeqV#3;vshLHIM6L`rdxFjV`;c1KB_>#$LvYDX9m$2w7rKwN zs;Eg^;zZsViZXUGYmjfV<%>m9b%;c2l)26tNvM#j%Ix~-KT@&Q%X%DZ!&-;NlO>KM z3&sQT3a2nG;Hi>7@PTrunoq_nzgTgbOwSs1LsbZA1e|k~lGgzNH8)W)FLEf;Z2|#- z73ds_#l(Y!ak=p9^R4N3T4d1HOxL_^6bT?T-cv~)Ppa!V%O1TmGu8V|mQ+G#)S$6} z#IaOX=oU7hzRqH9d{cXo29o%Q$fa-aQtpk&<{{)T1i*^n9Gqplo7C~TILQIGb^pF# zZWmx=1sgUyc&V@MgnMf*|FYQ19STk|T0C!Qa{XWYD^?4p-&l?uC)uqxOBNj^%EbL(z6 z{z!zzC}ubO8AGT|MM-M!gvpwySjcThar;L3f!2xKxQY@_gw|KP2A> z2uHy>Y#1s0Jr_9(fF3zv#)q9?LafbZ-LdS~zbmw?hbMVrNELK5TAAu@q z`>ZI7D)@`@pK&E(bKSf+a-JS}eUw4cdbwL=6?25sB=gLq=l#ijOIG9PoE%_By+#j~ zOh}%*4^yu_MO9-cf)rPNs$+xjbfrM~24QWxz|k`8lrlV>rUTHgBxybp9K)J_g_G&P z-EU@G0=BRsEUa_)w6gAJB2yOdq_p#5=0U2s=@92sxZ+DGRk}s_1tLK zsr)7AX7h`#wQ}+uT4yN1sEa>DF6QkZkmW-Xm;DJd+@8!-FJl10q%xv@eb*%O`>pX`Umu(;cyPes4k-N&$hI4ZmV6gErrHOIH{? z%JhZu-2#yd7VsZ_<2elb&a@7fUN{5c2TExY7-MlHoEF(-uqqO;GNm4OeFETA%k4y_*!S?`Km^pFG)u=o=-J;eFnVP;IVy`2j?AP-t(k#pgse!gtdOeM5#AMtq-AquD?zNYwG zWBLB58pv#KnpWIyIGIks$@Y7BKgCR^O>ph)q;J4l;v)`T}wPH;fIeP zfYVm%n9Tf?^+*O^j8I(IYr0lo)0v{sc|P6Dg#$Eo<7F?8AZJ>gu?@23TKsR&7a0H7e`rc+H|u z@<@>lW&?es67_*+LM=m4?YJ4}4jWB24ZO7ggsV|-O@~aYvL6c?I&mgcCth&6)m`Qe z>(M@mC9N79U%w5PG0N0{Kwk1G{8hnY&hYssY3qjZu8WS>cEKgjA7$ybSp!CPJ*yoh zCb4qZ)a?EssIy;D$D-)7%))NPP|QX59h-mNOPIB-zpXMB6j*qD+F`^SL=*_^^W~ZG zOFymKlqbF8C_k z_1)oD7&YNybYOv7`cQ=^Am#)3M~wOd^PLx;MUNXxZ1I)JEp5?8_KG|DjZ8tew4jU$ z@KB9QbS%ByMCo{~3D_3l(QI_iXTXHStr6e@b+E?(s*pR(Ic9wPCA)!5Di1C1B;V#= zE4v2zkdAAIDb`~x>BYArH8;d+UALDKF5bV;RHXu+Cd_!#DY$lToLaQ!Cm_Ke+~Jlx zy$!{-F^#2LaW258!sA9f-~1@`gg?NZUjK+T3ag}@ZM3DAIY7pA~zcLIRjsj zWSyl5%t=Ce~hfPkspk*@?<@YqQ0iUiGcsk#FwVCOj1r9>M36>#dGHDZPX@Eu-ogkc^om z*TDLOkhr*8sE%kh6OZ#kASH`bg(AP|Cl8)jUSJvWUVxX;H06-3R%RBFnFzju9^1NG zGV0ZNHo&Ogr%@!?Y^2eo2ZM0oTwyS{FMJuK9`o8y-Jt&(_Dp85)1czUI>W{FHRjy; z8NHmR7@zatfWOhU&D-G`>|~LqKT+OF39MRnr?q*lC_PdF($9vt%2Fxo(5}!>fi|Bq zhcF{GWnOGbXl+HvbPRY!c$dXAq*h!v!R-8b27Ri(&};B~noKk%aJcO-t(b<2nUAu5 zXej8c0{#^?u9|78AqB8CXVmi81e8~s*4M8TF_on^Y}I`Mv&6bUl!+>|I`91;MP}=| z0RY>h7J(;X;n1IQRpElaEh8Ar`^3{D71M$qq|&XyZ=-1BEpG{8Ujr~zvBAU8K6r+xx_@1N#?+w7Ar$Qxq{+7*Kv{+7YsV*NVr|GsG>jbhL~Lc${C;wv z{HRK&lnH>-*=$J=d0$Q`URHn`r4~l~jrp5@5<<+_eKQkNoM7-+MW_7q6#?D1FT6pX zjrn2vUucMmRY~22x*_rqBg@vcu(fi?zL*6(QJr}B|CJsBgKMPhS zq9YnN0w1ZP$#Ul?c6a@3mQRVT)j!EhN4VqXh3zmc5OCNy+#Gqbcou!4R|=QKl@6L} z^;6CmY%})zTH+{jJ7B=^%o%eT&V?Wd`KY)+)QUIrIN4?LaI zry%M8@#L`-;(ldX-AmT|*tX@Y0=KDN_oH=VSw}Ihwz4McJEBC9>UpHEF@a6hK)ikE zcb60Tbzy!^!t`@KJ1ce_j1d+ItZSH(6|T6U(3Y@ob*6>-o?_mwX=BDAI?sy(!%A{x zQi7uW$#=*D&R)zD1&YJMBg%H&YO$(t+uxfvDK30~(AA`U8OC8li#Q&D;SJ6>+bGZv z;L~1wf@<#5wd2EXf+pU&h1Fl==tl-z`;6Z=iOM~TFb%icx9a?{-Bq`8vKw8h1wV%8 zYo{%A5b3QyE>U}|vhy=HXVzAWITwk@U7eGF%ASZ{kf%>%b-05F*`&)XDBsv2^m*Hw zOB4(u8Q>TXqX-;YIbgY`XqGVdF605g!qx%bQ;Y;7sska=a*zG&*$X#X2?oTHn-)ez z{g4;>^P)M3y9M9~jS4k56@!Q*=#P(cZc5sE8gr>6HTxLf2``(EBN}$f6r@80VUSxbnCOV$y(dk3DCgd-b5 zh?Ak(kA^r~?Z@0Rn`0mz^nmst?McA>+4>k4v^idP`bho<)0X~B{?nL21&nsQkQGHy z0JPJGqK3;K0Z>`f@@wYj;y6OW$JQApomE_9Z(CGh^-36G+=ixHY)gZHkkoZ_1sHV( z^_in~Tq1BmF`ftK)sq+0FT{_EWLtjTr~dniAv&P);%!Jl@rj=whFf5<+JucwvJ-Z@ zE4*A7(F|0&Dn%?|KX_ZeedXoEoL8hdGrYXWne|u1fLfwdG&giEx~$}EHH!Ek5kdu} z?c|BaNug}9y3u1lWuDF}?f9P3MurC;1E#`p4{6AJ z^FDbjug{wr8Jb~nG{O>{Q#e-4t|?UM_CeZs=nlkU|Ngz^NQ8?>Gv2TNA=Q9e!7C0G z(fZ{(znHJnN~IT*xOrFiA!=*eq+5>+rn8pruI}cs2+`5M6gnnu?8oatSDB!0;`S^> zDl?V>Vbi&}r$Wk7Isi+E%rAyM#xeB?5r>9cTQn6jlqfe zwPK&!UV}daCBCfd))C7I_+|iF-8%s;V)bgj`*URyW<{WAnW39&Mt8=Z4*CZ%0v{7w ztrnxT3uL0jg+u%~EHYVIG7CofNbrVwt7i%#{<8~CUH$2M(p8j<%;C5G1}C_Sl~RD( z5qsnUY4KYer{#lGY8bS6tQXjcqcoFRDK#06&EFaSqh6&fC><4$P!U9+e|H?|3|D?B zV+&qpEc6~*V6Mi3lWNkx2ylw*g`GMO%cPWk;4jdR=#hzZvMMwE_astVcNGw0ZC)~m zUqZC)b-V=wFx^OmUoh)4=}jNNSM9POhX}GkBegj0*sGC|Xk16<4FK(`9{{sjKnf|j zdj1Dq?oH=Ex_-S%V5%1{=Hf?`RS}v}v=bPtJ9(ng@S{y33PN`WHrVhD0DNtQ>EdDU zL+(KOv53i=9bvwK)x6$p=y8)(@_#p&YIM}j%A?IAtQjZPjpolBSNMBE%)K*xPQYj7&G?yKD+E_c) zxCIOet0%yp2PgH_`Q4ro5Xp@T%~K*WQb+P+}4XJ!n1 zH8Z||f8(2mTr@QzbNgsIDjm;HoUTRtKNLQjn`1jFyPITLe6?3sRhh)YGs3&Gi~lCw zuKV3{LtIV>M;jv0wbpr}d!Bk0FQO9GoaU|1=^#|~xrX{NfYOq|4~OC)d9@?Xu58q$ z$r>l_KDg@%E={#5$2&8A1{%}M=}@3i5Pc}@XNXq=DQjL$HA7@*=7s)2J^C#hREeb7KMFEYQds{@lc?#FaUE`>VrgHEW+))4Ras zQHhWymtw=t9~Kd@Jw@O1hf0CmHrJoK8h#9S5pa9jf5pHXZy!+ISMsYD4T^^c=PpA>4cF~-`{&4wv5l_+B zHV1vm@?JXev*`OmnH3fAc7j91$|hZ%5qcWYGx(h|X}|P~BL~oA%?+ z1VY}Q7W(F$ItvNmI{=t#!u~m1KC2U%wyz@gwe_j&?9H7K5rRi7|3%hu3urnP<~`z!@E>vSKazpiyZb7sYRNnuPxVwG_K{&mO8SO~$&=ae9i z79K;`-j1=wpsUB?h`a9sXD&|wjT(P2?e6t%lCq#cv$*`uvJJbDxG!jl@>^jO9wZ%P zvAkEy3qsRB>-I+{j8tBXrTUeb_l|39y&DPE^#z=csB71Y4}&(Cz^g0&&(}Zi(dP1} z50Qt61+wiv_;dRgdd_l1YjDKFvFN(;1^C1T$ijJfwZ-UxqZ-`|&!=j)_)r2TOH%!= z?mWT!Zjd-BR&PzXhP$)r3^e-Jg6xA9hc7iAApJFy6^FRiLo}V@To#doUjY$4gx`{7 zo8y0cZCF4*oI}vLMJ=YeaZ*(T@u4Db6W;c{=K?sqx@7dL_)CcHs)T#dQD$%5{(5Xg zR%;p7$q2H(ik(dMEJJELb=hC9AR9ONvIO%=I?9X7{A87D5>%iYDCC~IXKbC;ijJU3v|pEga9)TK8OAd z1^>OX!}yuj5Z;Ly$d2ET2YQir2pK1wY>W=&M1uiHjC3@BEV*JF8fM zq83Bmdk9H0fBr&E70jDR!Q&FaoOSEbU5E8_Sf%tl4aPKO`UkOmcewhqO1%G-mJFg+ zL#4|@(g2Wi=xO|j4|M?SwkE4-lh$Q%eBAE>7W=n*$w*VS5T*2}MUaY=YB%A8_86)u zmdM;uqv#v~)ZG#s&|r_VdUN=@?}HQ7^9zKN>PRs`EEN6k@Y4IOyGXtUB7W*YO7nAL`ZVS#(Ltym1l!QB~MYvNI<)<;*%hifW zz{a*i#?Y{j-v)1X)4*q@14X)w<(7b4=E*QU!77`FyQTM= zq01KsjyR(I6Nv`*_h{J8!UR4;a{r!Fdl6c>^Cc>gRVY`jEFVA#0waIwncWU zK_n^CZku(vdg$?R@ydFhnH-r_#)Y_47&mf%n&AnER1K&D+nzhCF1r6S)k zO-f+#Cbkp52jK zV~OM_5(4g#0(@RGyH0Tn+gaBT+086EKLlA%`~>wBDY56qmLcf`)WOT`;fZKJ2( zHo^B<%_2l*7xi%ExBlAwOVu$zJvAfZ61bCPl)wHDVXZnA%(wfE$s$*ERfR!$%T5P5 zd?*>qVl4y?n$e$+6qj6%7%$?KpueBXAXuWt?Gn94JVD)3Q*1*&Bdw-x>V1=coj+L4 z%(bn-`9$Vtl>M)7{s3YOOn~3|%n@S&aCB>B&59|h;>%JEn zowgG&(#r~iO*4znv~Z-I2u&v(jP#I(8c1*I=8gip7kNLNZ9?$%0hvDbZC<^eXuHGF zoT@gtP5{*4F4=|yXR(iSAOP)6d_#E*`R?61762nFx7Dzal=`gLIh_qIU|A#~KK z!Cm7af8_pPV|a$`u(${@j0uK%u(e5bnY)02rP|CLJ}RA2#*!Qqb%vyagsVv2ywIPu zE#U!nwYMus1BLBt6t2VKO~L4;K@nk2hjkm#Vz)45Jt~Dk5NANSA6lYxrukLw(YUL# zfrr0}`PnW=!2xDLY)$%q^*1ewHjI-Yh#1k>Sl!ia6;!Bp!& z?||eQ`t)*uRLG+~eLde@@$DEtJX%HQ6(U2aU?yQM>^3J&q{`pdtO~oxc0KHd!V-s* zZF&dw`EQqd7O7qaeENHT3Rt@ z!I#MMS+2WBID#&nRLVD5v%~G1+=n(erK5M>Kt08>FIH|DjLYU?{%MAb=wCWKnyX;w zsPv@fhSUQV-}`yWrToq*@+cg9HAdhxe1y#)nvkU5GQ>1;SqWg(O8CG*T2nAJTABx##7~>ME3EfSo2pFNl9|6Yk8s|(ZHLJO^((u z`4TPG67V8Y5FwvCHbQ^&?@oBCcAqtppyq-6jJ^_gQXmUO1b^D!7WL zOi1PO(I#2{cDifPr42^nP>P#Vn`{LtHM@1L6`p5Zho-vQ6A%E5J9PizUT5s0J{Ex8 z(*h@zvjuzY2+@3a_5|0lKlciTC~Wf2S~FJ0+_5eGic>#8zj0&*Y!3xt7%xVgMBU38 z%$uDL??_3rPeUfjTD?zEf=tlP^Xn4M4q(z?|J+)UJk5-$ELVhML=#{7u6dbcE~Rj- zSL8r&8-_(q7DXIz?s5=4X}&5sX@J{N!X*R9R8yc%?2?e?y|EKj#9WVrihYD%1~G=Z zh2INGGlN-Zj4Xf^1BaCJh}Hm27QQc209bvRH~#TUN3g~itoayw8>~TxYt!N%ra%K; zWqc5p&njxa>r#zoPv)u7*?42dNFRSbiGJo&jDeEtaCKtFN zyrf6B+;UUMG&q@Y(g$^o8qIpb#zXnyNzYNPmgu*JY{D1 z>DLUzMnU~OmKj~O+j<+`gO@`ntaH9$eWd`QVqkAZ8^fE{7mcSn|2pRMk4mNYPjU6K z=P9pNPC$wW{4E+hIa{p51C90&2cO=K#6ge7*?Z3w)*HQWRy$`Cq9Wmkp?=i<$kT`9 zFlo0M*Dr?birQA*!h>Ri+j|b(9~*4$C4~orQ`|nb9&SZUvZTc^<2ch1Wc{rSPV+<>PMJ4gos_3Yr+4pgLv+!SF_{q+=d?3oR)MHR=JR!_CO%Vm z+gLg=GfTA!{Fj1sEh6yD0|+S$&&hf4~9gMB6F*uz^E`e4bGv&#A@q zjt&V=x#c=ss0YL^cC)BfnJc=#<8c+L_!b2!9A71i%v)m8Y)W&^VOL~;bx*dxN%2VD z9r14>-1`sBGStqh4@!* zU~2teMTu+ejRD1$Ya&En*bqZ_ImOfIeX__LA9E&(gXNv9ruLiM+a2DVIxtxyF--0-bp<4 z-qda7v?@!)^IV=moxctq(a^>uz!$hVike6?un>yo0XmOZo&RseS;Cg(Im|*Kt zq=zLOF-E*G>IIXnOft-HVNQjswGXfCI;sW;cY816v^6L;>&MXTP=?MmWa1m`+BZt#| zS;zp3(Ms_9gOk(zAhhC20d%&}0WxcbFfrnhL35m+0&{4_v-5sf(-R{u)2H_pn=AUX zg|^n)QJ-#=Pv4PCI#5~IX4KrdLQquHu_>xw*FU_wo{JgiFee<<(6V=o<&QI6OgwdK z+;#|(spIII+)df3fLFj500n9EG`1m;?^m!!+sR@ z3ppl+i_`TJPs?VAWIxdcX;B(Wg?w2qhKt&DC4IoCQ*7nC86T8rRJUq7sI$K6!^0!_1vz600Zvh)r` zdGDhw@Vy#LHzWs(D{B~9YOvWA9H*Aj4Ssl1k2u^DZ$>Y6Va?E}Ga}T%u(e=&bSso&0DhtD z9YAx|rstK0p?G_2d}4HYP>^pbvB1c(+heh`chI1Fe(#F$rgwOq&1qnjGkcw_>BE|e zE`Of13VXe!uqqn&iNL-U^6;cI>3TEAVjoAT87z)%Y(laJ#q7|%>GB)#N-iKzL5=Yg z#S@!`cbQ;*vtXja!u=Rsx9;%NLezRXW;vY&#iBX`SnUX^(b3&VM{e?HDA_pwa>zIj z9yEF_e~BsoN^XQ!zRW#%xKT|#vzeWHHtBIMT1|77+>>-GT5SRDX!fH7EG$2PII4a4 zWpEMxF0oW8l}(&EGbCo1hhP5DmnZC=upw?Q?_j;Y_+r>k>V{l5g~L`EoTE?_+4S|- zJn)3gvQxey(;**_TxSK%t!X?IoW=UaTklysN4pS^;bX_=xSc;lp#VQ&cC)R2Uvt9l zvy%o0*pK1y2>5<1ZQ@1cNg09{XN>zW#$U2SVPXpYQ!E4i#C#=T9;593jH1^&efqZT z$&y55UavA?S0bgbz5|Z4SLcd7)7DhN+XN;ZN)`Z-@wM!scJ0ow`Cfs`b_yDS6iE;v z32e=D@&^ord0x!OoNo)525g^2@Xout?vr;G+DL{ugRk-H&tVIYx*?{0z=VlDaGk4t z>!ZVmrxhNS*$K&SA^N1zlN&Q%AHY;v9>WOIWBv>pVN=uH?_Xf7UDxVyliMO4xG7Mq z!7W02Lj7*{In1rNXHIwA_JpNCQslBe(myzj{_Pmn%qGulTA7TBf}W!^kT;I#2GD|x zRhDz+5TfZ(Oc~N$(Wt_zey)-$)oR{0OX%tdew!Ilb_K8g5~zE1L+nAt_;esHq&+*B zPu7FCx*TR@VY$Kv04PWive&$6L-KkCp63$!3E=>>KlE17pA2XESudH`ioI%_J zA0c`zG%=++7!K5_Hrh6Lbzm51!EMTY&wO8Yn$_vxF#>)?g3KHM zfxl}3?M{VmW@3Opiyv@)y%f(}c6pJeI+4$==$_(894TPXWhN1;^R{Z{A_tp1ucn^A zN9d^}u5#oxJ|gN;#8~en$U7x3gZDBEK|sHa-jH1r#fSJFw;?0ZQH=&_-Yj6s{f9X# z(%nryJqsFY^iqElI(7x^aDaHa3j%d64$M>JhnHn|$_XL0G`8N(#ST3i6o}3n9$m2u z=o(l3oVc!8M2djJUl6j2Z7o=Ux*;n8^_@PaCd>NEM)$=+2PJcAtrr+c#B~S1!d>zt zq|S%44PG1Kv?JGC^^SbGf((m{L7R-?65bAw3+g-R)eQ~m+WCUgaODggiW-8p{_nt= zzR@@%dI79(2ALOgdc#PY5`_7E?l!c0DC>CB-1mH-VKuIh{H!QQe^$$3X~HQC51!WP zWZ!4>3jp8|fxM{a>3<7hmJ`52;OM+0lt)bd&WK29ApV5&Fx=5y^qq8>Zjz@)0oaU$ z7rS0&qvewd3hT&$n+FRi)ft} zaA=@N?dQ*aDztLDfZz3<#(K7Sg8l|1WK${l>}+e$_C|u%3KzV^$NdA(xPP7|U_y_3 zPr?{eA1}6oIaFx=BPf25LSSKzLCCT(u-LX+e?C6`+#6!@Lp#Mvt=+%(@fN^GJvJ~9 zC-NYxR=*r_OEm!iCyt@l)=wGqQTi(-df`N*oOyA$d^An$wtHCzESsXMSd_(4tBUsY z)+oxFqv}29V1eXs#ajVtS{LTxU>znah~-$dTUAyH~oU;(%WfUGh+l7MHMna^R`~F zzMG=P@Dq27Z(szI1tndzTwjkWCRc?-6AZ=-Y7%r+)Pk|^n)^(fit)rKa=nsORWdq* zN#vR5IHwi{*OdD@qB>buX+|%)j?B26x-;`gE0s9EFuFp}7%n}zgt0$ZK%QQ*-Tn^@ z_J;tJU$BJqacZ@A>hO%55*A9IOS4%?Y(b{50wRtr6_ie+>w4M?Eqam&tA{4LpXPXO zZ$r(bSs3WnmYcBX1`?2UBx1kyqp?P5$Z!1-GU?=jOahElt0r`EGgM^!#&eNW|Bi)Y zB(xD7@zWOkPqDN#;}dX!wf+0(>H8|m}jbt@D}T81VfBfQo319dS+tL<@GMghEYwR(3-BR96i1Y z7Y|5~Pk)PP(9~A@!h=30DDNU83&5=P2XWMO0d&Sw(>zy@+RsEj`)0q7g9W2OBPPD> zM?S720@v>kp$f0Wa%^n&jPI@H&!yzQT2+4W2Zss<*kb4-Ba(;v>if~MAplWN>1Yg$ zIN1mQ6=r@sqYP_1a5t>JM3HIUaTZA6S z#K^)s`fF0*%NmRg&$28!ZeLjwfYlKFf*IQ))|sJ>_(Y=?+F4FigKrEJ@?P>iU)Kn{H`ZE8S=IDa(z zHYmlj-HlCo@juQ083w5PV8k&i6*&lADR(j=w zwK6~a7WO>jj3a~UUU&6hS$rj+uI;8G1h!WGg1MCFk4yz#)Vyqs^2^R8=Rj{y3<4^= zp`1R`0E|(b?AVAIlpR*weKk}xe%#(E4P!S-o^&4rskulrufLIfUFvpbqoXb|25F4c zCkZ--?k4qam7m2G0y~?z+5lyI5t(^Etea`J{DTrMW~gRQFAoG%0@RfjRA@uTqNU#CVgYq`_81M>L*RfQvXQ`E@I+UP}$eNMZY$&t`)o>1MI= zDArkzD8%6r0HBjQYa|TnJEpB}a&94Xuv{qRyPS*1kBi$;xAqXYcm(&K0U5jI zM7VE(i5g72J&@V6vX)DDw^~E%%IA#2?lOROi#O9Ygb}A25R{6xGVGb>=$@!{nBs_z zN>c~EV1PNIn$hnCdp1fw7H4bTBodfS*YD=CCbFq8jde4e^CyK2y2jSiaJ%d zKNZL9r;&y0l9dWj_Q`glC2#v%^t25olb9w64V3*Ww-j>*+AUmbp0#hinlV zyiT)rjj3I~?O)fPjUCL=s=1A7mEwA5RdOSnjj`S+ncH{eXozh;yDt4}RDxXic43vh zqFL*{iTTr)57^KeqHV*O$@9Bq-&2=1sDM0T3z8v&zmF6)_R06FH0)O(16};i4^X3X zw`OF36m=_=eUuNWqqZOXcG=P6Awvq4XW=4$&u;6I2e1i~*IT3p5N9-B8@^oG5c4@d zBI#1O^gSJR$&5g_rYM4YUBI@mFr7Yt=Gz|J% zJ`*@o`}w3R(KVrs5Hz^sV9V)~8;VWlJcQR0l5&(7X~Jal;F6Yr#f9nfcjzP}EVV#2 z8~KY-ZKBFUQIQ`}uAsbK*q}osAKXyep5Yy#m_>+YPns3LQ)J#|DbyOcs~iOMGuA(6aMN0Kk;o6;r3XeLLP6Md(0QTEQ2fZ%Rc$`x zHf(owmTeB|7y@Dwo6Pd@F!9#;MUb@Q)AqpfZ2NutLd{_N`wU_nJ~iMCMh!+ZQmQj& zF6NfuW+%Fq0>2)DcJGEyZz%CUTWFq3`~+rwJ%tkO2wu6Z@R@7v0tzg8-9oyU+gwVk9ONT56R1qMr6w&yXns1~ABhYo^v>&FrOiH5RHl(<@B$JH3oiws^ z5$hYEZSu9Qz^5SAIE+4@RZ@}>K+^2h-Twa$LSqM23^=!RD@%k2a?{%WnTB#=lNW#5 z{2ZKVT!Vk@nO#4>#dqDlyoIk5(TZ~s5`sjSHV5+O_Q@XPtYIUbeOd!X=7Kfm%02DJ zpNpPXon6PhUt27(?xsjiXO@$7A8}t)bFYnc`Lfm!@FyeW=Ya=p#ueS#u#r{RU!fn*7QLtuu#2Byvva+nH4meKan4oI>-=iW8c z5|bXzJ4zf1yAZEJXf#{*yKbm9Vmh_Es~r=Z8|dm4?0c6dd&F$7K_6ehixPy#INgTP z8!t`HUN~ip%T{BQ83{+)5}Pr0Cf%Lwrh+Rgd+1rWG}#x=1u_m^6I_qY0mc|au+4Wf z!FlnrsalMSro(xS9EzzwgN-W>-nrCPx=zYTu={vGlkW9*SX23F@^ z!!)_aYKGQxDZaAZhHF?75oJ~b9WZ|lk@@t`4JwvW!D>~8u7$Pv)6!^rz^YljY7O$8- z48A-yjFyZT^)-zM zm)4E^3UP3pN&iLEv?v&+L0i>mBvu`fly(HEKm5e@1SS~z@W3O#qK&>^K%fcApV44( zTboI>F|U_cq@OxHS$F<8>Q|fiP9DkF(A+?YB#hg)XL?kTWRq(g(O}k_X60`9~H;<8|K`8UzXfOv@qbr>0 zg9}-zPuT5wDWHCh3JtHxxX>+B51Zc}0t~ zkaxi_G!60Q^@c2fd;EkqDs>+Nmc_cGHCON{FM}rYFQlS~w~3$w~4m!edkX%ttJ z%t{*Mp6<=)@Pe~qWAFNXI@|uC?-ll5PD`1+zy2exdF_L?LLNARZLase(Zfg|Bi|gY z1;K?Cffh&*i|q&Ke}@{9$WA(D{D18dXl<~v;rnj@I-HPS8~u~osz8rU01O_gENMtA z+3c~^&LS%|dy+s%tcuM>Y;#mk1}h`GX(c65hWF81i1EYgSXZ!ey)hpZR|k+bdZcKJ z1=CvwO~*s9QkcnaChM-0gmg&XKB`V5*O`u#kr8nDA6A|NUt^W382`HZ}s4bnd zkC``Q%WFbun}z1t*7h`ubxfk9Rlr@0UC;ZO(OUs%r8J#EvRa6 zq?^is&7O{5dY#CvTY1}CJ|t}oNdQGNY_CCZU;ri`?F=1@jk3a)Wo5?Ien5k5sM zs_{Tp3U^_V)L>Gok9;FnkGKX-CF1GWAaM~HT9l;sSaFjhGxRc?M(d7b$7K3jv36S+ zK9zy9Vi0&}5aR%W5WGT#Hc()>m@R87i|Kqnb#(W#5;ZWzt{biVS7v&&ufY41T9$=Uw!!ilU&!XqXp5nE}Hi#zND zHHD_e|2KtIf@p zk0iHP&1RHEQs0;gDRK7Y#BZQfW2xmLW-vQ=`Q#pOATJl8W&vYm5JwA)>@IN5JY34$ z62;!1*fyu@97V|+740knaU{nyLN==RR}kDV{9UvXN zEV2Ev7<%Q2eAQ#XBoMIY{wFS&gNH0bTk3DW2rx`0DCBJg`AtYGLX0b01sbd>99?*= zjc3L#p)=?HE-(eq)qfC9(N`n@iWITm)2vvxv76zpXW34P+n1KjNk56;L>&H&$L_V9 zsU2J^nKOgNj`1`9zgp z;2e{7-zu23D|o{dZKN|(AY0~MEjK~&@e8#`@&g;R(bb(49aUUMM(b%jjhDXVNJ|mGTT()x zAtB(jR0_s<(+1UdrLyh~B{OS<7Tf$a>A*QDB6DP&U0TJQd`wu;Kjm~~{z&l>C6F`M#SA?#3ZJ?T0xN;1 zfD4OTaM&O~zA)}Gm#P}Gyr+fhw;B(9_MBQ!Qd#oi^{Ew?1 z`q24)aR(M!lm3eYHbw^ne=7AZ=fO~EGHI+EsK~&MUX5N-%r*dY!mzuYx=js`aV>S7 z01sD1Rr1^8ZgKq^Ynl5bbq6fj5oNL;`+`1WoNPIcf?tm0&?xry?vvT}FqH(iNbmz| zSOKd7oMJj1_`XH*M}440A=yy?>HEXutVE$R;+vh$-DLIjvS^1RABoyy*Kz_kXB;aaTqZXG8QjEz7`!m94oB}B>4H_xk$D<HVT%{M-8l=Jcr15QoIM#wvaL3k_W|CTmP5M zDbvF5pIFzHqw*zVkQ7?6IURmRizs?U$)2at0DvOK;1q|S)_e1dXOU7_cHG{pA>P

    s dokonalým dopředným utajením, odmítnutím a obnovením po vloupání.]]> Pokročilé nastavení Všechny barevné režimy Překročená kapacita - příjemci neobdrží dříve poslané zprávy. @@ -1902,7 +1901,7 @@ Chat databáze exportována Členu skupiny nelze odeslat zprávu Požádejte váš kontakt ať povolí volání. - Odeslaných odpovědí + Odeslaná odpověď Škálovat Přizpůsobit Rozmazání pro lepší soukromí. @@ -1946,7 +1945,7 @@ Smazat bez upozornění hledat Chyba přepínání profilu - Vyberte chat profil + Vyberte profil chatu zpráva otevřít Kontakt smazán! @@ -2241,7 +2240,7 @@ Můžete nastavit operátory v nastavení sítě a serverů. Ocas Zastavíte přijímání zpráv z tohoto chatu. Chat historie bude zachována. - Servery pro nové soubory vašeho aktuálního chat profilu + Servery pro nové soubory vašeho aktuálního profilu chatu Protokolu serveru se změnil. Operátor serveru se změnil. Zoom @@ -2266,7 +2265,7 @@ Použit pro zprávy Server přidán k operátoru %s. Průhlednost - Přepínání chat profilu pro 1-rázové pozvánky. + Přepínání profilu chatu pro jednorázové pozvánky. video Sdílet profil Reportování zpráv je zakázáno v této skupině. @@ -2288,7 +2287,7 @@ Pro ochranu vaší IP adresy, soukromé směrování používá vaše servery SMP k doručování zpráv. Použít web portu TCP port pro zprávy - Váš chat profil bude zaslán členům + Váš profil chatu bude zaslán členům chatu Režim systému Zmínky členů 👋 Organizujte konverzace do seznamů @@ -2331,7 +2330,7 @@ Použít TCP port %1$s, když není zadán žádný port. Tento odkaz byl použit s jiným mobilním zařízením, vytvořte na počítači nový odkaz. Získejte upozornění, když jste zmíněni. - SimpleX adresa a 1 rázové odkazy je bezpečné sdílet přes všechny komunikátory. + SimpleX adresa a jednorázové odkazy je bezpečné sdílet přes všechny komunikátory. Zprávy budou smazány pro všechny členy. Aplikace vyžaduje potvrzení stahování z neznámých serverů (s výjimkou .onion nebo při aktivaci SOCKS proxy). Musíte povolit kontaktům volání, abyste jim mohli zavolat. @@ -2550,4 +2549,6 @@ Připojení selhalo selhal Pokud jste se připojili k nějakým kanálům nebo je vytvořili, přestanou trvale fungovat. + aktivní + Zrušit diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 5d3d9ac90e..8b73099b17 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -1971,7 +1971,7 @@ Abgelaufen Server-Einstellungen öffnen Andere Fehler - Proxy + Proxy-vermittelt Fehler beim Empfang Neu verbinden Deaktiviert @@ -2605,7 +2605,7 @@ Link-Tracking entfernen Verbinden tippen, um den Bot zu nutzen. Um Befehle senden zu können, müssen Sie verbunden sein. - SimpleX Relais-Link + SimpleX Relais-Adresse Fehler beim Markieren als gelesen Fingerabdruck in der Zielserveradresse stimmt nicht mit dem Zertifikat überein: %1$s. Fingerabdruck in der Weiterleitungsserveradresse stimmt nicht mit dem Zertifikat überein: %1$s. @@ -2629,7 +2629,118 @@ Sprachnachrichten suchen Videos Sprachnachrichten - Verbindung fehlgeschlagen + VERBINDUNG FEHLGESCHLAGEN Fehlgeschlagen Kanäle, welche Sie erstellt haben oder denen Sie beigetreten sind, werden dauerhaft deaktiviert. + %1$d/%2$d Relais aktiv + %1$d/%2$d Relais aktiv, %3$d Fehlgeschlagen + %1$d/%2$d Relais verbunden + %1$d/%2$d Relais verbunden, %3$d Fehler + %1$d Relais + %1$d Abonnent + %1$d Abonnenten + Angenommen + Aktiv + Abonnenten für alle blockieren? + Broadcast + Abbrechen + Kanalerstellung abbrechen? + Relais testen
    , um dessen Namen zu ermitteln.]]> + %1$s
    !]]> + Kanal + Kanal + Kanal + Kanal-Link + Kanal-Mitglieder + Kanal-Name + Der Kanal wird für alle Abonnenten gelöscht. Dies kann nicht rückgängig gemacht werden! + Der Kanal wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden! + Der Kanal wird mit %1$d von %2$d Relais gestartet. Fortfahren? + Chat-Relais + Chat-Relais + Chat-Relais + Chat-Relais + Chat‑Relais leiten Nachrichten in den von Ihnen erstellten Kanälen weiter. + Chat‑Relais leiten Nachrichten an Kanal-Abonnenten weiter. + Relais-Adresse überprüfen und erneut versuchen. + Relais-Name überprüfen und erneut versuchen. + Relais konfigurieren + Verbinden + verbunden + verbinden + Kanal erstellen + Kanal erstellen + Kanal erstellen (BETA) + Kanal wird erstellt + Link dekodieren + Kanal löschen + Kanal löschen? + Gelöscht + Relais löschen + Kanalprofil bearbeiten + Aktiviere mindestens ein Chat‑Relais, um einen Kanal zu erstellen. + Relais-Name eingeben… + Fehler beim Hinzufügen des Relais + Fehler beim Erstellen des Kanals + Fehler beim Öffnen des Kanals + Fehlgeschlagen + Fehlgeschlagen + Link erhalten + Ungültige Relais-Adresse! + Ungültiger Relais-Name! + Eingeladen + Kanal beitreten + Kanal verlassen + Kanal verlassen? + Link + Neu + Neues Chat-Relais + Keine Chat-Relais + Es sind keine Chat-Relais aktiviert. + Es sind nicht alle Relais verbunden + Kanal öffnen + Neuen Kanal öffnen + EIGENTÜMER + Eigentümer + Voreingestellte Relais-Adresse + Voreingestellter Relais-Name + Fortfahren + Relais + RELAIS + Relais-Adresse + Relais-Adresse + Relais-Verbindung fehlgeschlagen + Relais-Link + Relais-Test fehlgeschlagen! + Abonnent entfernen + Abonnent entfernen? + Der Server erfordert eine Autorisierung, um eine Verbindung zum Relais herzustellen. Bitte Passwort überprüfen. + Serverwarnung + Relais-Adresse teilen + ABONNENT + Abonnenten + Abonnenten verbinden sich über den Relais‑Link mit dem Kanal.\nDie Relais-Adresse wurde zur Einrichtung dieses Relais für diesen Kanal verwendet. + Abonnent wird aus dem Kanal entfernt. Dies kann nicht rückgängig gemacht werden! + Tippen, um dem Kanal beizutreten + Der Test ist bei Schritt %s fehlgeschlagen. + Relais testen + Dies ist eine Chat‑Relais-Adresse, welche nicht zum Verbinden verwendet werden kann. + Abonnent für alle freigeben? + Für neue Kanäle verwenden + Relais nutzen + Überprüfen + via %1$s + Sprachaufnahmen werden auf Ihrer Plattform nicht unterstützt. + Abwarten + Antwort abwarten + Sie + Sie sind Abonnent + Sie können einen Link oder QR-Code teilen - damit kann jeder dem Kanal beitreten. + Sie haben sich über diesen Relais‑Link mit dem Kanal verbunden. + Ihr Kanal + Ihr Kanal + Ihr Profil %1$s wird mit den Kanal‑Relais und -Abonnenten geteilt. + Ihre Relais-Adresse + Ihr Relais-Name + Sie werden keine Nachrichten mehr aus diesem Kanal erhalten. Der Chatverlauf bleibt erhalten. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml index 563b1a02c7..42ba84ef8c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/fr/strings.xml @@ -85,7 +85,7 @@ Les notifications périodiques sont désactivées ! Une phrase secrète est nécessaire Autoriser le dans la boîte de dialogue suivante pour recevoir des notifications instantanément.]]> - Le serveur requiert une autorisation pour créer des files d\'attente, vérifiez le mot de passe + Le serveur requiert une autorisation pour créer des files d\'attente, vérifiez le mot de passe. L\'application récupère périodiquement les nouveaux messages - elle utilise un peu votre batterie chaque jour. L\'application n\'utilise pas les notifications push - les données de votre appareil ne sont pas envoyées aux serveurs. SimpleX fonctionne en arrière-plan au lieu d\'utiliser les notifications push.]]> Cacher @@ -1017,7 +1017,7 @@ Supprimer le fichier Erreur lors de la sauvegarde des serveurs XFTP Assurez-vous que les adresses des serveurs XFTP sont au bon format, séparées par des lignes et qu\'elles ne sont pas dupliquées. - Le serveur requiert une autorisation pour téléverser, vérifiez le mot de passe + Le serveur requiert une autorisation pour téléverser, vérifiez le mot de passe. Téléverser le fichier Serveurs XFTP Vos serveurs XFTP @@ -1056,7 +1056,7 @@ Système Authentification annulée ID du message incorrect - Le hash du message précédent est différent.\" + Le hash du message précédent est différent. L\'ID du message suivant est incorrect (inférieur ou égal au précédent). \nCela peut se produire en raison d\'un bug ou lorsque la connexion est compromise. Erreur de déchiffrement @@ -1149,7 +1149,7 @@ Assurez-vous que le fichier a une syntaxe YAML correcte. Exporter le thème pour avoir un exemple de la structure du fichier du thème. La mise à jour du profil sera envoyée à vos contacts. Guide de l\'utilisateur.]]> - Enregistrer les paramètres de validation automatique + Enregistrer les paramètres de l\'adresse SimpleX Pour se connecter, votre contact peut scanner un code QR ou utiliser un lien dans l\'app. Le code d\'accès de l\'application est remplacé par un code d\'autodestruction. Activer l\'autodestruction @@ -1950,7 +1950,7 @@ Infos serveurs Afficher les informations pour À partir de %s. - À partir de %s. \nToutes les données restent confinées dans votre appareil. + À partir de %s.\nToutes les données restent confinées dans votre appareil. Statistiques Total Serveur XFTP @@ -2361,4 +2361,92 @@ Quatres nouvelles langues d\'interface Partagez votre adresse Actualisez votre adresse + 1 discussion avec un membre + vous a accepté + Accepter le membre + actif + tous + Tous les messages + Permettre des fichiers et des médias seulement si votre contact les permet. + Permettre à vos contacts d\'envoyer des fichiers et des médias. + Tous les serveurs + Annuler + seulement après que votre requête soit acceptée.]]> + Vérifiez l\'adresse de relais et essayez à nouveau. + Vérifiez le nom du relais et essayez à nouveau. + Se connecter + Se connecter + connecté + CONNEXION ÉCHOUÉE + contact supprimé + contact désactivé + le contact devrait accepter… + Créez votre adresse + supprimé + Supprimer les messages + Supprimer le relais + %d messages + Entrez le nom de relais.. + échoué + échoué + Fichiers + Les membres seront retirés du groupe - impossible de revenir en arrière! + Le membre va rejoindre le groupe, accepter le membre? + Les messages de ces membres seront affichés! + modérateurs + nouveau + Nouveau rôle de groupe: Modérateur + non synchronisé + Désactivé + Ouvrir pour se connecter + Ouvrez pour rejoindre + en attente + en attente d\'approbation + Veuillez attendre que les modérateurs de groupe examinent votre demande pour rejoindre le groupe. + Adresse de relais prédéfinie + Nom de relais prédéfini + Serveurs prédéfinis + Politique de confidentialité et conditions d\'utilisation. + Continuer + Rejeter + Rejeter la demande de contact + rejeté + rejeté + Rejeter le membre? + relais + RELAIS + Adresse de relais + Adresse de relais + Échec de la connexion au relais + Lien du relais + Retirer et supprimer les messages + retiré du groupe + Retirer les membres? + Retire les messages et bloque les membres. + Rapport envoyé aux modérateurs + requête envoyée + examiné par les administrateurs + Examiner les membres du groupe + Examiner les membres + Envoyez une demande de contact? + Envoyer la demande + Envoyer la demande sans message + Envoyez vos commentaires privés aux groupes. + Envoyé à votre contact après la connexion. + Le serveur requiert une autorisation pour se connecter au relais, vérifiez le mot de passe. + Avertissement du serveur + Partager l\'ancienne adresse + Partager l\'ancien lien + Partager l\'adresse de relais + Description courte: + Lien court + Adresse SimpleX courte + Adresse du relais SimpleX + Port TCP pour la messagerie + Échec du test à l\'étape %s. + Tester le relais + L\'adresse sera courte et votre profil sera partagé via l\'adresse. + Le lien sera court, et le profil de groupe sera partagé via le lien. + L\'expéditeur n\'en sera PAS informé. + Ce réglage est pour votre profil actuel diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index 09a843c91c..596042210b 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -45,7 +45,7 @@ Az Android Keystore-t a jelmondat biztonságos tárolására használják – lehetővé teszi az értesítési szolgáltatás működését. Hibás az üzenet kivonata Háttér - Megjegyzés: az üzenet- és fájltovábbító kiszolgálók SOCKS proxyn keresztül kapcsolódnak. A hívások és a hivatkozások előnézetének küldése közvetlen kapcsolatot használ.]]> + Megjegyzés: az üzenet- és a fájlátjátszók SOCKS proxyn keresztül kapcsolódnak. A hívások és a hivatkozások előnézetének küldése közvetlen kapcsolatot használ.]]> Alkalmazásadatok biztonsági mentése Az adatbázis előkészítése sikertelen Az összes partnerével továbbra is kapcsolatban marad. A profilfrissítés el lesz küldve a partnerei számára. @@ -114,7 +114,7 @@ Az alkalmazásjelkód helyettesítve lesz egy önmegsemmisítő jelkóddal. Arab, bolgár, finn, héber, thai és ukrán – köszönet a felhasználóknak és a Weblate-nek. Engedélyezi a hangüzeneteket? - Mindig legyen használva továbbítókiszolgáló + Mindig legyen használva átjátszó mindig A hívás már véget ért! Engedélyezés @@ -618,7 +618,7 @@ Azonnal A fájlok és a médiatartalmak küldése le van tiltva! Profil elrejtése - Hogyan használja a saját kiszolgálóit + Útmutató a saját kiszolgálók használatához Csevegési üzenetek gyorsabb megtalálása Téma importálása Hiba történt a téma importálásakor @@ -1135,7 +1135,7 @@ Elküldve A hangüzenetek küldése le van tiltva. Legutóbbi üzenetek előnézetének megjelenítése - Az előre beállított kiszolgáló címe + Előre beállított kiszolgáló címe Időszakos értesítések letiltva! A jelkód módosult! Akkor fut, amikor az alkalmazás meg van nyitva @@ -1198,7 +1198,7 @@ A fájlok és a médiatartalmak küldése le van tiltva. Fájl megosztása… Mentés - továbbítókiszolgálón keresztül + átjátszón keresztül Megosztás megállítása Ön eltávolította őt: %1$s Jelmondat mentése és a csevegés megnyitása @@ -1435,7 +1435,7 @@ A kézbesítési jelentések le vannak tiltva %d csoportban Néhány nem végzetes hiba történt az importáláskor: Köszönet a felhasználóknak a Weblate-en való közreműködésért! - A továbbítókiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. + Az átjátszó kiszolgáló csak szükség esetén lesz használva. Egy másik fél megfigyelheti az IP-címét. Beállítás a rendszer-hitelesítés helyett. Az üzenetfogadási cím egy másik kiszolgálóra fog módosulni. A cím módosítása akkor fejeződik be, amikor az üzenetküldési kiszolgáló online lesz. A csevegés megállítása a csevegési adatbázis exportálásához, importálásához vagy törléséhez. A csevegés megállításakor nem tud üzeneteket fogadni és küldeni. @@ -1444,7 +1444,7 @@ Jelmondat mentése a beállításokban Ennek a csoportnak több mint %1$d tagja van, a kézbesítési jelentések nem lesznek elküldve. A második pipa, ami már nagyon hiányzott! ✅ - A továbbítókiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát. + Az átjátszó kiszolgáló megvédi az IP-címét, de megfigyelheti a hívás időtartamát. Az utolsó üzenet tervezetének megőrzése a mellékletekkel együtt. A mentett WebRTC ICE-kiszolgálók el lesznek távolítva. A kézbesítési jelentések engedélyezve vannak %d csoportban @@ -1597,7 +1597,7 @@ Feltöltés megerősítése Hiba történt az adatbázis törlésekor Az adminisztrátorok egy tagot a csoport összes tagja számára letilthatnak. - Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-továbbítókiszolgálókra. + Az összes partnere, -beszélgetése és -fájlja biztonságosan titkosítva lesz, majd töredékekre bontva feltöltődnek a beállított XFTP-átjátszókra. Alkalmazásadatok átköltöztetése Adatbázis archiválása Átköltöztetés visszavonása @@ -1756,7 +1756,7 @@ IP-cím védelme Az alkalmazás kérni fogja az ismeretlen fájlkiszolgálókról történő letöltések megerősítését (kivéve, ha az .onion vagy a SOCKS proxy engedélyezve van). Ismeretlen kiszolgálók! - Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-továbbítókiszolgálók számára:\n%1$s. + Tor vagy VPN nélkül az IP-címe láthatóvá válik a következő XFTP-átjátszók számára:\n%1$s. Összes színmód Fekete Színmód @@ -1788,7 +1788,7 @@ További kiemelőszín 2 Alkalmazás témája Perzsa kezelőfelület - Védje az IP-címét a partnerei által kiválasztott üzenetváltási továbbítókiszolgálókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben. + Védje az IP-címét a partnerei által kiválasztott üzenetváltási átjátszókkal szemben.\nEngedélyezze a *Hálózat és kiszolgálók* menüben. Ismeretlen kiszolgálókról származó fájlok megerősítése. Továbbfejlesztett üzenetkézbesítés Alkalmazás témájának visszaállítása @@ -1932,17 +1932,17 @@ Letiltás Letiltva Stabil - Hiba történt a(z) %1$s továbbítókiszolgálóhoz való kapcsolódáskor. Próbálja meg később. - A(z) %1$s célkiszolgáló verziója nem kompatibilis a(z) %2$s továbbítókiszolgálóval. - A(z) %1$s továbbítókiszolgáló nem tudott kapcsolódni a(z) %2$s célkiszolgálóhoz. Próbálja meg később. - A(z) %1$s célkiszolgáló címe nem kompatibilis a(z) %2$s továbbítókiszolgáló beállításaival. + Hiba történt a(z) %1$s továbbító kiszolgálóhoz való kapcsolódáskor. Próbálja meg később. + A(z) %1$s célkiszolgáló verziója nem kompatibilis a(z) %2$s továbbító kiszolgálóval. + A(z) %1$s továbbító kiszolgáló nem tudott kapcsolódni a(z) %2$s célkiszolgálóhoz. Próbálja meg később. + A(z) %1$s célkiszolgáló címe nem kompatibilis a(z) %2$s továbbító kiszolgáló beállításaival. Médiatartalom elhomályosítása Közepes Kikapcsolva Enyhe Erős - A továbbítókiszolgáló címe nem kompatibilis a hálózati beállításokkal: %1$s. - A továbbítókiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %1$s. + A továbbító kiszolgáló címe nem kompatibilis a hálózati beállításokkal: %1$s. + A továbbító kiszolgáló verziója nem kompatibilis a hálózati beállításokkal: %1$s. hívás A partner törölve lesz – ez a művelet nem vonható vissza! Csak a beszélgetés törlése @@ -2498,10 +2498,10 @@ Tiszta hivatkozás megnyitása Teljes hivatkozás megnyitása Nyomonkövetési paraméterek eltávolítása a hivatkozásokból - SimpleX továbbítókiszolgáló-hivatkozás + SimpleX-átjátszócím Hiba a csevegés olvasottként való megjelölésekor A célkiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %1$s. - A továbbítókiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %1$s. + A továbbító kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %1$s. A kiszolgáló címében szereplő ujjlenyomat nem egyezik a tanúsítvánnyal: %1$s. nincs feliratkozás Ön nem kapcsolódott ahhoz a kiszolgálóhoz, amely az adott partnerétől érkező üzenetek fogadására szolgál (nincs feliratkozás). @@ -2522,7 +2522,118 @@ Hangüzenetek keresése Videók Hangüzenetek - Nem sikerült létrehozni a kapcsolatot + NEM SIKERÜLT LÉTREHOZNI A KAPCSOLATOT sikertelen - Ha csatornákat hozott létre vagy csatlakozott hozzájuk, akkor azok véglegesen le fognak állni. + Ha csatornákat hozott létre vagy csak csatlakozott hozzájuk, akkor azok véglegesen le fognak állni. + aktív + Közvetítés… + Mégse + csatorna + Csatorna + Csatorna + Csatornahivatkozás + Csatornatagok + Csatorna neve + Kapcsolódás + kapcsolódott + kapcsolódás + Csatorna létrehozása + Csatorna létrehozása + Csatorna létrehozása (béta) + Csatorna létrehozása + törölve + sikertelen + sikertelen + Hivatkozás + új + meghíva + Csatorna megnyitása + Új csatorna megnyitása + TULAJDONOS + Tulajdonosok + Csatorna elhagyása + Elhagyja a csatornát? + Ellenőrzés + Várakozás + Várakozás a válaszra + Ön + Saját csatorna + Saját csatorna + FELIRATKOZÓ + Feliratkozók + %1$d feliratkozó + %1$d feliratkozó + elfogadva + Csatorna törlése + Törli a csatornát? + Csatlakozás a csatornához + Koppintson a „Csatlakozás a csatornához” gombra + A hangrögzítés nem támogatott az Ön által használt eszközön + Nincsenek engedélyezve csevegési átjátszók. + Kiszolgáló-figyelmeztetés + Ön feliratkozó + Ön nem fog több üzenetet kapni ebből a csatornából. A csevegési előzmények megmaradnak. + átjátszó + A csatorna az összes feliratkozó számára törölve lesz – ez a művelet nem vonható vissza! + A csatorna törölve lesz az Ön számára – ez a művelet nem vonható vissza! + Csatornaprofil szerkesztése + Megoszthat egy hivatkozást vagy egy QR-kódot – bárki képes lesz csatlakozni a csatornához. + Csevegési átjátszók + Eltávolítja a feliratkozót? + A feliratkozó el lesz távolítva a csatornából – ez a művelet nem vonható vissza! + Csevegési átjátszó + Új csevegési átjátszó + Előre beállított átjátszó neve + Előre beállított átjátszó címe + Saját átjátszó neve + Saját átjátszó címe + Adja meg az átjátszó nevét… + Átjátszó használata + Átjátszó tesztelése + Használat új csatornákhoz + Átjátszó törlése + Nem sikerült tesztelni az átjátszót! + Hivatkozás megtekintése + Hivatkozás dekódolása + A teszt a(z) %s. lépésnél sikertelen volt. + A kiszolgáló hitelesítést igényel az átjátszóhoz való kapcsolódáshoz, ellenőrizze a jelszavát. + Érvénytelen átjátszónév! + Ellenőrizze az átjátszó nevét, és próbálja újra. + Érvénytelen átjátszócím! + Ellenőrizze az átjátszó címét, és próbálja újra. + Hiba az átjátszó hozzáadásakor + Csevegési átjátszók + A csevegési átjátszók továbbítják az üzeneteket az Ön által létrehozott csatornákban. + Csevegési átjátszók + Nincsenek csevegési átjátszók + A csevegési átjátszók továbbítják az üzeneteket a csatorna feliratkozóinak. + %1$d/%2$d átjátszó aktív, %3$d sikertelen + %1$d/%2$d átjátszó aktív + %1$d/%2$d átjátszó kapcsolódva, %3$d hiba + %1$d/%2$d átjátszó kapcsolódva + %1$d átjátszó + ÁTJÁTSZÓ + Átjátszóhivatkozás + Átjátszócím + a következőn keresztül: %1$s + Átjátszó címének megosztása + A feliratkozók az átjátszó hivatkozását használják a csatornához való kapcsolódáshoz.\nAz átjátszócím ennek az átjátszónak a beállítására szolgált a csatornához. + Ön ezen az átjátszóhivatkozáson keresztül kapcsolódott a csatornához. + Feliratkozó eltávolítása + Az összes feliratkozó számára letiltja a feliratkozót? + Hiba a csatorna létrehozásakor + Visszavonja a csatorna létrehozását? + Engedélyezzen legalább egy csevegési átjátszót a csatorna létrehozásához. + A saját profilja (%1$s) meg lesz osztva a csatorna átjátszóival és feliratkozóival. + Átjátszók konfigurálása + Nem sikerült kapcsolódni az átjátszóhoz + Nem minden átjátszó kapcsolódott + Folytatás + A csatorna %2$d átjátszóból %1$d használatával kezd el működni. Folytatja? + Átjátszócím + Ez egy csevegési átjátszó címe, nem használható kapcsolódásra. + %1$s nevű csatornához!]]> + Hiba a csatorna megnyitásakor + Az összes feliratkozó számára feloldja a feliratkozó letiltását? + Átjátszó tesztelése a nevének lekéréséhez.]]> diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index fe4a658a68..48a97135d5 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -2534,7 +2534,7 @@ Apri link pulito Apri link completo Rimuovi il tracciamento del link - Link del relay SimpleX + Indirizzo del relay SimpleX Errore nel segnare la lettura L\'impronta digitale nell\'indirizzo del server di destinazione non corrisponde al certificato: %1$s. L\'impronta digitale nell\'indirizzo del server di inoltro non corrisponde al certificato: %1$s. @@ -2558,7 +2558,118 @@ Video Messaggi vocali Filtro - Connessione fallita + CONNESSIONE FALLITA fallito Se sei dentro canali o ne hai creati, essi smetteranno di funzionare definitivamente. + %1$d/%2$d relay attivo/i + %1$d/%2$d relay attivo/i, %3$d fallito/i + %1$d/%2$d relay connesso/i + %1$d/%2$d relay connesso/i, %3$d errori + %1$d relay + %1$d iscritto + %1$d iscritti + accettato + attivo + Bloccare l\'iscritto per tutti? + Annulla + Annullare la creazione del canale? + Prova il relay per recuperare il suo nome.]]> + %1$s!]]> + canale + Canale + Canale + Link del canale + Membri del canale + Nome del canale + Il canale verrà eliminato per tutti gli iscritti, non è reversibile! + Il canale verrà eliminato per te, non è reversibile! + Il canale sarà operativo con %1$d di %2$d relay. Procedere? + Relay della chat + Relay della chat + Relay della chat + Relay della chat + I relay della chat inoltrano i messaggi nei canali che crei. + I relay della chat inoltrano i messaggi agli iscritti del canale. + Controlla l\'indirizzo del relay e riprova. + Controlla il nome del relay e riprova. + Configura i relay + Connetti + connesso + in connessione + Crea canale + Crea canale + Crea canale (BETA) + Creazione canale + Decodifica il link + Elimina canale + Eliminare il canale? + eliminato + Elimina relay + Modifica profilo canale + Attiva almeno un relay della chat per creare un canale. + Inserisci il nome del relay… + Errore di aggiunta del relay + Errore di creazione del canale + Errore di apertura del canale + fallito + fallito + Ottieni link + Indirizzo del relay non valido! + Nome del relay non valido! + invitato + Link + nuovo + Nuovo relay di chat + Nessun relay di chat + Nessun relay di chat attivato. + Non tutti i relay sono connessi + Apri canale + Apri un canale nuovo + PROPRIETARIO + Proprietari + Indirizzo relay preimpostato + Nome relay preimpostato + Procedi + relay + RELAY + Indirizzo del relay + Indirizzo del relay + Connessione del relay fallita + Link del relay + Prova del relay fallita! + Rimuovi iscritto + Rimuovere l\'iscritto? + Il server richiede l\'autorizzazione per connettersi al relay, controlla la password. + Avviso del server + Condividi l\'indirizzo del relay + ISCRITTO + Iscritti + Gli iscritti usano il link del relay per connettersi al canale.\nL\'indirizzo del relay è stato usato per impostare questo relay per il canale. + L\'iscritto verrà rimosso dal canale, non è reversibile! + Prova fallita al passo %s. + Prova relay + Questo è un indirizzo di relay di chat, non può essere usato per connettersi. + Sbloccare l\'iscritto per tutti? + Usa per canali nuovi + Usa relay + Verifica + via %1$s + La registrazione vocale non è supportata sulla tua piattaforma + Attendi + Attendi risposta + tu + sei iscritto/a + Ti sei connesso/a al canale attraverso questo link del relay. + Il tuo canale + Il tuo canale + Il tuo profilo %1$s verrà condiviso con i relay del canale e gli iscritti. + L\'indirizzo del tuo relay + Il nome del tuo relay + Smetterai di ricevere messaggi da questo canale. La cronologia della chat sarà preservata. + Iscriviti al canale + Esci dal canale + Uscire dal canale? + Tocca Iscriviti al canale + Puoi condividere un link o un codice QR, chiunque sarà in grado di iscriversi al canale. + Trasmetti diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index a67f00a459..d844729bb3 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -2208,12 +2208,12 @@ 离开聊天? 你将停止从这个聊天收到消息。聊天历史将被保留。 邀请加入聊天 - 将为你删除聊天 - 此操作无法撤销! + 将为你删除聊天 —— 此操作无法撤销! 删除聊天 删除聊天? 添加好友 添加团队成员 - 将为所有成员删除聊天 - 此操作无法撤销! + 将为所有成员删除聊天 —— 此操作无法撤销! 仅聊天所有人可更改首选项。 角色将被更改为 %s。聊天中的每个人都会收到通知。 成员之间的私信被禁止。 @@ -2518,7 +2518,7 @@ 打开干净链接 打开完整链接 删除链接跟踪 - SimpleX 中继链接 + SimpleX 中继地址 标记为已读时出错 目标服务器地址的指纹和证书不匹配:%1$s。 转发服务器地址的指纹和证书不匹配:%1$s。 @@ -2545,4 +2545,115 @@ 连接失败 失败 如果你加入了或创建了频道,它们会永远停止工作。 + 订阅者使用中继链接连接到频道。\n中继地址用于为频道设置这个中继。 + %1$d 个中继活跃,共 %2$d 个 + %1$d 个中继活跃,共 %2$d 个,%3$d 个失灵 + %1$d 个中继已连接,共 %2$d 个 + %1$d 个中继已连接,共 %2$d 个,%3$d 个出错 + %1$d 个中继 + %1$d 位订阅者 + %1$d 位订阅者 + 已接受 + 活跃 + 为所有人拦截订阅者? + 广播 + 取消 + 取消创建频道? + 测试中继 来获取其名称。]]> + %1$s 频道的链接!]]> + 频道 + 频道 + 频道 + 频道链接 + 频道成员 + 频道名 + 将为所有订阅者删除频道 —— 此操作无法撤销! + 将为你删除频道 —— 此操作无法撤销! + 频道将开始用 %2$d 个中继中的 %1$d 个中继运作。要继续吗? + 聊天中继 + 聊天中继 + 聊天中继 + 聊天中继 + 聊天中继在你创建的频道中转发消息。 + 聊天中继转发消息给频道订阅者。 + 检查中继地址并重试。 + 检查中继名并重试。 + 配置中继 + 连接 + 已连接 + 正在连接 + 创建频道 + 创建频道 + 创建频道(测试版) + 正在创建频道 + 解码链接 + 删除频道 + 删除频道吗? + 已删除 + 删除中继 + 编辑频道简介 + 要创建频道至少启用一个聊天中继。 + 输入中继名… + 添加中继出错 + 创建频道出错 + 打开频道出错 + 失败 + 失败 + 获取链接 + 无效的中继地址! + 无效的中继名! + 已邀请 + 加入频道 + 离开频道 + 离开频道? + 链接 + + 新聊天中继 + 无聊天中继 + 未启用聊天中继。 + 不是所有中继均已连接 + 打开频道 + 打开新频道 + 所有者 + 所有者 + 预设中继地址 + 预设中继名 + 继续 + 中继 + 中继 + 中继地址 + 中继地址 + 中继连接失败 + 中继链接 + 中继测试失败! + 删除订阅者 + 删除订阅者? + 服务器需要身份认证来连接到中继,检查密码。 + 服务器警告 + 分享中继地址 + 订阅者 + 订阅者 + 将从频道删除订阅者 —— 此操作无法撤销! + 轻触加入频道 + 测试在第 %s 步失败。 + 测试中继 + 这是聊天中继地址,无法用于连接。 + 为所有人解封订阅者? + 用于新频道 + 使用中继 + 验证 + 通过 %1$s + 你的平台不支持录音 + 等待 + 等待响应 + + 你是订阅者 + 可以分享链接或二维码 —— 任何人均可加入该频道。 + 你通过此中继链接连接至该频道。 + 你的频道 + 你的频道 + 你的个人资料 %1$s 将分享给频道中继和订阅者。 + 你的中继地址 + 你的中继名 + 你会停止收到来自该频道的消息。聊天记录将被保留。 From 969e6e10bd31203db0dfac4f009c0baa8050626c Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Sun, 12 Apr 2026 23:21:16 +0100 Subject: [PATCH 021/152] 6.5-beta.8: ios 326 --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 1e5a634a2a..c977f5709c 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -2019,7 +2019,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2069,7 +2069,7 @@ CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; @@ -2111,7 +2111,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2131,7 +2131,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; @@ -2156,7 +2156,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; GCC_OPTIMIZATION_LEVEL = s; @@ -2193,7 +2193,7 @@ CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; @@ -2230,7 +2230,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2281,7 +2281,7 @@ CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = 5NN7GUYB6T; DYLIB_COMPATIBILITY_VERSION = 1; @@ -2332,7 +2332,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; @@ -2366,7 +2366,7 @@ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; CODE_SIGN_ENTITLEMENTS = "SimpleX SE/SimpleX SE.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 325; + CURRENT_PROJECT_VERSION = 326; DEVELOPMENT_TEAM = 5NN7GUYB6T; ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu17; From 0770ecd1d1ea88c9059fb52ea00f497afb06a79c Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin Date: Sun, 12 Apr 2026 23:52:02 +0100 Subject: [PATCH 022/152] 6.5-beta.9: android 341, desktop 136 --- apps/multiplatform/gradle.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/multiplatform/gradle.properties b/apps/multiplatform/gradle.properties index 3446ef9c30..45129a0d54 100644 --- a/apps/multiplatform/gradle.properties +++ b/apps/multiplatform/gradle.properties @@ -24,13 +24,13 @@ android.nonTransitiveRClass=true kotlin.mpp.androidSourceSetLayoutVersion=2 kotlin.jvm.target=11 -android.version_name=6.5-beta.8 -android.version_code=340 +android.version_name=6.5-beta.9 +android.version_code=341 android.bundle=false -desktop.version_name=6.5-beta.8 -desktop.version_code=135 +desktop.version_name=6.5-beta.9 +desktop.version_code=136 kotlin.version=2.1.20 gradle.plugin.version=8.7.0 From 673f5e374b8f791f24be5104b55e3eed9f9f935c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 13 Apr 2026 09:21:14 +0100 Subject: [PATCH 023/152] core: refactor unnecessary functions away (#6796) * core: refactor unnecessary functions away * fix --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- src/Simplex/Chat/Library/Commands.hs | 14 +++++++------- src/Simplex/Chat/Library/Internal.hs | 25 ++----------------------- src/Simplex/Chat/Library/Subscriber.hs | 4 ++-- src/Simplex/Chat/Types.hs | 14 +++++++++++++- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index d14642befc..f37110b8f8 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -1919,7 +1919,7 @@ processChatCommand vr nm = \case where recreateConn user conn@PendingContactConnection {customUserProfileId, connLinkInv} newUser = do subMode <- chatReadVar subscriptionMode - let short = isJust $ connShortLink =<< connLinkInv + let short = isJust $ connShortLink' =<< connLinkInv userLinkData_ | short = Just $ UserInvLinkData $ contactShortLinkData (userProfileDirect newUser Nothing Nothing True) Nothing | otherwise = Nothing @@ -2060,7 +2060,7 @@ processChatCommand vr nm = \case case gInfo of GroupInfo {preparedGroup = Nothing} -> throwCmdError "group doesn't have link to connect" GroupInfo {useRelays = BoolDef True, preparedGroup = Just PreparedGroup {connLinkToConnect}} -> do - sLnk <- case toShortLinkContact connLinkToConnect of + sLnk <- case connShortLink' connLinkToConnect of Just sl -> pure sl Nothing -> throwChatError $ CEException "failed to retrieve relays: no short link" (FixedLinkData {linkConnReq = mainCReq@(CRContactUri crData), linkEntityId, rootKey}, cData@(ContactLinkData _ UserContactData {owners, relays})) <- getShortLinkConnReq nm user sLnk @@ -2216,7 +2216,7 @@ processChatCommand vr nm = \case -- TODO [certs rcv] (connId, (ccLink, _serviceId)) <- withAgent $ \a -> createConnection a nm (aUserId user) True True SCMContact (Just userLinkData) Nothing IKPQOn subMode ccLink' <- shortenCreatedLink ccLink - let ccLink'' = if isTrue userChatRelay then createdRelayLink ccLink' else ccLink' + let ccLink'' = if isTrue userChatRelay then setShortLinkType CCTRelay ccLink' else ccLink' withFastStore $ \db -> createUserContactLink db user connId ccLink'' subMode pure $ CRUserContactLinkCreated user ccLink'' CreateMyAddress -> withUser $ \User {userId} -> @@ -2438,8 +2438,8 @@ processChatCommand vr nm = \case crClientData = encodeJSON $ CRDataGroup groupLinkId -- prepare link with entityId as linkEntityId (no server request) (ccLink, preparedParams) <- withAgent $ \a -> prepareConnectionLink a (aUserId user) rootKey entityId True (Just crClientData) - ccLink' <- createdChannelLink <$> shortenCreatedLink ccLink - sLnk <- case toShortLinkContact ccLink' of + ccLink' <- setShortLinkType CCTChannel <$> shortenCreatedLink ccLink + sLnk <- case connShortLink' ccLink' of Just sl -> pure sl Nothing -> throwChatError $ CEException "failed to create relayed group link: no short link" -- generate owner key, OwnerAuth signed by root key @@ -2910,7 +2910,7 @@ processChatCommand vr nm = \case crClientData = encodeJSON $ CRDataGroup groupLinkId -- TODO [certs rcv] (connId, (ccLink, _serviceId)) <- withAgent $ \a -> createConnection a nm (aUserId user) True True SCMContact (Just userLinkData) (Just crClientData) IKPQOff subMode - ccLink' <- createdGroupLink <$> shortenCreatedLink ccLink + ccLink' <- setShortLinkType CCTGroup <$> shortenCreatedLink ccLink gVar <- asks random gLink <- withFastStore $ \db -> createGroupLink db gVar user gInfo connId ccLink' groupLinkId mRole subMode pure $ CRGroupLinkCreated user gInfo gLink @@ -4070,7 +4070,7 @@ processChatCommand vr nm = \case encodeShortLinkData $ RelayAddressLinkData {relayProfile = RelayProfile {displayName, fullName, shortDescr, image}} updatePCCShortLinkData :: PendingContactConnection -> Profile -> CM (Maybe ShortLinkInvitation) updatePCCShortLinkData conn@PendingContactConnection {connLinkInv} profile = - forM (connShortLink =<< connLinkInv) $ \_ -> do + forM (connShortLink' =<< connLinkInv) $ \_ -> do let userData = contactShortLinkData profile Nothing userLinkData = UserInvLinkData userData shortenShortLink' =<< withAgent (\a -> setConnShortLink a nm (aConnId' conn) SCMInvitation userLinkData Nothing) diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 4ff677f379..da57f654ef 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1302,8 +1302,8 @@ setGroupLinkData nm user gInfo gLink = do (conn, groupRelays) <- withFastStore $ \db -> (,) <$> getGroupLinkConnection db vr user gInfo <*> liftIO (getConnectedGroupRelays db gInfo) let (userLinkData, crClientData) = groupLinkData gInfo gLink groupRelays - tagShortLink = if useRelays' gInfo then toShortChannelLink else toShortGroupLink - sLnk <- shortenShortLink' . tagShortLink =<< withAgent (\a -> setConnShortLink a nm (aConnId conn) SCMContact userLinkData (Just crClientData)) + linkType = if useRelays' gInfo then CCTChannel else CCTGroup + sLnk <- shortenShortLink' . setShortLinkType_ linkType =<< withAgent (\a -> setConnShortLink a nm (aConnId conn) SCMContact userLinkData (Just crClientData)) withFastStore' $ \db -> setGroupLinkShortLink db gLink sLnk setGroupLinkDataAsync :: User -> GroupInfo -> GroupLink -> CM () @@ -1382,27 +1382,6 @@ shortenShortLink' l = (`shortenShortLink` l) <$> asks (shortLinkPresetServers . shortenCreatedLink :: CreatedConnLink m -> CM (CreatedConnLink m) shortenCreatedLink (CCLink cReq sLnk) = CCLink cReq <$> mapM shortenShortLink' sLnk -createdGroupLink :: CreatedLinkContact -> CreatedLinkContact -createdGroupLink (CCLink cReq shortLink) = CCLink cReq (toShortGroupLink <$> shortLink) - -toShortGroupLink :: ShortLinkContact -> ShortLinkContact -toShortGroupLink (CSLContact sch _ srv k) = CSLContact sch CCTGroup srv k - -createdChannelLink :: CreatedLinkContact -> CreatedLinkContact -createdChannelLink (CCLink cReq shortLink) = CCLink cReq (toShortChannelLink <$> shortLink) - -toShortChannelLink :: ShortLinkContact -> ShortLinkContact -toShortChannelLink (CSLContact sch _ srv k) = CSLContact sch CCTChannel srv k - -createdRelayLink :: CreatedLinkContact -> CreatedLinkContact -createdRelayLink (CCLink cReq shortLink) = CCLink cReq (toShortRelayLink <$> shortLink) - -toShortRelayLink :: ShortLinkContact -> ShortLinkContact -toShortRelayLink (CSLContact sch _ srv k) = CSLContact sch CCTRelay srv k - -toShortLinkContact :: CreatedLinkContact -> Maybe ShortLinkContact -toShortLinkContact (CCLink _cReq sLink) = sLink - deleteGroupLink' :: User -> GroupInfo -> CM () deleteGroupLink' user gInfo = do vr <- chatVersionRange diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index f5f7752ca4..1ada54b4f7 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -3724,8 +3724,8 @@ runRelayRequestWorker a Worker {doWork} = do let crClientData = encodeJSON $ CRDataGroup groupLinkId -- prepare link with relayMemId as linkEntityId (no server request) (ccLink, preparedParams) <- withAgent $ \a' -> prepareConnectionLink a' (aUserId user) sigKeys relayMemId True (Just crClientData) - ccLink' <- createdGroupLink <$> shortenCreatedLink ccLink - sLnk <- case toShortLinkContact ccLink' of + ccLink' <- setShortLinkType CCTGroup <$> shortenCreatedLink ccLink + sLnk <- case connShortLink' ccLink' of Just sl -> pure sl Nothing -> throwChatError $ CEException "failed to create relay link: no short link" let userData = encodeShortLinkData $ RelayShortLinkData {relayProfile = fromLocalProfile p} diff --git a/src/Simplex/Chat/Types.hs b/src/Simplex/Chat/Types.hs index ebe4820a11..6ddc411fff 100644 --- a/src/Simplex/Chat/Types.hs +++ b/src/Simplex/Chat/Types.hs @@ -52,7 +52,7 @@ import Simplex.Chat.Types.Shared import Simplex.Chat.Types.UITheme import Simplex.FileTransfer.Description (FileDigest) import Simplex.FileTransfer.Types (RcvFileId, SndFileId) -import Simplex.Messaging.Agent.Protocol (ACorrId, ACreatedConnLink, AEventTag (..), AEvtTag (..), ConnId, ConnShortLink, ConnectionLink, ConnectionMode (..), ConnectionRequestUri, CreatedConnLink, InvitationId, SAEntity (..), UserId) +import Simplex.Messaging.Agent.Protocol (ACorrId, ACreatedConnLink, AEventTag (..), AEvtTag (..), ConnId, ConnShortLink (..), ConnectionLink, ConnectionMode (..), ConnectionRequestUri, ContactConnType (..), CreatedConnLink (..), InvitationId, SAEntity (..), UserId) import Simplex.Messaging.Agent.Store.DB (Binary (..), blobFieldDecoder, fromTextField_) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Crypto.File (CryptoFileArgs (..)) @@ -518,6 +518,18 @@ instance FromField BusinessChatType where fromField = fromTextField_ textDecode instance ToField BusinessChatType where toField = toField . textEncode +class HasShortLink l where + connShortLink' :: l c -> Maybe (ConnShortLink c) + +instance HasShortLink CreatedConnLink where + connShortLink' (CCLink _ sl) = sl + +setShortLinkType :: ContactConnType -> CreatedLinkContact -> CreatedLinkContact +setShortLinkType ct (CCLink cReq sl) = CCLink cReq (setShortLinkType_ ct <$> sl) + +setShortLinkType_ :: ContactConnType -> ShortLinkContact -> ShortLinkContact +setShortLinkType_ ct (CSLContact sch _ srv k) = CSLContact sch ct srv k + data PreparedGroup = PreparedGroup { connLinkToConnect :: CreatedLinkContact, connLinkPreparedConnection :: Bool, From 577b30e72f791f8410ab5cd6bfc9766a7c62cf2d Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:40:27 +0000 Subject: [PATCH 024/152] nix: strip ios library (#6503) * strip ios like in android * remove strip-unneeded in mac * strip only simplex-chat libs * flake.nix: strip only local symbols in MacOS library * flake.nix: make libs writable * flake.nix: better strip placement * reduce framework size by exporting only public API symbols --- apps/ios/SimpleX.xcodeproj/project.pbxproj | 3 +++ apps/ios/SimpleXChat/exported_symbols.txt | 11 +++++++++++ flake.nix | 1 + 3 files changed, 15 insertions(+) create mode 100644 apps/ios/SimpleXChat/exported_symbols.txt diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index c977f5709c..ef37f26097 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -2319,6 +2319,9 @@ SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + EXPORTED_SYMBOLS_FILE = "$(PROJECT_DIR)/SimpleXChat/exported_symbols.txt"; + STRIP_INSTALLED_PRODUCT = YES; + STRIP_STYLE = "non-global"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/apps/ios/SimpleXChat/exported_symbols.txt b/apps/ios/SimpleXChat/exported_symbols.txt new file mode 100644 index 0000000000..52c3bf83e9 --- /dev/null +++ b/apps/ios/SimpleXChat/exported_symbols.txt @@ -0,0 +1,11 @@ +# Swift mangled symbols (Swift 5+ ABI stable prefix) +_$s* + +# ObjC class/metaclass symbols (for NSObject subclasses) +_OBJC_CLASS_$_* +_OBJC_METACLASS_$_* + +# C API (SimpleX.h bridging header) +_chat_* +_haskell_init* +_hs_init* diff --git a/flake.nix b/flake.nix index c130e1a1fd..43f4e8912a 100644 --- a/flake.nix +++ b/flake.nix @@ -93,6 +93,7 @@ for pkg in $out/_pkg/*.a; do chmod +w $pkg ${mac2ios.packages.${system}.mac2ios}/bin/mac2ios $pkg + [[ "$pkg" == *simplex-chat* ]] && ${pkgs.stdenv.cc.targetPrefix}strip -x $pkg chmod -w $pkg done From b5842380f64e941a342a9dbc384557db9050dcd4 Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Mon, 13 Apr 2026 16:19:56 +0000 Subject: [PATCH 025/152] gradle: remove obsolete JetBrains Space dev repo causing 503 build failures (#6803) --- apps/multiplatform/build.gradle.kts | 1 - apps/multiplatform/settings.gradle.kts | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/multiplatform/build.gradle.kts b/apps/multiplatform/build.gradle.kts index a0cd35b3ca..a2e1eb07c3 100644 --- a/apps/multiplatform/build.gradle.kts +++ b/apps/multiplatform/build.gradle.kts @@ -68,7 +68,6 @@ allprojects { repositories { google() mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") maven("https://oss.sonatype.org/content/repositories/snapshots") maven("https://jitpack.io") } diff --git a/apps/multiplatform/settings.gradle.kts b/apps/multiplatform/settings.gradle.kts index 40446f1958..50a50d531d 100644 --- a/apps/multiplatform/settings.gradle.kts +++ b/apps/multiplatform/settings.gradle.kts @@ -3,7 +3,6 @@ pluginManagement { google() gradlePluginPortal() mavenCentral() - maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } plugins { From e977b46e9e40cf9a8bac788bfe5c247b97d15fa4 Mon Sep 17 00:00:00 2001 From: another-simple-pixel Date: Mon, 13 Apr 2026 21:16:24 +0300 Subject: [PATCH 026/152] website: update section 3 dark theme illustrations (#6802) Co-authored-by: Claude Opus 4.6 --- .../src/img/design_3/section-3-desktop.webp | Bin 131982 -> 130424 bytes .../src/img/design_3/section-3-mobile.webp | Bin 154090 -> 169164 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/website/src/img/design_3/section-3-desktop.webp b/website/src/img/design_3/section-3-desktop.webp index 3e8305f83f280affbf2c7367dcbccdd0ddb44f51..1a002a52a7598bc6a61a3f884b1994da95effafe 100644 GIT binary patch literal 130424 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

    sQUtsWhEp#Y(jZVJFA9Csz~ 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 Bq9p(T literal 131982 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

    Welcome to the selected users' communities that you can join via SimpleX Chat app.

    SimpleX Directory is also available as a SimpleX chat bot.

    -

    Read about how to add your community.

    +

    Read about how to add your community.

    GzZeoD3p6v2GQ%0dgEy$ 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 diff --git a/website/src/img/design_3/section-3-mobile.webp b/website/src/img/design_3/section-3-mobile.webp index 30ea2d0ef67beffdf602994883e16e5611bb818f..df983644b587211721a6ff0a1ea4df262815c3fa 100644 GIT binary patch literal 169164 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 Vza#wb4h*0FqlN$f{Qu<%{5N${`}hC= From de813dc0d0ed6e91ea018e8f235e5a537e61492b Mon Sep 17 00:00:00 2001 From: another-simple-pixel Date: Mon, 13 Apr 2026 21:17:25 +0300 Subject: [PATCH 027/152] website: fix horizontal scrollbar on Windows (#6801) --- website/src/css/design3.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/website/src/css/design3.css b/website/src/css/design3.css index ba81d6da4a..0484966ad8 100644 --- a/website/src/css/design3.css +++ b/website/src/css/design3.css @@ -216,6 +216,9 @@ html { font-family: GT-Walsheim, Gilroy, Helvetica, sans-serif; } +body { + overflow-x: hidden; +} .dark html, .dark body { From 5eae0bab23730c0962d24844db6fadae1df36d6e Mon Sep 17 00:00:00 2001 From: another-simple-pixel Date: Mon, 13 Apr 2026 21:18:11 +0300 Subject: [PATCH 028/152] website: center roadmap labels on desktop (#6795) --- website/src/css/design3.css | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/website/src/css/design3.css b/website/src/css/design3.css index 0484966ad8..5e5be66c2f 100644 --- a/website/src/css/design3.css +++ b/website/src/css/design3.css @@ -694,7 +694,7 @@ main .section-bg { font-size: calc(var(--sec-vwu) * 1.5); color: #333333; /* Isometric projection: rotate then skew */ - transform: rotate(-30deg) skewX(30.6deg); + transform: rotate(-30deg) skewX(30.6deg) translateX(-50%); transform-origin: 0 0; } @@ -702,10 +702,10 @@ main .section-bg { color: #ffffff; } -.roadmap-label-now { left: 46.54%; top: 88.16%; } -.roadmap-label-1 { left: 59.5%; top: 75.0%; } -.roadmap-label-2 { left: 72.5%; top: 61.8%; } -.roadmap-label-3 { left: 85.5%; top: 48.5%; } +.roadmap-label-now { left: 47.84%; top: 86.87%; } +.roadmap-label-1 { left: 60.8%; top: 73.7%; } +.roadmap-label-2 { left: 73.8%; top: 60.5%; } +.roadmap-label-3 { left: 86.8%; top: 47.2%; } .dark .page-5 { From 79a9860159f4637400ab236215f565274a8fa636 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 14 Apr 2026 09:02:02 +0000 Subject: [PATCH 029/152] core: fix group link update overwriting owners (#6804) * core: fix group link update overwriting owners * fix * rename --- src/Simplex/Chat/Library/Internal.hs | 11 ++++-- tests/ChatTests/Groups.hs | 51 ++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index da57f654ef..6f867ab0f1 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1328,12 +1328,19 @@ updatePublicGroupData user gInfo -- TODO [relays] owner: set owners on updating link data (multi-owner) groupLinkData :: GroupInfo -> GroupLink -> [GroupRelay] -> (UserConnLinkData 'CMContact, CRClientData) -groupLinkData gInfo@GroupInfo {groupProfile, groupSummary = GroupSummary {publicMemberCount}} GroupLink {groupLinkId} groupRelays = +groupLinkData gInfo@GroupInfo {groupProfile, groupSummary = GroupSummary {publicMemberCount}, membership = GroupMember {memberId}, groupKeys} GroupLink {groupLinkId} groupRelays = let direct = not $ useRelays' gInfo relays = mapMaybe (\GroupRelay {relayLink} -> relayLink) groupRelays publicGroupData_ = PublicGroupData <$> publicMemberCount userData = encodeShortLinkData $ GroupShortLinkData {groupProfile, publicGroupData = publicGroupData_} - userLinkData = UserContactLinkData UserContactData {direct, owners = [], relays, userData} + owners = case groupKeys of + Just GroupKeys {groupRootKey = GRKPrivate rootPrivKey, memberPrivKey} -> + let ownerId = unMemberId memberId + ownerKey = C.publicKey memberPrivKey + authOwnerSig = C.sign' rootPrivKey (ownerId <> C.encodePubKey ownerKey) + in [OwnerAuth {ownerId, ownerKey, authOwnerSig}] + _ -> [] + userLinkData = UserContactLinkData UserContactData {direct, owners, relays, userData} crClientData = encodeJSON $ CRDataGroup groupLinkId in (userLinkData, crClientData) diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index aedbb5e1e9..0685d609e6 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -253,6 +253,7 @@ chatGroupTests = do it "should update channel profile (signed)" testChannelUpdateProfileSigned it "should preserve working link after profile update" testChannelLinkAfterProfileUpdate it "should preserve working link after welcome message update" testChannelLinkAfterWelcomeUpdate + it "should preserve owner key in link data after profile update" testChannelOwnerKeyAfterLinkUpdate it "should update channel preferences (signed)" testChannelUpdatePrefsSigned it "should change member role (signed)" testChannelChangeRoleSigned it "should block member for all (signed)" testChannelBlockMemberSigned @@ -8844,6 +8845,56 @@ testChannelLinkAfterWelcomeUpdate ps = bob <# "#team> hi" [cath, dan] *<# "#team> hi [>>]" +testChannelOwnerKeyAfterLinkUpdate :: HasCallStack => TestParams -> IO () +testChannelOwnerKeyAfterLinkUpdate ps = + withNewTestChat ps "alice" aliceProfile $ \alice -> + withNewTestChatOpts ps relayTestOpts "bob" bobProfile $ \bob -> + withNewTestChat ps "cath" cathProfile $ \cath -> + withNewTestChat ps "dan" danProfile $ \dan -> do + (shortLink, fullLink) <- prepareChannel1Relay "team" alice bob + memberJoinChannel "team" [bob] [alice] shortLink fullLink cath + + -- Owner updates channel profile - triggers rebuilding link data. + alice ##> "/gp team my_team My team description" + alice <## "changed to #my_team (My team description)" + concurrentlyN_ + [ do + bob <## "alice updated group #team: (signed)" + bob <## "changed to #my_team (My team description)", + do + cath <## "alice updated group #team: (signed)" + cath <## "changed to #my_team (My team description)" + ] + + threadDelay 100000 + + -- Late subscriber joins via the same channel link after profile update. + alice ##> "/show link #my_team" + (shortLink', fullLink') <- getGroupLinks alice "my_team" GRMember False + shortLink' `shouldBe` shortLink + fullLink' `shouldBe` fullLink + memberJoinChannel "my_team" [bob] [alice] shortLink' fullLink' dan + + -- Verify owner member record in late subscriber's DB has a public key. + ownerKeyPresent <- withCCTransaction dan $ \db -> + DB.query_ db "SELECT COUNT(1) FROM group_members WHERE member_role = 'owner' AND member_pub_key IS NOT NULL" :: IO [[Int]] + ownerKeyPresent `shouldBe` [[1]] + + -- Verify signed event is received by late subscriber. + alice ##> "/gp my_team team" + alice <## "changed to #team" + concurrentlyN_ + [ do + bob <## "alice updated group #my_team: (signed)" + bob <## "changed to #team", + do + cath <## "alice updated group #my_team: (signed)" + cath <## "changed to #team", + do + dan <## "alice updated group #my_team: (signed)" + dan <## "changed to #team" + ] + testChannelUpdatePrefsSigned :: HasCallStack => TestParams -> IO () testChannelUpdatePrefsSigned ps = withNewTestChat ps "alice" aliceProfile $ \alice -> From 424b8697501722e6d7f96e564188e734d81a6079 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 14 Apr 2026 11:15:12 +0000 Subject: [PATCH 030/152] core: don't save owner key as passed by relay, if owner record doesn't exist (#6806) --- src/Simplex/Chat/Library/Subscriber.hs | 9 +++++++-- tests/ChatTests/Groups.hs | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 1ada54b4f7..15a6d6c8bd 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -2900,8 +2900,13 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = | otherwise -> messageError "x.grp.mem.intro ignored: member already exists" Left _ - | useRelays' gInfo -> - void $ withStore $ \db -> createIntroReMember db user gInfo memInfo memRestrictions + | useRelays' gInfo -> do + -- owner key must only come from link data, not from relay intro + let memInfo' = case memInfo of + MemberInfo mId mRole v p _ + | mRole == GROwner -> MemberInfo mId mRole v p Nothing + _ -> memInfo + void $ withStore $ \db -> createIntroReMember db user gInfo memInfo' memRestrictions | otherwise -> do when (memberRole < GRAdmin) $ throwChatError (CEGroupContactRole c) case memChatVRange of diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 0685d609e6..3c6a29c4e3 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -8854,6 +8854,8 @@ testChannelOwnerKeyAfterLinkUpdate ps = (shortLink, fullLink) <- prepareChannel1Relay "team" alice bob memberJoinChannel "team" [bob] [alice] shortLink fullLink cath + threadDelay 100000 + -- Owner updates channel profile - triggers rebuilding link data. alice ##> "/gp team my_team My team description" alice <## "changed to #my_team (My team description)" @@ -8875,6 +8877,8 @@ testChannelOwnerKeyAfterLinkUpdate ps = fullLink' `shouldBe` fullLink memberJoinChannel "my_team" [bob] [alice] shortLink' fullLink' dan + threadDelay 100000 + -- Verify owner member record in late subscriber's DB has a public key. ownerKeyPresent <- withCCTransaction dan $ \db -> DB.query_ db "SELECT COUNT(1) FROM group_members WHERE member_role = 'owner' AND member_pub_key IS NOT NULL" :: IO [[Int]] From 5c6514ee91cb971537c820975018fbe3bccb9d61 Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:15:39 +0000 Subject: [PATCH 031/152] simplex-chat-nodejs: bump version (#6812) --- packages/simplex-chat-nodejs/package.json | 2 +- packages/simplex-chat-nodejs/src/download-libs.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/simplex-chat-nodejs/package.json b/packages/simplex-chat-nodejs/package.json index 657c6e05f2..21e00e7399 100644 --- a/packages/simplex-chat-nodejs/package.json +++ b/packages/simplex-chat-nodejs/package.json @@ -1,6 +1,6 @@ { "name": "simplex-chat", - "version": "6.5.0-beta.4.4", + "version": "6.5.0-beta.4.5", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ diff --git a/packages/simplex-chat-nodejs/src/download-libs.js b/packages/simplex-chat-nodejs/src/download-libs.js index 6b8f583155..25d4127ea4 100644 --- a/packages/simplex-chat-nodejs/src/download-libs.js +++ b/packages/simplex-chat-nodejs/src/download-libs.js @@ -4,7 +4,7 @@ const path = require('path'); const extract = require('extract-zip'); const GITHUB_REPO = 'simplex-chat/simplex-chat-libs'; -const RELEASE_TAG = 'v6.5.0-beta.4'; +const RELEASE_TAG = 'v6.5.0-beta.9'; const ROOT_DIR = process.cwd(); // Root of the package being installed const LIBS_DIR = path.join(ROOT_DIR, 'libs') const INSTALLED_FILE = path.join(LIBS_DIR, 'installed.txt'); From ac6f8b76acff225d6f9adcdc5650319c9739b9e7 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Wed, 15 Apr 2026 19:28:31 +0000 Subject: [PATCH 032/152] core: flatten MsgContainer type to match wire JSON format (#6808) * core: refactor MsgContainer * comment * simplify * refactor * corrections * update * clean up --------- Co-authored-by: Evgeny Poberezkin --- src/Simplex/Chat/Library/Commands.hs | 17 +- src/Simplex/Chat/Library/Internal.hs | 38 ++-- src/Simplex/Chat/Library/Subscriber.hs | 16 +- src/Simplex/Chat/Messages.hs | 5 - src/Simplex/Chat/Protocol.hs | 255 ++++++++++++------------- src/Simplex/Chat/Store/Messages.hs | 4 +- tests/ProtocolTests.hs | 51 +++-- 7 files changed, 188 insertions(+), 198 deletions(-) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index f37110b8f8..d2660c6203 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -1281,7 +1281,7 @@ processChatCommand vr nm = \case Just smId -> void $ sendDirectContactMessage user ct $ XMsgUpdate smId mc M.empty Nothing Nothing Nothing Nothing Nothing -> do - (msg, _) <- sendDirectContactMessage user ct $ XMsgNew $ MCSimple $ extMsgContent mc Nothing + (msg, _) <- sendDirectContactMessage user ct $ XMsgNew $ mcSimple mc ci <- saveSndChatItem user (CDDirectSnd ct) msg (CISndMsgContent mc) toView $ CEvtNewChatItems user [AChatItem SCTDirect SMDSnd (DirectChat ct) ci] APIRejectContact connReqId -> withUser $ \user -> do @@ -2026,7 +2026,7 @@ processChatCommand vr nm = \case -- create changed feature items (connecting incognito sends default preferences, instead of user preferences) lift . when incognito $ createContactChangedFeatureItems user ct ct' forM_ msgContent_ $ \mc -> do - let evt = XMsgNew $ MCSimple (extMsgContent mc Nothing) + let evt = XMsgNew $ mcSimple mc (msg, _) <- sendDirectContactMessage user ct' evt ci <- saveSndChatItem user (CDDirectSnd ct') msg (CISndMsgContent mc) toView $ CEvtNewChatItems user [AChatItem SCTDirect SMDSnd (DirectChat ct') ci] @@ -2374,7 +2374,7 @@ processChatCommand vr nm = \case Right conn | directOrUsed ct -> (ct, conn) : ctConns _ -> ctConns ctSndEvent :: (Contact, Connection) -> (ConnOrGroupId, Maybe MsgSigning, ChatMsgEvent 'Json) - ctSndEvent (_, Connection {connId}) = (ConnectionId connId, Nothing, XMsgNew $ MCSimple (extMsgContent mc Nothing)) + ctSndEvent (_, Connection {connId}) = (ConnectionId connId, Nothing, XMsgNew $ mcSimple mc) ctMsgReq :: (Contact, Connection) -> SndMessage -> ChatMsgReq ctMsgReq (_, conn) SndMessage {msgId, msgBody} = (conn, MsgFlags {notification = hasNotification XMsgNew_}, (vrValue msgBody, [msgId])) combineResults :: (Contact, Connection) -> Either ChatError SndMessage -> Either ChatError ([Int64], PQEncryption) -> Either ChatError (Contact, SndMessage) @@ -2570,7 +2570,7 @@ processChatCommand vr nm = \case void $ sendGroupMessage user gInfo scope ([m] <> rcpModMs') msg when (maxVersion (memberChatVRange m) < groupKnockingVersion) $ forM_ (memberConn m) $ \mConn -> do - let msg2 = XMsgNew $ MCSimple $ extMsgContent (MCText acceptedToGroupMessage) Nothing + let msg2 = XMsgNew $ mcSimple (MCText acceptedToGroupMessage) void $ sendDirectMemberMessage mConn msg2 groupId when (memberCategory m == GCInviteeMember) $ do introduceToRemaining vr user gInfo m {memberRole = role} @@ -4134,9 +4134,9 @@ processChatCommand vr nm = \case prepareMsgs :: NonEmpty (ComposedMessageReq, Maybe FileInvitation) -> Maybe CITimed -> CM (NonEmpty (MsgContainer, Maybe (CIQuote 'CTDirect))) prepareMsgs cmsFileInvs timed_ = withFastStore $ \db -> forM cmsFileInvs $ \((ComposedMessage {quotedItemId, msgContent = mc}, itemForwarded, _, _), fInv_) -> do - case (quotedItemId, itemForwarded) of - (Nothing, Nothing) -> pure (MCSimple (ExtMsgContent mc M.empty fInv_ (ttl' <$> timed_) (justTrue live) Nothing Nothing), Nothing) - (Nothing, Just _) -> pure (MCForward (ExtMsgContent mc M.empty fInv_ (ttl' <$> timed_) (justTrue live) Nothing Nothing), Nothing) + (mc', quotedItem_) <- case (quotedItemId, itemForwarded) of + (Nothing, Nothing) -> pure (mcSimple mc, Nothing) + (Nothing, Just _) -> pure (mcForward mc, Nothing) (Just qiId, Nothing) -> do CChatItem _ qci@ChatItem {meta = CIMeta {itemTs, itemSharedMsgId}, formattedText, file} <- getDirectChatItem db user contactId qiId @@ -4144,8 +4144,9 @@ processChatCommand vr nm = \case let msgRef = MsgRef {msgId = itemSharedMsgId, sentAt = itemTs, sent, memberId = Nothing} qmc = quoteContent mc origQmc file quotedItem = CIQuote {chatDir = qd, itemId = Just qiId, sharedMsgId = itemSharedMsgId, sentAt = itemTs, content = qmc, formattedText} - pure (MCQuote QuotedMsg {msgRef, content = qmc} (ExtMsgContent mc M.empty fInv_ (ttl' <$> timed_) (justTrue live) Nothing Nothing), Just quotedItem) + pure (mcQuote QuotedMsg {msgRef, content = qmc} mc, Just quotedItem) (Just _, Just _) -> throwError SEInvalidQuote + pure (mc' {file = fInv_, ttl = ttl' <$> timed_, live = justTrue live}, quotedItem_) where quoteData :: ChatItem c d -> ExceptT StoreError IO (MsgContent, CIQDirection 'CTDirect, Bool) quoteData ChatItem {meta = CIMeta {itemDeleted = Just _}} = throwError SEInvalidQuote diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 6f867ab0f1..871c6c512e 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -202,24 +202,22 @@ toggleNtf m ntfOn = withAgent (\a -> toggleConnectionNtfs a connId ntfOn) `catchAllErrors` eToView prepareGroupMsg :: DB.Connection -> User -> GroupInfo -> Maybe MsgScope -> ShowGroupAsSender -> MsgContent -> Map MemberName MsgMention -> Maybe ChatItemId -> Maybe CIForwardedFrom -> Maybe FileInvitation -> Maybe CITimed -> Bool -> ExceptT StoreError IO (ChatMsgEvent 'Json, Maybe (CIQuote 'CTGroup)) -prepareGroupMsg db user g@GroupInfo {membership} msgScope showGroupAsSender mc mentions quotedItemId_ itemForwarded fInv_ timed_ live = case (quotedItemId_, itemForwarded) of - (Nothing, Nothing) -> - let mc' = MCSimple $ ExtMsgContent mc mentions fInv_ (ttl' <$> timed_) (justTrue live) msgScope (justTrue showGroupAsSender) - in pure (XMsgNew mc', Nothing) - (Nothing, Just _) -> - let mc' = MCForward $ ExtMsgContent mc mentions fInv_ (ttl' <$> timed_) (justTrue live) msgScope (justTrue showGroupAsSender) - in pure (XMsgNew mc', Nothing) - (Just quotedItemId, Nothing) -> do - CChatItem _ qci@ChatItem {meta = CIMeta {itemTs, itemSharedMsgId}, formattedText, mentions = quoteMentions, file} <- - getGroupCIWithReactions db user g quotedItemId - (origQmc, qd, sent, member_) <- quoteData qci membership - let msgRef = MsgRef {msgId = itemSharedMsgId, sentAt = itemTs, sent, memberId = memberId' <$> member_} - qmc = quoteContent mc origQmc file - (qmc', ft', _) = updatedMentionNames qmc formattedText quoteMentions - quotedItem = CIQuote {chatDir = qd, itemId = Just quotedItemId, sharedMsgId = itemSharedMsgId, sentAt = itemTs, content = qmc', formattedText = ft'} - mc' = MCQuote QuotedMsg {msgRef, content = qmc'} (ExtMsgContent mc mentions fInv_ (ttl' <$> timed_) (justTrue live) msgScope (justTrue showGroupAsSender)) - pure (XMsgNew mc', Just quotedItem) - (Just _, Just _) -> throwError SEInvalidQuote +prepareGroupMsg db user g@GroupInfo {membership} msgScope showGroupAsSender mc mentions quotedItemId_ itemForwarded fInv_ timed_ live = do + (mc', quotedItem_) <- case (quotedItemId_, itemForwarded) of + (Nothing, Nothing) -> pure (mcSimple mc, Nothing) + (Nothing, Just _) -> pure (mcForward mc, Nothing) + (Just quotedItemId, Nothing) -> do + CChatItem _ qci@ChatItem {meta = CIMeta {itemTs, itemSharedMsgId}, formattedText, mentions = quoteMentions, file} <- + getGroupCIWithReactions db user g quotedItemId + (origQmc, qd, sent, member_) <- quoteData qci membership + let msgRef = MsgRef {msgId = itemSharedMsgId, sentAt = itemTs, sent, memberId = memberId' <$> member_} + qmc = quoteContent mc origQmc file + (qmc', ft', _) = updatedMentionNames qmc formattedText quoteMentions + quotedItem = CIQuote {chatDir = qd, itemId = Just quotedItemId, sharedMsgId = itemSharedMsgId, sentAt = itemTs, content = qmc', formattedText = ft'} + pure (mcQuote QuotedMsg {msgRef, content = qmc'} mc, Just quotedItem) + (Just _, Just _) -> throwError SEInvalidQuote + let mc'' = mc' {mentions = MsgMentions mentions, file = fInv_, ttl = ttl' <$> timed_, live = justTrue live, scope = msgScope, asGroup = justTrue showGroupAsSender} + pure (XMsgNew mc'', quotedItem_) where quoteData :: ChatItem c d -> GroupMember -> ExceptT StoreError IO (MsgContent, CIQDirection 'CTGroup, Bool, Maybe GroupMember) quoteData ChatItem {meta = CIMeta {itemDeleted = Just _}} _ = throwError SEInvalidQuote @@ -1062,7 +1060,7 @@ introduceToModerators vr user gInfo@GroupInfo {groupId} m@GroupMember {memberRol let msg = if maxVersion (memberChatVRange m) >= groupKnockingVersion then XGrpLinkAcpt GAPendingReview memberRole memberId - else XMsgNew $ MCSimple $ extMsgContent (MCText pendingReviewMessage) Nothing + else XMsgNew $ mcSimple (MCText pendingReviewMessage) void $ sendDirectMemberMessage mConn msg groupId modMs <- withStore' $ \db -> getGroupModerators db vr user gInfo let rcpModMs = filter shouldIntroduceToMod modMs @@ -1200,7 +1198,7 @@ sendHistory user gInfo@GroupInfo {membership} m@GroupMember {activeConn = Just c | useRelays' gInfo = Nothing | m `supportsVersion` groupHistoryIncludeWelcomeVersion = do let GroupInfo {groupProfile = GroupProfile {description}} = gInfo - fmap (\descr -> XMsgNew $ MCSimple $ extMsgContent (MCText descr) Nothing) description + fmap (\descr -> XMsgNew $ mcSimple (MCText descr)) description | otherwise = Nothing itemForwardEvents :: CChatItem 'CTGroup -> CM [ChatMsgEvent 'Json] itemForwardEvents cci = case cci of diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index 15a6d6c8bd..e4146fd526 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -700,7 +700,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = Just UserContactRequest {welcomeSharedMsgId = Just smId} -> void $ sendDirectContactMessage user ct $ XMsgUpdate smId mc M.empty Nothing Nothing Nothing Nothing _ -> do - (msg, _) <- sendDirectContactMessage user ct $ XMsgNew $ MCSimple $ extMsgContent mc Nothing + (msg, _) <- sendDirectContactMessage user ct $ XMsgNew $ mcSimple mc ci <- saveSndChatItem user (CDDirectSnd ct) msg (CISndMsgContent mc) toView $ CEvtNewChatItems user [AChatItem SCTDirect SMDSnd (DirectChat ct) ci] @@ -987,7 +987,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = checkSendAsGroup asGroup $ memberCanSend (Just m'') scope $ newGroupContentMessage gInfo' (Just m'') mc msg brokerTs False where - ExtMsgContent {scope, asGroup} = mcExtMsgContent mc + MsgContainer {scope, asGroup} = mc -- file description is always allowed, to allow sending files to support scope XMsgFileDescr sharedMsgId fileDescr -> groupMessageFileDescription gInfo' (Just m'') sharedMsgId fileDescr XMsgUpdate sharedMsgId mContent mentions ttl live msgScope asGroup_ -> @@ -1217,7 +1217,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = Just UserContactRequest {welcomeSharedMsgId = Just smId} -> void $ sendGroupMessage' user gInfo [m] $ XMsgUpdate smId mc M.empty Nothing Nothing Nothing Nothing _ -> do - msg <- sendGroupMessage' user gInfo [m] $ XMsgNew $ MCSimple $ extMsgContent mc Nothing + msg <- sendGroupMessage' user gInfo [m] $ XMsgNew $ mcSimple mc ci <- saveSndChatItem user (CDGroupSnd gInfo Nothing) msg (CISndMsgContent mc) withStore' $ \db -> createGroupSndStatus db (chatItemId' ci) (groupMemberId' m) GSSNew toView $ CEvtNewChatItems user [AChatItem SCTGroup SMDSnd (GroupChat gInfo Nothing) ci] @@ -1726,7 +1726,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = newContentMessage :: Contact -> MsgContainer -> RcvMessage -> MsgMeta -> CM () newContentMessage ct mc msg@RcvMessage {sharedMsgId_} msgMeta = do - let ExtMsgContent content _ fInv_ _ _ _ _ = mcExtMsgContent mc + let MsgContainer {content, file = fInv_} = mc -- Uncomment to test stuck delivery on errors - see test testDirectMessageDelete -- case content of -- MCText "hello 111" -> @@ -1737,7 +1737,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = then do void $ newChatItem (ciContentNoParse $ CIRcvChatFeatureRejected CFVoice) Nothing Nothing False else do - let ExtMsgContent _ _ _ itemTTL live_ _ _ = mcExtMsgContent mc + let MsgContainer {ttl = itemTTL, live = live_} = mc timed_ = rcvContactCITimed ct itemTTL live = fromMaybe False live_ file_ <- processFileInvitation fInv_ content $ \db -> createRcvFileTransfer db userId ct @@ -1979,7 +1979,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = rejected gInfo' m' scopeInfo f = newChatItem gInfo' m' scopeInfo (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False timed_ gInfo' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo' itemTTL live' = fromMaybe False live_ - ExtMsgContent content mentions fInv_ itemTTL live_ msgScope_ asGroup_ = mcExtMsgContent mc + MsgContainer {content, mentions = MsgMentions mentions, file = fInv_, ttl = itemTTL, live = live_, scope = msgScope_, asGroup = asGroup_} = mc sentAsGroup = asGroup_ == Just True ts@(_, ft_) = msgContentTexts content -- m' is Maybe GroupMember @@ -2021,7 +2021,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = let fileMember_ = if sentAsGroup then Nothing else m' in processFileInvitation fInv_ content $ \db -> createRcvGroupFileTransfer db userId gInfo' fileMember_ newChatItem gInfo' m' scopeInfo ciContent ciFile_ timed live = do - let mentions' = if maybe False memberBlocked m' then [] else mentions + let mentions' = if maybe False memberBlocked m' then M.empty else mentions (ci, cInfo) <- saveRcvCI gInfo' m' scopeInfo ciContent ciFile_ timed live mentions' ci' <- maybe (pure ci) (\m -> blockedMemberCI gInfo' m ci) m' let memberId_ = memberId' <$> m' @@ -3290,7 +3290,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = XMsgNew mc -> void $ memberCanSend author_ scope $ newGroupContentMessage gInfo author_ mc rcvMsg msgTs True where - ExtMsgContent {scope} = mcExtMsgContent mc + MsgContainer {scope} = mc -- file description is always allowed, to allow sending files to support scope XMsgFileDescr sharedMsgId fileDescr -> void $ groupMessageFileDescription gInfo author_ sharedMsgId fileDescr XMsgUpdate sharedMsgId mContent mentions ttl live msgScope asGroup_ -> diff --git a/src/Simplex/Chat/Messages.hs b/src/Simplex/Chat/Messages.hs index e404388d8d..d90429f58e 100644 --- a/src/Simplex/Chat/Messages.hs +++ b/src/Simplex/Chat/Messages.hs @@ -1308,11 +1308,6 @@ data CIForwardedFrom | CIFFGroup {chatName :: Text, msgDir :: MsgDirection, groupId :: Maybe GroupId, chatItemId :: Maybe ChatItemId} deriving (Show) -cmForwardedFrom :: AChatMsgEvent -> Maybe CIForwardedFrom -cmForwardedFrom = \case - ACME _ (XMsgNew (MCForward _)) -> Just CIFFUnknown - _ -> Nothing - data CIForwardedFromTag = CIFFUnknown_ | CIFFContact_ diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index 3485849741..db77a2f7b4 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -477,8 +477,8 @@ deriving instance Show AChatMsgEvent -- actual filtering on forwarding is done in processEvent isForwardedGroupMsg :: ChatMsgEvent e -> Bool isForwardedGroupMsg ev = case ev of - XMsgNew mc -> case mcExtMsgContent mc of - ExtMsgContent {file = Just FileInvitation {fileInline = Just _}} -> False + XMsgNew mc -> case mc of + MsgContainer {file = Just FileInvitation {fileInline = Just _}} -> False _ -> True XMsgFileDescr _ _ -> True XMsgUpdate {} -> True @@ -582,7 +582,7 @@ data QuotedMsg = QuotedMsg {msgRef :: MsgRef, content :: MsgContent} cmToQuotedMsg :: AChatMsgEvent -> Maybe QuotedMsg cmToQuotedMsg = \case - ACME _ (XMsgNew (MCQuote quotedMsg _)) -> Just quotedMsg + ACME _ (XMsgNew MsgContainer {quote = Just quotedMsg}) -> Just quotedMsg _ -> Nothing data MsgContentTag @@ -631,24 +631,51 @@ instance FromField MsgContentTag where fromField = fromTextField_ $ eitherToMayb instance ToField MsgContentTag where toField = toField . safeDecodeUtf8 . strEncode -data MsgContainer - = MCSimple ExtMsgContent - | MCQuote QuotedMsg ExtMsgContent - | MCComment MsgRef ExtMsgContent - | MCForward ExtMsgContent +-- Wire JSON 1:1 with parsed form. The three discriminator fields `quote`, `parent`, +-- and `forward` are independent and may co-occur (e.g. a comment that quotes another +-- comment carries both `parent` and `quote`). `forward` is `Maybe Bool` for backwards +-- compatibility with the previous wire encoding: the serializer omits the field when +-- `Nothing` and the parser treats absent/false as "not a forward". +data MsgContainer = MsgContainer + { content :: MsgContent, + -- the key used in mentions is a locally (per message) unique display name of member. + -- Suffixes _1, _2 should be appended to make names locally unique. + -- It should be done in the UI, as they will be part of the text, and validated in the API. + mentions :: MsgMentions, + file :: Maybe FileInvitation, + ttl :: Maybe Int, + live :: Maybe Bool, + scope :: Maybe MsgScope, + asGroup :: Maybe Bool, + quote :: Maybe QuotedMsg, + parent :: Maybe MsgRef, + forward :: Maybe Bool + } deriving (Eq, Show) -mcExtMsgContent :: MsgContainer -> ExtMsgContent -mcExtMsgContent = \case - MCSimple c -> c - MCQuote _ c -> c - MCComment _ c -> c - MCForward c -> c +mcSimple :: MsgContent -> MsgContainer +mcSimple content = + MsgContainer + { content, + mentions = MsgMentions M.empty, + file = Nothing, + ttl = Nothing, + live = Nothing, + scope = Nothing, + asGroup = Nothing, + quote = Nothing, + parent = Nothing, + forward = Nothing + } -isMCForward :: MsgContainer -> Bool -isMCForward = \case - MCForward _ -> True - _ -> False +mcQuote :: QuotedMsg -> MsgContent -> MsgContainer +mcQuote q c = (mcSimple c) {quote = Just q} + +mcComment :: MsgRef -> MsgContent -> MsgContainer +mcComment p c = (mcSimple c) {parent = Just p} + +mcForward :: MsgContent -> MsgContainer +mcForward c = (mcSimple c) {forward = Just True} data MsgContent = MCText {text :: Text} @@ -722,29 +749,94 @@ msgContentTag = \case MCChat {} -> MCChat_ MCUnknown {tag} -> MCUnknown_ tag -data ExtMsgContent = ExtMsgContent - { content :: MsgContent, - -- the key used in mentions is a locally (per message) unique display name of member. - -- Suffixes _1, _2 should be appended to make names locally unique. - -- It should be done in the UI, as they will be part of the text, and validated in the API. - mentions :: Map MemberName MsgMention, - file :: Maybe FileInvitation, - ttl :: Maybe Int, - live :: Maybe Bool, - scope :: Maybe MsgScope, - asGroup :: Maybe Bool - } +data MsgMention = MsgMention {memberId :: MemberId} deriving (Eq, Show) -data MsgMention = MsgMention {memberId :: MemberId} +newtype MsgMentions = MsgMentions (Map MemberName MsgMention) deriving (Eq, Show) $(JQ.deriveJSON (taggedObjectJSON $ dropPrefix "MCL") ''MsgChatLink) $(JQ.deriveJSON defaultJSON ''MsgMention) +instance FromJSON MsgMentions where + parseJSON v = MsgMentions <$> parseJSON v + omittedField = Just $ MsgMentions M.empty + +instance ToJSON MsgMentions where + toJSON (MsgMentions m) = toJSON $ toMaybeMap m + toEncoding (MsgMentions m) = toEncoding $ toMaybeMap m + omitField (MsgMentions m) = M.null m + +toMaybeMap :: Map k v -> Maybe (Map k v) +toMaybeMap m = if M.null m then Nothing else Just m +{-# INLINE toMaybeMap #-} + $(JQ.deriveJSON defaultJSON ''QuotedMsg) +instance FromJSON MsgContent where + parseJSON (J.Object v) = + v .: "type" >>= \case + MCText_ -> MCText <$> v .: "text" + MCLink_ -> do + text <- v .: "text" + preview <- v .: "preview" + pure MCLink {text, preview} + MCImage_ -> do + text <- v .: "text" + image <- v .: "image" + pure MCImage {text, image} + MCVideo_ -> do + text <- v .: "text" + image <- v .: "image" + duration <- v .: "duration" + pure MCVideo {text, image, duration} + MCVoice_ -> do + text <- v .: "text" + duration <- v .: "duration" + pure MCVoice {text, duration} + MCFile_ -> MCFile <$> v .: "text" + MCReport_ -> do + text <- v .: "text" + reason <- v .: "reason" + pure MCReport {text, reason} + MCChat_ -> do + text <- v .: "text" + chatLink <- v .: "chatLink" + pure MCChat {text, chatLink} + MCUnknown_ tag -> do + text <- fromMaybe unknownMsgType <$> v .:? "text" + pure MCUnknown {tag, text, json = v} + parseJSON invalid = + JT.prependFailure "bad MsgContent, " (JT.typeMismatch "Object" invalid) + +unknownMsgType :: Text +unknownMsgType = "unknown message type" + +instance ToJSON MsgContent where + toJSON = \case + MCUnknown {json} -> J.Object json + MCText t -> J.object ["type" .= MCText_, "text" .= t] + MCLink {text, preview} -> J.object ["type" .= MCLink_, "text" .= text, "preview" .= preview] + MCImage {text, image} -> J.object ["type" .= MCImage_, "text" .= text, "image" .= image] + MCVideo {text, image, duration} -> J.object ["type" .= MCVideo_, "text" .= text, "image" .= image, "duration" .= duration] + MCVoice {text, duration} -> J.object ["type" .= MCVoice_, "text" .= text, "duration" .= duration] + MCFile t -> J.object ["type" .= MCFile_, "text" .= t] + MCReport {text, reason} -> J.object ["type" .= MCReport_, "text" .= text, "reason" .= reason] + MCChat {text, chatLink} -> J.object ["type" .= MCChat_, "text" .= text, "chatLink" .= chatLink] + toEncoding = \case + MCUnknown {json} -> JE.value $ J.Object json + MCText t -> J.pairs $ "type" .= MCText_ <> "text" .= t + MCLink {text, preview} -> J.pairs $ "type" .= MCLink_ <> "text" .= text <> "preview" .= preview + MCImage {text, image} -> J.pairs $ "type" .= MCImage_ <> "text" .= text <> "image" .= image + MCVideo {text, image, duration} -> J.pairs $ "type" .= MCVideo_ <> "text" .= text <> "image" .= image <> "duration" .= duration + MCVoice {text, duration} -> J.pairs $ "type" .= MCVoice_ <> "text" .= text <> "duration" .= duration + MCFile t -> J.pairs $ "type" .= MCFile_ <> "text" .= t + MCReport {text, reason} -> J.pairs $ "type" .= MCReport_ <> "text" .= text <> "reason" .= reason + MCChat {text, chatLink} -> J.pairs $ "type" .= MCChat_ <> "text" .= text <> "chatLink" .= chatLink + +$(JQ.deriveJSON defaultJSON ''MsgContainer) + -- this limit reserves space for metadata in forwarded messages -- 15780 (limit used for fileChunkSize) - 161 (x.grp.msg.forward overhead) = 15619, - 16 for block encryption ("rounded" to 15602) maxEncodedMsgLength :: Int @@ -835,109 +927,14 @@ markCompressedBatch :: ByteString -> ByteString markCompressedBatch = B.cons 'X' {-# INLINE markCompressedBatch #-} -parseMsgContainer :: J.Object -> JT.Parser MsgContainer -parseMsgContainer v = - MCQuote <$> v .: "quote" <*> mc - <|> MCComment <$> v .: "parent" <*> mc - <|> (v .: "forward" >>= \f -> (if f then MCForward else MCSimple) <$> mc) - -- The support for arbitrary object in "forward" property is added to allow - -- forward compatibility with forwards that include public group links. - <|> (MCForward <$> ((v .: "forward" :: JT.Parser J.Object) *> mc)) - <|> MCSimple <$> mc - where - mc = do - content <- v .: "content" - file <- v .:? "file" - ttl <- v .:? "ttl" - live <- v .:? "live" - mentions <- fromMaybe M.empty <$> (v .:? "mentions") - scope <- v .:? "scope" - asGroup <- v .:? "asGroup" - pure ExtMsgContent {content, mentions, file, ttl, live, scope, asGroup} - -extMsgContent :: MsgContent -> Maybe FileInvitation -> ExtMsgContent -extMsgContent mc file = ExtMsgContent mc M.empty file Nothing Nothing Nothing Nothing - justTrue :: Bool -> Maybe Bool justTrue True = Just True justTrue False = Nothing -instance FromJSON MsgContent where - parseJSON (J.Object v) = - v .: "type" >>= \case - MCText_ -> MCText <$> v .: "text" - MCLink_ -> do - text <- v .: "text" - preview <- v .: "preview" - pure MCLink {text, preview} - MCImage_ -> do - text <- v .: "text" - image <- v .: "image" - pure MCImage {text, image} - MCVideo_ -> do - text <- v .: "text" - image <- v .: "image" - duration <- v .: "duration" - pure MCVideo {text, image, duration} - MCVoice_ -> do - text <- v .: "text" - duration <- v .: "duration" - pure MCVoice {text, duration} - MCFile_ -> MCFile <$> v .: "text" - MCReport_ -> do - text <- v .: "text" - reason <- v .: "reason" - pure MCReport {text, reason} - MCChat_ -> do - text <- v .: "text" - chatLink <- v .: "chatLink" - pure MCChat {text, chatLink} - MCUnknown_ tag -> do - text <- fromMaybe unknownMsgType <$> v .:? "text" - pure MCUnknown {tag, text, json = v} - parseJSON invalid = - JT.prependFailure "bad MsgContent, " (JT.typeMismatch "Object" invalid) - -unknownMsgType :: Text -unknownMsgType = "unknown message type" - -msgContainerJSON :: MsgContainer -> J.Object -msgContainerJSON = \case - MCQuote qm mc -> o $ ("quote" .= qm) : msgContent mc - MCComment ref mc -> o $ ("parent" .= ref) : msgContent mc - MCForward mc -> o $ ("forward" .= True) : msgContent mc - MCSimple mc -> o $ msgContent mc - where - o = JM.fromList - msgContent ExtMsgContent {content, mentions, file, ttl, live, scope, asGroup} = - ("file" .=? file) $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("mentions" .=? nonEmptyMap mentions) $ ("scope" .=? scope) $ ("asGroup" .=? asGroup) ["content" .= content] - nonEmptyMap :: Map k v -> Maybe (Map k v) nonEmptyMap m = if M.null m then Nothing else Just m {-# INLINE nonEmptyMap #-} -instance ToJSON MsgContent where - toJSON = \case - MCUnknown {json} -> J.Object json - MCText t -> J.object ["type" .= MCText_, "text" .= t] - MCLink {text, preview} -> J.object ["type" .= MCLink_, "text" .= text, "preview" .= preview] - MCImage {text, image} -> J.object ["type" .= MCImage_, "text" .= text, "image" .= image] - MCVideo {text, image, duration} -> J.object ["type" .= MCVideo_, "text" .= text, "image" .= image, "duration" .= duration] - MCVoice {text, duration} -> J.object ["type" .= MCVoice_, "text" .= text, "duration" .= duration] - MCFile t -> J.object ["type" .= MCFile_, "text" .= t] - MCReport {text, reason} -> J.object ["type" .= MCReport_, "text" .= text, "reason" .= reason] - MCChat {text, chatLink} -> J.object ["type" .= MCChat_, "text" .= text, "chatLink" .= chatLink] - toEncoding = \case - MCUnknown {json} -> JE.value $ J.Object json - MCText t -> J.pairs $ "type" .= MCText_ <> "text" .= t - MCLink {text, preview} -> J.pairs $ "type" .= MCLink_ <> "text" .= text <> "preview" .= preview - MCImage {text, image} -> J.pairs $ "type" .= MCImage_ <> "text" .= text <> "image" .= image - MCVideo {text, image, duration} -> J.pairs $ "type" .= MCVideo_ <> "text" .= text <> "image" .= image <> "duration" .= duration - MCVoice {text, duration} -> J.pairs $ "type" .= MCVoice_ <> "text" .= text <> "duration" .= duration - MCFile t -> J.pairs $ "type" .= MCFile_ <> "text" .= t - MCReport {text, reason} -> J.pairs $ "type" .= MCReport_ <> "text" .= text <> "reason" .= reason - MCChat {text, chatLink} -> J.pairs $ "type" .= MCChat_ <> "text" .= text <> "chatLink" .= chatLink - instance ToField MsgContent where toField = toField . encodeJSON @@ -1254,7 +1251,7 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do opt key = JT.parseEither (.:? key) params msg :: CMEventTag 'Json -> Either String (ChatMsgEvent 'Json) msg = \case - XMsgNew_ -> XMsgNew <$> JT.parseEither parseMsgContainer params + XMsgNew_ -> XMsgNew <$> JT.parseEither parseJSON (J.Object params) XMsgFileDescr_ -> XMsgFileDescr <$> p "msgId" <*> p "fileDescr" XMsgUpdate_ -> do msgId' <- p "msgId" @@ -1340,7 +1337,9 @@ chatToAppMessage chatMsg@ChatMessage {chatVRange, msgId, chatMsgEvent} = case en o = JM.fromList params :: ChatMsgEvent 'Json -> J.Object params = \case - XMsgNew container -> msgContainerJSON container + XMsgNew mc -> case toJSON mc of + J.Object obj -> obj + _ -> JM.empty XMsgFileDescr msgId' fileDescr -> o ["msgId" .= msgId', "fileDescr" .= fileDescr] XMsgUpdate {msgId = msgId', content, mentions, ttl, live, scope, asGroup} -> o $ ("asGroup" .=? asGroup) $ ("ttl" .=? ttl) $ ("live" .=? live) $ ("scope" .=? scope) $ ("mentions" .=? nonEmptyMap mentions) ["msgId" .= msgId', "content" .= content] XMsgDel msgId' memberId scope -> o $ ("memberId" .=? memberId) $ ("scope" .=? scope) ["msgId" .= msgId'] diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs index a2c91af86b..eb265ffa2d 100644 --- a/src/Simplex/Chat/Store/Messages.hs +++ b/src/Simplex/Chat/Store/Messages.hs @@ -558,7 +558,9 @@ createNewRcvChatItem db user chatDirection RcvMessage {msgId, chatMsgEvent, msgS quotedItem <- mapM (getChatItemQuote_ db user chatDirection) quotedMsg pure (ciId, quotedItem, itemForwarded) where - itemForwarded = cmForwardedFrom chatMsgEvent + itemForwarded = case chatMsgEvent of + ACME _ (XMsgNew MsgContainer {forward}) | forward == Just True -> Just CIFFUnknown + _ -> Nothing quotedMsg = cmToQuotedMsg chatMsgEvent quoteRow :: NewQuoteRow quoteRow = case quotedMsg of diff --git a/tests/ProtocolTests.hs b/tests/ProtocolTests.hs index 6d9ee54e6c..3ba789b988 100644 --- a/tests/ProtocolTests.hs +++ b/tests/ProtocolTests.hs @@ -113,84 +113,79 @@ decodeChatMessageTest :: Spec decodeChatMessageTest = describe "Chat message encoding/decoding" $ do it "x.msg.new simple text" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing)) + #==# XMsgNew (mcSimple (MCText "hello")) it "x.msg.new simple text - timed message TTL" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"ttl\":3600}}" - #==# XMsgNew (MCSimple (ExtMsgContent (MCText "hello") [] Nothing (Just 3600) Nothing Nothing Nothing)) + #==# XMsgNew ((mcSimple (MCText "hello")) {ttl = Just 3600}) it "x.msg.new simple text - live message" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"live\":true}}" - #==# XMsgNew (MCSimple (ExtMsgContent (MCText "hello") [] Nothing Nothing (Just True) Nothing Nothing)) + #==# XMsgNew ((mcSimple (MCText "hello")) {live = Just True}) it "x.msg.new simple link" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"https://simplex.chat\",\"type\":\"link\",\"preview\":{\"description\":\"SimpleX Chat\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA\",\"title\":\"SimpleX Chat\",\"uri\":\"https://simplex.chat\"}}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCLink "https://simplex.chat" $ LinkPreview {uri = "https://simplex.chat", title = "SimpleX Chat", description = "SimpleX Chat", image = ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA", content = Nothing}) Nothing)) + #==# XMsgNew (mcSimple (MCLink "https://simplex.chat" $ LinkPreview {uri = "https://simplex.chat", title = "SimpleX Chat", description = "SimpleX Chat", image = ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgA", content = Nothing})) it "x.msg.new simple image" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"\",\"type\":\"image\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\"}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCImage "" $ ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=") Nothing)) + #==# XMsgNew (mcSimple (MCImage "" $ ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=")) it "x.msg.new simple image with text" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"here's an image\",\"type\":\"image\",\"image\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=\"}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCImage "here's an image" $ ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=") Nothing)) + #==# XMsgNew (mcSimple (MCImage "here's an image" $ ImageData "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAQMAAAD+wSzIAAAABlBMVEX///+/v7+jQ3Y5AAAADklEQVQI12P4AIX8EAgALgAD/aNpbtEAAAAASUVORK5CYII=")) it "x.msg.new chat message" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}" - ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing))) + ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (mcSimple (MCText "hello"))) it "x.msg.new chat message with chat version range" $ "{\"v\":\"1-17\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}" - ##==## ChatMessage supportedChatVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing))) + ##==## ChatMessage supportedChatVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (mcSimple (MCText "hello"))) it "x.msg.new quote" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}}}}" ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") - (XMsgNew (MCQuote quotedMsg (extMsgContent (MCText "hello to you too") Nothing))) + (XMsgNew (mcQuote quotedMsg (MCText "hello to you too"))) it "x.msg.new quote - timed message TTL" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}},\"ttl\":3600}}" ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") - (XMsgNew (MCQuote quotedMsg (ExtMsgContent (MCText "hello to you too") [] Nothing (Just 3600) Nothing Nothing Nothing))) + (XMsgNew ((mcQuote quotedMsg (MCText "hello to you too")) {ttl = Just 3600})) it "x.msg.new quote - live message" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}},\"live\":true}}" ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") - (XMsgNew (MCQuote quotedMsg (ExtMsgContent (MCText "hello to you too") [] Nothing Nothing (Just True) Nothing Nothing))) + (XMsgNew ((mcQuote quotedMsg (MCText "hello to you too")) {live = Just True})) it "x.msg.new forward" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"forward\":true}}" - ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ MCForward (extMsgContent (MCText "hello") Nothing)) + ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ mcForward (MCText "hello")) it "x.msg.new forward - timed message TTL" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"forward\":true,\"ttl\":3600}}" - ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ MCForward (ExtMsgContent (MCText "hello") [] Nothing (Just 3600) Nothing Nothing Nothing)) + ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ (mcForward (MCText "hello")) {ttl = Just 3600}) it "x.msg.new forward - live message" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"forward\":true,\"live\":true}}" - ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ MCForward (ExtMsgContent (MCText "hello") [] Nothing Nothing (Just True) Nothing Nothing)) + ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ (mcForward (MCText "hello")) {live = Just True}) it "x.msg.new simple text with file" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"file\":{\"fileSize\":12345,\"fileName\":\"photo.jpg\"}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCText "hello") (Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}))) + #==# XMsgNew ((mcSimple (MCText "hello")) {file = Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}}) it "x.msg.new simple file with file" $ "{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"\",\"type\":\"file\"},\"file\":{\"fileSize\":12345,\"fileName\":\"file.txt\"}}}" - #==# XMsgNew (MCSimple (extMsgContent (MCFile "") (Just FileInvitation {fileName = "file.txt", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}))) + #==# XMsgNew ((mcSimple (MCFile "")) {file = Just FileInvitation {fileName = "file.txt", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}}) it "x.msg.new quote with file" $ - "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}},\"file\":{\"fileSize\":12345,\"fileName\":\"photo.jpg\"}}}" + "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello to you too\",\"type\":\"text\"},\"file\":{\"fileSize\":12345,\"fileName\":\"photo.jpg\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}}}}" ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") ( XMsgNew - ( MCQuote - quotedMsg - ( extMsgContent - (MCText "hello to you too") - (Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}) - ) - ) + (mcQuote quotedMsg (MCText "hello to you too")) + {file = Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}} ) it "x.msg.new report" $ "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"\",\"reason\":\"spam\",\"type\":\"report\"},\"quote\":{\"content\":{\"text\":\"hello there!\",\"type\":\"text\"},\"msgRef\":{\"msgId\":\"BQYHCA==\",\"sent\":true,\"sentAt\":\"1970-01-01T00:00:01.000000001Z\"}}}}" ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") - (XMsgNew (MCQuote quotedMsg (extMsgContent (MCReport "" RRSpam) Nothing))) + (XMsgNew (mcQuote quotedMsg (MCReport "" RRSpam))) it "x.msg.new forward with file" $ - "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"forward\":true,\"file\":{\"fileSize\":12345,\"fileName\":\"photo.jpg\"}}}" - ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ MCForward (extMsgContent (MCText "hello") (Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}))) + "{\"v\":\"1\",\"msgId\":\"AQIDBA==\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"},\"file\":{\"fileSize\":12345,\"fileName\":\"photo.jpg\"},\"forward\":true}}" + ##==## ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew $ (mcForward (MCText "hello")) {file = Just FileInvitation {fileName = "photo.jpg", fileSize = 12345, fileDigest = Nothing, fileConnReq = Nothing, fileInline = Nothing, fileDescr = Nothing}}) it "x.msg.update" $ "{\"v\":\"1\",\"event\":\"x.msg.update\",\"params\":{\"msgId\":\"AQIDBA==\", \"content\":{\"text\":\"hello\",\"type\":\"text\"}}}" #==# XMsgUpdate (SharedMsgId "\1\2\3\4") (MCText "hello") [] Nothing Nothing Nothing Nothing @@ -300,7 +295,7 @@ decodeChatMessageTest = describe "Chat message encoding/decoding" $ do -- $ "{\"v\":\"1\",\"event\":\"x.grp.msg.forward\",\"params\":{\"msgForward\":{\"memberId\":\"AQIDBA==\",\"msg\":\"{\"v\":\"1\",\"event\":\"x.msg.new\",\"params\":{\"content\":{\"text\":\"hello\",\"type\":\"text\"}}}\",\"msgTs\":\"1970-01-01T00:00:01.000000001Z\"}}}" -- #==# XGrpMsgForward -- (MemberId "\1\2\3\4") - -- (ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (MCSimple (extMsgContent (MCText "hello") Nothing)))) + -- (ChatMessage chatInitialVRange (Just $ SharedMsgId "\1\2\3\4") (XMsgNew (mcSimple (MCText "hello")))) -- (systemToUTCTime $ MkSystemTime 1 1) it "x.info.probe" $ "{\"v\":\"1\",\"event\":\"x.info.probe\",\"params\":{\"probe\":\"AQIDBA==\"}}" From e2a55291fc09ffd20fc0bfa2a9c68fc0e5c1bf92 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Thu, 16 Apr 2026 09:10:48 +0000 Subject: [PATCH 033/152] core, ui: tolerate unknown MsgContentTag in chatContentTypes (#6805) --- apps/ios/Shared/Model/SimpleXAPI.swift | 2 +- apps/ios/SimpleXChat/ChatTypes.swift | 39 ++++++++++++- .../chat/simplex/common/model/ChatModel.kt | 55 +++++++++++++++---- .../chat/simplex/common/model/SimpleXAPI.kt | 4 +- 4 files changed, 86 insertions(+), 14 deletions(-) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index e527df1abd..02478aed80 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -458,7 +458,7 @@ func apiGetChat(chatId: ChatId, scope: GroupChatScope?, contentTag: MsgContentTa func apiGetChatContentTypes(chatId: ChatId, scope: GroupChatScope? = nil) async throws -> [MsgContentTag] { let r: ChatResponse0 = try await chatSendCmd(.apiGetChatContentTypes(chatId: chatId, scope: scope)) - if case let .chatContentTypes(types) = r { return types } + if case let .chatContentTypes(types) = r { return types.filter { if case .unknown = $0 { return false }; return true } } throw r.unexpected } diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 99fdeebac4..21cd050c8c 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -4773,7 +4773,7 @@ extension MsgContent: Encodable { } } -public enum MsgContentTag: String, Decodable { +public enum MsgContentTag: Codable, Hashable { case text case link case image @@ -4781,6 +4781,43 @@ public enum MsgContentTag: String, Decodable { case voice case file case report + case chat + case unknown(type: String) + + public var rawValue: String { + switch self { + case .text: return "text" + case .link: return "link" + case .image: return "image" + case .video: return "video" + case .voice: return "voice" + case .file: return "file" + case .report: return "report" + case .chat: return "chat" + case let .unknown(type): return type + } + } + + public init(from decoder: Decoder) throws { + let s = try decoder.singleValueContainer().decode(String.self) + switch s { + case "text": self = .text + case "link": self = .link + case "image": self = .image + case "video": self = .video + case "voice": self = .voice + case "file": self = .file + case "report": self = .report + case "chat": self = .chat + case "liveText": self = .text + default: self = .unknown(type: s) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(rawValue) + } } public enum MsgChatLink: Codable, Equatable, Hashable { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index f89a599bb4..ff6b003c25 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -4492,16 +4492,51 @@ object MsgContentSerializer : KSerializer { } } -@Serializable -enum class MsgContentTag { - @SerialName("text") Text, - @SerialName("link") Link, - @SerialName("image") Image, - @SerialName("video") Video, - @SerialName("voice") Voice, - @SerialName("file") File, - @SerialName("report") Report, - @SerialName("chat") Chat, +@Serializable(with = MsgContentTagSerializer::class) +sealed class MsgContentTag { + @Serializable @SerialName("text") object Text: MsgContentTag() + @Serializable @SerialName("link") object Link: MsgContentTag() + @Serializable @SerialName("image") object Image: MsgContentTag() + @Serializable @SerialName("video") object Video: MsgContentTag() + @Serializable @SerialName("voice") object Voice: MsgContentTag() + @Serializable @SerialName("file") object File: MsgContentTag() + @Serializable @SerialName("report") object Report: MsgContentTag() + @Serializable @SerialName("chat") object Chat: MsgContentTag() + @Serializable @SerialName("unknown") data class Unknown(val type: String): MsgContentTag() + + val cmdString: String get() = when (this) { + is Text -> "text" + is Link -> "link" + is Image -> "image" + is Video -> "video" + is Voice -> "voice" + is File -> "file" + is Report -> "report" + is Chat -> "chat" + is Unknown -> type + } +} + +object MsgContentTagSerializer : KSerializer { + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("MsgContentTag", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): MsgContentTag = + when (val s = decoder.decodeString()) { + "text" -> MsgContentTag.Text + "link" -> MsgContentTag.Link + "image" -> MsgContentTag.Image + "video" -> MsgContentTag.Video + "voice" -> MsgContentTag.Voice + "file" -> MsgContentTag.File + "report" -> MsgContentTag.Report + "chat" -> MsgContentTag.Chat + "liveText" -> MsgContentTag.Text + else -> MsgContentTag.Unknown(s) + } + + override fun serialize(encoder: Encoder, value: MsgContentTag) { + encoder.encodeString(value.cmdString) + } } @Serializable diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 661b7e767f..8a2be99af2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1043,7 +1043,7 @@ object ChatController { suspend fun apiGetChatContentTypes(rh: Long?, type: ChatType, id: Long, scope: GroupChatScope?): List? { val r = sendCmd(rh, CC.ApiGetChatContentTypes(type, id, scope)) - if (r is API.Result && r.res is CR.ChatContentTypes) return r.res.contentTypes + if (r is API.Result && r.res is CR.ChatContentTypes) return r.res.contentTypes.filter { it !is MsgContentTag.Unknown } Log.e(TAG, "apiGetChatContentTypes bad response: ${r.responseType} ${r.details}") AlertManager.shared.showAlertMsg(generalGetString(MR.strings.error_loading_details), "${r.responseType}: ${r.details}") return null @@ -3790,7 +3790,7 @@ sealed class CC { val tag = if (contentTag == null) { "" } else { - " content=${contentTag.name.lowercase()}" + " content=${contentTag.cmdString}" } "/_get chat ${chatRef(type, id, scope)}$tag ${pagination.cmdString}" + (if (search == "") "" else " search=$search") } From 30ae0d864ce28e30c193cd1e8617b37cb4205041 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Thu, 16 Apr 2026 23:48:19 +0100 Subject: [PATCH 034/152] core: share links to channels and verify shared links when connecting (#6810) * core: share links to channels and verify shared links when connecting * refactor * improve * refactor case * simplify * exctract encodeChatBinding * share api * corrections Co-authored-by: Evgeny * tests * verify signature in the tests * drop signature if context does not match on reception * try to test "fake" forward * fix * fix direct chat sharing test * channel test * sign link * rename api * refactor view * chal link item CLI view, tests * clean up * share channel in channel as channel * query plan * fix test * refactor * whitespace * simpler * refactor * dont use partial field update --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- bots/api/COMMANDS.md | 1 + bots/api/TYPES.md | 30 +++ bots/src/API/Docs/Commands.hs | 2 + bots/src/API/Docs/Responses.hs | 1 + bots/src/API/Docs/Types.hs | 4 + bots/src/API/TypeInfo.hs | 1 + cabal.project | 2 +- .../types/typescript/src/commands.ts | 1 + .../types/typescript/src/types.ts | 29 ++ ...026-04-11-channel-invitations-directory.md | 255 ++++++++++++++++++ src/Simplex/Chat/Controller.hs | 22 +- src/Simplex/Chat/Library/Commands.hs | 161 +++++++---- src/Simplex/Chat/Library/Internal.hs | 12 +- src/Simplex/Chat/Library/Subscriber.hs | 24 +- src/Simplex/Chat/Protocol.hs | 36 ++- src/Simplex/Chat/Store/Messages.hs | 6 +- .../SQLite/Migrations/chat_query_plans.txt | 39 +++ src/Simplex/Chat/View.hs | 54 +++- tests/ChatTests/ChatRelays.hs | 163 +++++++++++ tests/ChatTests/Groups.hs | 38 ++- tests/ChatTests/Utils.hs | 3 + 21 files changed, 791 insertions(+), 93 deletions(-) create mode 100644 plans/2026-04-11-channel-invitations-directory.md diff --git a/bots/api/COMMANDS.md b/bots/api/COMMANDS.md index b5d49077c0..07bb692e0f 100644 --- a/bots/api/COMMANDS.md +++ b/bots/api/COMMANDS.md @@ -1280,6 +1280,7 @@ Determine SimpleX link type and if the bot is already connected via this link. **Parameters**: - userId: int64 - connectionLink: string? +- linkOwnerSig: [LinkOwnerSig](./TYPES.md#linkownersig)? **Syntax**: diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index aee16ac5ea..de9952063c 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -117,6 +117,7 @@ This file is generated automatically. - [InvitationLinkPlan](#invitationlinkplan) - [InvitedBy](#invitedby) - [LinkContent](#linkcontent) +- [LinkOwnerSig](#linkownersig) - [LinkPreview](#linkpreview) - [LocalProfile](#localprofile) - [MemberCriteria](#membercriteria) @@ -132,6 +133,7 @@ This file is generated automatically. - [NetworkError](#networkerror) - [NewUser](#newuser) - [NoteFolder](#notefolder) +- [OwnerVerification](#ownerverification) - [PendingContactConnection](#pendingcontactconnection) - [PrefEnabled](#prefenabled) - [Preferences](#preferences) @@ -1698,6 +1700,7 @@ Error: Ok: - type: "ok" - contactSLinkData_: [ContactShortLinkData](#contactshortlinkdata)? +- ownerVerification: [OwnerVerification](#ownerverification)? OwnLink: - type: "ownLink" @@ -2261,6 +2264,7 @@ Ok: - type: "ok" - groupSLinkInfo_: [GroupShortLinkInfo](#groupshortlinkinfo)? - groupSLinkData_: [GroupShortLinkData](#groupshortlinkdata)? +- ownerVerification: [OwnerVerification](#ownerverification)? OwnLink: - type: "ownLink" @@ -2526,6 +2530,7 @@ Public: Ok: - type: "ok" - contactSLinkData_: [ContactShortLinkData](#contactshortlinkdata)? +- ownerVerification: [OwnerVerification](#ownerverification)? OwnLink: - type: "ownLink" @@ -2578,6 +2583,16 @@ Unknown: - json: JSONObject +--- + +## LinkOwnerSig + +**Record type**: +- ownerId: string? +- chatBinding: string +- ownerSig: string + + --- ## LinkPreview @@ -2683,6 +2698,7 @@ Chat: - type: "chat" - text: string - chatLink: [MsgChatLink](#msgchatlink) +- ownerSig: [LinkOwnerSig](#linkownersig)? Unknown: - type: "unknown" @@ -2830,6 +2846,20 @@ SubscribeError: - unread: bool +--- + +## OwnerVerification + +**Discriminated union type**: + +Verified: +- type: "verified" + +Failed: +- type: "failed" +- reason: string + + --- ## PendingContactConnection diff --git a/bots/src/API/Docs/Commands.hs b/bots/src/API/Docs/Commands.hs index 26b48e56b0..de91c751d2 100644 --- a/bots/src/API/Docs/Commands.hs +++ b/bots/src/API/Docs/Commands.hs @@ -282,6 +282,7 @@ cliCommands = "SetUserGroupReceipts", "SetUserAutoAcceptMemberContacts", "SetUserTimedMessages", + "SharePublicGroup", "ShowChatItem", "ShowChatItemInfo", "ShowGroupDescription", @@ -407,6 +408,7 @@ undocumentedCommands = "APISetUserGroupReceipts", "APISetUserServers", "APISetUserUIThemes", + "APIShareChatMsgContent", "APIStandaloneFileInfo", "APIStorageEncryption", "APISuspendChat", diff --git a/bots/src/API/Docs/Responses.hs b/bots/src/API/Docs/Responses.hs index 873ca5eb97..eb67c5670b 100644 --- a/bots/src/API/Docs/Responses.hs +++ b/bots/src/API/Docs/Responses.hs @@ -132,6 +132,7 @@ undocumentedResponses = "CRChatItemInfo", "CRChatItems", "CRChatItemTTL", + "CRChatMsgContent", "CRChatRelayTestResult", "CRChats", "CRConnectionsDiff", diff --git a/bots/src/API/Docs/Types.hs b/bots/src/API/Docs/Types.hs index 826b8c1957..18b7d5e43b 100644 --- a/bots/src/API/Docs/Types.hs +++ b/bots/src/API/Docs/Types.hs @@ -299,6 +299,7 @@ chatTypesDocsData = (sti @InvitationLinkPlan, STUnion, "ILP", [], "", ""), (sti @InvitedBy, STUnion, "IB", [], "", ""), (sti @LinkContent, STUnion, "LC", [], "", ""), + (sti @LinkOwnerSig, STRecord, "", [], "", ""), (sti @LinkPreview, STRecord, "", [], "", ""), (sti @LocalProfile, STRecord, "", [], "", ""), (sti @MemberCriteria, STEnum1, "MC", [], "", ""), @@ -314,6 +315,7 @@ chatTypesDocsData = (sti @NetworkError, STUnion, "NE", [], "", ""), (sti @NewUser, STRecord, "", [], "", ""), (sti @NoteFolder, STRecord, "", [], "", ""), + (sti @OwnerVerification, STUnion, "OV", [], "", ""), (sti @PendingContactConnection, STRecord, "", [], "", ""), (sti @PrefEnabled, STRecord, "", [], "", ""), (sti @Preferences, STRecord, "", [], "", ""), @@ -506,6 +508,7 @@ deriving instance Generic JSONCIDirection deriving instance Generic JSONCIFileStatus deriving instance Generic JSONCIStatus deriving instance Generic LinkContent +deriving instance Generic LinkOwnerSig deriving instance Generic LinkPreview deriving instance Generic LocalProfile deriving instance Generic MemberCriteria @@ -521,6 +524,7 @@ deriving instance Generic MsgSigStatus deriving instance Generic NetworkError deriving instance Generic NewUser deriving instance Generic NoteFolder +deriving instance Generic OwnerVerification deriving instance Generic PendingContactConnection deriving instance Generic PrefEnabled deriving instance Generic Preferences diff --git a/bots/src/API/TypeInfo.hs b/bots/src/API/TypeInfo.hs index 37f74e4275..36e87db62d 100644 --- a/bots/src/API/TypeInfo.hs +++ b/bots/src/API/TypeInfo.hs @@ -214,6 +214,7 @@ toTypeInfo tr = "ProtocolServer", "SbKey", "SharedMsgId", + "Signature", "TransportHost", "UIColor", "UserPwd", diff --git a/cabal.project b/cabal.project index 65983d22a5..e7d70bde64 100644 --- a/cabal.project +++ b/cabal.project @@ -21,7 +21,7 @@ constraints: zip +disable-bzip2 +disable-zstd source-repository-package type: git location: https://github.com/simplex-chat/simplexmq.git - tag: bc5ea42bec3a63e46b191e4150dd79957f114e01 + tag: 95b17ada2795e1c5c84bbe2a50a0752ee66d0aad source-repository-package type: git diff --git a/packages/simplex-chat-client/types/typescript/src/commands.ts b/packages/simplex-chat-client/types/typescript/src/commands.ts index d5c3046e3a..2f2b114bfe 100644 --- a/packages/simplex-chat-client/types/typescript/src/commands.ts +++ b/packages/simplex-chat-client/types/typescript/src/commands.ts @@ -471,6 +471,7 @@ export namespace APIAddContact { export interface APIConnectPlan { userId: number // int64 connectionLink?: string + linkOwnerSig?: T.LinkOwnerSig } export namespace APIConnectPlan { diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index 621a69dcc8..f9735f2b0c 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -1986,6 +1986,7 @@ export namespace ContactAddressPlan { export interface Ok extends Interface { type: "ok" contactSLinkData_?: ContactShortLinkData + ownerVerification?: OwnerVerification } export interface OwnLink extends Interface { @@ -2577,6 +2578,7 @@ export namespace GroupLinkPlan { type: "ok" groupSLinkInfo_?: GroupShortLinkInfo groupSLinkData_?: GroupShortLinkData + ownerVerification?: OwnerVerification } export interface OwnLink extends Interface { @@ -2787,6 +2789,7 @@ export namespace InvitationLinkPlan { export interface Ok extends Interface { type: "ok" contactSLinkData_?: ContactShortLinkData + ownerVerification?: OwnerVerification } export interface OwnLink extends Interface { @@ -2856,6 +2859,12 @@ export namespace LinkContent { } } +export interface LinkOwnerSig { + ownerId?: string + chatBinding: string + ownerSig: string +} + export interface LinkPreview { uri: string title: string @@ -2973,6 +2982,7 @@ export namespace MsgContent { type: "chat" text: string chatLink: MsgChatLink + ownerSig?: LinkOwnerSig } export interface Unknown extends Interface { @@ -3131,6 +3141,25 @@ export interface NoteFolder { unread: boolean } +export type OwnerVerification = OwnerVerification.Verified | OwnerVerification.Failed + +export namespace OwnerVerification { + export type Tag = "verified" | "failed" + + interface Interface { + type: Tag + } + + export interface Verified extends Interface { + type: "verified" + } + + export interface Failed extends Interface { + type: "failed" + reason: string + } +} + export interface PendingContactConnection { pccConnId: number // int64 pccAgentConnId: string diff --git a/plans/2026-04-11-channel-invitations-directory.md b/plans/2026-04-11-channel-invitations-directory.md new file mode 100644 index 0000000000..6ae2c046db --- /dev/null +++ b/plans/2026-04-11-channel-invitations-directory.md @@ -0,0 +1,255 @@ +# Public Group Invitations & Directory Listing + +## Goal + +Enable public group (channel) subscribers to invite new subscribers by sharing a channel card in any chat where they can send messages. Channel owners can prove ownership via a signed card. This unblocks directory service support for public groups alongside regular groups. + +Sharing channels should be as simple as forwarding — share button on channel opens chat picker, sends a channel card as a regular message. Old clients show the text; new clients show a rich card with profile and join button. + +## Context + +### Current state +- Public groups have `PublicGroupProfile {groupType = GTChannel, groupLink, publicGroupId}` and `useRelays = True` +- Users join public groups via link → `APIPrepareGroup` → `APIConnectPreparedGroup` +- `MCChat` message content exists with `MsgChatLink` variants for contacts, invitations, and groups (`MCLGroup`) +- Group invitations (`XGrpInv`) carry `connRequest :: ConnReqInvitation` — public groups don't use this mechanism +- Directory bot registers groups via group invitation (owner invites bot as admin) — public groups need a different flow + +### Owner keys in public group links +- `FixedLinkData.rootKey :: PublicKeyEd25519` — genesis root key +- `UserContactData.owners :: [OwnerAuth]` — chain of authorized owner keys, each signed by root or previous owner +- Public group creator stores `GroupKeys {groupRootKey = GRKPrivate rootPrivKey, memberPrivKey}` +- `memberPrivKey`'s public key = `ownerKey` in the `OwnerAuth` entry (created via `newOwnerAuth`) +- `publicGroupId = sha256(rootPubKey)` — immutable group identity + +### DR connection shared secret +- Each direct connection has `rcAD` (Associated Data) from X3DH key exchange +- `getConnectionRatchetAdHash` returns `sha256(rcAD)` — binding for replay protection + +## Design + +### Channel cards as MCChat messages + +Channel invitations are sent as regular `XMsgNew` with `MCChat` content. No new protocol messages. + +```haskell +data MsgContent + = ... + | MCChat {text :: Text, chatLink :: MsgChatLink, ownerSig :: Maybe LinkOwnerSig} + | ... +``` + +`ownerSig` is optional. Old clients ignore it (missing field) and show `text` as a regular message. + +```haskell +data LinkOwnerSig = LinkOwnerSig + { ownerId :: Maybe OwnerId, -- Nothing = root key, Just = owner key from OwnerAuth chain + binding :: B64UrlByteString, + ownerSig :: B64UrlByteString + } +``` + +Sending is supported for channel cards only (for now). Verification is generic for all `MsgChatLink` types: +- `ownerId = Just id`: verified against matching `OwnerAuth.ownerKey` in the link's owner chain (channels) +- `ownerId = Nothing`: verified against `rootKey` from `FixedLinkData` (contacts, invitations) + +The sender proves control over the link regardless of type. + +### What is signed + +`smpEncode chatBinding <> bindingData <> smpEncode chatLink` signed with `memberPrivKey`. + +Binding depends on where the card is sent: +- **Direct chat**: `CBDirect` with `ratchetAdHash` +- **Public group**: `CBGroup` with `smpEncode (publicGroupId, memberId)` +- **Group without public identity**: signature treated as failed at verification time + +Binding is to chat, not to message (`sharedMsgId` is not included). This allows the sender to forward their own signed card within the same chat (e.g., re-sharing a channel link as a reminder) without invalidating the signature. Message-level binding would prevent this since forwarded messages get new `sharedMsgId`s. + +### Sending flow + +1. User presses "Share" on channel → API call `APIPrepareLinkOwnerSig GroupId` returns `Maybe LinkOwnerSig` +2. Opens chat picker (same as forwarding) — chats with disabled simplex links greyed out +3. Sends `XMsgNew` with `MCChat {text = displayName, chatLink = MCLGroup {connLink, groupProfile}, ownerSig}` +4. Creates regular `CISndMsgContent` chat item — no new item types, no new response types + +### Receiving flow + +Regular `XMsgNew` processing. Creates `CIRcvMsgContent (MCChat ...)`. No hidden groups, no async verification, no special events. + +UI renders channel card with profile, member count, join button. If `ownerSig` present, shows "signed by owner" indicator (unverified until join). + +### Verification at join time + +When user taps "Join" on a channel card: + +1. UI extracts `connLink` and `ownerSig` from `MCChat` message content +2. UI calls `APIConnectPlan` with the link and signature. `APIConnectPlan` extended: + ```haskell + APIConnectPlan {userId :: UserId, connectionLink :: Maybe AConnectionLink, linkOwnerSig :: Maybe LinkOwnerSig} + ``` + Parser: `/_connect plan [sig=]` +3. Inside `connectPlan`, if `linkOwnerSig` is present: + - Gets `FixedLinkData {rootKey}` and `UserContactData {owners}` from resolved link + - Finds verification key: `ownerId = Nothing` → `rootKey`, `ownerId = Just id` → matching `OwnerAuth.ownerKey` + - Verifies binding data against expected value from context + - Verifies signature +4. Each "OK" plan variant extended with verification result: + ```haskell + data LinkSigVerification = LSVVerified | LSVFailed {reason :: Text} + + ILPOk {contactSLinkData_, linkSigVerification :: Maybe LinkSigVerification} + CAPOk {contactSLinkData_, linkSigVerification :: Maybe LinkSigVerification} + GLPOk {groupSLinkInfo_, groupSLinkData_, linkSigVerification :: Maybe LinkSigVerification} + -- Nothing = not signed, Just LSVVerified = verified, Just LSVFailed = failed with reason + ``` + Reasons: "unknown owner ID", "binding data mismatch", "signature verification failed", "no group identity for verification" +5. UI shows verification result in join/connect alert for the OK plan variants +6. User confirms → `APIPrepareGroup` → `APIConnectPreparedGroup` — existing join flow, no changes + +Pasted links (no message context) pass `linkOwnerSig = Nothing` — plan shows "not signed." + +### Forwarding + +When `MCChat` is forwarded, `ownerSig` is dropped — UNLESS forwarded by sender in the same chat (re-sharing own card as reminder). Signature is bound to chat context, so forwarding in the same chat preserves validity. + +Implementation: in forwarding code, drop `ownerSig` unless `fromChatRef == toChatRef` and sender is the same user. + +### Simplex link permission + +`MCChat` IS a simplex link — if `SGFSimplexLinks` is prohibited for the sender's role, `MCChat` should be prohibited regardless of content. + +Currently `prohibitedSimplexLinks` (Internal.hs:363) only checks formatted text. Fix: also check `MsgContent` type — if it's `MCChat` and simplex links are not allowed, prohibit it. This covers both send and receive via existing `prohibitedGroupContent` calls. + +For backward compatibility, the current text-level check is sufficient since the link is included in `text`. But the `MCChat` type check is the correct long-term fix. + +### CLI view + +`MCChat` with `MCLGroup` renders as channel card with display name. If `ownerSig` present, shows "(signed)" indicator. + +## Directory bot changes + +### Registration flow + +Bot receives regular `CIRcvMsgContent (MCChat ...)` messages in direct chat from channel owners. Bot checks `ownerSig` is present. Verifies at join time via `connectPlan`. No special events needed. + +- Owner sends channel card to bot in DM (signed) +- Bot resolves link, verifies owner signature +- Bot joins channel as subscriber +- Simplified approval flow: `GRSProposed` → `GRSPendingApproval` → `GRSActive` + +### Profile monitoring + +Bot as subscriber receives `XGrpInfo` when owner updates profile. On profile change: re-resolve link, compare. Periodic re-verification. + +### Search and listing + +Search includes both groups and public groups. No separate listing category — `groupProfile.publicGroup` is the source of truth. `DETGroup` works for both in JSON listing. + +## Implementation plan (diff from master) + +### Step 1: LinkOwnerSig type + +- `LinkOwnerSig` type in Types.hs (or Protocol.hs alongside `MCChat`) +- `ownerSig :: Maybe LinkOwnerSig` field on `MCChat` +- JSON derivation with backward compat (optional field) + +### Step 2: CBDirect + +- Add `CBDirect` to `ChatBinding` in Protocol.hs (already done on master via refactoring PR) + +### Step 3: Share chat message content API + +New command that constructs the complete `MCChat` content for sharing: +```haskell +-- Controller.hs +APIShareChatMsgContent {shareChatRef :: ChatRef, toChatRef :: ChatRef} +-- returns CRChatMsgContent {user :: User, msgContent :: MsgContent} +``` + +Implementation in Commands.hs: +1. Load shared chat info from `shareChatRef` — initially only `CTGroup` with public groups supported +2. Get `PublicGroupProfile {groupLink}` and `groupProfile` from group +3. Determine if user is owner (has `GroupKeys {memberPrivKey}`) +4. If owner, compute binding based on `toChatRef`: + - `ChatRef CTDirect contactId` → `getConnectionRatchetAdHash` on contact's connection → `CBDirect` + - `ChatRef CTGroup groupId` → `smpEncode (publicGroupId, memberId)` if group has identity → `CBGroup` + - Group without identity → `Nothing` (can't sign) +5. If owner and binding available, sign `smpEncode chatBinding <> bindingData <> smpEncode chatLink` with `memberPrivKey` +6. Return `MCChat {text = displayName, chatLink = MCLGroup {connLink = groupLink, groupProfile}, ownerSig}` + +Parser: `/_share_chat ` + +UI flow: press Share on channel → chat picker → select destination → call `APIShareChatMsgContent` → get `MsgContent` → send via existing `APISendMessages` + +All business logic (ownership check, signing decision, link extraction, profile inclusion) stays in core. UI only passes two chat refs and sends the returned content. + +### Step 4: connectPlan verification + +Extend `APIConnectPlan` (Controller.hs:472): +```haskell +APIConnectPlan {userId :: UserId, connectionLink :: Maybe AConnectionLink, linkOwnerSig :: Maybe LinkOwnerSig} +``` + +Parser (Commands.hs:4945): extend to accept optional JSON `LinkOwnerSig` parameter. + +In `connectPlan` (Commands.hs), pass `linkOwnerSig` to `groupShortLinkPlan` / `groupJoinRequestPlan`. + +In `groupShortLinkPlan` (Commands.hs ~line 3944): after resolving the link via `getShortLinkConnReq`, if `linkOwnerSig` is present: +1. Extract `FixedLinkData {rootKey}` and `UserContactData {owners}` +2. If `ownerId = Nothing`: verify against `rootKey` +3. If `ownerId = Just id`: find `OwnerAuth` where `ownerId == id`, verify against `ownerKey` +4. Check binding data matches expected +5. Verify signature + +Extend `GroupLinkPlan` (Controller.hs:1025): +```haskell +GLPOk {groupSLinkInfo_, groupSLinkData_, ownerVerified :: Maybe Bool} +``` +`Nothing` = not signed, `Just True` = verified, `Just False` = failed. + +`CRConnectionPlan` response carries this through to UI — shown in plan alert. + +### Step 5: Forwarding — drop ownerSig + +In message forwarding code (Commands.hs, `APIForwardChatItems`), when forwarding `MCChat` content, set `ownerSig = Nothing`. + +Location: Commands.hs where forwarded message content is constructed — find where `MCChat` is handled in forwarding and strip the signature. + +### Step 6: Permission check + +Fix `prohibitedSimplexLinks` (Internal.hs:363) to also check `MsgContent` type — if `MCChat`, treat as simplex link. Covers both send and receive paths via existing `prohibitedGroupContent` calls. + +For backward compatibility, the link is also in `text` field, so existing text-level check catches it. The type check is the correct fix. + +### Step 7: CLI view + +In `viewChatItem` (View.hs), `MCChat` content already renders via `ttyMsgContent`. Extend to show channel card format and "(signed)" indicator when `ownerSig` is present. + +### Step 8: groupLinkData owners preservation + +Fix `groupLinkData` (Internal.hs:1330) to reconstruct `OwnerAuth` from `GroupKeys` instead of hardcoding `owners = []`. This ensures the resolved link data has the owner keys needed for verification. + +Implementation: when `GroupKeys` has `GRKPrivate rootPrivKey` and `memberPrivKey`, reconstruct `OwnerAuth` with `ownerId = unMemberId memberId`, `ownerKey = publicKey memberPrivKey`, `authOwnerSig = sign rootPrivKey (ownerId <> encodePubKey ownerKey)`. + +### Step 9: Tests + +- Share channel card in direct chat (owner signed) +- Share channel card in group (unsigned — no binding for groups without identity) +- Share channel card in channel +- Join via channel card — verify `connectPlan` shows verification result +- Non-public group share rejected +- Forwarded card has no signature +- Old client compatibility (text field shown) + +### Step 10: Directory bot + +- Handle `MCChat` with `MCLGroup` in `crDirectoryEvent_` +- Channel registration flow +- Profile monitoring + +## What stays from refactoring PR (already on master) + +- `CBDirect` in `ChatBinding` +- `HasShortLink` typeclass with `connShortLink'` +- `setShortLinkType` / `setShortLinkType_` diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 16652f90dd..f4757ca501 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -341,6 +341,7 @@ data ChatCommand | APIGetReactionMembers {userId :: UserId, groupId :: GroupId, chatItemId :: ChatItemId, reaction :: MsgReaction} | APIPlanForwardChatItems {fromChatRef :: ChatRef, chatItemIds :: NonEmpty ChatItemId} | APIForwardChatItems {toChatRef :: ChatRef, sendAsGroup :: ShowGroupAsSender, fromChatRef :: ChatRef, chatItemIds :: NonEmpty ChatItemId, ttl :: Maybe Int} + | APIShareChatMsgContent {shareChatRef :: ChatRef, toSendRef :: SendRef} | APIUserRead UserId | UserRead | APIChatRead {chatRef :: ChatRef} @@ -469,7 +470,7 @@ data ChatCommand | AddContact IncognitoEnabled | APISetConnectionIncognito Int64 IncognitoEnabled | APIChangeConnectionUser Int64 UserId -- new user id to switch connection to - | APIConnectPlan {userId :: UserId, connectionLink :: Maybe AConnectionLink} -- Maybe is used to report link parsing failure as special error + | APIConnectPlan {userId :: UserId, connectionLink :: Maybe AConnectionLink, linkOwnerSig :: Maybe LinkOwnerSig} -- Maybe AConnectionLink is used to report link parsing failure as special error | APIPrepareContact UserId ACreatedConnLink ContactShortLinkData | APIPrepareGroup UserId CreatedLinkContact DirectLink GroupShortLinkData | APIChangePreparedContactUser ContactId UserId @@ -500,6 +501,7 @@ data ChatCommand | ForwardMessage {toChatName :: ChatName, fromContactName :: ContactName, forwardedMsg :: Text} | ForwardGroupMessage {toChatName :: ChatName, fromGroupName :: GroupName, fromMemberName_ :: Maybe ContactName, forwardedMsg :: Text} | ForwardLocalMessage {toChatName :: ChatName, forwardedMsg :: Text} + | SharePublicGroup {shareGroupName :: GroupName, toChatName :: ChatName} | SendMessage SendName Text | SendMemberContactMessage GroupName ContactName Text | AcceptMemberContact ContactName @@ -760,6 +762,7 @@ data ChatResponse | CRLeftMemberUser {user :: User, groupInfo :: GroupInfo} | CRGroupDeletedUser {user :: User, groupInfo :: GroupInfo, msgSigned :: Bool} | CRForwardPlan {user :: User, itemsCount :: Int, chatItemIds :: [ChatItemId], forwardConfirmation :: Maybe ForwardConfirmation} + | CRChatMsgContent {user :: User, msgContent :: MsgContent} | CRRcvFileAccepted {user :: User, chatItem :: AChatItem} -- TODO add chatItem :: AChatItem | CRRcvFileAcceptedSndCancelled {user :: User, rcvFileTransfer :: RcvFileTransfer} @@ -1007,14 +1010,14 @@ data ConnectionPlan deriving (Show) data InvitationLinkPlan - = ILPOk {contactSLinkData_ :: Maybe ContactShortLinkData} + = ILPOk {contactSLinkData_ :: Maybe ContactShortLinkData, ownerVerification :: Maybe OwnerVerification} | ILPOwnLink | ILPConnecting {contact_ :: Maybe Contact} | ILPKnown {contact :: Contact} deriving (Show) data ContactAddressPlan - = CAPOk {contactSLinkData_ :: Maybe ContactShortLinkData} + = CAPOk {contactSLinkData_ :: Maybe ContactShortLinkData, ownerVerification :: Maybe OwnerVerification} | CAPOwnLink | CAPConnectingConfirmReconnect | CAPConnectingProhibit {contact :: Contact} @@ -1023,13 +1026,18 @@ data ContactAddressPlan deriving (Show) data GroupLinkPlan - = GLPOk {groupSLinkInfo_ :: Maybe GroupShortLinkInfo, groupSLinkData_ :: Maybe GroupShortLinkData} + = GLPOk {groupSLinkInfo_ :: Maybe GroupShortLinkInfo, groupSLinkData_ :: Maybe GroupShortLinkData, ownerVerification :: Maybe OwnerVerification} | GLPOwnLink {groupInfo :: GroupInfo} | GLPConnectingConfirmReconnect | GLPConnectingProhibit {groupInfo_ :: Maybe GroupInfo} | GLPKnown {groupInfo :: GroupInfo} deriving (Show) +data OwnerVerification + = OVVerified + | OVFailed {reason :: Text} + deriving (Show) + type DirectLink = Bool data GroupShortLinkInfo = GroupShortLinkInfo @@ -1042,11 +1050,11 @@ data GroupShortLinkInfo = GroupShortLinkInfo connectionPlanProceed :: ConnectionPlan -> Bool connectionPlanProceed = \case CPInvitationLink ilp -> case ilp of - ILPOk _ -> True + ILPOk {} -> True ILPOwnLink -> True _ -> False CPContactAddress cap -> case cap of - CAPOk _ -> True + CAPOk {} -> True CAPOwnLink -> True CAPConnectingConfirmReconnect -> True CAPContactViaAddress _ -> True @@ -1631,6 +1639,8 @@ $(JQ.deriveJSON (enumJSON $ dropPrefix "HS") ''HelpSection) $(JQ.deriveJSON (sumTypeJSON $ dropPrefix "CLQ") ''ChatListQuery) +$(JQ.deriveJSON (sumTypeJSON $ dropPrefix "OV") ''OwnerVerification) + $(JQ.deriveJSON (sumTypeJSON $ dropPrefix "ILP") ''InvitationLinkPlan) $(JQ.deriveJSON (sumTypeJSON $ dropPrefix "CAP") ''ContactAddressPlan) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index d2660c6203..3a1cc76a44 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -101,6 +101,7 @@ import qualified Simplex.Messaging.Crypto.ShortLink as SL import Simplex.Messaging.Crypto.File (CryptoFile (..), CryptoFileArgs (..)) import qualified Simplex.Messaging.Crypto.File as CF import Simplex.Messaging.Crypto.Ratchet (PQEncryption (..), PQSupport (..), pattern IKPQOff, pattern IKPQOn, pattern PQEncOff, pattern PQSupportOff, pattern PQSupportOn) +import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers (base64P) import Simplex.Messaging.Protocol (AProtoServerWithAuth (..), AProtocolType (..), MsgFlags (..), NtfServer, ProtoServerWithAuth (..), ProtocolServer, ProtocolType (..), ProtocolTypeI (..), SProtocolType (..), SubscriptionMode (..), UserProtocol, userProtocol) @@ -690,7 +691,7 @@ processChatCommand vr nm = \case gInfo@GroupInfo {groupId, membership} <- withFastStore $ \db -> getGroupInfo db vr user chatId when (isNothing scope) $ assertUserGroupRole gInfo GRAuthor let (_, ft_) = msgContentTexts mc - if prohibitedSimplexLinks gInfo membership ft_ + if prohibitedSimplexLinks gInfo membership mc ft_ then throwCmdError ("feature not allowed " <> T.unpack (groupFeatureNameText GFSimplexLinks)) else do -- TODO [knocking] check chat item scope? @@ -999,7 +1000,13 @@ processChatCommand vr nm = \case CTContactConnection -> throwCmdError "not supported" where prepareMsgReq :: CChatItem c -> CM (Maybe (MsgContent, Maybe CryptoFile)) - prepareMsgReq (CChatItem _ ci) = forwardMsgContent ci $>>= forwardContent ci + prepareMsgReq (CChatItem md ci) = forwardMsgContent ci $>>= forwardContent ci . dropOwnerSig + where + dropOwnerSig = \case + mc@MCChat {text, chatLink} + | SMDSnd <- md, fromChat == toChat -> mc + | otherwise -> MCChat {text, chatLink, ownerSig = Nothing} + mc -> mc forwardCIFF :: ChatItem c d -> Maybe CIForwardedFrom -> Maybe CIForwardedFrom forwardCIFF ChatItem {meta = CIMeta {itemForwarded}} ciff = case itemForwarded of Nothing -> ciff @@ -1067,6 +1074,41 @@ processChatCommand vr nm = \case let formattedDate = formatTime defaultTimeLocale "%Y%m%d_%H%M%S" currentDate let ext = takeExtension fileName pure $ prefix <> formattedDate <> ext + APIShareChatMsgContent (ChatRef CTGroup groupId _) toSendRef -> withUser $ \user -> do + GroupInfo {groupProfile = gp@GroupProfile {publicGroup}, membership = GroupMember {memberId, memberRole}, groupKeys} <- + withFastStore $ \db -> getGroupInfo db vr user groupId + case publicGroup of + Nothing -> throwCmdError "not a public group" + Just PublicGroupProfile {groupLink} -> do + let signingKeys = case (memberRole, groupKeys) of + (GROwner, Just gk@GroupKeys {groupRootKey = GRKPrivate _}) -> Just gk + _ -> Nothing + ownerSig <- + pure signingKeys $>>= \GroupKeys {memberPrivKey} -> + mkLinkOwnerSig memberPrivKey groupLink memberId <$$> shareChatBinding user toSendRef + let text = safeDecodeUtf8 $ strEncode groupLink + pure $ CRChatMsgContent user MCChat {text, chatLink = MCLGroup groupLink gp, ownerSig} + where + mkLinkOwnerSig :: ConnectionModeI m => C.PrivateKeyEd25519 -> ConnShortLink m -> MemberId -> (ChatBinding, ByteString) -> LinkOwnerSig + mkLinkOwnerSig privKey connLink MemberId {unMemberId} (cbTag, bindingData) = + let ownerId = Just $ B64UrlByteString unMemberId + cb = encodeChatBinding cbTag bindingData + ownerSig = C.sign' privKey $ cb <> smpEncode connLink + in LinkOwnerSig {ownerId, chatBinding = B64UrlByteString cb, ownerSig} + shareChatBinding :: User -> SendRef -> CM (Maybe (ChatBinding, ByteString)) + shareChatBinding u = \case + SRDirect contactId -> do + ct <- withFastStore $ \db -> getContact db vr u contactId + forM (contactConn ct) $ \conn -> + (CBDirect,) <$> withAgent (`getConnectionRatchetAdHash` aConnId conn) + SRGroup toGroupId _ asGroup -> do + GroupInfo {groupProfile = GroupProfile {publicGroup}, membership = m} <- withFastStore $ \db -> getGroupInfo db vr u toGroupId + pure $ mkBinding m <$> publicGroup + where + mkBinding GroupMember {memberId} PublicGroupProfile {publicGroupId = pgId} + | asGroup = (CBChannel, smpEncode pgId) + | otherwise = (CBGroup, smpEncode (pgId, memberId)) + APIShareChatMsgContent _ _ -> throwCmdError "sharing is only supported for public groups" APIUserRead userId -> withUserId userId $ \user -> withFastStore' (`setUserChatsRead` user) >> ok user UserRead -> withUser $ \User {userId} -> processChatCommand vr nm $ APIUserRead userId APIChatRead chatRef@(ChatRef cType chatId scope_) -> withUser $ \_ -> case cType of @@ -1933,9 +1975,9 @@ processChatCommand vr nm = \case createDirectConnection db newUser agConnId ccLink' Nothing ConnNew Nothing subMode initialChatVersion PQSupportOn deleteAgentConnectionAsync (aConnId' conn) pure conn' - APIConnectPlan userId (Just cLink) -> withUserId userId $ \user -> - uncurry (CRConnectionPlan user) <$> connectPlan user cLink - APIConnectPlan _ Nothing -> throwChatError CEInvalidConnReq + APIConnectPlan userId (Just cLink) linkOwnerSig_ -> withUserId userId $ \user -> + uncurry (CRConnectionPlan user) <$> connectPlan user cLink linkOwnerSig_ + APIConnectPlan _ Nothing _ -> throwChatError CEInvalidConnReq APIPrepareContact userId accLink contactSLinkData -> withUserId userId $ \user -> do let ContactShortLinkData {profile, message, business} = contactSLinkData welcomeSharedMsgId <- forM message $ \_ -> getSharedMsgId @@ -2176,7 +2218,7 @@ processChatCommand vr nm = \case Connect incognito (Just cLink@(ACL m cLink')) -> withUser $ \user -> do -- TODO [relays] member: /c api to support groups with relays -- TODO - possibly by going through APIPrepareGroup -> APIConnectPreparedGroup - (ccLink, plan) <- connectPlan user cLink `catchAllErrors` \e -> case cLink' of CLFull cReq -> pure (ACCL m (CCLink cReq Nothing), CPInvitationLink (ILPOk Nothing)); _ -> throwError e + (ccLink, plan) <- connectPlan user cLink Nothing `catchAllErrors` \e -> case cLink' of CLFull cReq -> pure (ACCL m (CCLink cReq Nothing), CPInvitationLink (ILPOk Nothing Nothing)); _ -> throwError e connectWithPlan user incognito ccLink plan Connect _ Nothing -> throwChatError CEInvalidConnReq APIConnectContactViaAddress userId incognito contactId -> withUserId userId $ \user -> do @@ -2194,7 +2236,7 @@ processChatCommand vr nm = \case toView $ CEvtChatInfoUpdated user (AChatInfo SCTDirect $ DirectChat ct') throwError e ConnectSimplex incognito -> withUser $ \user -> do - plan <- contactRequestPlan user adminContactReq Nothing `catchAllErrors` const (pure $ CPContactAddress (CAPOk Nothing)) + plan <- contactRequestPlan user adminContactReq Nothing Nothing `catchAllErrors` const (pure $ CPContactAddress (CAPOk Nothing Nothing)) connectWithPlan user incognito (ACCL SCMContact (CCLink adminContactReq Nothing)) plan DeleteContact cName cdm -> withContactName cName $ \ctId -> APIDeleteChat (ChatRef CTDirect ctId Nothing) cdm ClearContact cName -> withContactName cName $ \chatId -> APIClearChat $ ChatRef CTDirect chatId Nothing @@ -2288,6 +2330,19 @@ processChatCommand vr nm = \case toChatRef <- getChatRef user toChatName asGroup <- getSendAsGroup user toChatRef processChatCommand vr nm $ APIForwardChatItems toChatRef asGroup (ChatRef CTLocal folderId Nothing) (forwardedItemId :| []) Nothing + SharePublicGroup shareGroupName toChatName -> withUser $ \user -> do + groupId <- withFastStore $ \db -> getGroupIdByName db user shareGroupName + toChatRef <- getChatRef user toChatName + sendRef <- case toChatRef of + ChatRef CTDirect ctId _ -> pure $ SRDirect ctId + ChatRef CTGroup gId scope_ -> do + gInfo <- withFastStore $ \db -> getGroupInfo db vr user gId + pure $ SRGroup gId scope_ (useRelays' gInfo) + _ -> throwCmdError "unsupported share target" + processChatCommand vr nm (APIShareChatMsgContent (ChatRef CTGroup groupId Nothing) sendRef) >>= \case + CRChatMsgContent _ mc -> + processChatCommand vr nm $ APISendMessages sendRef False Nothing [composedMessage Nothing mc] + r -> pure r SendMessage sendName msg -> withUser $ \user -> do let mc = MCText msg case sendName of @@ -3888,28 +3943,29 @@ processChatCommand vr nm = \case pure (gId, chatSettings) _ -> throwCmdError "not supported" processChatCommand vr nm $ APISetChatSettings (ChatRef cType chatId Nothing) $ updateSettings chatSettings - connectPlan :: User -> AConnectionLink -> CM (ACreatedConnLink, ConnectionPlan) - connectPlan user (ACL SCMInvitation cLink) = case cLink of - CLFull cReq -> invitationReqAndPlan cReq Nothing Nothing + connectPlan :: User -> AConnectionLink -> Maybe LinkOwnerSig -> CM (ACreatedConnLink, ConnectionPlan) + connectPlan user (ACL SCMInvitation cLink) sig_ = case cLink of + CLFull cReq -> invitationReqAndPlan cReq Nothing Nothing Nothing CLShort l -> do let l' = serverShortLink l knownLinkPlans l' >>= \case Just r -> pure r Nothing -> do - (FixedLinkData {linkConnReq = cReq}, cData) <- getShortLinkConnReq nm user l' + (FixedLinkData {linkConnReq = cReq, rootKey}, cData) <- getShortLinkConnReq nm user l' contactSLinkData_ <- liftIO $ decodeLinkUserData cData - invitationReqAndPlan cReq (Just l') contactSLinkData_ + let ov = verifyLinkOwner rootKey [] l sig_ + invitationReqAndPlan cReq (Just l') contactSLinkData_ ov where knownLinkPlans l' = withFastStore $ \db -> do let inv cReq = ACCL SCMInvitation $ CCLink cReq (Just l') liftIO (getConnectionEntityViaShortLink db vr user l') >>= \case - Just (cReq, ent) -> pure $ Just (inv cReq, invitationEntityPlan Nothing ent) + Just (cReq, ent) -> pure $ Just (inv cReq, invitationEntityPlan Nothing Nothing ent) -- deleted contact is returned as known, as invitation link cannot be re-used too connect anyway Nothing -> bimap inv (CPInvitationLink . ILPKnown) <$$> getContactViaShortLinkToConnect db vr user l' - invitationReqAndPlan cReq sLnk_ contactSLinkData_ = do - plan <- invitationRequestPlan user cReq contactSLinkData_ `catchAllErrors` (pure . CPError) + invitationReqAndPlan cReq sLnk_ cld ov = do + plan <- invitationRequestPlan user cReq cld ov `catchAllErrors` (pure . CPError) pure (ACCL SCMInvitation (CCLink cReq sLnk_), plan) - connectPlan user (ACL SCMContact cLink) = case cLink of + connectPlan user (ACL SCMContact cLink) sig_ = case cLink of CLFull cReq -> do plan <- contactOrGroupRequestPlan user cReq `catchAllErrors` (pure . CPError) pure (ACCL SCMContact $ CCLink cReq Nothing, plan) @@ -3919,12 +3975,14 @@ processChatCommand vr nm = \case knownLinkPlans >>= \case Just r -> pure r Nothing -> do - (FixedLinkData {linkConnReq = cReq}, cData) <- getShortLinkConnReq nm user l' + (FixedLinkData {linkConnReq = cReq, rootKey}, cData) <- getShortLinkConnReq nm user l' withFastStore' (\db -> getContactWithoutConnViaShortAddress db vr user l') >>= \case Just ct' | not (contactDeleted ct') -> pure (con cReq, CPContactAddress (CAPContactViaAddress ct')) _ -> do contactSLinkData_ <- liftIO $ decodeLinkUserData cData - plan <- contactRequestPlan user cReq contactSLinkData_ + let ContactLinkData _ UserContactData {owners} = cData + ov = verifyLinkOwner rootKey owners l' sig_ + plan <- contactRequestPlan user cReq contactSLinkData_ ov pure (con cReq, plan) where knownLinkPlans = withFastStore $ \db -> @@ -3945,8 +4003,8 @@ processChatCommand vr nm = \case knownLinkPlans >>= \case Just r -> pure r Nothing -> do - (fd, cData@(ContactLinkData _ UserContactData {direct, relays})) <- getShortLinkConnReq nm user l' - let FixedLinkData {linkConnReq = cReq, linkEntityId} = fd + (fd, cData@(ContactLinkData _ UserContactData {direct, owners, relays})) <- getShortLinkConnReq nm user l' + let FixedLinkData {linkConnReq = cReq, linkEntityId, rootKey} = fd linkInfo = GroupShortLinkInfo {direct, groupRelays = relays, publicGroupId = B64UrlByteString <$> linkEntityId} groupSLinkData_ <- liftIO $ decodeLinkUserData cData -- Cross-validate linkEntityId and publicGroupId from profile: @@ -3957,7 +4015,8 @@ processChatCommand vr nm = \case (Just entityId, Just publicGroupId) | entityId == publicGroupId -> pure () (Nothing, Nothing) -> pure () _ -> throwChatError CEInvalidConnReq - plan <- groupJoinRequestPlan user cReq (Just linkInfo) groupSLinkData_ + let ov = verifyLinkOwner rootKey owners l' sig_ + plan <- groupJoinRequestPlan user cReq (Just linkInfo) groupSLinkData_ ov pure (con cReq, plan) where knownLinkPlans = withFastStore $ \db -> @@ -3973,9 +4032,9 @@ processChatCommand vr nm = \case processChatCommand vr nm $ APIConnectContactViaAddress userId incognito contactId _ -> processChatCommand vr nm $ APIConnect userId incognito $ Just ccLink | otherwise = pure $ CRConnectionPlan user ccLink plan - invitationRequestPlan :: User -> ConnReqInvitation -> Maybe ContactShortLinkData -> CM ConnectionPlan - invitationRequestPlan user cReq contactSLinkData_ = do - maybe (CPInvitationLink (ILPOk contactSLinkData_)) (invitationEntityPlan contactSLinkData_) + invitationRequestPlan :: User -> ConnReqInvitation -> Maybe ContactShortLinkData -> Maybe OwnerVerification -> CM ConnectionPlan + invitationRequestPlan user cReq cld ov = do + maybe (CPInvitationLink (ILPOk cld ov)) (invitationEntityPlan cld ov) <$> withFastStore' (\db -> getConnectionEntityByConnReq db vr user $ invCReqSchemas cReq) where invCReqSchemas :: ConnReqInvitation -> (ConnReqInvitation, ConnReqInvitation) @@ -3983,15 +4042,15 @@ processChatCommand vr nm = \case ( CRInvitationUri crData {crScheme = SSSimplex} e2e, CRInvitationUri crData {crScheme = simplexChat} e2e ) - invitationEntityPlan :: Maybe ContactShortLinkData -> ConnectionEntity -> ConnectionPlan - invitationEntityPlan contactSLinkData_ = \case + invitationEntityPlan :: Maybe ContactShortLinkData -> Maybe OwnerVerification -> ConnectionEntity -> ConnectionPlan + invitationEntityPlan cld ov = \case RcvDirectMsgConnection Connection {connStatus, contactConnInitiated} ct_ -> case ct_ of Just ct | contactActive ct -> CPInvitationLink (ILPKnown ct) - | otherwise -> CPInvitationLink (ILPOk contactSLinkData_) + | otherwise -> CPInvitationLink (ILPOk cld ov) Nothing | connStatus == ConnNew && contactConnInitiated -> CPInvitationLink ILPOwnLink - | connStatus == ConnPrepared -> CPInvitationLink (ILPOk contactSLinkData_) + | connStatus == ConnPrepared -> CPInvitationLink (ILPOk cld ov) | otherwise -> CPInvitationLink (ILPConnecting Nothing) _ -> CPError $ ChatError $ CECommandError "found connection entity is not RcvDirectMsgConnection" contactOrGroupRequestPlan :: User -> ConnReqContact -> CM ConnectionPlan @@ -3999,10 +4058,10 @@ processChatCommand vr nm = \case let ConnReqUriData {crClientData} = crData groupLinkId = crClientData >>= decodeJSON >>= \(CRDataGroup gli) -> Just gli case groupLinkId of - Nothing -> contactRequestPlan user cReq Nothing - Just _ -> groupJoinRequestPlan user cReq Nothing Nothing - contactRequestPlan :: User -> ConnReqContact -> Maybe ContactShortLinkData -> CM ConnectionPlan - contactRequestPlan user (CRContactUri crData) contactSLinkData_ = do + Nothing -> contactRequestPlan user cReq Nothing Nothing + Just _ -> groupJoinRequestPlan user cReq Nothing Nothing Nothing + contactRequestPlan :: User -> ConnReqContact -> Maybe ContactShortLinkData -> Maybe OwnerVerification -> CM ConnectionPlan + contactRequestPlan user (CRContactUri crData) cld ov = do let cReqSchemas = contactCReqSchemas crData cReqHashes = bimap contactCReqHash contactCReqHash cReqSchemas withFastStore' (\db -> getUserContactLinkByConnReq db user cReqSchemas) >>= \case @@ -4012,19 +4071,19 @@ processChatCommand vr nm = \case Nothing -> withFastStore' (\db -> getContactWithoutConnViaAddress db vr user cReqSchemas) >>= \case Just ct | not (contactDeleted ct) -> pure $ CPContactAddress (CAPContactViaAddress ct) - _ -> pure $ CPContactAddress (CAPOk contactSLinkData_) + _ -> pure $ CPContactAddress (CAPOk cld ov) Just (RcvDirectMsgConnection Connection {connStatus} Nothing) - | connStatus == ConnPrepared -> pure $ CPContactAddress (CAPOk contactSLinkData_) + | connStatus == ConnPrepared -> pure $ CPContactAddress (CAPOk cld ov) | otherwise -> pure $ CPContactAddress CAPConnectingConfirmReconnect Just (RcvDirectMsgConnection _ (Just ct)) | not (contactReady ct) && contactActive ct -> pure $ CPContactAddress (CAPConnectingProhibit ct) - | contactDeleted ct -> pure $ CPContactAddress (CAPOk contactSLinkData_) + | contactDeleted ct -> pure $ CPContactAddress (CAPOk cld ov) | otherwise -> pure $ CPContactAddress (CAPKnown ct) -- TODO [short links] RcvGroupMsgConnection branch is deprecated? (old group link protocol?) - Just (RcvGroupMsgConnection _ gInfo _) -> groupPlan gInfo Nothing Nothing + Just (RcvGroupMsgConnection _ gInfo _) -> groupPlan gInfo Nothing Nothing Nothing Just _ -> throwCmdError "found connection entity is not RcvDirectMsgConnection or RcvGroupMsgConnection" - groupJoinRequestPlan :: User -> ConnReqContact -> Maybe GroupShortLinkInfo -> Maybe GroupShortLinkData -> CM ConnectionPlan - groupJoinRequestPlan user (CRContactUri crData) groupSLinkInfo_ groupSLinkData_ = do + groupJoinRequestPlan :: User -> ConnReqContact -> Maybe GroupShortLinkInfo -> Maybe GroupShortLinkData -> Maybe OwnerVerification -> CM ConnectionPlan + groupJoinRequestPlan user (CRContactUri crData) linkInfo gld ov = do let cReqSchemas = contactCReqSchemas crData cReqHashes = bimap contactCReqHash contactCReqHash cReqSchemas withFastStore' (\db -> getGroupInfoByUserContactLinkConnReq db vr user cReqSchemas) >>= \case @@ -4033,21 +4092,21 @@ processChatCommand vr nm = \case connEnt_ <- withFastStore' $ \db -> getContactConnEntityByConnReqHash db vr user cReqHashes gInfo_ <- withFastStore' $ \db -> getGroupInfoByGroupLinkHash db vr user cReqHashes case (gInfo_, connEnt_) of - (Nothing, Nothing) -> pure $ CPGroupLink (GLPOk groupSLinkInfo_ groupSLinkData_) + (Nothing, Nothing) -> pure $ CPGroupLink (GLPOk linkInfo gld ov) -- TODO [short links] RcvDirectMsgConnection branches are deprecated? (old group link protocol?) (Nothing, Just (RcvDirectMsgConnection _conn Nothing)) -> pure $ CPGroupLink GLPConnectingConfirmReconnect (Nothing, Just (RcvDirectMsgConnection _ (Just ct))) | not (contactReady ct) && contactActive ct -> pure $ CPGroupLink (GLPConnectingProhibit gInfo_) - | otherwise -> pure $ CPGroupLink (GLPOk groupSLinkInfo_ groupSLinkData_) + | otherwise -> pure $ CPGroupLink (GLPOk linkInfo gld ov) (Nothing, Just _) -> throwCmdError "found connection entity is not RcvDirectMsgConnection" - (Just gInfo, _) -> groupPlan gInfo groupSLinkInfo_ groupSLinkData_ - groupPlan :: GroupInfo -> Maybe GroupShortLinkInfo -> Maybe GroupShortLinkData -> CM ConnectionPlan - groupPlan gInfo@GroupInfo {membership} groupSLinkInfo_ groupSLinkData_ + (Just gInfo, _) -> groupPlan gInfo linkInfo gld ov + groupPlan :: GroupInfo -> Maybe GroupShortLinkInfo -> Maybe GroupShortLinkData -> Maybe OwnerVerification -> CM ConnectionPlan + groupPlan gInfo@GroupInfo {membership} linkInfo gld ov | memberStatus membership == GSMemRejected = pure $ CPGroupLink (GLPKnown gInfo) | not (memberActive membership) && not (memberRemoved membership) = pure $ CPGroupLink (GLPConnectingProhibit $ Just gInfo) | memberActive membership = pure $ CPGroupLink (GLPKnown gInfo) - | otherwise = pure $ CPGroupLink (GLPOk groupSLinkInfo_ groupSLinkData_) + | otherwise = pure $ CPGroupLink (GLPOk linkInfo gld ov) contactCReqSchemas :: ConnReqUriData -> (ConnReqContact, ConnReqContact) contactCReqSchemas crData = ( CRContactUri crData {crScheme = SSSimplex}, @@ -4059,6 +4118,16 @@ processChatCommand vr nm = \case serverShortLink = \case CSLInvitation _ srv lnkId linkKey -> CSLInvitation SLSServer srv lnkId linkKey CSLContact _ ct srv linkKey -> CSLContact SLSServer ct srv linkKey + verifyLinkOwner :: ConnectionModeI m => C.PublicKeyEd25519 -> [OwnerAuth] -> ConnShortLink m -> Maybe LinkOwnerSig -> Maybe OwnerVerification + verifyLinkOwner rootKey owners connLink = + fmap $ \LinkOwnerSig {ownerId, chatBinding = B64UrlByteString bindingBytes, ownerSig} -> + let signedData = bindingBytes <> smpEncode connLink + findOwner (B64UrlByteString oId) = find (\OwnerAuth {ownerId = oId'} -> oId' == oId) owners + in case maybe (Just rootKey) (fmap ownerKey . findOwner) ownerId of + Nothing -> OVFailed "unknown owner" + Just key + | C.verify' key ownerSig signedData -> OVVerified + | otherwise -> OVFailed "signature verification failed" contactShortLinkData :: Profile -> Maybe AddressSettings -> UserLinkData contactShortLinkData p settings = let msg = autoReply =<< settings @@ -4772,6 +4841,7 @@ chatCommandP = "/_reaction members " *> (APIGetReactionMembers <$> A.decimal <* " #" <*> A.decimal <* A.space <*> A.decimal <* A.space <*> (knownReaction <$?> jsonP)), "/_forward plan " *> (APIPlanForwardChatItems <$> chatRefP <*> _strP), "/_forward " *> (APIForwardChatItems <$> chatRefP <*> (" as_group=" *> onOffP <|> pure False) <* A.space <*> chatRefP <*> _strP <*> sendMessageTTLP), + "/_share chat content " *> (APIShareChatMsgContent <$> chatRefP <* A.space <*> sendRefP), "/_read user " *> (APIUserRead <$> A.decimal), "/read user" $> UserRead, "/_read chat " *> (APIChatRead <$> chatRefP), @@ -4943,7 +5013,7 @@ chatCommandP = (">#" <|> "> #") *> (SendGroupMessageQuote <$> displayNameP <* A.space <* char_ '@' <*> (Just <$> displayNameP) <* A.space <*> quotedMsg <*> msgTextP), "/_contacts " *> (APIListContacts <$> A.decimal), "/contacts" $> ListContacts, - "/_connect plan " *> (APIConnectPlan <$> A.decimal <* A.space <*> ((Just <$> strP) <|> A.takeTill (== ' ') $> Nothing)), + "/_connect plan " *> (APIConnectPlan <$> A.decimal <* A.space <*> ((Just <$> strP) <|> A.takeTill (== ' ') $> Nothing) <*> optional (" sig=" *> jsonP)), "/_prepare contact " *> (APIPrepareContact <$> A.decimal <* A.space <*> connLinkP <* A.space <*> jsonP), "/_prepare group " *> (APIPrepareGroup <$> A.decimal <* A.space <*> connLinkP' <*> (" direct=" *> onOffP <|> pure True) <* A.space <*> jsonP), "/_set contact user @" *> (APIChangePreparedContactUser <$> A.decimal <* A.space <*> A.decimal), @@ -4960,6 +5030,7 @@ chatCommandP = ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <* A.space <* A.char '@' <*> (Just <$> displayNameP) <* A.space <*> msgTextP, ForwardGroupMessage <$> chatNameP <* " <- #" <*> displayNameP <*> pure Nothing <* A.space <*> msgTextP, ForwardLocalMessage <$> chatNameP <* " <- * " <*> msgTextP, + "/share chat #" *> (SharePublicGroup <$> displayNameP <* A.space <*> chatNameP), SendMessage <$> sendNameP <* A.space <*> msgTextP, "@#" *> (SendMemberContactMessage <$> displayNameP <* A.space <* char_ '@' <*> displayNameP <* A.space <*> msgTextP), "/accept_member_contact @" *> (AcceptMemberContact <$> displayNameP), diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 871c6c512e..846ff4a7b7 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -341,7 +341,7 @@ prohibitedGroupContent gInfo@GroupInfo {membership = mem@GroupMember {memberRole | isVoice mc && not (groupFeatureMemberAllowed SGFVoice m gInfo) && not hostApprovalVoice = Just GFVoice | isNothing scopeInfo && not (isVoice mc) && isJust file_ && not (groupFeatureMemberAllowed SGFFiles m gInfo) = Just GFFiles | isNothing scopeInfo && isReport mc && (badReportUser || not (groupFeatureAllowed SGFReports gInfo)) = Just GFReports - | isNothing scopeInfo && prohibitedSimplexLinks gInfo m ft = Just GFSimplexLinks + | isNothing scopeInfo && prohibitedSimplexLinks gInfo m mc ft = Just GFSimplexLinks | otherwise = Nothing where hostApprovalVoice @@ -358,10 +358,14 @@ prohibitedGroupContent gInfo@GroupInfo {membership = mem@GroupMember {memberRole | sent = userRole >= GRModerator | otherwise = userRole < GRModerator -prohibitedSimplexLinks :: GroupInfo -> GroupMember -> Maybe MarkdownList -> Bool -prohibitedSimplexLinks gInfo m ft = +prohibitedSimplexLinks :: GroupInfo -> GroupMember -> MsgContent -> Maybe MarkdownList -> Bool +prohibitedSimplexLinks gInfo m mc ft = not (groupFeatureMemberAllowed SGFSimplexLinks m gInfo) - && maybe False (any ftIsSimplexLink) ft + && (isChatLink mc || maybe False (any ftIsSimplexLink) ft) + where + isChatLink = \case + MCChat {} -> True + _ -> False ftIsSimplexLink :: FormattedText -> Bool ftIsSimplexLink FormattedText {format} = maybe False isSimplexLink format diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index e4146fd526..efdd61fb0e 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -1726,7 +1726,16 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = newContentMessage :: Contact -> MsgContainer -> RcvMessage -> MsgMeta -> CM () newContentMessage ct mc msg@RcvMessage {sharedMsgId_} msgMeta = do - let MsgContainer {content, file = fInv_} = mc + let MsgContainer {content = c, file = fInv_} = mc + content <- case c of + MCChat {text, chatLink, ownerSig = Just LinkOwnerSig {chatBinding = B64UrlByteString binding}} -> do + keepSig <- case contactConn ct of + Nothing -> pure False + Just conn -> do + adHash <- withAgent (`getConnectionRatchetAdHash` aConnId conn) + pure $ encodeChatBinding CBDirect adHash == binding + pure $ if keepSig then c else MCChat {text, chatLink, ownerSig = Nothing} + _ -> pure c -- Uncomment to test stuck delivery on errors - see test testDirectMessageDelete -- case content of -- MCText "hello 111" -> @@ -1979,7 +1988,16 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = rejected gInfo' m' scopeInfo f = newChatItem gInfo' m' scopeInfo (ciContentNoParse $ CIRcvGroupFeatureRejected f) Nothing Nothing False timed_ gInfo' = if forwarded then rcvCITimed_ (Just Nothing) itemTTL else rcvGroupCITimed gInfo' itemTTL live' = fromMaybe False live_ - MsgContainer {content, mentions = MsgMentions mentions, file = fInv_, ttl = itemTTL, live = live_, scope = msgScope_, asGroup = asGroup_} = mc + MsgContainer {content = c, mentions = MsgMentions mentions, file = fInv_, ttl = itemTTL, live = live_, scope = msgScope_, asGroup = asGroup_} = mc + content = case c of + MCChat {text, chatLink, ownerSig = Just LinkOwnerSig {chatBinding = B64UrlByteString binding}} -> case publicGroup of + Just pgp | maybe False (binding ==) (expectedBinding pgp) -> c + _ -> MCChat {text, chatLink, ownerSig = Nothing} + _ -> c + expectedBinding PublicGroupProfile {publicGroupId} + | sentAsGroup = Just $ encodeChatBinding CBChannel (smpEncode publicGroupId) + | otherwise = (\GroupMember {memberId} -> encodeChatBinding CBGroup (smpEncode (publicGroupId, memberId))) <$> m_ + GroupInfo {groupProfile = GroupProfile {publicGroup}} = gInfo sentAsGroup = asGroup_ == Just True ts@(_, ft_) = msgContentTexts content -- m' is Maybe GroupMember @@ -2030,7 +2048,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = groupMessageUpdate :: GroupInfo -> Maybe GroupMember -> SharedMsgId -> MsgContent -> Map MemberName MsgMention -> Maybe MsgScope -> RcvMessage -> UTCTime -> Maybe Int -> Maybe Bool -> Maybe Bool -> CM (Maybe DeliveryTaskContext) groupMessageUpdate gInfo@GroupInfo {groupId} m_ sharedMsgId mc mentions msgScope_ msg@RcvMessage {msgId} brokerTs ttl_ live_ asGroup_ - | Just m <- m_, prohibitedSimplexLinks gInfo m ft_ = + | Just m <- m_, prohibitedSimplexLinks gInfo m mc ft_ = messageWarning ("x.msg.update ignored: feature not allowed " <> groupFeatureNameText GFSimplexLinks) $> Nothing | otherwise = do updateRcvChatItem `catchCINotFound` \_ -> do diff --git a/src/Simplex/Chat/Protocol.hs b/src/Simplex/Chat/Protocol.hs index db77a2f7b4..b7e838c52b 100644 --- a/src/Simplex/Chat/Protocol.hs +++ b/src/Simplex/Chat/Protocol.hs @@ -318,7 +318,7 @@ data AChatMessage = forall e. MsgEncodingI e => ACMsg (SMsgEncoding e) (ChatMess data KeyRef = KRMember deriving (Eq, Show) -data ChatBinding = CBGroup +data ChatBinding = CBGroup | CBDirect | CBChannel deriving (Eq, Show) data MsgSignature = MsgSignature KeyRef C.ASignature @@ -381,10 +381,15 @@ instance Encoding KeyRef where c -> fail $ "invalid KeyRef tag: " <> show c instance Encoding ChatBinding where - smpEncode CBGroup = "G" + smpEncode = \case + CBGroup -> "G" + CBDirect -> "D" + CBChannel -> "C" smpP = A.anyChar >>= \case 'G' -> pure CBGroup + 'D' -> pure CBDirect + 'C' -> pure CBChannel c -> fail $ "invalid ChatBinding: " <> show c instance ToField ChatBinding where toField = toField . decodeLatin1 . smpEncode @@ -411,7 +416,8 @@ data MsgSigning = MsgSigning privKey :: C.PrivateKeyEd25519 } - +encodeChatBinding :: ChatBinding -> ByteString -> ByteString +encodeChatBinding cb bindingData = smpEncode cb <> bindingData data ChatMsgEvent (e :: MsgEncoding) where XMsgNew :: MsgContainer -> ChatMsgEvent 'Json @@ -685,7 +691,7 @@ data MsgContent | MCVoice {text :: Text, duration :: Int} | MCFile {text :: Text} | MCReport {text :: Text, reason :: ReportReason} - | MCChat {text :: Text, chatLink :: MsgChatLink} + | MCChat {text :: Text, chatLink :: MsgChatLink, ownerSig :: Maybe LinkOwnerSig} | MCUnknown {tag :: Text, text :: Text, json :: J.Object} deriving (Eq, Show) @@ -695,6 +701,13 @@ data MsgChatLink | MCLGroup {connLink :: ShortLinkContact, groupProfile :: GroupProfile} deriving (Eq, Show) +data LinkOwnerSig = LinkOwnerSig + { ownerId :: Maybe B64UrlByteString, + chatBinding :: B64UrlByteString, + ownerSig :: C.Signature 'C.Ed25519 + } + deriving (Eq, Show) + msgContentText :: MsgContent -> Text msgContentText = \case MCText t -> t @@ -757,6 +770,8 @@ newtype MsgMentions = MsgMentions (Map MemberName MsgMention) $(JQ.deriveJSON (taggedObjectJSON $ dropPrefix "MCL") ''MsgChatLink) +$(JQ.deriveJSON defaultJSON ''LinkOwnerSig) + $(JQ.deriveJSON defaultJSON ''MsgMention) instance FromJSON MsgMentions where @@ -803,7 +818,8 @@ instance FromJSON MsgContent where MCChat_ -> do text <- v .: "text" chatLink <- v .: "chatLink" - pure MCChat {text, chatLink} + ownerSig <- v .:? "ownerSig" + pure MCChat {text, chatLink, ownerSig} MCUnknown_ tag -> do text <- fromMaybe unknownMsgType <$> v .:? "text" pure MCUnknown {tag, text, json = v} @@ -813,6 +829,9 @@ instance FromJSON MsgContent where unknownMsgType :: Text unknownMsgType = "unknown message type" +(.=?) :: ToJSON v => JT.Key -> Maybe v -> [(J.Key, J.Value)] -> [(J.Key, J.Value)] +key .=? value = maybe id ((:) . (key .=)) value + instance ToJSON MsgContent where toJSON = \case MCUnknown {json} -> J.Object json @@ -823,7 +842,7 @@ instance ToJSON MsgContent where MCVoice {text, duration} -> J.object ["type" .= MCVoice_, "text" .= text, "duration" .= duration] MCFile t -> J.object ["type" .= MCFile_, "text" .= t] MCReport {text, reason} -> J.object ["type" .= MCReport_, "text" .= text, "reason" .= reason] - MCChat {text, chatLink} -> J.object ["type" .= MCChat_, "text" .= text, "chatLink" .= chatLink] + MCChat {text, chatLink, ownerSig} -> J.object $ ("ownerSig" .=? ownerSig) ["type" .= MCChat_, "text" .= text, "chatLink" .= chatLink] toEncoding = \case MCUnknown {json} -> JE.value $ J.Object json MCText t -> J.pairs $ "type" .= MCText_ <> "text" .= t @@ -833,7 +852,7 @@ instance ToJSON MsgContent where MCVoice {text, duration} -> J.pairs $ "type" .= MCVoice_ <> "text" .= text <> "duration" .= duration MCFile t -> J.pairs $ "type" .= MCFile_ <> "text" .= t MCReport {text, reason} -> J.pairs $ "type" .= MCReport_ <> "text" .= text <> "reason" .= reason - MCChat {text, chatLink} -> J.pairs $ "type" .= MCChat_ <> "text" .= text <> "chatLink" .= chatLink + MCChat {text, chatLink, ownerSig} -> J.pairs $ "type" .= MCChat_ <> "text" .= text <> "chatLink" .= chatLink <> maybe mempty ("ownerSig" .=) ownerSig $(JQ.deriveJSON defaultJSON ''MsgContainer) @@ -1324,9 +1343,6 @@ appJsonToCM AppMessageJson {v, msgId, event, params} = do XOk_ -> pure XOk XUnknown_ t -> pure $ XUnknown t params -(.=?) :: ToJSON v => JT.Key -> Maybe v -> [(J.Key, J.Value)] -> [(J.Key, J.Value)] -key .=? value = maybe id ((:) . (key .=)) value - chatToAppMessage :: forall e. MsgEncodingI e => ChatMessage e -> AppMessage e chatToAppMessage chatMsg@ChatMessage {chatVRange, msgId, chatMsgEvent} = case encoding @e of SBinary -> AMBinary AppMessageBinary {msgId = Nothing, tag = B.head $ strEncode tag, body = chatMsgBinaryToBody chatMsg} diff --git a/src/Simplex/Chat/Store/Messages.hs b/src/Simplex/Chat/Store/Messages.hs index eb265ffa2d..5d433088a4 100644 --- a/src/Simplex/Chat/Store/Messages.hs +++ b/src/Simplex/Chat/Store/Messages.hs @@ -229,7 +229,7 @@ createNewSndMessage db gVar connOrGroupId chatMsgEvent msgSigning_ encodeMessage ECMEncoded msgBody -> do let signedMsg_ = signBody <$> msgSigning_ signBody MsgSigning {bindingTag, bindingData, keyRef, privKey} = - let sig = C.ASignature C.SEd25519 $ C.sign' privKey (smpEncode bindingTag <> bindingData <> msgBody) + let sig = C.ASignature C.SEd25519 $ C.sign' privKey (encodeChatBinding bindingTag bindingData <> msgBody) in SignedMsg {chatBinding = bindingTag, signatures = MsgSignature keyRef sig :| [], signedBody = msgBody} createdAt <- getCurrentTime DB.execute @@ -240,7 +240,7 @@ createNewSndMessage db gVar connOrGroupId chatMsgEvent msgSigning_ encodeMessage shared_msg_id, shared_msg_id_user, created_at, updated_at ) VALUES (?,?,?,?,?,?,?,?,?,?,?) |] - ((MDSnd, toCMEventTag chatMsgEvent, DB.Binary msgBody, chatBinding <$> signedMsg_, DB.Binary . smpEncode . signatures <$> signedMsg_, connId_, groupId_) + ((MDSnd, toCMEventTag chatMsgEvent, DB.Binary msgBody, (\SignedMsg {chatBinding} -> chatBinding) <$> signedMsg_, DB.Binary . smpEncode . signatures <$> signedMsg_, connId_, groupId_) :. (DB.Binary sharedMsgId, Just (BI True), createdAt, createdAt)) msgId <- insertedRowId db pure $ Right SndMessage {msgId, sharedMsgId = SharedMsgId sharedMsgId, msgBody, signedMsg_} @@ -327,7 +327,7 @@ createNewRcvMessage db connOrGroupId NewRcvMessage {chatMsgEvent, verifiedMsg, b shared_msg_id, author_group_member_id, forwarded_by_group_member_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?) |] - ((MDRcv, toCMEventTag chatMsgEvent, DB.Binary msgBody, chatBinding <$> signedMsg_, DB.Binary . smpEncode . signatures <$> signedMsg_, brokerTs, currentTs, currentTs, connId_, groupId_) + ((MDRcv, toCMEventTag chatMsgEvent, DB.Binary msgBody, (\SignedMsg {chatBinding} -> chatBinding) <$> signedMsg_, DB.Binary . smpEncode . signatures <$> signedMsg_, brokerTs, currentTs, currentTs, connId_, groupId_) :. (sharedMsgId_, authorMember, forwardedByMember)) msgId <- insertedRowId db pure RcvMessage {msgId, chatMsgEvent = ACME (encoding @e) chatMsgEvent, sharedMsgId_, msgSigned, forwardedByMember} diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index a6f2d53aec..231b1a73bf 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -1842,6 +1842,41 @@ SEARCH group_members USING COVERING INDEX idx_group_members_invited_by_group_mem SEARCH contacts USING COVERING INDEX idx_contacts_grp_direct_inv_from_group_member_id (grp_direct_inv_from_group_member_id=?) SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (contact_group_member_id=?) +Query: + INSERT INTO group_members + ( group_id, index_in_group, member_id, member_role, member_category, member_status, member_relations_vector, invited_by, + user_id, local_display_name, contact_id, contact_profile_id, member_pub_key, created_at, updated_at, + peer_chat_min_version, peer_chat_max_version) + VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) + +Plan: +SEARCH group_relays USING COVERING INDEX idx_group_relays_group_member_id (group_member_id=?) +SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_single_sender_group_member_id (single_sender_group_member_id=?) +SEARCH delivery_jobs USING COVERING INDEX idx_delivery_jobs_job_scope_support_gm_id (job_scope_support_gm_id=?) +SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_sender_group_member_id (sender_group_member_id=?) +SEARCH delivery_tasks USING COVERING INDEX idx_delivery_tasks_job_scope_support_gm_id (job_scope_support_gm_id=?) +SEARCH received_probes USING COVERING INDEX idx_received_probes_group_member_id (group_member_id=?) +SEARCH sent_probe_hashes USING COVERING INDEX idx_sent_probe_hashes_group_member_id (group_member_id=?) +SEARCH sent_probes USING COVERING INDEX idx_sent_probes_group_member_id (group_member_id=?) +SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_group_member_id (group_member_id=?) +SEARCH chat_item_moderations USING COVERING INDEX idx_chat_item_moderations_moderator_member_id (moderator_member_id=?) +SEARCH chat_item_reactions USING COVERING INDEX idx_chat_item_reactions_group_member_id (group_member_id=?) +SEARCH chat_items USING COVERING INDEX idx_chat_items_group_scope_group_member_id (group_scope_group_member_id=?) +SEARCH chat_items USING COVERING INDEX idx_chat_items_forwarded_by_group_member_id (forwarded_by_group_member_id=?) +SEARCH chat_items USING COVERING INDEX idx_chat_items_item_deleted_by_group_member_id (item_deleted_by_group_member_id=?) +SEARCH chat_items USING COVERING INDEX idx_chat_items_group_member_id (group_member_id=?) +SEARCH pending_group_messages USING COVERING INDEX idx_pending_group_messages_group_member_id (group_member_id=?) +SEARCH messages USING COVERING INDEX idx_messages_forwarded_by_group_member_id (forwarded_by_group_member_id=?) +SEARCH messages USING COVERING INDEX idx_messages_author_group_member_id (author_group_member_id=?) +SEARCH connections USING COVERING INDEX idx_connections_group_member_id (group_member_id=?) +SEARCH rcv_files USING COVERING INDEX idx_rcv_files_group_member_id (group_member_id=?) +SEARCH snd_files USING COVERING INDEX idx_snd_files_group_member_id (group_member_id=?) +SEARCH group_member_intros USING COVERING INDEX idx_group_member_intros_to_group_member_id (to_group_member_id=?) +SEARCH group_member_intros USING COVERING INDEX idx_group_member_intros_re_group_member_id (re_group_member_id=?) +SEARCH group_members USING COVERING INDEX idx_group_members_invited_by_group_member_id (invited_by_group_member_id=?) +SEARCH contacts USING COVERING INDEX idx_contacts_grp_direct_inv_from_group_member_id (grp_direct_inv_from_group_member_id=?) +SEARCH contacts USING COVERING INDEX idx_contacts_contact_group_member_id (contact_group_member_id=?) + Query: INSERT INTO group_relays (group_id, group_member_id, chat_relay_id, relay_status, created_at, updated_at) @@ -6530,6 +6565,10 @@ Query: SELECT COUNT(1) FROM contacts WHERE user_id = ? AND chat_item_ttl > 0 Plan: SEARCH contacts USING INDEX idx_contacts_chat_ts (user_id=?) +Query: SELECT COUNT(1) FROM group_members WHERE member_role = 'owner' AND member_pub_key IS NOT NULL +Plan: +SCAN group_members + Query: SELECT COUNT(1) FROM groups WHERE user_id = ? AND chat_item_ttl > 0 Plan: SEARCH groups USING INDEX sqlite_autoindex_groups_2 (user_id=?) diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index 3afe0ce0ce..80fe4c0b30 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -22,7 +22,7 @@ import qualified Data.ByteString.Lazy.Char8 as LB import Data.Char (isSpace, toUpper) import Data.Function (on) import Data.Int (Int64) -import Data.List (groupBy, intercalate, intersperse, sortOn) +import Data.List (groupBy, intercalate, intersperse, nub, sortOn) import Data.List.NonEmpty (NonEmpty (..)) import Data.Map.Strict (Map) import qualified Data.Map.Strict as M @@ -148,8 +148,8 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte CRConnectionVerified u verified code -> ttyUser u [plain $ if verified then "connection verified" else "connection not verified, current code is " <> code] CRContactCode u ct code -> ttyUser u $ viewContactCode ct code testView CRGroupMemberCode u g m code -> ttyUser u $ viewGroupMemberCode g m code testView - CRNewChatItems u chatItems -> viewChatItems ttyUser unmuted u chatItems ts tz - CRChatItems u _ chatItems -> ttyUser u $ concatMap (\(AChatItem _ _ chat item) -> viewChatItem chat item True ts tz <> viewItemReactions item) chatItems + CRNewChatItems u chatItems -> viewChatItems ttyUser unmuted u chatItems ts tz testView + CRChatItems u _ chatItems -> ttyUser u $ concatMap (\(AChatItem _ _ chat item) -> viewChatItem chat item True ts tz <> viewItemReactions item <> viewTestInfo testView item) chatItems CRChatItemInfo u ci ciInfo -> ttyUser u $ viewChatItemInfo ci ciInfo tz CRChatItemId u itemId -> ttyUser u [plain $ maybe "no item" show itemId] CRChatItemUpdated u (AChatItem _ _ chat item) -> ttyUser u $ unmuted u chat item $ viewItemUpdate chat item liveItems ts tz @@ -222,6 +222,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte CRLeftMemberUser u g -> ttyUser u $ [ttyGroup' g <> ": you left the group"] <> groupPreserved g CRGroupDeletedUser u g signed -> ttyUser u [ttyGroup' g <> ": you deleted the group" <> signedStr signed] CRForwardPlan u count itemIds fc -> ttyUser u $ viewForwardPlan count itemIds fc + CRChatMsgContent u mc -> ttyUser u $ ttyMsgContent mc <> viewMsgTestInfo testView mc CRRcvFileAccepted u ci -> ttyUser u $ savingFile' ci CRRcvFileAcceptedSndCancelled u ft -> ttyUser u $ viewRcvFileSndCancelled ft CRSndFileCancelled u _ ftm fts -> ttyUser u $ viewSndFileCancelled ftm fts @@ -407,7 +408,7 @@ chatEventToView hu ChatConfig {logLevel, showReactions, showReceipts, testView} CEvtContactRatchetSync u ct progress -> ttyUser u $ viewContactRatchetSync ct progress CEvtGroupMemberRatchetSync u g m progress -> ttyUser u $ viewGroupMemberRatchetSync g m progress CEvtChatInfoUpdated _ _ -> [] - CEvtNewChatItems u chatItems -> viewChatItems ttyUser unmuted u chatItems ts tz + CEvtNewChatItems u chatItems -> viewChatItems ttyUser unmuted u chatItems ts tz testView CEvtChatItemsStatusesUpdated u chatItems | length chatItems <= 20 -> concatMap @@ -646,11 +647,12 @@ viewChatItems :: [AChatItem] -> UTCTime -> TimeZone -> + Bool -> [StyledString] -viewChatItems ttyUser unmuted u chatItems ts tz +viewChatItems ttyUser unmuted u chatItems ts tz testView | length chatItems <= 20 = concatMap - (\(AChatItem _ _ chat item) -> ttyUser u $ unmuted u chat item $ viewChatItem chat item False ts tz <> viewItemReactions item) + (\(AChatItem _ _ chat item) -> ttyUser u $ unmuted u chat item $ viewChatItem chat item False ts tz <> viewItemReactions item <> viewTestInfo testView item) chatItems | all (\aci -> aChatItemDir aci == MDRcv) chatItems = ttyUser u [sShow (length chatItems) <> " new messages"] | all (\aci -> aChatItemDir aci == MDSnd) chatItems = ttyUser u [sShow (length chatItems) <> " messages sent"] @@ -949,6 +951,14 @@ viewItemReactions ChatItem {reactions} = [" " <> viewReactions reactions | viewReaction CIReactionCount {reaction = MREmoji (MREmojiChar emoji), userReacted, totalReacted} = plain [emoji, ' '] <> (if userReacted then styled Italic else plain) (show totalReacted) +viewTestInfo :: Bool -> ChatItem c d -> [StyledString] +viewTestInfo testView ChatItem {content} = maybe [] (viewMsgTestInfo testView) $ ciMsgContent content + +viewMsgTestInfo :: Bool -> MsgContent -> [StyledString] +viewMsgTestInfo testView = \case + MCChat {ownerSig = Just sig} | testView -> [viewJSON sig] + _ -> [] + viewReactionMembers :: [MemberReaction] -> [StyledString] viewReactionMembers memberReactions = [sShow (length memberReactions) <> " member(s) reacted"] @@ -2039,7 +2049,7 @@ viewGroupUserChanged viewConnectionPlan :: ChatConfig -> ACreatedConnLink -> ConnectionPlan -> [StyledString] viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case CPInvitationLink ilp -> case ilp of - ILPOk contactSLinkData -> [invOrBiz contactSLinkData "ok to connect"] <> [viewJSON contactSLinkData | testView] + ILPOk contactSLinkData ov -> [invOrBiz contactSLinkData "ok to connect"] <> viewSigVerification ov <> [viewJSON contactSLinkData | testView] ILPOwnLink -> [invLink "own link"] ILPConnecting Nothing -> [invLink "connecting"] ILPConnecting (Just ct) -> [invLink ("connecting to contact " <> ttyContact' ct)] @@ -2057,7 +2067,7 @@ viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case | business -> ("business address: " <>) _ -> ("invitation link: " <>) CPContactAddress cap -> case cap of - CAPOk contactSLinkData -> [addrOrBiz contactSLinkData "ok to connect"] <> [viewJSON contactSLinkData | testView] + CAPOk contactSLinkData ov -> [addrOrBiz contactSLinkData "ok to connect"] <> viewSigVerification ov <> [viewJSON contactSLinkData | testView] CAPOwnLink -> [ctAddr "own address"] CAPConnectingConfirmReconnect -> [ctAddr "connecting, allowed to reconnect"] CAPConnectingProhibit ct -> [ctAddr ("connecting to contact " <> ttyContact' ct)] @@ -2075,9 +2085,10 @@ viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case | business -> ("business address: " <>) _ -> ("contact address: " <>) CPGroupLink glp -> case glp of - GLPOk groupSLinkInfo_ groupSLinkData -> + GLPOk groupSLinkInfo_ groupSLinkData ov -> let direct = maybe True (\(GroupShortLinkInfo {direct = d}) -> d) groupSLinkInfo_ in [grpLink $ if direct then "ok to connect directly" else "ok to connect via relays"] + <> viewSigVerification ov <> [viewJSON groupSLinkData | testView] GLPOwnLink g -> [grpLink "own link for group " <> ttyGroup' g] GLPConnectingConfirmReconnect -> [grpLink "connecting, allowed to reconnect"] @@ -2113,6 +2124,10 @@ viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case nextConnectPrepared Contact {preparedContact, activeConn} = case preparedContact of Just _ -> maybe True (\c -> connStatus c == ConnPrepared) activeConn _ -> False + viewSigVerification = \case + Just OVVerified -> ["owner signature: verified"] + Just (OVFailed r) -> ["owner signature: FAILED (" <> plain r <> ")"] + Nothing -> [] viewContactUpdated :: Contact -> Contact -> [StyledString] viewContactUpdated @@ -2212,7 +2227,26 @@ sentWithTime_ ts tz styledMsg CIMeta {itemTs} = prependFirst (ttyMsgTime ts tz itemTs <> " ") styledMsg ttyMsgContent :: MsgContent -> [StyledString] -ttyMsgContent = msgPlain . msgContentText +ttyMsgContent = \case + MCChat {text, chatLink, ownerSig} -> + let (linkInfo, name, links) = viewChatLink chatLink + signed = if isJust ownerSig then " (signed)" else "" + body = if T.null text || text `elem` links then [] else msgPlain text + in [plain $ linkInfo <> viewName name <> signed <> ":"] <> map plain links <> body + mc -> msgPlain $ msgContentText mc + where + viewChatLink = \case + MCLGroup {connLink, groupProfile = GroupProfile {displayName, publicGroup}} -> + let (ref, links) = case publicGroup of + Just PublicGroupProfile {groupType, groupLink} -> (textEncode groupType, nub [enc connLink, enc groupLink]) + Nothing -> ("group", [enc connLink]) + in ("link to join " <> ref <> " #", displayName, links) + MCLContact {connLink, profile = Profile {displayName}} -> + ("contact address of @", displayName, [enc connLink]) + MCLInvitation {invLink, profile = Profile {displayName}} -> + ("one-time link of @", displayName, [enc invLink]) + enc :: StrEncoding a => a -> Text + enc = safeDecodeUtf8 . strEncode prependFirst :: StyledString -> [StyledString] -> [StyledString] prependFirst s [] = [s] diff --git a/tests/ChatTests/ChatRelays.hs b/tests/ChatTests/ChatRelays.hs index 721d71d0e0..58fe1074ef 100644 --- a/tests/ChatTests/ChatRelays.hs +++ b/tests/ChatTests/ChatRelays.hs @@ -1,9 +1,23 @@ +{-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE OverloadedStrings #-} + module ChatTests.ChatRelays where import ChatClient import ChatTests.DBUtils +import ChatTests.Groups (memberJoinChannel, memberJoinChannel', prepareChannel, prepareChannel', prepareChannel1Relay, setupRelay) import ChatTests.Utils import Control.Concurrent (threadDelay) +import qualified Data.Aeson as J +import qualified Data.ByteString.Char8 as B +import qualified Data.ByteString.Lazy.Char8 as LB +import Data.Maybe (fromMaybe) +import qualified Data.Text as T +import ProtocolTests (testGroupProfile) +import Simplex.Chat.Protocol (LinkOwnerSig, MsgChatLink (..), MsgContent (..)) +import Simplex.Chat.Types (GroupProfile (..)) +import Simplex.Messaging.Encoding.String (StrEncoding (..)) +import Simplex.Messaging.Util (decodeJSON) import Test.Hspec hiding (it) chatRelayTests :: SpecWith TestParams @@ -14,6 +28,10 @@ chatRelayTests = do it "re-add soft-deleted relay by same name" testReAddRelaySameName it "test chat relay" testChatRelayTest it "relay profile updated in address" testRelayProfileUpdateInAddress + describe "share channel card" $ do + it "share channel card in direct chat" testShareChannelDirect + it "share channel card in group" testShareChannelGroup + it "share channel card in channel" testShareChannelChannel testGetSetChatRelays :: HasCallStack => TestParams -> IO () testGetSetChatRelays ps = @@ -165,6 +183,151 @@ testRelayProfileUpdateInAddress ps = alice ##> ("/relay test " <> bobSLink) alice <## "relay test passed, profile: bob2 (Bob relay)" +testShareChannelDirect :: HasCallStack => TestParams -> IO () +testShareChannelDirect ps = + testChat3 aliceProfile bobProfile cathProfile test ps + where + test alice bob cath = withRelay ps $ \relay -> do + (shortLink, fullLink) <- prepareChannel1Relay "news" alice relay + connectUsers alice bob + -- alice gets ownerSig from share content API (for validation later) + alice ##> "/_share chat content #1 @2" + alice <## "link to join channel #news (signed):" + (_, apiOwnerSig) <- getTermLine2 alice + -- alice sends the card to bob + alice ##> "/share chat #news @bob" + alice <# "@bob link to join channel #news (signed):" + _ <- getTermLine2 alice -- alice's testView ownerSig + bob <# "alice> link to join channel #news (signed):" + -- bob captures the received ownerSig from message view (testView) + (sLink, cSig) <- getTermLine2 bob + sLink `shouldBe` shortLink + cSig `shouldBe` apiOwnerSig + -- bob verifies owner signature via connect plan + bob ##> ("/_connect plan 1 " <> shortLink <> " sig=" <> cSig) + bob <## "group link: ok to connect via relays" + bob <## "owner signature: verified" + _ <- getTermLine bob -- group link data + -- bob joins + memberJoinChannel' "news" 1 0 1 0 [relay] [alice] shortLink fullLink bob + connectUsers bob cath + -- bob (subscriber) shares unsigned - not owner + bob ##> "/share chat #news @cath" + bob <# "@cath link to join channel #news:" + _ <- getTermLine bob + cath <# "bob> link to join channel #news:" + _ <- getTermLine cath + -- bob tries to replay alice's signed card to cath - binding mismatch, sig stripped at receive + let sig = fromMaybe (error "bad sig") (decodeJSON (T.pack cSig) :: Maybe LinkOwnerSig) + cLink = either error id $ strDecode (B.pack sLink) + mc = MCChat (T.pack sLink) (MCLGroup cLink (testGroupProfile {displayName = "news"} :: GroupProfile)) (Just sig) + cm = "{\"msgContent\":" <> LB.unpack (J.encode mc) <> "}" + bob ##> ("/_send @3 json [" <> cm <> "]") + bob <# "@cath link to join group #news (signed):" + _ <- getTermLine2 bob -- bob's testView ownerSig (his sent has the sig data) + -- cath sees it without signature - binding was for alice->bob, not bob->cath, sig stripped + cath <# "bob> link to join group #news:" + _ <- getTermLine cath + -- cath joins anyway + memberJoinChannel "news" [relay] [alice] shortLink fullLink cath + alice #> "#news hello" + relay <# "#news> hello" + [bob, cath] *<# "#news> hello [>>]" + +testShareChannelGroup :: HasCallStack => TestParams -> IO () +testShareChannelGroup ps = + testChat3 aliceProfile bobProfile cathProfile test ps + where + test alice bob cath = withRelay ps $ \relay -> do + (shortLink, fullLink) <- prepareChannel1Relay "news" alice relay + createGroup2 "team" alice bob + alice ##> "/share chat #news #team" + alice <# "#team link to join channel #news:" + _ <- getTermLine alice + bob <# "#team alice> link to join channel #news:" + sLink <- getTermLine bob + sLink `shouldBe` shortLink + memberJoinChannel' "news" 2 0 1 0 [relay] [alice] sLink fullLink bob + createGroup2 "work" bob cath + bob ##> "/share chat #news #work" + bob <# "#work link to join channel #news:" + _ <- getTermLine bob + cath <# "#work bob> link to join channel #news:" + _ <- getTermLine cath + memberJoinChannel' "news" 2 0 0 0 [relay] [alice] shortLink fullLink cath + alice #> "#news hello" + relay <# "#news> hello" + [bob, cath] *<# "#news> hello [>>]" + +testShareChannelChannel :: HasCallStack => TestParams -> IO () +testShareChannelChannel ps = + testChat3 aliceProfile bobProfile cathProfile test ps + where + test alice bob cath = withRelay ps $ \relay -> do + relaySLink <- setupRelay alice relay + (sLink1, fLink1) <- prepareChannel "news" alice relay + (sLink2, fLink2) <- prepareChannel' 2 "updates" alice relay + -- bob joins "updates" first (relay doesn't know bob yet, no suffix) + memberJoinChannel "updates" [relay] [alice] sLink2 fLink2 bob + -- alice (owner) shares "news" to "updates" - signed + alice ##> "/_share chat content #1 #2(as_group=on)" + alice <## "link to join channel #news (signed):" + (apiLink, apiOwnerSig) <- getTermLine2 alice + apiLink `shouldBe` sLink1 + alice ##> "/share chat #news #updates" + alice <# "#updates link to join channel #news (signed):" + _ <- getTermLine2 alice -- link, ownerSig + relay <# "#updates> link to join channel #news (signed):" + _ <- getTermLine2 relay -- link, ownerSig + bob <# "#updates> link to join channel #news (signed): [>>]" + (cLink, cSig) <- getTermLine2 bob + cLink `shouldBe` (sLink1 <> " [>>]") + cSig `shouldBe` apiOwnerSig + -- bob verifies alice's signature via connect plan + bob ##> ("/_connect plan 1 " <> sLink1 <> " sig=" <> cSig) + bob <## "group link: ok to connect via relays" + bob <## "owner signature: verified" + _ <- getTermLine bob -- group link data + -- bob joins "news" (group #2 for bob, relay knows bob from "updates" so sfx=1) + memberJoinChannel' "news" 2 1 1 1 [relay] [alice] sLink1 fLink1 bob + -- bob creates channel "bob_ch" for delivery to cath + bob ##> ("/relays name=relay " <> relaySLink) + bob <## "ok" + (sLink3, fLink3) <- prepareChannel "bob_ch" bob relay + memberJoinChannel "bob_ch" [relay] [bob] sLink3 fLink3 cath + -- bob (subscriber) shares "news" to "bob_ch" - unsigned (not owner) + bob ##> "/share chat #news #bob_ch" + bob <# "#bob_ch link to join channel #news:" + _ <- getTermLine bob + relay <# "#bob_ch> link to join channel #news:" + _ <- getTermLine relay + cath <# "#bob_ch> link to join channel #news: [>>]" + _ <- getTermLine cath + -- bob tries to replay alice's signed card to bob_ch - binding mismatch, sig stripped at receive + let sig = fromMaybe (error "bad sig") (decodeJSON (T.pack cSig) :: Maybe LinkOwnerSig) + cLink' = either error id $ strDecode (B.pack sLink1) + mc = MCChat (T.pack sLink1) (MCLGroup cLink' (testGroupProfile {displayName = "news"} :: GroupProfile)) (Just sig) + cm = "{\"msgContent\":" <> LB.unpack (J.encode mc) <> "}" + bob ##> ("/_send #3 json [" <> cm <> "]") + bob <# "#bob_ch link to join group #news (signed):" + _ <- getTermLine2 bob -- bob's testView ownerSig (his sent has the sig data) + relay <# "#bob_ch bob_2> link to join group #news:" + _ <- getTermLine relay + cath <# "#bob_ch bob> link to join group #news: [>>]" + _ <- getTermLine cath + -- cath joins "news" (group #2 for cath since "bob_ch" is #1) + memberJoinChannel' "news" 2 1 0 1 [relay] [alice] sLink1 fLink1 cath + -- alice sends message, both receive + alice #> "#news hello" + relay <# "#news> hello" + [bob, cath] *<# "#news> hello [>>]" + +getTermLine2 :: TestCC -> IO (String, String) +getTermLine2 c = (,) <$> getTermLine c <*> getTermLine c + +withRelay :: HasCallStack => TestParams -> (TestCC -> IO ()) -> IO () +withRelay ps = withNewTestChatOpts ps relayTestOpts "relay" relayProfile + -- Create a public group with relay=1, wait for relay to join createChannelWithRelay :: HasCallStack => String -> TestCC -> TestCC -> IO () createChannelWithRelay gName owner relay = do diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 3c6a29c4e3..9e4f54f4df 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -8440,16 +8440,25 @@ createChannel1Relay gName owner relay cath dan eve = do forM_ [cath, dan, eve] $ \member -> memberJoinChannel gName [relay] [owner] shortLink fullLink member -prepareChannel1Relay :: String -> TestCC -> TestCC -> IO (String, String) -prepareChannel1Relay gName owner relay = do +setupRelay :: TestCC -> TestCC -> IO String +setupRelay owner relay = do rName <- userName relay - relay ##> "/ad" (relaySLink, _cLink) <- getContactLinks relay True - owner ##> ("/relays name=" <> rName <> " " <> relaySLink) owner <## "ok" + pure relaySLink +prepareChannel1Relay :: String -> TestCC -> TestCC -> IO (String, String) +prepareChannel1Relay gName owner relay = do + _ <- setupRelay owner relay + prepareChannel gName owner relay + +prepareChannel :: String -> TestCC -> TestCC -> IO (String, String) +prepareChannel = prepareChannel' 1 + +prepareChannel' :: Int -> String -> TestCC -> TestCC -> IO (String, String) +prepareChannel' relayId gName owner relay = do owner ##> ("/public group relays=1 #" <> gName) owner <## ("group #" <> gName <> " is created") owner <## "wait for selected relay(s) to join, then you can invite members via group link" @@ -8457,7 +8466,7 @@ prepareChannel1Relay gName owner relay = do concurrentlyN_ [ do owner <## ("#" <> gName <> ": group link relays updated, current relays:") - owner <## " - relay id 1: active" + owner <## (" - relay id " <> show relayId <> ": active") owner <## "group link:" _ <- getTermLine owner pure (), @@ -8516,10 +8525,17 @@ prepareChannel2Relays gName owner relay1 relay2 = do getGroupLinks owner gName GRMember False memberJoinChannel :: String -> [TestCC] -> [TestCC] -> String -> String -> TestCC -> IO () -memberJoinChannel gName relays owners shortLink fullLink member = do +memberJoinChannel gName = memberJoinChannel' gName 1 0 0 0 + +-- | sfx params: relaySfx - how relay/owner see the member, memberRelaySfx - how member sees relay +memberJoinChannel' :: String -> Int -> Int -> Int -> Int -> [TestCC] -> [TestCC] -> String -> String -> TestCC -> IO () +memberJoinChannel' gName gId relaySfx ownerSfx memberRelaySfx relays owners shortLink fullLink member = do mName <- userName member mFullName <- showName member - relayNames <- mapM userName relays + let sfxMName s = if s == 0 then mName else mName <> "_" <> show s + sfxName s = if s == 0 then mFullName else sfxMName s <> drop (length mName) mFullName + sfxRelayName rn = if memberRelaySfx == 0 then rn else rn <> "_" <> show memberRelaySfx + relayNames <- mapM (\r -> sfxRelayName <$> userName r) relays member ##> ("/_connect plan 1 " <> shortLink) member <## "group link: ok to connect via relays" @@ -8528,7 +8544,7 @@ memberJoinChannel gName relays owners shortLink fullLink member = do member ##> ("/_prepare group 1 " <> fullLink <> " " <> shortLink <> " direct=off " <> groupSLinkData) member <## ("#" <> gName <> ": group is prepared") - member ##> "/_connect group #1" + member ##> ("/_connect group #" <> show gId) member <## ("#" <> gName <> ": connection started") concurrentlyN_ $ [ member @@ -8540,11 +8556,11 @@ memberJoinChannel gName relays owners shortLink fullLink member = do ] ] <> [ do - relay <## (mFullName <> ": accepting request to join group #" <> gName <> "...") - relay <## ("#" <> gName <> ": " <> mName <> " joined the group") + relay <## (sfxName relaySfx <> ": accepting request to join group #" <> gName <> "...") + relay <## ("#" <> gName <> ": " <> sfxMName relaySfx <> " joined the group") | relay <- relays ] - <> [ owner <### [EndsWith ("added " <> mFullName <> " to the group")] + <> [ owner <### [EndsWith ("added " <> sfxName ownerSfx <> " to the group")] | owner <- owners ] diff --git a/tests/ChatTests/Utils.hs b/tests/ChatTests/Utils.hs index 8acdb78b34..ebc9056164 100644 --- a/tests/ChatTests/Utils.hs +++ b/tests/ChatTests/Utils.hs @@ -81,6 +81,9 @@ frankProfile = mkProfile "frank" "Frank" Nothing businessProfile :: Profile businessProfile = mkProfile "biz" "Biz Inc" Nothing +relayProfile :: Profile +relayProfile = mkProfile "relay" "Relay" Nothing + mkProfile :: T.Text -> T.Text -> Maybe ImageData -> Profile mkProfile displayName descr image = Profile {displayName, fullName = "", shortDescr = Just descr, image, contactLink = Nothing, peerType = Nothing, preferences = defaultPrefs} From 0470d7ac5422cad5b864a01a4c5636a7d3596190 Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Fri, 17 Apr 2026 07:31:13 +0000 Subject: [PATCH 035/152] desktop: fix ChatItemsMergerTest#6820 (#6820) recalculateChatStatePositions() was moved to direct methods on ActiveChatState in #5830 but the test was not updated. --- .../kotlin/chat/simplex/app/ChatItemsMergerTest.kt | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/multiplatform/common/src/commonTest/kotlin/chat/simplex/app/ChatItemsMergerTest.kt b/apps/multiplatform/common/src/commonTest/kotlin/chat/simplex/app/ChatItemsMergerTest.kt index 18b17b25a9..0d5ec24bff 100644 --- a/apps/multiplatform/common/src/commonTest/kotlin/chat/simplex/app/ChatItemsMergerTest.kt +++ b/apps/multiplatform/common/src/commonTest/kotlin/chat/simplex/app/ChatItemsMergerTest.kt @@ -18,8 +18,7 @@ class ChatItemsMergerTest { val chatState1 = ActiveChatState(splits = splits1) val removed1 = listOf(oldItems[1]) val newItems1 = oldItems - removed1 - val recalc1 = recalculateChatStatePositions(chatState1) - recalc1.removed(removed1.map { Triple(it.id, oldItems.indexOf(removed1[0]), it.isRcvNew) }, newItems1) + chatState1.itemsRemoved(removed1.map { Triple(it.id, oldItems.indexOf(removed1[0]), it.isRcvNew) }, newItems1) assertEquals(1, splits1.value.size) assertEquals(124L, splits1.value.first()) @@ -27,8 +26,7 @@ class ChatItemsMergerTest { val chatState2 = ActiveChatState(splits = splits2) val removed2 = listOf(oldItems[1], oldItems[2]) val newItems2 = oldItems - removed2 - val recalc2 = recalculateChatStatePositions(chatState2) - recalc2.removed(removed2.mapIndexed { index, it -> Triple(it.id, oldItems.indexOf(removed2[index]), it.isRcvNew) }, newItems2) + chatState2.itemsRemoved(removed2.mapIndexed { index, it -> Triple(it.id, oldItems.indexOf(removed2[index]), it.isRcvNew) }, newItems2) assertEquals(1, splits2.value.size) assertEquals(125L, splits2.value.first()) @@ -36,14 +34,12 @@ class ChatItemsMergerTest { val chatState3 = ActiveChatState(splits = splits3) val removed3 = listOf(oldItems[1], oldItems[2], oldItems[3]) val newItems3 = oldItems - removed3 - val recalc3 = recalculateChatStatePositions(chatState3) - recalc3.removed(removed3.mapIndexed { index, it -> Triple(it.id, oldItems.indexOf(removed3[index]), it.isRcvNew) }, newItems3) + chatState3.itemsRemoved(removed3.mapIndexed { index, it -> Triple(it.id, oldItems.indexOf(removed3[index]), it.isRcvNew) }, newItems3) assertEquals(0, splits3.value.size) val splits4 = MutableStateFlow(listOf(123L)) val chatState4 = ActiveChatState(splits = splits4) - val recalc4 = recalculateChatStatePositions(chatState4) - recalc4.cleared() + chatState4.clear() assertEquals(0, splits4.value.size) } From 27cab1a575b3e5625490975f8ee5c03526da1388 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 17 Apr 2026 08:27:41 +0000 Subject: [PATCH 036/152] core, ui: channel relay leave (#6779) --- apps/ios/Shared/Model/AppAPITypes.swift | 1 + apps/ios/Shared/Views/Chat/ChatView.swift | 3 +- .../Chat/ComposeMessage/ComposeView.swift | 170 +++++++++---- .../Views/Chat/Group/ChannelRelaysView.swift | 19 +- .../ios/Shared/Views/Helpers/ShareSheet.swift | 99 ++++---- .../Shared/Views/NewChat/AddChannelView.swift | 7 +- .../Shared/Views/NewChat/NewChatView.swift | 27 ++ apps/ios/SimpleXChat/ChatTypes.swift | 9 +- .../chat/simplex/common/model/ChatModel.kt | 12 +- .../chat/simplex/common/model/SimpleXAPI.kt | 1 + .../simplex/common/views/chat/ComposeView.kt | 175 ++++++++++--- .../views/chat/group/ChannelRelaysView.kt | 9 +- .../common/views/helpers/AlertManager.kt | 22 +- .../common/views/newchat/AddChannelView.kt | 7 +- .../common/views/newchat/ConnectPlan.kt | 27 ++ .../commonMain/resources/MR/base/strings.xml | 18 +- .../commonMain/resources/MR/de/strings.xml | 1 - .../commonMain/resources/MR/hu/strings.xml | 1 - .../commonMain/resources/MR/it/strings.xml | 1 - .../resources/MR/zh-rCN/strings.xml | 1 - bots/api/TYPES.md | 5 + .../types/typescript/src/types.ts | 15 +- plans/2026-04-10-relay-leaving-group.md | 234 ++++++++++++++++++ src/Simplex/Chat/Controller.hs | 2 + src/Simplex/Chat/Library/Commands.hs | 57 +++-- src/Simplex/Chat/Library/Internal.hs | 12 +- src/Simplex/Chat/Library/Subscriber.hs | 12 +- src/Simplex/Chat/Types/Shared.hs | 4 + src/Simplex/Chat/View.hs | 1 + tests/ChatTests/Groups.hs | 73 ++++++ 30 files changed, 839 insertions(+), 186 deletions(-) create mode 100644 plans/2026-04-10-relay-leaving-group.md diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift index 1131069d88..7b92873203 100644 --- a/apps/ios/Shared/Model/AppAPITypes.swift +++ b/apps/ios/Shared/Model/AppAPITypes.swift @@ -1376,6 +1376,7 @@ enum GroupLinkPlan: Decodable, Hashable { case connectingConfirmReconnect case connectingProhibit(groupInfo_: GroupInfo?) case known(groupInfo: GroupInfo) + case noRelays(groupSLinkData_: GroupShortLinkData?) } struct ChatTagData: Encodable { diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 1898fd2851..eebd7892f6 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -141,8 +141,7 @@ struct ChatView: View { showCommandsMenu: $showCommandsMenu, keyboardVisible: $keyboardVisible, keyboardHiddenDate: $keyboardHiddenDate, - selectedRange: $selectedRange, - disabledText: chat.chatInfo.userCantSendReason?.composeLabel + selectedRange: $selectedRange ) } else { SelectedItemsBottomToolbar( diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index f37eb614b9..5728fbcd6b 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -336,7 +336,6 @@ struct ComposeView: View { @Binding var keyboardVisible: Bool @Binding var keyboardHiddenDate: Date @Binding var selectedRange: NSRange - var disabledText: LocalizedStringKey? = nil @State var linkUrl: String? = nil @State var hasSimplexLink: Bool = false @@ -382,15 +381,12 @@ struct ComposeView: View { Divider() } + let ownerState = ownerRelayState if let gInfo = chat.chatInfo.groupInfo, gInfo.useRelays, ![.memRejected, .memLeft, .memRemoved, .memGroupDeleted].contains(gInfo.membership.memberStatus) { if gInfo.membership.memberRole == .owner { - let relays = channelRelaysModel.groupId == gInfo.groupId - ? channelRelaysModel.groupRelays : [] - let failedCount = relays.filter { relayMemberConnFailed($0) != nil }.count - let activeCount = relays.filter { $0.relayStatus == .rsActive && relayMemberConnFailed($0) == nil }.count - if !relays.isEmpty && activeCount < relays.count { - ownerChannelRelayBar(relays: relays, activeCount: activeCount, failedCount: failedCount) + if let s = ownerState, s.activeCount < s.relays.count { + ownerChannelRelayBar(relays: s.relays, activeCount: s.activeCount, failedCount: s.failedCount, removedCount: s.removedCount) } } else { let hostnames = (chatModel.channelRelayHostnames[gInfo.groupId] ?? []).sorted() @@ -398,18 +394,18 @@ struct ComposeView: View { .filter { $0.wrapped.memberRole == .relay } .sorted { hostFromRelayLink($0.wrapped.relayLink ?? "") < hostFromRelayLink($1.wrapped.relayLink ?? "") } let showProgress = !gInfo.nextConnectPrepared || composeState.inProgress - let connectedCount = relayMembers.filter { $0.wrapped.activeConn?.connStatus == .ready }.count - let deletedCount = relayMembers.filter { $0.wrapped.activeConn?.connStatus == .deleted }.count - let failedCount = relayMembers.filter { $0.wrapped.activeConn?.connFailedErr != nil }.count - let errorCount = deletedCount + failedCount - let resolvedCount = connectedCount + deletedCount + let removedCount = relayMembers.filter { relayMemberRemoved($0.wrapped.memberStatus) }.count + let connectedCount = relayMembers.filter { !relayMemberRemoved($0.wrapped.memberStatus) && $0.wrapped.activeConn?.connStatus == .ready && $0.wrapped.activeConn?.connFailedErr == nil }.count + let failedCount = relayMembers.filter { !relayMemberRemoved($0.wrapped.memberStatus) && $0.wrapped.activeConn?.connFailedErr != nil }.count + let resolvedCount = connectedCount + removedCount + failedCount let total = relayMembers.count > 0 ? relayMembers.count : hostnames.count - if total > 0, !showProgress || resolvedCount < total { + if total > 0, removedCount + failedCount > 0 || resolvedCount < total { subscriberChannelRelayBar( hostnames: hostnames, relayMembers: relayMembers, connectedCount: connectedCount, - errorCount: errorCount, + removedCount: removedCount, + failedCount: failedCount, total: total, showProgress: showProgress ) @@ -417,8 +413,9 @@ struct ComposeView: View { } } + let userCantSendReason = chat.chatInfo.userCantSendReason(allRelaysBroken: ownerState?.noActiveRelays ?? false) let composeEnabled = ( - chat.chatInfo.sendMsgEnabled || + userCantSendReason == nil || (chat.chatInfo.groupInfo?.nextConnectPrepared ?? false) || (chat.chatInfo.contact?.nextAcceptContactRequest ?? false) ) @@ -521,7 +518,7 @@ struct ComposeView: View { .disabled(!composeEnabled) .if(!composeEnabled) { v in v.onTapGesture { - if let reason = chat.chatInfo.userCantSendReason { + if let reason = userCantSendReason { AlertManager.shared.showAlertMsg( title: "You can't send messages!", message: reason.alertMessage @@ -723,35 +720,90 @@ struct ComposeView: View { } } - private func ownerChannelRelayBar(relays: [GroupRelay], activeCount: Int, failedCount: Int) -> some View { + private var ownerRelayState: (relays: [GroupRelay], activeCount: Int, failedCount: Int, removedCount: Int, noActiveRelays: Bool)? { + guard let gInfo = chat.chatInfo.groupInfo, gInfo.useRelays, + gInfo.membership.memberRole == .owner, + ![.memLeft, .memRemoved, .memGroupDeleted].contains(gInfo.membership.memberStatus) + else { return nil } + let relays = channelRelaysModel.groupId == gInfo.groupId + ? channelRelaysModel.groupRelays : [] + guard !relays.isEmpty else { return nil } + let relayMembers = relays.map { relay in + (relay, chatModel.groupMembers.first(where: { $0.wrapped.groupMemberId == relay.groupMemberId })?.wrapped) + } + let removedCount = relayMembers.filter { (_, m) in relayMemberRemoved(m?.memberStatus) }.count + let activeCount = relayMembers.filter { (relay, m) in !relayMemberRemoved(m?.memberStatus) && relay.relayStatus == .rsActive && m?.activeConn?.connFailedErr == nil }.count + let failedCount = relayMembers.filter { (_, m) in !relayMemberRemoved(m?.memberStatus) && m?.activeConn?.connFailedErr != nil }.count + let noActiveRelays = activeCount == 0 && (failedCount + removedCount) == relays.count + return (relays, activeCount, failedCount, removedCount, noActiveRelays) + } + + private var disabledText: LocalizedStringKey? { + chat.chatInfo.userCantSendReason(allRelaysBroken: ownerRelayState?.noActiveRelays ?? false)?.composeLabel + } + + @ViewBuilder private func ownerChannelRelayBar(relays: [GroupRelay], activeCount: Int, failedCount: Int, removedCount: Int) -> some View { let total = relays.count - let sorted = relays.sorted { relayDisplayName($0) < relayDisplayName($1) } - return VStack(spacing: 0) { + let allBroken = activeCount == 0 && (failedCount + removedCount) == total + let sorted = relays.map { relay in + (relay, chatModel.groupMembers.first(where: { $0.wrapped.groupMemberId == relay.groupMemberId })?.wrapped) + }.sorted { relayDisplayName($0.0) < relayDisplayName($1.0) } + VStack(spacing: 0) { relayBarHeader { - if activeCount + failedCount < total { + if !allBroken && activeCount + failedCount + removedCount < total { RelayProgressIndicator(active: activeCount, total: total) } - if failedCount > 0 { - Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays active, %d failed", comment: "channel relay bar progress with errors"), activeCount, total, failedCount)) + if allBroken { + if removedCount == total { + Text("All relays removed") + } else if failedCount == total { + Text("All relays failed") + } else { + Text("No active relays") + } + Image(systemName: "exclamationmark.triangle") + .foregroundColor(.orange) + } else if activeCount + failedCount + removedCount >= total { + if failedCount > 0 && removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays not active", comment: "channel relay bar"), failedCount + removedCount)) + } else if failedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays failed", comment: "channel relay bar"), failedCount)) + } else { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays removed", comment: "channel relay bar"), removedCount)) + } + } else if failedCount > 0 && removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays active, %d errors", comment: "channel relay bar"), activeCount, total, failedCount + removedCount)) + } else if failedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays active, %d failed", comment: "channel relay bar"), activeCount, total, failedCount)) + } else if removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays active, %d removed", comment: "channel relay bar"), activeCount, total, removedCount)) } else { Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays active", comment: "channel relay bar progress"), activeCount, total)) } } if relayListExpanded { - ForEach(sorted) { relay in - let failedErr = relayMemberConnFailed(relay) - if let err = failedErr { + if allBroken { + Text("Adding relays will be supported later.") + .frame(maxWidth: .infinity, alignment: .leading) + .font(.caption) + .foregroundColor(theme.colors.secondary) + .padding(.leading, 12) + .padding(.trailing) + .padding(.bottom, 4) + } + ForEach(sorted, id: \.0.id) { (relay, m) in + if let err = m?.activeConn?.connFailedErr { Button { showAlert( NSLocalizedString("Relay connection failed", comment: "alert title"), message: err ) } label: { - ownerRelayDetailRow(relay, connFailed: true) + ownerRelayDetailRow(relay, connFailed: true, memberStatus: m?.memberStatus) } .buttonStyle(.plain) } else { - ownerRelayDetailRow(relay, connFailed: false) + ownerRelayDetailRow(relay, connFailed: false, memberStatus: m?.memberStatus) } } } @@ -760,38 +812,70 @@ struct ComposeView: View { .animation(nil, value: relayListExpanded) } - private func ownerRelayDetailRow(_ relay: GroupRelay, connFailed: Bool) -> some View { + private func ownerRelayDetailRow(_ relay: GroupRelay, connFailed: Bool, memberStatus: GroupMemberStatus?) -> some View { relayBarDetailRow { Text(relayDisplayName(relay)).foregroundColor(theme.colors.secondary) Spacer() - relayStatusIndicator(relay.relayStatus, connFailed: connFailed) + relayStatusIndicator(relay.relayStatus, connFailed: connFailed, memberStatus: memberStatus) } } - private func subscriberChannelRelayBar( + @ViewBuilder private func subscriberChannelRelayBar( hostnames: [String], relayMembers: [GMember], connectedCount: Int, - errorCount: Int, + removedCount: Int, + failedCount: Int, total: Int, showProgress: Bool ) -> some View { + let errorCount = removedCount + failedCount + let allBroken = connectedCount == 0 && errorCount == total VStack(spacing: 0) { relayBarHeader { - if showProgress && connectedCount + errorCount < total { - RelayProgressIndicator(active: connectedCount, total: total) - } - if showProgress { - if errorCount > 0 { - Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays connected, %d errors", comment: "channel subscriber relay bar progress with errors"), connectedCount, total, errorCount)) + if allBroken { + if removedCount == total { + Text("All relays removed") + } else if failedCount == total { + Text("All relays failed") + } else { + Text("No active relays") + } + Image(systemName: "exclamationmark.triangle") + .foregroundColor(.orange) + } else { + if showProgress && connectedCount + errorCount < total { + RelayProgressIndicator(active: connectedCount, total: total) + } + if connectedCount + removedCount + failedCount >= total, removedCount + failedCount > 0 { + if failedCount > 0 && removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays not active", comment: "channel subscriber relay bar"), failedCount + removedCount)) + } else if failedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays failed", comment: "channel subscriber relay bar"), failedCount)) + } else if removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d relays removed", comment: "channel subscriber relay bar"), removedCount)) + } + } else if failedCount > 0 && removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays connected, %d errors", comment: "channel subscriber relay bar"), connectedCount, total, errorCount)) + } else if failedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays connected, %d failed", comment: "channel subscriber relay bar"), connectedCount, total, failedCount)) + } else if removedCount > 0 { + Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays connected, %d removed", comment: "channel subscriber relay bar"), connectedCount, total, removedCount)) } else { Text(String.localizedStringWithFormat(NSLocalizedString("%d/%d relays connected", comment: "channel subscriber relay bar progress"), connectedCount, total)) } - } else { - Text(String.localizedStringWithFormat(NSLocalizedString("%d relays", comment: "channel relay bar"), total)) } } if relayListExpanded { + if allBroken { + Text("Waiting for channel owner to add relays.") + .frame(maxWidth: .infinity, alignment: .leading) + .font(.caption) + .foregroundColor(theme.colors.secondary) + .padding(.leading, 12) + .padding(.trailing) + .padding(.bottom, 4) + } if relayMembers.isEmpty { ForEach(hostnames, id: \.self) { relay in relayBarDetailRow { @@ -875,9 +959,9 @@ struct ComposeView: View { .padding(.vertical, 2) } - private func relayMemberConnFailed(_ relay: GroupRelay) -> String? { - chatModel.groupMembers.first(where: { $0.wrapped.groupMemberId == relay.groupMemberId })? - .wrapped.activeConn?.connFailedErr + + private func relayMemberRemoved(_ status: GroupMemberStatus?) -> Bool { + status.map { [.memLeft, .memRemoved, .memGroupDeleted].contains($0) } ?? false } private func connectButtonView(_ label: LocalizedStringKey, icon: String, connect: @escaping () -> Void) -> some View { @@ -920,7 +1004,7 @@ struct ComposeView: View { private func sendMessageView(_ disableSendButton: Bool, placeholder: String? = nil, sendToConnect: (() -> Void)? = nil) -> some View { ZStack(alignment: .leading) { SendMessageView( - placeholder: placeholder, + placeholder: disabledText != nil ? nil : placeholder, composeState: $composeState, selectedRange: $selectedRange, sendMessage: { ttl in diff --git a/apps/ios/Shared/Views/Chat/Group/ChannelRelaysView.swift b/apps/ios/Shared/Views/Chat/Group/ChannelRelaysView.swift index 1a4e384e24..c88d639199 100644 --- a/apps/ios/Shared/Views/Chat/Group/ChannelRelaysView.swift +++ b/apps/ios/Shared/Views/Chat/Group/ChannelRelaysView.swift @@ -73,7 +73,9 @@ struct ChannelRelaysView: View { } private func ownerRelayStatusText(_ member: GroupMember) -> LocalizedStringKey { - if case .failed = member.activeConn?.connStatus { + if [.memLeft, .memRemoved, .memGroupDeleted].contains(member.memberStatus) { + relayConnStatus(member).text + } else if case .failed = member.activeConn?.connStatus { "failed" } else if member.activeConn?.connDisabled ?? false { "disabled" @@ -104,11 +106,16 @@ struct ChannelRelaysView: View { } func relayConnStatus(_ member: GroupMember) -> (text: LocalizedStringKey, color: Color) { - switch member.activeConn?.connStatus { - case .ready: ("connected", .green) - case .deleted: ("deleted", .red) - case .failed: ("failed", .red) - default: ("connecting", .yellow) + switch member.memberStatus { + case .memLeft: ("removed by operator", .red) + case .memRemoved, .memGroupDeleted: (member.memberStatus.text, .red) + default: + switch member.activeConn?.connStatus { + case .ready: ("connected", .green) + case .deleted: ("deleted", .red) + case .failed: ("failed", .red) + default: ("connecting", .yellow) + } } } diff --git a/apps/ios/Shared/Views/Helpers/ShareSheet.swift b/apps/ios/Shared/Views/Helpers/ShareSheet.swift index 2ef928c7c5..0f6b9d01e5 100644 --- a/apps/ios/Shared/Views/Helpers/ShareSheet.swift +++ b/apps/ios/Shared/Views/Helpers/ShareSheet.swift @@ -102,9 +102,9 @@ class OpenChatAlertViewController: UIViewController { private let profileImage: UIView private let subtitle: String? private let cancelTitle: String - private let confirmTitle: String + private let confirmTitle: String? private let onCancel: () -> Void - private let onConfirm: () -> Void + private let onConfirm: (() -> Void)? init( profileName: String, @@ -112,9 +112,9 @@ class OpenChatAlertViewController: UIViewController { profileImage: UIView, subtitle: String? = nil, cancelTitle: String = "Cancel", - confirmTitle: String = "Open", - onCancel: @escaping () -> Void, - onConfirm: @escaping () -> Void + confirmTitle: String? = "Open", + onCancel: @escaping () -> Void = {}, + onConfirm: (() -> Void)? = nil ) { self.profileName = profileName self.profileFullName = profileFullName @@ -180,7 +180,7 @@ class OpenChatAlertViewController: UIViewController { subtitleLabel.text = subtitle subtitleLabel.font = UIFont.preferredFont(forTextStyle: .footnote) subtitleLabel.textColor = .secondaryLabel - subtitleLabel.numberOfLines = 1 + subtitleLabel.numberOfLines = 3 subtitleLabel.textAlignment = .center subtitleLabel.translatesAutoresizingMaskIntoConstraints = false profileViews.append(subtitleLabel) @@ -211,20 +211,54 @@ class OpenChatAlertViewController: UIViewController { cancelButton.titleLabel?.font = UIFont(descriptor: bodyDescr.withSymbolicTraits(.traitBold) ?? bodyDescr, size: 0) cancelButton.addTarget(self, action: #selector(cancelTapped), for: .touchUpInside) - let confirmButton = UIButton(type: .system) - confirmButton.setTitle(confirmTitle, for: .normal) - confirmButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body) - confirmButton.addTarget(self, action: #selector(confirmTapped), for: .touchUpInside) + let buttonStack: UIStackView + var buttonDividerConstraints: [NSLayoutConstraint] = [] - let verticalButtons = cancelButton.intrinsicContentSize.width + 20 >= alertWidth / 2 || confirmButton.intrinsicContentSize.width + 20 >= alertWidth / 2 + if let confirmTitle { + let confirmButton = UIButton(type: .system) + confirmButton.setTitle(confirmTitle, for: .normal) + confirmButton.titleLabel?.font = UIFont.preferredFont(forTextStyle: .body) + confirmButton.addTarget(self, action: #selector(confirmTapped), for: .touchUpInside) - // Button stack with equal width buttons - let buttonStack = UIStackView(arrangedSubviews: verticalButtons ? [confirmButton, cancelButton] : [cancelButton, confirmButton]) - buttonStack.axis = verticalButtons ? .vertical : .horizontal - buttonStack.distribution = .fillEqually - buttonStack.spacing = 0 // no spacing, use divider instead - buttonStack.translatesAutoresizingMaskIntoConstraints = false - buttonStack.heightAnchor.constraint(greaterThanOrEqualToConstant: alertButtonHeight * (verticalButtons ? 2 : 1)).isActive = true + let verticalButtons = cancelButton.intrinsicContentSize.width + 20 >= alertWidth / 2 || confirmButton.intrinsicContentSize.width + 20 >= alertWidth / 2 + + // Button stack with equal width buttons + buttonStack = UIStackView(arrangedSubviews: verticalButtons ? [confirmButton, cancelButton] : [cancelButton, confirmButton]) + buttonStack.axis = verticalButtons ? .vertical : .horizontal + buttonStack.distribution = .fillEqually + buttonStack.spacing = 0 // no spacing, use divider instead + buttonStack.translatesAutoresizingMaskIntoConstraints = false + buttonStack.heightAnchor.constraint(greaterThanOrEqualToConstant: alertButtonHeight * (verticalButtons ? 2 : 1)).isActive = true + + // Add divider between buttons + let buttonDivider = UIView() + buttonDivider.backgroundColor = UIColor.separator + buttonDivider.translatesAutoresizingMaskIntoConstraints = false + buttonStack.addSubview(buttonDivider) + + buttonDividerConstraints = if verticalButtons { + [ + buttonDivider.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + buttonDivider.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + buttonDivider.centerYAnchor.constraint(equalTo: buttonStack.centerYAnchor), + buttonDivider.heightAnchor.constraint(equalToConstant: 1 / UIScreen.main.scale) + ] + } else { + [ + buttonDivider.topAnchor.constraint(equalTo: buttonStack.topAnchor), + buttonDivider.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + buttonDivider.centerXAnchor.constraint(equalTo: buttonStack.centerXAnchor), + buttonDivider.widthAnchor.constraint(equalToConstant: 1 / UIScreen.main.scale) + ] + } + } else { + // Single button + buttonStack = UIStackView(arrangedSubviews: [cancelButton]) + buttonStack.axis = .horizontal + buttonStack.distribution = .fillEqually + buttonStack.translatesAutoresizingMaskIntoConstraints = false + buttonStack.heightAnchor.constraint(greaterThanOrEqualToConstant: alertButtonHeight).isActive = true + } // Vertical stack containing hStack and buttonStack let vStack = UIStackView(arrangedSubviews: [topRowContainer, buttonStack]) @@ -241,29 +275,6 @@ class OpenChatAlertViewController: UIViewController { horizontalDivider.translatesAutoresizingMaskIntoConstraints = false containerView.addSubview(horizontalDivider) - // Add divider between buttons - let buttonDivider = UIView() - buttonDivider.backgroundColor = UIColor.separator - buttonDivider.translatesAutoresizingMaskIntoConstraints = false - buttonStack.addSubview(buttonDivider) - - // Constraints - let buttonDividerConstraints = if verticalButtons { - [ - buttonDivider.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), - buttonDivider.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), - buttonDivider.centerYAnchor.constraint(equalTo: buttonStack.centerYAnchor), - buttonDivider.heightAnchor.constraint(equalToConstant: 1 / UIScreen.main.scale) - ] - } else { - [ - buttonDivider.topAnchor.constraint(equalTo: buttonStack.topAnchor), - buttonDivider.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), - buttonDivider.centerXAnchor.constraint(equalTo: buttonStack.centerXAnchor), - buttonDivider.widthAnchor.constraint(equalToConstant: 1 / UIScreen.main.scale) - ] - } - NSLayoutConstraint.activate([ // Container view centering and fixed width containerView.centerYAnchor.constraint(equalTo: view.centerYAnchor), @@ -295,7 +306,7 @@ class OpenChatAlertViewController: UIViewController { @objc private func confirmTapped() { dismiss(animated: true) { - self.onConfirm() + self.onConfirm?() } } } @@ -308,9 +319,9 @@ func showOpenChatAlert( theme: AppTheme, subtitle: String? = nil, cancelTitle: String = "Cancel", - confirmTitle: String = "Open", + confirmTitle: String? = "Open", onCancel: @escaping () -> Void = {}, - onConfirm: @escaping () -> Void + onConfirm: (() -> Void)? = nil ) { let themedView = profileImage.environmentObject(theme) let hostingController = UIHostingController(rootView: themedView) diff --git a/apps/ios/Shared/Views/NewChat/AddChannelView.swift b/apps/ios/Shared/Views/NewChat/AddChannelView.swift index 098cccef1b..9ee82158a1 100644 --- a/apps/ios/Shared/Views/NewChat/AddChannelView.swift +++ b/apps/ios/Shared/Views/NewChat/AddChannelView.swift @@ -428,9 +428,10 @@ func relayDisplayName(_ relay: GroupRelay) -> String { return "relay \(relay.groupRelayId)" } -func relayStatusIndicator(_ status: RelayStatus, connFailed: Bool = false) -> some View { - let color: Color = connFailed ? .red : (status == .rsActive ? .green : .yellow) - let text: LocalizedStringKey = connFailed ? "failed" : status.text +func relayStatusIndicator(_ status: RelayStatus, connFailed: Bool = false, memberStatus: GroupMemberStatus? = nil) -> some View { + let removed = memberStatus.map { [.memLeft, .memRemoved, .memGroupDeleted].contains($0) } ?? false + let color: Color = connFailed || removed ? .red : (status == .rsActive ? .green : .yellow) + let text: LocalizedStringKey = connFailed ? "failed" : memberStatus == .memLeft ? "removed by operator" : status.text return HStack(spacing: 4) { Circle() .fill(color) diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index 63fb7f5221..d869a2e4ac 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -1454,6 +1454,33 @@ func planAndConnect( showOpenKnownGroupAlert(groupInfo, theme: theme, dismiss: dismiss) } } + case let .noRelays(groupSLinkData_): + logger.debug("planAndConnect, .groupLink, .noRelays") + await MainActor.run { + if let groupSLinkData = groupSLinkData_ { + showOpenChatAlert( + profileName: groupSLinkData.groupProfile.displayName, + profileFullName: groupSLinkData.groupProfile.fullName, + profileImage: + ProfileImage( + imageStr: groupSLinkData.groupProfile.image, + iconName: "antenna.radiowaves.left.and.right.circle.fill", + size: alertProfileImageSize + ), + theme: theme, + subtitle: NSLocalizedString("Channel has no active relays. Please try to join later.", comment: "alert subtitle"), + cancelTitle: NSLocalizedString("OK", comment: "alert button"), + confirmTitle: nil, + onCancel: { cleanup?() } + ) + } else { + showAlert( + NSLocalizedString("Channel temporarily unavailable", comment: "alert title"), + message: NSLocalizedString("Channel has no active relays. Please try to join later.", comment: "alert message") + ) + cleanup?() + } + } } case let .error(chatError): logger.debug("planAndConnect, .error \(chatErrorString(chatError))") diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 21cd050c8c..88c3acc02a 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -1563,8 +1563,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { } } - public var userCantSendReason: (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { - get { + public func userCantSendReason(allRelaysBroken: Bool = false) -> (composeLabel: LocalizedStringKey, alertMessage: LocalizedStringKey?)? { switch self { case let .direct(contact): if contact.sendMsgToConnect { return nil } @@ -1578,6 +1577,7 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { if groupInfo.membership.memberActive { switch(groupChatScope) { case .none: + if allRelaysBroken && groupInfo.useRelays { return ("can't broadcast", nil) } if groupInfo.membership.memberPending { return ("reviewed by admins", "Please contact group admin.") } if groupInfo.membership.memberRole == .observer { return groupInfo.useRelays ? ("you are subscriber", nil) : ("you are observer", "Please contact group admin.") @@ -1613,10 +1613,9 @@ public enum ChatInfo: Identifiable, Decodable, NamedChat, Hashable { case .invalidJSON: return ("can't send messages", nil) } - } } - public var sendMsgEnabled: Bool { userCantSendReason == nil } + public var sendMsgEnabled: Bool { userCantSendReason() == nil } public var incognito: Bool { get { @@ -2564,6 +2563,7 @@ public enum RelayStatus: String, Decodable, Equatable, Hashable { case rsInvited = "invited" case rsAccepted = "accepted" case rsActive = "active" + case rsInactive = "inactive" } public struct RelayProfile: Codable, Equatable, Hashable { @@ -2636,6 +2636,7 @@ extension RelayStatus { case .rsInvited: "invited" case .rsAccepted: "accepted" case .rsActive: "active" + case .rsInactive: "inactive" } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index ff6b003c25..7078c4c404 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1596,8 +1596,7 @@ sealed class ChatInfo: SomeChat, NamedChat { } } - val userCantSendReason: Pair? - get() { + fun userCantSendReason(allRelaysBroken: Boolean = false): Pair? { when (this) { is Direct -> { if (contact.sendMsgToConnect) return null @@ -1618,6 +1617,9 @@ sealed class ChatInfo: SomeChat, NamedChat { if (groupInfo.membership.memberActive) { when (groupChatScope) { null -> { + if (allRelaysBroken && groupInfo.useRelays) { + return generalGetString(MR.strings.cant_broadcast_message) to null + } if (groupInfo.membership.memberPending) { return generalGetString(MR.strings.reviewed_by_admins) to generalGetString(MR.strings.observer_cant_send_message_desc) } @@ -1666,7 +1668,7 @@ sealed class ChatInfo: SomeChat, NamedChat { } } - val sendMsgEnabled get() = userCantSendReason == null + val sendMsgEnabled get() = userCantSendReason() == null val sndReady: Boolean get() = when(this) { @@ -2270,13 +2272,15 @@ enum class RelayStatus { @SerialName("new") RsNew, @SerialName("invited") RsInvited, @SerialName("accepted") RsAccepted, - @SerialName("active") RsActive; + @SerialName("active") RsActive, + @SerialName("inactive") RsInactive; val text: String get() = when (this) { RsNew -> generalGetString(MR.strings.relay_status_new) RsInvited -> generalGetString(MR.strings.relay_status_invited) RsAccepted -> generalGetString(MR.strings.relay_status_accepted) RsActive -> generalGetString(MR.strings.relay_status_active) + RsInactive -> generalGetString(MR.strings.relay_status_inactive) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index 8a2be99af2..fc4471f395 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -6873,6 +6873,7 @@ sealed class GroupLinkPlan { @Serializable @SerialName("connectingConfirmReconnect") object ConnectingConfirmReconnect: GroupLinkPlan() @Serializable @SerialName("connectingProhibit") class ConnectingProhibit(val groupInfo_: GroupInfo? = null): GroupLinkPlan() @Serializable @SerialName("known") class Known(val groupInfo: GroupInfo): GroupLinkPlan() + @Serializable @SerialName("noRelays") class NoRelays(val groupSLinkData_: GroupShortLinkData? = null): GroupLinkPlan() } abstract class TerminalItem { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index 10f426b152..69990764de 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -1128,8 +1128,10 @@ fun ComposeView( } } - val sendMsgEnabled = rememberUpdatedState(chat.chatInfo.sendMsgEnabled) - val userCantSendReason = rememberUpdatedState(chat.chatInfo.userCantSendReason) + val ownerRelayState = ownerRelayState(chat, chatModel) + + val userCantSendReason = rememberUpdatedState(chat.chatInfo.userCantSendReason(ownerRelayState?.noActiveRelays == true)) + val sendMsgEnabled = rememberUpdatedState(userCantSendReason.value == null) val nextSendGrpInv = rememberUpdatedState(chat.nextSendGrpInv) @Composable @@ -1307,7 +1309,7 @@ fun ComposeView( sendButtonColor = sendButtonColor, timedMessageAllowed = timedMessageAllowed, customDisappearingMessageTimePref = chatModel.controller.appPrefs.customDisappearingMessageTime, - placeholder = placeholder ?: composeState.value.placeholder, + placeholder = if (userCantSendReason.value != null) "" else placeholder ?: composeState.value.placeholder, sendMessage = { ttl -> sendMessage(ttl) resetLinkPreview() @@ -1470,11 +1472,10 @@ fun ComposeView( && gInfo.membership.memberStatus !in listOf(GroupMemberStatus.MemRejected, GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted) ) { if (gInfo.membership.memberRole == GroupMemberRole.Owner) { - val relays = if (ChannelRelaysModel.groupId.value == gInfo.groupId) ChannelRelaysModel.groupRelays.toList() else emptyList() - val failedCount = relays.count { relayMemberConnFailed(chatModel, it) != null } - val activeCount = relays.count { it.relayStatus == RelayStatus.RsActive && relayMemberConnFailed(chatModel, it) == null } - if (relays.isNotEmpty() && activeCount < relays.size) { - OwnerChannelRelayBar(chatModel, relays, activeCount, failedCount, relayListExpanded) + ownerRelayState?.let { s -> + if (s.activeCount < s.relays.size) { + OwnerChannelRelayBar(chatModel, s.relays, s.activeCount, s.failedCount, s.removedCount, relayListExpanded) + } } } else { val hostnames = (chatModel.channelRelayHostnames[gInfo.groupId] ?: emptyList()).sorted() @@ -1482,14 +1483,13 @@ fun ComposeView( .filter { it.memberRole == GroupMemberRole.Relay } .sortedBy { hostFromRelayLink(it.relayLink ?: "") } val showProgress = !gInfo.nextConnectPrepared || composeState.value.inProgress - val connectedCount = relayMembers.count { it.activeConn?.connStatus == ConnStatus.Ready } - val deletedCount = relayMembers.count { it.activeConn?.connStatus == ConnStatus.Deleted } - val failedCount = relayMembers.count { it.activeConn?.connFailedErr != null } - val errorCount = deletedCount + failedCount - val resolvedCount = connectedCount + deletedCount + val removedCount = relayMembers.count { relayMemberRemoved(it.memberStatus) } + val connectedCount = relayMembers.count { !relayMemberRemoved(it.memberStatus) && it.activeConn?.connStatus == ConnStatus.Ready && it.activeConn?.connFailedErr == null } + val failedCount = relayMembers.count { !relayMemberRemoved(it.memberStatus) && it.activeConn?.connFailedErr != null } + val resolvedCount = connectedCount + removedCount + failedCount val total = if (relayMembers.isNotEmpty()) relayMembers.size else hostnames.size - if (total > 0 && (!showProgress || resolvedCount < total)) { - SubscriberChannelRelayBar(hostnames, relayMembers, connectedCount, errorCount, total, showProgress, relayListExpanded) + if (total > 0 && (removedCount + failedCount > 0 || resolvedCount < total)) { + SubscriberChannelRelayBar(hostnames, relayMembers, connectedCount, removedCount, failedCount, total, showProgress, relayListExpanded) } } } @@ -1639,25 +1639,66 @@ private fun OwnerChannelRelayBar( relays: List, activeCount: Int, failedCount: Int, + removedCount: Int, relayListExpanded: MutableState ) { val total = relays.size - val sorted = relays.sortedBy { relayDisplayName(it) } + val allBroken = activeCount == 0 && (failedCount + removedCount) == total + val members = chatModel.groupMembers.value.associateBy { it.groupMemberId } + val sorted = relays.map { relay -> relay to members[relay.groupMemberId] }.sortedBy { relayDisplayName(it.first) } Column(Modifier.background(MaterialTheme.colors.surface)) { RelayBarHeader(relayListExpanded) { - if (activeCount + failedCount < total) { + if (!allBroken && activeCount + failedCount + removedCount < total) { RelayProgressIndicator(active = activeCount, total = total) } - val statusText = if (failedCount > 0) { - String.format(generalGetString(MR.strings.relay_bar_active_with_failures), activeCount, total, failedCount) + if (allBroken) { + val statusText = if (removedCount == total) { + generalGetString(MR.strings.relay_bar_all_relays_removed) + } else if (failedCount == total) { + generalGetString(MR.strings.relay_bar_all_relays_failed) + } else { + generalGetString(MR.strings.relay_bar_no_active_relays) + } + Text(statusText, color = MaterialTheme.colors.secondary) + Icon( + painterResource(MR.images.ic_warning), + contentDescription = null, + tint = WarningOrange, + modifier = Modifier.size(18.dp) + ) + } else if (activeCount + failedCount + removedCount >= total) { + val statusText = if (failedCount > 0 && removedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_relays_not_active), failedCount + removedCount) + } else if (failedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_relays_failed), failedCount) + } else { + String.format(generalGetString(MR.strings.relay_bar_relays_removed), removedCount) + } + Text(statusText, color = MaterialTheme.colors.secondary) } else { - String.format(generalGetString(MR.strings.relay_bar_active), activeCount, total) + val statusText = if (failedCount > 0 && removedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_active_with_errors), activeCount, total, failedCount + removedCount) + } else if (failedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_active_with_failures), activeCount, total, failedCount) + } else if (removedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_active_with_removed), activeCount, total, removedCount) + } else { + String.format(generalGetString(MR.strings.relay_bar_active), activeCount, total) + } + Text(statusText, color = MaterialTheme.colors.secondary) } - Text(statusText, modifier = Modifier.weight(1f), color = MaterialTheme.colors.secondary) } if (relayListExpanded.value) { - sorted.forEach { relay -> - val failedErr = relayMemberConnFailed(chatModel, relay) + if (allBroken) { + Text( + generalGetString(MR.strings.relay_bar_owner_no_delivery), + modifier = Modifier.fillMaxWidth().padding(start = 12.dp, end = DEFAULT_PADDING, bottom = 4.dp), + color = MaterialTheme.colors.secondary, + fontSize = 12.sp + ) + } + sorted.forEach { (relay, m) -> + val failedErr = m?.activeConn?.connFailedErr RelayBarDetailRow( onClick = if (failedErr != null) { { @@ -1674,7 +1715,7 @@ private fun OwnerChannelRelayBar( fontSize = 12.sp ) Spacer(Modifier.weight(1f)) - RelayStatusIndicator(relay.relayStatus, connFailed = failedErr != null) + RelayStatusIndicator(relay.relayStatus, connFailed = failedErr != null, memberStatus = m?.memberStatus) } } } @@ -1686,28 +1727,65 @@ private fun SubscriberChannelRelayBar( hostnames: List, relayMembers: List, connectedCount: Int, - errorCount: Int, + removedCount: Int, + failedCount: Int, total: Int, showProgress: Boolean, relayListExpanded: MutableState ) { + val errorCount = removedCount + failedCount + val allBroken = connectedCount == 0 && errorCount == total Column(Modifier.background(MaterialTheme.colors.surface)) { RelayBarHeader(relayListExpanded) { - if (showProgress && connectedCount + errorCount < total) { - RelayProgressIndicator(active = connectedCount, total = total) - } - val statusText = if (showProgress) { - if (errorCount > 0) { + if (allBroken) { + val statusText = if (removedCount == total) { + generalGetString(MR.strings.relay_bar_all_relays_removed) + } else if (failedCount == total) { + generalGetString(MR.strings.relay_bar_all_relays_failed) + } else { + generalGetString(MR.strings.relay_bar_no_active_relays) + } + Text(statusText, color = MaterialTheme.colors.secondary) + Icon( + painterResource(MR.images.ic_warning), + contentDescription = null, + tint = WarningOrange, + modifier = Modifier.size(18.dp) + ) + } else if (connectedCount + removedCount + failedCount >= total && errorCount > 0) { + val statusText = if (failedCount > 0 && removedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_relays_not_active), failedCount + removedCount) + } else if (failedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_relays_failed), failedCount) + } else { + String.format(generalGetString(MR.strings.relay_bar_relays_removed), removedCount) + } + Text(statusText, color = MaterialTheme.colors.secondary) + } else { + if (showProgress && connectedCount + errorCount < total) { + RelayProgressIndicator(active = connectedCount, total = total) + } + val statusText = if (failedCount > 0 && removedCount > 0) { String.format(generalGetString(MR.strings.relay_bar_connected_with_errors), connectedCount, total, errorCount) + } else if (failedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_connected_with_failures), connectedCount, total, failedCount) + } else if (removedCount > 0) { + String.format(generalGetString(MR.strings.relay_bar_connected_with_removed), connectedCount, total, removedCount) } else { String.format(generalGetString(MR.strings.relay_bar_connected), connectedCount, total) } - } else { - String.format(generalGetString(MR.strings.relay_bar_count), total) + Text(statusText, color = MaterialTheme.colors.secondary) } - Text(statusText, modifier = Modifier.weight(1f), color = MaterialTheme.colors.secondary) } if (relayListExpanded.value) { + if (allBroken) { + Text( + generalGetString(MR.strings.relay_bar_subscriber_waiting), + modifier = Modifier.fillMaxWidth().padding(start = 12.dp, end = DEFAULT_PADDING, bottom = 4.dp), + color = MaterialTheme.colors.secondary, + fontSize = 12.sp + ) + } if (relayMembers.isEmpty()) { hostnames.forEach { relay -> RelayBarDetailRow { @@ -1775,6 +1853,7 @@ private fun RelayBarHeader( verticalAlignment = Alignment.CenterVertically ) { content() + Spacer(Modifier.weight(1f)) Icon( painterResource(if (expanded.value) MR.images.ic_chevron_down else MR.images.ic_chevron_up), contentDescription = null, @@ -1800,9 +1879,31 @@ private fun RelayBarDetailRow( } } -private fun relayMemberConnFailed(chatModel: ChatModel, relay: GroupRelay): String? { - return chatModel.groupMembers.value - .firstOrNull { it.groupMemberId == relay.groupMemberId } - ?.activeConn?.connFailedErr +private fun ownerRelayState(chat: Chat, chatModel: ChatModel): OwnerRelayState? { + val gInfo = (chat.chatInfo as? ChatInfo.Group)?.groupInfo ?: return null + if (!gInfo.useRelays || gInfo.membership.memberRole != GroupMemberRole.Owner || + gInfo.membership.memberStatus in listOf(GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted) + ) return null + val relays = if (ChannelRelaysModel.groupId.value == gInfo.groupId) ChannelRelaysModel.groupRelays.toList() else emptyList() + if (relays.isEmpty()) return null + val relayMembers = relays.map { relay -> + relay to chatModel.groupMembers.value.firstOrNull { it.groupMemberId == relay.groupMemberId } + } + val removedCount = relayMembers.count { (_, m) -> relayMemberRemoved(m?.memberStatus) } + val activeCount = relayMembers.count { (relay, m) -> !relayMemberRemoved(m?.memberStatus) && relay.relayStatus == RelayStatus.RsActive && m?.activeConn?.connFailedErr == null } + val failedCount = relayMembers.count { (_, m) -> !relayMemberRemoved(m?.memberStatus) && m?.activeConn?.connFailedErr != null } + val noActiveRelays = activeCount == 0 && (failedCount + removedCount) == relays.size + return OwnerRelayState(relays, activeCount, failedCount, removedCount, noActiveRelays) } +private data class OwnerRelayState( + val relays: List, + val activeCount: Int, + val failedCount: Int, + val removedCount: Int, + val noActiveRelays: Boolean +) + +private fun relayMemberRemoved(status: GroupMemberStatus?): Boolean = + status in listOf(GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted) + diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/ChannelRelaysView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/ChannelRelaysView.kt index e8f2a36fff..39ebe5afd8 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/ChannelRelaysView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/ChannelRelaysView.kt @@ -131,7 +131,9 @@ private fun subscriberRelayStatusText(member: GroupMember): String { } private fun ownerRelayStatusText(member: GroupMember, groupRelays: List): String { - return if (member.activeConn?.connStatus is ConnStatus.Failed) { + return if (member.memberStatus in listOf(GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted)) { + relayConnStatus(member).first + } else if (member.activeConn?.connStatus is ConnStatus.Failed) { generalGetString(MR.strings.relay_conn_status_failed) } else if (member.activeConn?.connDisabled == true) { generalGetString(MR.strings.member_info_member_disabled) @@ -144,6 +146,11 @@ private fun ownerRelayStatusText(member: GroupMember, groupRelays: List { + when (member.memberStatus) { + GroupMemberStatus.MemLeft -> return generalGetString(MR.strings.relay_conn_status_removed_by_operator) to Color.Red + GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted -> return member.memberStatus.text to Color.Red + else -> {} + } return when (member.activeConn?.connStatus) { is ConnStatus.Ready -> generalGetString(MR.strings.relay_conn_status_connected) to Color.Green is ConnStatus.Deleted -> generalGetString(MR.strings.relay_conn_status_deleted) to Color.Red diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt index 34d8099951..6bfe8d7869 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt @@ -273,10 +273,10 @@ class AlertManager { profileFullName: String, profileImage: @Composable () -> Unit, subtitle: String? = null, - confirmText: String = generalGetString(MR.strings.connect_plan_open_chat), - onConfirm: () -> Unit, + confirmText: String? = generalGetString(MR.strings.connect_plan_open_chat), + onConfirm: (() -> Unit)? = null, dismissText: String = generalGetString(MR.strings.cancel_verb), - onDismiss: (() -> Unit)?, + onDismiss: (() -> Unit)? = null, ) { showAlert { AlertDialog( @@ -325,7 +325,7 @@ class AlertManager { textAlign = TextAlign.Center, style = MaterialTheme.typography.body2, color = MaterialTheme.colors.secondary, - maxLines = 1, + maxLines = 3, modifier = Modifier.fillMaxWidth() ) } @@ -341,16 +341,18 @@ class AlertManager { delay(200) focusRequester.requestFocus() } - TextButton(onClick = { - onConfirm.invoke() - hideAlert() - }, Modifier.focusRequester(focusRequester)) { - Text(confirmText) + if (confirmText != null && onConfirm != null) { + TextButton(onClick = { + onConfirm.invoke() + hideAlert() + }, Modifier.focusRequester(focusRequester)) { + Text(confirmText) + } } TextButton(onClick = { onDismiss?.invoke() hideAlert() - }) { + }, if (confirmText == null) Modifier.focusRequester(focusRequester) else Modifier) { Text(dismissText) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt index cf10f5e545..944cd70255 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt @@ -547,9 +547,10 @@ fun relayDisplayName(relay: GroupRelay): String { @Composable -fun RelayStatusIndicator(status: RelayStatus, connFailed: Boolean = false) { - val color = if (connFailed) Color.Red else if (status == RelayStatus.RsActive) Color.Green else WarningYellow - val text = if (connFailed) generalGetString(MR.strings.relay_status_failed) else status.text +fun RelayStatusIndicator(status: RelayStatus, connFailed: Boolean = false, memberStatus: GroupMemberStatus? = null) { + val removed = memberStatus in listOf(GroupMemberStatus.MemLeft, GroupMemberStatus.MemRemoved, GroupMemberStatus.MemGroupDeleted) + val color = if (connFailed || removed) Color.Red else if (status == RelayStatus.RsActive) Color.Green else WarningYellow + val text = if (connFailed) generalGetString(MR.strings.relay_status_failed) else if (memberStatus == GroupMemberStatus.MemLeft) generalGetString(MR.strings.relay_conn_status_removed_by_operator) else status.text Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt index 68c7d5b3f1..e83d26c394 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt @@ -281,6 +281,33 @@ private suspend fun planAndConnectTask( cleanup() } } + is GroupLinkPlan.NoRelays -> { + Log.d(TAG, "planAndConnect, .GroupLink, .NoRelays") + val groupSLinkData = connectionPlan.groupLinkPlan.groupSLinkData_ + if (groupSLinkData != null) { + AlertManager.privacySensitive.showOpenChatAlert( + profileName = groupSLinkData.groupProfile.displayName, + profileFullName = groupSLinkData.groupProfile.fullName, + profileImage = { + ProfileImage( + size = alertProfileImageSize, + image = groupSLinkData.groupProfile.image, + icon = MR.images.ic_bigtop_updates_padded + ) + }, + subtitle = generalGetString(MR.strings.channel_no_active_relays_try_later), + confirmText = null, + dismissText = generalGetString(MR.strings.ok), + onDismiss = { cleanup() } + ) + } else { + AlertManager.privacySensitive.showAlertMsg( + generalGetString(MR.strings.channel_temporarily_unavailable), + generalGetString(MR.strings.channel_no_active_relays_try_later) + ) + cleanup() + } + } } is ConnectionPlan.Error -> { Log.d(TAG, "planAndConnect, error ${connectionPlan.chatError}") diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 9ea32d5131..a106b53176 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -191,6 +191,8 @@ Please check that you used the correct link or ask your contact to send you another one. Unsupported connection link This link requires a newer app version. Please upgrade the app or ask your contact to send a compatible link. + Channel temporarily unavailable + Channel has no active relays. Please try to join later. Connection error (AUTH) Unless your contact deleted the connection or this link was already used, it might be a bug - please report it.\nTo connect, please ask your contact to create another connection link and check that you have a stable network connection. Connection blocked @@ -591,6 +593,7 @@ removed from group you left can\'t send messages + can\'t broadcast you are observer reviewed by admins member has old version @@ -2881,17 +2884,30 @@ connecting deleted failed + removed by operator new invited accepted active + inactive + All relays removed + All relays failed + No active relays + %1$d relays removed + %1$d relays failed + %1$d relays not active %1$d/%2$d relays active, %3$d failed + %1$d/%2$d relays active, %3$d removed + %1$d/%2$d relays active, %3$d errors %1$d/%2$d relays active %1$d/%2$d relays connected, %3$d errors + %1$d/%2$d relays connected, %3$d failed + %1$d/%2$d relays connected, %3$d removed %1$d/%2$d relays connected - %1$d relays + Adding relays will be supported later. + Waiting for channel owner to add relays. RELAY diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml index 8b73099b17..c66d351601 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/de/strings.xml @@ -2636,7 +2636,6 @@ %1$d/%2$d Relais aktiv, %3$d Fehlgeschlagen %1$d/%2$d Relais verbunden %1$d/%2$d Relais verbunden, %3$d Fehler - %1$d Relais %1$d Abonnent %1$d Abonnenten Angenommen diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml index 596042210b..310a52715a 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/hu/strings.xml @@ -2611,7 +2611,6 @@ %1$d/%2$d átjátszó aktív %1$d/%2$d átjátszó kapcsolódva, %3$d hiba %1$d/%2$d átjátszó kapcsolódva - %1$d átjátszó ÁTJÁTSZÓ Átjátszóhivatkozás Átjátszócím diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml index 48a97135d5..b6b372da7c 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/it/strings.xml @@ -2565,7 +2565,6 @@ %1$d/%2$d relay attivo/i, %3$d fallito/i %1$d/%2$d relay connesso/i %1$d/%2$d relay connesso/i, %3$d errori - %1$d relay %1$d iscritto %1$d iscritti accettato diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml index d844729bb3..be037e8b87 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/zh-rCN/strings.xml @@ -2550,7 +2550,6 @@ %1$d 个中继活跃,共 %2$d 个,%3$d 个失灵 %1$d 个中继已连接,共 %2$d 个 %1$d 个中继已连接,共 %2$d 个,%3$d 个出错 - %1$d 个中继 %1$d 位订阅者 %1$d 位订阅者 已接受 diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index de9952063c..ec62577a72 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -2281,6 +2281,10 @@ Known: - type: "known" - groupInfo: [GroupInfo](#groupinfo) +NoRelays: +- type: "noRelays" +- groupSLinkData_: [GroupShortLinkData](#groupshortlinkdata)? + --- @@ -3272,6 +3276,7 @@ ParseError: - "invited" - "accepted" - "active" +- "inactive" --- diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index f9735f2b0c..9b0934d67b 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -2566,9 +2566,16 @@ export type GroupLinkPlan = | GroupLinkPlan.ConnectingConfirmReconnect | GroupLinkPlan.ConnectingProhibit | GroupLinkPlan.Known + | GroupLinkPlan.NoRelays export namespace GroupLinkPlan { - export type Tag = "ok" | "ownLink" | "connectingConfirmReconnect" | "connectingProhibit" | "known" + export type Tag = + | "ok" + | "ownLink" + | "connectingConfirmReconnect" + | "connectingProhibit" + | "known" + | "noRelays" interface Interface { type: Tag @@ -2599,6 +2606,11 @@ export namespace GroupLinkPlan { type: "known" groupInfo: GroupInfo } + + export interface NoRelays extends Interface { + type: "noRelays" + groupSLinkData_?: GroupShortLinkData + } } export interface GroupMember { @@ -3679,6 +3691,7 @@ export enum RelayStatus { Invited = "invited", Accepted = "accepted", Active = "active", + Inactive = "inactive", } export enum ReportReason { diff --git a/plans/2026-04-10-relay-leaving-group.md b/plans/2026-04-10-relay-leaving-group.md new file mode 100644 index 0000000000..42aebf425b --- /dev/null +++ b/plans/2026-04-10-relay-leaving-group.md @@ -0,0 +1,234 @@ +# Plan: Relay Leaving Group (Moderation Capability) + +## Context + +SimpleX Chat channels use chat relays to forward messages from owners to subscribers. When a channel hosts prohibited content, the relay operator needs the ability to make their relay leave the group. Currently `APILeaveGroup` doesn't work correctly for relay members: the `getRecipients` helper always uses `getGroupRelayMembers` for channel groups, which returns only other relays (members with `GRRelay` role) — the owner is excluded. The relay needs to notify the owner (so it can update channel link data) and all subscribers directly (relay has connections to all of them). + +## Flow + +1. **Relay** calls `APILeaveGroup` → sends `XGrpLeave` directly to all members (owners + subscribers) → deletes all connections +2. **Owner** receives `XGrpLeave` → updates relay member status to `GSMemLeft` → updates `GroupRelay.relayStatus` to `RSInactive` → updates channel link relay list via `updatePublicGroupData` → `setGroupLinkDataAsync` → `setAgentConnShortLinkAsync` (excludes left relay from link data) → relay bar shows status +3. **Subscribers** receive `XGrpLeave` directly from relay → update relay member status to `GSMemLeft` → delete connection to relay → relay bar shows status + +## Changes + +### 1. Add `RSInactive` to `RelayStatus` + +**`src/Simplex/Chat/Types/Shared.hs`** (~L81-112) + +`GroupMemberStatus` already carries left/removed semantics (`GSMemLeft`, `GSMemRemoved`), so `RelayStatus` should not duplicate that. Add `RSInactive` as a generic terminal status meaning "no longer operational", complementing `RSActive`. Add `"inactive"` encoding in `relayStatusText` and `TextEncoding` instance. + +```haskell +data RelayStatus + = RSNew + | RSInvited + | RSAccepted + | RSActive + | RSInactive + deriving (Eq, Show) +``` + +### 2. Fix `APILeaveGroup` recipients for relay + +**`src/Simplex/Chat/Library/Commands.hs`** (~L2838-2844) + +Use nested condition inside `useRelays'` guard. When relay leaves, it sends `XGrpLeave` to all current/pending members directly (relay has connections to all of them). + +```haskell +getRecipients user gInfo@GroupInfo {membership} + | useRelays' gInfo = + if isRelay membership + then do + -- Relay leaving: notify all members directly, clean up all connections + ms <- withFastStore' $ \db -> getGroupMembers db vr user gInfo + pure (ms, filter memberCurrentOrPending ms) + else do + relays <- withFastStore' $ \db -> getGroupRelayMembers db vr user gInfo + pure (relays, relays) + | otherwise = do + ms <- withFastStore' $ \db -> getGroupMembers db vr user gInfo + pure (ms, filter memberCurrentOrPending ms) +``` + +- `members` (first tuple) = all members → used by `deleteMembersConnections'` for connection cleanup +- `recipients` (second tuple) = all current/pending members → XGrpLeave sent directly + +Existing functions: `isRelay` (Types.hs:1063), `getGroupMembers` (Store/Groups.hs), `memberCurrentOrPending` (Types.hs:1308). + +### 3. Update `xGrpLeave` to set relay status and channel link on owner + +**`src/Simplex/Chat/Library/Subscriber.hs`** (~L3113-3124) + +After `updateMemberRecordDeleted` and before `updatePublicGroupData`, set `RSInactive` on the owner's `GroupRelay` record. On subscribers this is a no-op because they have no `GroupRelay` record (`getGroupRelayByGMId` returns `Left`, `forM_` skips). + +```haskell +xGrpLeave gInfo m msg@RcvMessage {msgSigned} brokerTs = do + deleteMemberConnection m + gInfo' <- updateMemberRecordDeleted user gInfo m GSMemLeft + -- Set relay status to inactive (owner-only; subscriber has no GroupRelay record) + when (isRelay m) $ + withStore' $ \db -> do + relay_ <- runExceptT $ getGroupRelayByGMId db (groupMemberId' m) + forM_ relay_ $ \relay -> void $ updateRelayStatus db relay RSInactive + gInfo'' <- updatePublicGroupData user gInfo' + -- ... rest unchanged +``` + +The channel link update chain on owner: `updatePublicGroupData` (Internal.hs:1317) → `setGroupLinkDataAsync` (Internal.hs:1309) → `getConnectedGroupRelays` (filters `member_status = GSMemConnected AND relay_status IN (RSAccepted, RSActive)`) → `groupLinkData` (builds `UserContactLinkData` with remaining relay links only) → `setAgentConnShortLinkAsync` (updates SMP short link). The left relay is excluded by the `member_status` filter, so its link is removed from the channel link data. + +Existing functions: `isRelay` (Types.hs:1063), `getGroupRelayByGMId` (Store/Groups.hs:1296), `updateRelayStatus` (Store/Groups.hs:1418), `groupMemberId'` (Types.hs). + +### 4. Client type updates + +**`apps/ios/SimpleXChat/ChatTypes.swift`** (~L2558-2563, L2628-2637) + +Add `case rsInactive = "inactive"` to `RelayStatus` enum and `case .rsInactive: "inactive"` to `text` property. + +**`apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt`** (~L2266-2276) + +Add `@SerialName("inactive") RsInactive` to `RelayStatus` enum and `RsInactive -> generalGetString(MR.strings.relay_status_inactive)` to `text` property. + +**`apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml`** (~L2879) + +Add `inactive`. + +**`packages/simplex-chat-client/types/typescript/src/types.ts`** (~L3608-3613) + +Add `Inactive = "inactive"` to `RelayStatus` enum. + +### 5. UI: relay bar updates + +The relay bar (above compose area) currently shows for owners when `activeCount < relays.count`, and for subscribers in steady state. After relay leaves, the bar shows but needs better indication of what happened and whether delivery is broken. + +#### 5a. Fix `relayStatusIndicator` color for `RSInactive` + +Currently `relayStatusIndicator` shows yellow for any non-active status — yellow implies "connecting/in progress", which is wrong for an inactive relay. + +**iOS** (`apps/ios/Shared/Views/NewChat/AddChannelView.swift` L431-432): +```swift +// CURRENT: +let color: Color = connFailed ? .red : (status == .rsActive ? .green : .yellow) +// NEW: +let color: Color = connFailed ? .red : (status == .rsActive ? .green : (status == .rsInactive ? .red : .yellow)) +``` + +**Kotlin** (`apps/multiplatform/.../views/newchat/AddChannelView.kt` L551): +```kotlin +// CURRENT: +val color = if (connFailed) Color.Red else if (status == RelayStatus.RsActive) Color.Green else WarningYellow +// NEW: +val color = if (connFailed) Color.Red else when (status) { + RelayStatus.RsActive -> Color.Green + RelayStatus.RsInactive -> Color.Red + else -> WarningYellow +} +``` + +#### 5b. Owner relay bar: "no active relays" message + +When `activeCount == 0`, show a warning in the relay bar that delivery is broken and adding new relays is coming. + +**iOS** (`apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift` ~L730-738): + +In `ownerChannelRelayBar`, when expanded and `activeCount == 0`, add footer text: +```swift +"Messages can't be delivered to subscribers. Adding new relay will be available in a future update." +``` + +**Kotlin** (`apps/multiplatform/.../views/chat/ComposeView.kt` ~L1647-1657): same logic. + +New string: `relay_bar_owner_no_delivery` = "Messages can't be delivered to subscribers. Adding new relay will be available in a future update." + +#### 5c. Subscriber relay bar: show disconnection in steady state + +Currently in steady state (`showProgress = false`), the subscriber relay bar header shows only "N relays" with no error indication. When relay connections are deleted (relay left), the subscriber sees no issue in collapsed view. + +**iOS** (`apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift` ~L780-792): + +When `!showProgress`, check error state: +```swift +if !showProgress { + if errorCount == total { + Text("All relays disconnected – messages can't be delivered") + } else if errorCount > 0 { + Text(String.localizedStringWithFormat("%d/%d relays connected, %d errors", connectedCount, total, errorCount)) + } else { + Text(String.localizedStringWithFormat("%d relays", total)) + } +} +``` + +**Kotlin** (`apps/multiplatform/.../views/chat/ComposeView.kt` ~L1695-1707): same logic. + +New strings: +- `relay_bar_all_disconnected` = "All relays disconnected – messages can't be delivered" +- `relay_bar_connected_with_errors_steady` = "%1$d/%2$d relays connected, %3$d errors" + +### 6. Test + +**`tests/ChatTests/Groups.hs`** + +Add `testChannelRelayLeave` test: + +1. Create channel with 2 relays (`relay1`, `relay2`) and 2 subscribers (`dan`, `eve`) via `prepareChannel2Relays` + `memberJoinChannel` +2. Verify channel works: owner sends message → subscribers receive via relay forwarding +3. `relay1` leaves: `relay1 ##> "/leave #team"` +4. Verify relay1 output: `"#team: you left the group"` +5. Verify owner output: `"#team: left the group (signed)"` +6. Verify subscribers receive `XGrpLeave` directly — check relay1 member status is `"left"` on subscribers via `checkMemberStatus` +7. Wait for async link data update +8. Verify channel still works with remaining relay: owner sends message → relay2 forwards → subscribers receive +9. `relay2` leaves: `relay2 ##> "/leave #team"` +10. Verify relay2 output and owner/subscriber leave events +11. **Verify no delivery**: owner sends message, `threadDelay`, check subscribers' last item is still the previous message (not the new one) — pattern from `testChannelSubscriberLeave` L9237 + +Register test in test list at ~L261 (after `testChannelSubscriberLeave`). + +## Files Modified + +| File | Change | +|------|--------| +| `src/Simplex/Chat/Types/Shared.hs` | Add `RSInactive` to `RelayStatus` | +| `src/Simplex/Chat/Library/Commands.hs` | Fix `getRecipients` for relay in `APILeaveGroup` | +| `src/Simplex/Chat/Library/Subscriber.hs` | Update `xGrpLeave` to set relay status | +| `apps/ios/SimpleXChat/ChatTypes.swift` | Add `rsInactive` case | +| `apps/ios/Shared/Views/NewChat/AddChannelView.swift` | Fix `relayStatusIndicator` color for inactive | +| `apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift` | Owner/subscriber relay bar messages | +| `apps/multiplatform/.../ChatModel.kt` | Add `RsInactive` case | +| `apps/multiplatform/.../AddChannelView.kt` | Fix `RelayStatusIndicator` color for inactive | +| `apps/multiplatform/.../ComposeView.kt` | Owner/subscriber relay bar messages | +| `apps/multiplatform/.../strings.xml` | Add `relay_status_inactive` + relay bar strings | +| `packages/.../types.ts` | Add `Inactive` to enum | +| `tests/ChatTests/Groups.hs` | Add `testChannelRelayLeave` test | + +## Verification + +```bash +cabal build --ghc-options=-O0 +cabal test simplex-chat-test --test-options='-m "channels"' +``` + +Manual: verify relay bar appearance on iOS simulator and Android emulator after relay leaves. + +## Adversarial Review + +**Pass 1:** +- Relay's `sendGroupMessage'` signs `XGrpLeave` (`requiresSignature XGrpLeave_ = True`; relay has `groupKeys` with `memberPrivKey`). Owner and subscribers verify signature. OK. +- `deleteMembersConnections' user members True` with `waitDelivery=True` ensures `XGrpLeave` reaches SMP queues before relay deletes connections. OK. +- Owner's channel link update: `updatePublicGroupData` → `setGroupLinkDataAsync` → `getConnectedGroupRelays` (excludes left relay by `member_status = GSMemLeft`) → `groupLinkData` (builds link with remaining relays) → `setAgentConnShortLinkAsync` (updates SMP short link). Left relay's link removed. OK. +- `muteEventInChannel` for relay member (`GRRelay < GRModerator`): muted for subscribers (no chat item), but DB is updated. Owner sees event (`GROwner >= GRModerator`). OK. +- Relay's `deleteGroupLinkIfExists` is no-op (relay doesn't own group link). OK. +- `getGroupRelayByGMId` on subscriber returns `Left` (no `GroupRelay` record) → `forM_` skips. No error. OK. +- `memberEventDeliveryScope` returns `DJSGroup {jobSpec = DJDeliveryJob {includePending = False}}` for relay member. On subscriber, creates a delivery task but subscriber has no forwarding role — delivery worker finds no eligible connections. Harmless no-op. OK. +- Owner relay bar: `activeCount` drops (RSInactive ≠ RSActive) → bar shows → `relayStatusIndicator` shows red dot with "inactive". When `activeCount == 0`: "Messages can't be delivered... Adding new relay will be available in a future update." OK. +- Subscriber relay bar: `connStatus = .deleted` → `deletedCount` increases → `errorCount` increases. When `errorCount == total` in steady state: "All relays disconnected – messages can't be delivered". OK. + +**Pass 2:** +- Race condition: owner removes relay + relay leaves simultaneously. Both paths delete connection and update member status. No data corruption — idempotent. `GroupRelay.relayStatus` ends as `RSInactive` from `xGrpLeave` or unchanged from `xGrpMemDel` (which doesn't update relay status). OK. +- `getGroupMembers` for relay may return thousands of subscribers. `deleteMembersConnections'` uses `deleteAgentConnectionsAsync'` which handles batching. `sendGroupMessage'` also handles sending to many members. OK. +- Relay's own `membership` record has no `activeConn` in members list (can't connect to self). `mapMaybe` in `deleteMembersConnections'` filters it out. OK. +- Both relays leave: after last relay leaves, owner sends message. Delivery system has no connected relays to forward through — message saved locally but not delivered. Subscribers' last chat item remains unchanged. Test verifies this. OK. +- `getGroupRelays` (used by `apiGetGroupRelays`) returns ALL GroupRelay records including RSInactive — owner UI correctly includes left relays in bar. OK. +- Subscriber `groupMembers` filter (`memberRole == .relay`) includes left members (memberRole unchanged) — subscriber UI correctly shows left relays. OK. + +**Result: 2 consecutive clean passes.** diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index f4757ca501..3b128a3183 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -1031,6 +1031,7 @@ data GroupLinkPlan | GLPConnectingConfirmReconnect | GLPConnectingProhibit {groupInfo_ :: Maybe GroupInfo} | GLPKnown {groupInfo :: GroupInfo} + | GLPNoRelays {groupSLinkData_ :: Maybe GroupShortLinkData} deriving (Show) data OwnerVerification @@ -1063,6 +1064,7 @@ connectionPlanProceed = \case GLPOk {} -> True GLPOwnLink _ -> True GLPConnectingConfirmReconnect -> True + GLPNoRelays _ -> False _ -> False CPError _ -> True diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 3a1cc76a44..95c5014d41 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -37,6 +37,7 @@ import Data.Constraint (Dict (..)) import Data.Either (fromRight, partitionEithers, rights) import Data.Foldable (foldr') import Data.Functor (($>)) +import Data.Functor.Identity (Identity (..), runIdentity) import Data.Int (Int64) import Data.List (dropWhileEnd, find, foldl', isSuffixOf, partition, sortOn, zipWith4) import Data.List.NonEmpty (NonEmpty (..)) @@ -56,9 +57,11 @@ import qualified Data.UUID.V4 as V4 import Simplex.Chat.Library.Subscriber import Simplex.Chat.Call import Simplex.Chat.Controller +import Simplex.Chat.Delivery (DeliveryJobScope (..), DeliveryJobSpec (..), DeliveryWorkerScope (..)) import Simplex.Chat.Files import Simplex.Chat.Markdown import Simplex.Chat.Messages +import Simplex.Chat.Messages.Batch (encodeBatchElement) import Simplex.Chat.Messages.CIContent import Simplex.Chat.Messages.CIContent.Events import Simplex.Chat.Operators @@ -2878,18 +2881,35 @@ processChatCommand vr nm = \case filesInfo <- withFastStore' $ \db -> getGroupFileInfo db user gInfo withGroupLock "leaveGroup" groupId $ do cancelFilesInProgress user filesInfo - (members, recipients) <- getRecipients user gInfo - msg <- sendGroupMessage' user gInfo recipients XGrpLeave + msg <- + if useRelays' gInfo && isRelay membership + then leaveChannelRelay gInfo + else leaveGroupSendMsg user gInfo (gInfo', scopeInfo) <- mkLocalGroupChatScope gInfo ci <- saveSndChatItem user (CDGroupSnd gInfo' scopeInfo) msg (CISndGroupEvent SGEUserLeft) toView $ CEvtNewChatItems user [AChatItem SCTGroup SMDSnd (GroupChat gInfo' scopeInfo) ci] -- TODO delete direct connections that were unused deleteGroupLinkIfExists user gInfo' -- member records are not deleted to keep history - deleteMembersConnections' user members True withFastStore' $ \db -> updateGroupMemberStatus db userId membership GSMemLeft pure $ CRLeftMemberUser user gInfo' {membership = membership {memberStatus = GSMemLeft}} where + -- Relay leaving channel: create delivery job for cursor-based sending and async connection cleanup. + leaveChannelRelay gInfo = do + msg@SndMessage {msgBody, signedMsg_} <- + liftEither . runIdentity =<< lift (createSndMessages $ Identity (GroupId groupId, groupMsgSigning gInfo XGrpLeave, XGrpLeave)) + let body = encodeBatchElement signedMsg_ msgBody + withFastStore' $ \db -> do + deleteGroupDeliveryTasks db gInfo + deleteGroupDeliveryJobs db gInfo + createMsgDeliveryJob db gInfo (DJSGroup {jobSpec = DJRelayRemoved}) Nothing body + lift . void $ getDeliveryJobWorker True (groupId, DWSGroup) + pure msg + leaveGroupSendMsg user gInfo = do + (members, recipients) <- getRecipients user gInfo + msg <- sendGroupMessage' user gInfo recipients XGrpLeave + deleteMembersConnections' user members True + pure msg getRecipients user gInfo | useRelays' gInfo = do relays <- withFastStore' $ \db -> getGroupRelayMembers db vr user gInfo @@ -4003,21 +4023,24 @@ processChatCommand vr nm = \case knownLinkPlans >>= \case Just r -> pure r Nothing -> do - (fd, cData@(ContactLinkData _ UserContactData {direct, owners, relays})) <- getShortLinkConnReq nm user l' - let FixedLinkData {linkConnReq = cReq, linkEntityId, rootKey} = fd - linkInfo = GroupShortLinkInfo {direct, groupRelays = relays, publicGroupId = B64UrlByteString <$> linkEntityId} + (fd, cData@(ContactLinkData _ UserContactData {direct, owners, relays})) <- getShortLinkConnReq' nm user l' groupSLinkData_ <- liftIO $ decodeLinkUserData cData - -- Cross-validate linkEntityId and publicGroupId from profile: - -- for channels both must be present and match, for p2p groups both must be absent - let profilePGId = groupSLinkData_ >>= \GroupShortLinkData {groupProfile = GroupProfile {publicGroup}} -> - fmap (\PublicGroupProfile {publicGroupId} -> publicGroupId) publicGroup - case (B64UrlByteString <$> linkEntityId, profilePGId) of - (Just entityId, Just publicGroupId) | entityId == publicGroupId -> pure () - (Nothing, Nothing) -> pure () - _ -> throwChatError CEInvalidConnReq - let ov = verifyLinkOwner rootKey owners l' sig_ - plan <- groupJoinRequestPlan user cReq (Just linkInfo) groupSLinkData_ ov - pure (con cReq, plan) + if not direct && null relays + then pure (con (linkConnReq fd), CPGroupLink (GLPNoRelays groupSLinkData_)) + else do + let FixedLinkData {linkConnReq = cReq, linkEntityId, rootKey} = fd + linkInfo = GroupShortLinkInfo {direct, groupRelays = relays, publicGroupId = B64UrlByteString <$> linkEntityId} + -- Cross-validate linkEntityId and publicGroupId from profile: + -- for channels both must be present and match, for p2p groups both must be absent + let profilePGId = groupSLinkData_ >>= \GroupShortLinkData {groupProfile = GroupProfile {publicGroup}} -> + fmap (\PublicGroupProfile {publicGroupId} -> publicGroupId) publicGroup + case (B64UrlByteString <$> linkEntityId, profilePGId) of + (Just entityId, Just publicGroupId) | entityId == publicGroupId -> pure () + (Nothing, Nothing) -> pure () + _ -> throwChatError CEInvalidConnReq + let ov = verifyLinkOwner rootKey owners l' sig_ + plan <- groupJoinRequestPlan user cReq (Just linkInfo) groupSLinkData_ ov + pure (con cReq, plan) where knownLinkPlans = withFastStore $ \db -> liftIO (getGroupInfoViaUserShortLink db vr user l') >>= \case diff --git a/src/Simplex/Chat/Library/Internal.hs b/src/Simplex/Chat/Library/Internal.hs index 846ff4a7b7..f82b6884b2 100644 --- a/src/Simplex/Chat/Library/Internal.hs +++ b/src/Simplex/Chat/Library/Internal.hs @@ -1349,15 +1349,19 @@ groupLinkData gInfo@GroupInfo {groupProfile, groupSummary = GroupSummary {public restoreShortLink' :: ConnShortLink m -> CM (ConnShortLink m) restoreShortLink' l = (`restoreShortLink` l) <$> asks (shortLinkPresetServers . config) -getShortLinkConnReq :: NetworkRequestMode -> User -> ConnShortLink m -> CM (FixedLinkData m, ConnLinkData m) -getShortLinkConnReq nm user@User {userChatRelay} l = do +getShortLinkConnReq' :: NetworkRequestMode -> User -> ConnShortLink m -> CM (FixedLinkData m, ConnLinkData m) +getShortLinkConnReq' nm user l = do l' <- restoreShortLink' l - (fd, cData) <- withAgent $ \a -> getConnShortLink a nm (aUserId user) l' + withAgent $ \a -> getConnShortLink a nm (aUserId user) l' + +getShortLinkConnReq :: NetworkRequestMode -> User -> ConnShortLink m -> CM (FixedLinkData m, ConnLinkData m) +getShortLinkConnReq nm user l = do + (fd, cData) <- getShortLinkConnReq' nm user l case cData of ContactLinkData _ UserContactData {direct, relays} | not supported -> throwChatError CEUnsupportedConnReq where - supported = direct || not (null relays) || isTrue userChatRelay + supported = direct || not (null relays) _ -> pure () pure (fd, cData) diff --git a/src/Simplex/Chat/Library/Subscriber.hs b/src/Simplex/Chat/Library/Subscriber.hs index efdd61fb0e..e92622b60c 100644 --- a/src/Simplex/Chat/Library/Subscriber.hs +++ b/src/Simplex/Chat/Library/Subscriber.hs @@ -1526,7 +1526,11 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = muteEventInChannel :: GroupInfo -> GroupMember -> Bool muteEventInChannel gInfo@GroupInfo {membership} m = - useRelays' gInfo && memberRole' membership < GRModerator && not (isRelay membership) && memberRole' m < GRModerator + useRelays' gInfo + && not (isRelay membership) -- relay users see all events + && not (isRelay m) -- relay events (e.g. leave) are visible to all + && memberRole' membership < GRModerator + && memberRole' m < GRModerator memberCanSend :: Maybe GroupMember -> Maybe MsgScope -> CM (Maybe DeliveryTaskContext) -> CM (Maybe DeliveryTaskContext) memberCanSend Nothing _ a = a -- channel message - was previously checked and allowed by relay @@ -3138,6 +3142,10 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage = deleteMemberConnection m -- member record is not deleted to allow creation of "member left" chat item gInfo' <- updateMemberRecordDeleted user gInfo m GSMemLeft + when (isRelay m) $ + withStore' $ \db -> do + relay_ <- runExceptT $ getGroupRelayByGMId db (groupMemberId' m) + forM_ relay_ $ \relay -> void $ updateRelayStatus db relay RSInactive gInfo'' <- updatePublicGroupData user gInfo' unless (muteEventInChannel gInfo'' m) $ do (gInfo''', m', scopeInfo) <- mkGroupChatScope gInfo'' m @@ -3716,7 +3724,7 @@ runRelayRequestWorker a Worker {doWork} = do where getLinkDataCreateRelayLink :: RelayRequestData -> GroupInfo -> CM (GroupInfo, ShortLinkContact) getLinkDataCreateRelayLink RelayRequestData {reqGroupLink} gInfo = do - (FixedLinkData {linkEntityId, rootKey}, cData@(ContactLinkData _ UserContactData {owners})) <- getShortLinkConnReq NRMBackground user reqGroupLink + (FixedLinkData {linkEntityId, rootKey}, cData@(ContactLinkData _ UserContactData {owners})) <- getShortLinkConnReq' NRMBackground user reqGroupLink liftIO (decodeLinkUserData cData) >>= \case Nothing -> throwChatError $ CEException "getLinkDataCreateRelayLink: no group link data" Just GroupShortLinkData {groupProfile = gp@GroupProfile {publicGroup}} -> do diff --git a/src/Simplex/Chat/Types/Shared.hs b/src/Simplex/Chat/Types/Shared.hs index 22cb73f325..e0630e2e42 100644 --- a/src/Simplex/Chat/Types/Shared.hs +++ b/src/Simplex/Chat/Types/Shared.hs @@ -83,6 +83,7 @@ data RelayStatus | RSInvited | RSAccepted | RSActive + | RSInactive deriving (Eq, Show) relayStatusText :: RelayStatus -> Text @@ -91,6 +92,7 @@ relayStatusText = \case RSInvited -> "invited" RSAccepted -> "accepted" RSActive -> "active" + RSInactive -> "inactive" instance TextEncoding RelayStatus where textEncode = \case @@ -98,11 +100,13 @@ instance TextEncoding RelayStatus where RSInvited -> "invited" RSAccepted -> "accepted" RSActive -> "active" + RSInactive -> "inactive" textDecode = \case "new" -> Just RSNew "invited" -> Just RSInvited "accepted" -> Just RSAccepted "active" -> Just RSActive + "inactive" -> Just RSInactive _ -> Nothing instance FromField RelayStatus where fromField = fromTextField_ textDecode diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index 80fe4c0b30..ba5d006c25 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -2110,6 +2110,7 @@ viewConnectionPlan ChatConfig {logLevel, testView} _connLink = \case "use " <> ttyToGroup g Nothing <> highlight' "" <> " to send messages" ] knownGroup prepared = grpOrBizLink g <> ": known " <> prepared <> grpOrBiz g <> " " <> ttyGroup' g + GLPNoRelays _ -> [grpLink "channel has no active relays, please try to join later"] where connecting g = [grpOrBizLink g <> ": connecting to " <> grpOrBiz g <> " " <> ttyGroup' g] grpLink = ("group link: " <>) diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 9e4f54f4df..9cba9e6b74 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -262,6 +262,7 @@ chatGroupTests = do it "should delete channel and clean up relay connections" testChannelDeleteGroupCleanup it "owner should leave channel (signed)" testChannelOwnerLeave it "subscriber should leave channel (signed)" testChannelSubscriberLeave + it "relay should leave channel" testChannelRelayLeave it "owner should update profile in channel (signed)" testChannelOwnerProfileUpdate it "subscriber should update profile in channel (signed)" testChannelSubscriberProfileUpdate describe "channel message operations" $ do @@ -9330,6 +9331,78 @@ testChannelSubscriberLeave ps = DB.query db "SELECT member_status FROM group_members WHERE local_display_name = ?" (Only name) :: IO [Only T.Text] map (\(Only s) -> s) statuses `shouldBe` maybeToList expected +testChannelRelayLeave :: HasCallStack => TestParams -> IO () +testChannelRelayLeave ps = + withNewTestChat ps "alice" aliceProfile $ \alice -> + withNewTestChatOpts ps relayTestOpts "bob" bobProfile $ \bob -> + withNewTestChatOpts ps relayTestOpts "cath" cathProfile $ \cath -> + withNewTestChat ps "dan" danProfile $ \dan -> + withNewTestChat ps "eve" eveProfile $ \eve -> + withNewTestChat ps "frank" frankProfile $ \frank -> do + (shortLink, fullLink) <- prepareChannel2Relays "team" alice bob cath + forM_ [dan, eve] $ \member -> + memberJoinChannel "team" [bob, cath] [alice] shortLink fullLink member + + -- verify channel works + alice #> "#team hello" + [bob, cath] *<# "#team> hello" + [dan, eve] *<# "#team> hello [>>]" + + -- relay1 (bob) leaves + threadDelay 100000 + bob ##> "/leave #team" + bob <## "#team: you left the group" + bob <## "use /d #team to delete the group" + concurrentlyN_ + [ alice <## "#team: bob left the group (signed)", + -- cath: not notified (relays not connected, owner doesn't forward) + dan <## "#team: bob left the group (signed)", + eve <## "#team: bob left the group (signed)" + ] + + -- verify relay1 member status is "left" on all clients that know bob + checkMemberStatus alice "bob" (Just "left") + checkMemberStatus dan "bob" (Just "left") + checkMemberStatus eve "bob" (Just "left") + + -- verify channel still works with remaining relay + threadDelay 100000 + alice #> "#team still working" + cath <# "#team> still working" + [dan, eve] *<# "#team> still working [>>]" + + -- relay2 (cath) leaves + threadDelay 100000 + cath ##> "/leave #team" + cath <## "#team: you left the group" + cath <## "use /d #team to delete the group" + concurrentlyN_ + [ alice <## "#team: cath left the group (signed)", + dan <## "#team: cath left the group (signed)", + eve <## "#team: cath left the group (signed)" + ] + + -- verify relay2 member status + checkMemberStatus alice "cath" (Just "left") + checkMemberStatus dan "cath" (Just "left") + checkMemberStatus eve "cath" (Just "left") + + -- verify no delivery: owner sends but no relays to forward + alice #> "#team no delivery" + (dan ("/_connect plan 1 " <> shortLink) + frank <## "group link: channel has no active relays, please try to join later" + where + checkMemberStatus :: HasCallStack => TestCC -> T.Text -> Maybe T.Text -> IO () + checkMemberStatus cc name expected = do + statuses <- withCCTransaction cc $ \db -> + DB.query db "SELECT member_status FROM group_members WHERE local_display_name = ?" (Only name) :: IO [Only T.Text] + map (\(Only s) -> s) statuses `shouldBe` maybeToList expected + testChannelOwnerProfileUpdate :: HasCallStack => TestParams -> IO () testChannelOwnerProfileUpdate ps = withNewTestChat ps "alice" aliceProfile $ \alice -> From 7d5037f201400d4ff06e3d4a1df662bb4a040566 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Fri, 17 Apr 2026 09:38:55 +0000 Subject: [PATCH 037/152] ui: disable swipe to reply, context menu reply when user can't send (#6822) --- apps/ios/Shared/Views/Chat/ChatView.swift | 4 ++-- .../kotlin/chat/simplex/common/views/chat/ChatView.kt | 2 +- .../chat/simplex/common/views/chat/item/ChatItemView.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index eebd7892f6..7a0cd82cbc 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -2108,7 +2108,7 @@ struct ChatView: View { func chatItemWithMenu(_ ci: ChatItem, _ range: ClosedRange?, _ maxWidth: CGFloat, _ itemSeparation: ItemSeparation) -> some View { let alignment: Alignment = ci.chatDir.sent ? .trailing : .leading let live = composeState.liveMessage != nil - let canReply = ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live && !ci.localNote && selectedChatItems == nil + let canReply = ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live && !ci.localNote && selectedChatItems == nil && chat.chatInfo.sendMsgEnabled return ZStack(alignment: .trailing) { Image(systemName: "arrowshape.turn.up.left") .font(.system(size: 18)) @@ -2276,7 +2276,7 @@ struct ChatView: View { availableReactions.count > 0 { reactionsGroup } - if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live && !ci.localNote { + if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live && !ci.localNote && chat.chatInfo.sendMsgEnabled { replyButton } let fileSource = getLoadedFileSource(ci.file) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 117b8955a1..dc5747e69e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -1953,7 +1953,7 @@ fun BoxScope.ChatItemsList( } false } - val swipeableModifier = if (appPlatform.isDesktop) Modifier else SwipeToDismissModifier( + val swipeableModifier = if (appPlatform.isDesktop || !chatInfo.sendMsgEnabled) Modifier else SwipeToDismissModifier( state = dismissState, directions = setOf(DismissDirection.EndToStart), swipeDistance = with(LocalDensity.current) { 30.dp.toPx() }, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt index d5e2110063..14afccee54 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/ChatItemView.kt @@ -402,7 +402,7 @@ fun ChatItemView( if (cInfo.featureEnabled(ChatFeature.Reactions) && cItem.allowAddReaction) { MsgReactionsMenu() } - if (cItem.meta.itemDeleted == null && !live && !cItem.localNote) { + if (cItem.meta.itemDeleted == null && !live && !cItem.localNote && cInfo.sendMsgEnabled) { ItemAction(stringResource(MR.strings.reply_verb), painterResource(MR.images.ic_reply), onClick = { if (composeState.value.editing) { composeState.value = ComposeState(contextItem = ComposeContextItem.QuotedItem(cItem), useLinkPreviews = useLinkPreviews) From f49d985119c50699dd8b8a24e36daccc7b5774b9 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 17 Apr 2026 21:10:00 +0100 Subject: [PATCH 038/152] ios: sharing channel links/cards (#6821) * ios: sharing channel links/cards * update nix shas * improve * fix preview * change condition * move button for owner * refactor * refactor 2 * fix sheets * MsgChatLink JSON encoding * correct default icon when editing group profile * drop link from card * card layout * strip link from text * remove file ref * share via chat when created * rename file, do not show text when there is no text * better card layout * padding, info string * add log * padding * text layout * warning emoji if signature verification failed * chat link preview in chat list * description * alert information * tappable preview * better * conditional border color * sending and forwarding views * small link icons for forwarding * strip link in one place * forwarded context * quote view for chat links * reduce diff, remove unnecessary changes * simplify * trim description * diff --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- apps/ios/Shared/Model/AppAPITypes.swift | 25 +- apps/ios/Shared/Model/SimpleXAPI.swift | 10 +- .../Chat/ChatItem/CIChatLinkHeader.swift | 67 +++ .../Views/Chat/ChatItem/FramedItemView.swift | 30 +- .../Views/Chat/ChatItem/MsgContentView.swift | 27 +- .../Views/Chat/ChatItemForwardingView.swift | 26 +- apps/ios/Shared/Views/Chat/ChatView.swift | 5 +- .../ComposeMessage/ComposeChatLinkView.swift | 43 ++ .../Chat/ComposeMessage/ComposeView.swift | 21 +- .../Chat/ComposeMessage/ContextItemView.swift | 5 +- .../Views/Chat/Group/GroupChatInfoView.swift | 68 ++- .../Views/Chat/Group/GroupLinkView.swift | 13 + .../Views/Chat/Group/GroupProfileView.swift | 2 +- .../Views/ChatList/ChatPreviewView.swift | 32 +- .../ios/Shared/Views/Helpers/ShareSheet.swift | 17 + .../Shared/Views/NewChat/AddChannelView.swift | 3 +- .../Shared/Views/NewChat/NewChatView.swift | 29 +- .../Views/UserSettings/UserProfile.swift | 5 +- apps/ios/SimpleX.xcodeproj/project.pbxproj | 14 +- apps/ios/SimpleXChat/ChatTypes.swift | 172 +++++++- plans/2026-04-16-ios-share-channel-link.md | 407 ++++++++++++++++++ scripts/nix/sha256map.nix | 2 +- 22 files changed, 970 insertions(+), 53 deletions(-) create mode 100644 apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift create mode 100644 apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift create mode 100644 plans/2026-04-16-ios-share-channel-link.md diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift index 7b92873203..6c7544e724 100644 --- a/apps/ios/Shared/Model/AppAPITypes.swift +++ b/apps/ios/Shared/Model/AppAPITypes.swift @@ -62,6 +62,7 @@ enum ChatCommand: ChatCmdProtocol { case apiGetReactionMembers(userId: Int64, groupId: Int64, itemId: Int64, reaction: MsgReaction) case apiPlanForwardChatItems(fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64]) case apiForwardChatItems(toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, sendAsGroup: Bool, fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64], ttl: Int?) + case apiShareChatMsgContent(shareChatType: ChatType, shareChatId: Int64, toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, sendAsGroup: Bool) case apiGetNtfToken case apiRegisterToken(token: DeviceToken, notificationMode: NotificationsMode) case apiVerifyToken(token: DeviceToken, nonce: String, code: String) @@ -128,7 +129,7 @@ enum ChatCommand: ChatCmdProtocol { case apiAddContact(userId: Int64, incognito: Bool) case apiSetConnectionIncognito(connId: Int64, incognito: Bool) case apiChangeConnectionUser(connId: Int64, userId: Int64) - case apiConnectPlan(userId: Int64, connLink: String) + case apiConnectPlan(userId: Int64, connLink: String, linkOwnerSig: LinkOwnerSig?) case apiPrepareContact(userId: Int64, connLink: CreatedConnLink, contactShortLinkData: ContactShortLinkData) case apiPrepareGroup(userId: Int64, connLink: CreatedConnLink, directLink: Bool, groupShortLinkData: GroupShortLinkData) case apiChangePreparedContactUser(contactId: Int64, newUserId: Int64) @@ -261,6 +262,9 @@ enum ChatCommand: ChatCmdProtocol { let ttlStr = ttl != nil ? "\(ttl!)" : "default" let asGroup = sendAsGroup ? " as_group=on" : "" return "/_forward \(ref(toChatType, toChatId, scope: toScope))\(asGroup) \(ref(fromChatType, fromChatId, scope: fromScope)) \(itemIds.map({ "\($0)" }).joined(separator: ",")) ttl=\(ttlStr)" + case let .apiShareChatMsgContent(shareChatType, shareChatId, toChatType, toChatId, toScope, sendAsGroup): + let asGroup = sendAsGroup ? "(as_group=on)" : "" + return "/_share chat content \(ref(shareChatType, shareChatId, scope: nil)) \(ref(toChatType, toChatId, scope: toScope))\(asGroup)" case .apiGetNtfToken: return "/_ntf get " case let .apiRegisterToken(token, notificationMode): return "/_ntf register \(token.cmdString) \(notificationMode.rawValue)" case let .apiVerifyToken(token, nonce, code): return "/_ntf verify \(token.cmdString) \(nonce) \(code)" @@ -337,7 +341,9 @@ enum ChatCommand: ChatCmdProtocol { case let .apiAddContact(userId, incognito): return "/_connect \(userId) incognito=\(onOff(incognito))" case let .apiSetConnectionIncognito(connId, incognito): return "/_set incognito :\(connId) \(onOff(incognito))" case let .apiChangeConnectionUser(connId, userId): return "/_set conn user :\(connId) \(userId)" - case let .apiConnectPlan(userId, connLink): return "/_connect plan \(userId) \(connLink)" + case let .apiConnectPlan(userId, connLink, linkOwnerSig): + let sigStr = if let linkOwnerSig { " sig=\(encodeJSON(linkOwnerSig))" } else { "" } + return "/_connect plan \(userId) \(connLink)\(sigStr)" case let .apiPrepareContact(userId, connLink, contactShortLinkData): return "/_prepare contact \(userId) \(connLink.connFullLink) \(connLink.connShortLink ?? "") \(encodeJSON(contactShortLinkData))" case let .apiPrepareGroup(userId, connLink, directLink, groupShortLinkData): return "/_prepare group \(userId) \(connLink.connFullLink) \(connLink.connShortLink ?? "") direct=\(onOff(directLink)) \(encodeJSON(groupShortLinkData))" case let .apiChangePreparedContactUser(contactId, newUserId): return "/_set contact user @\(contactId) \(newUserId)" @@ -451,6 +457,7 @@ enum ChatCommand: ChatCmdProtocol { case .apiGetReactionMembers: return "apiGetReactionMembers" case .apiPlanForwardChatItems: return "apiPlanForwardChatItems" case .apiForwardChatItems: return "apiForwardChatItems" + case .apiShareChatMsgContent: return "apiShareChatMsgContent" case .apiGetNtfToken: return "apiGetNtfToken" case .apiRegisterToken: return "apiRegisterToken" case .apiVerifyToken: return "apiVerifyToken" @@ -821,6 +828,7 @@ enum ChatResponse1: Decodable, ChatAPIResult { case acceptingContactRequest(user: UserRef, contact: Contact) case contactRequestRejected(user: UserRef, contactRequest: UserContactRequest, contact_: Contact?) case newChatItems(user: UserRef, chatItems: [AChatItem]) + case chatMsgContent(user: UserRef, msgContent: MsgContent) case groupChatItemsDeleted(user: UserRef, groupInfo: GroupInfo, chatItemIDs: Set, byUser: Bool, member_: GroupMember?) case forwardPlan(user: UserRef, chatItemIds: [Int64], forwardConfirmation: ForwardConfirmation?) case chatItemUpdated(user: UserRef, chatItem: AChatItem) @@ -864,6 +872,7 @@ enum ChatResponse1: Decodable, ChatAPIResult { case .acceptingContactRequest: "acceptingContactRequest" case .contactRequestRejected: "contactRequestRejected" case .newChatItems: "newChatItems" + case .chatMsgContent: "chatMsgContent" case .groupChatItemsDeleted: "groupChatItemsDeleted" case .forwardPlan: "forwardPlan" case .chatItemUpdated: "chatItemUpdated" @@ -898,6 +907,7 @@ enum ChatResponse1: Decodable, ChatAPIResult { case let .newChatItems(u, chatItems): let itemsString = chatItems.map { chatItem in String(describing: chatItem) }.joined(separator: "\n") return withUser(u, itemsString) + case let .chatMsgContent(u, mc): return withUser(u, String(describing: mc)) case let .groupChatItemsDeleted(u, gInfo, chatItemIDs, byUser, member_): return withUser(u, "chatItemIDs: \(String(describing: chatItemIDs))\ngroupInfo: \(String(describing: gInfo))\nbyUser: \(byUser)\nmember_: \(String(describing: member_))") case let .forwardPlan(u, chatItemIds, forwardConfirmation): return withUser(u, "items: \(chatItemIds) forwardConfirmation: \(String(describing: forwardConfirmation))") @@ -1341,6 +1351,11 @@ enum ChatPagination { } } +enum OwnerVerification: Decodable, Hashable { + case verified + case failed(reason: String) +} + enum ConnectionPlan: Decodable, Hashable { case invitationLink(invitationLinkPlan: InvitationLinkPlan) case contactAddress(contactAddressPlan: ContactAddressPlan) @@ -1349,14 +1364,14 @@ enum ConnectionPlan: Decodable, Hashable { } enum InvitationLinkPlan: Decodable, Hashable { - case ok(contactSLinkData_: ContactShortLinkData?) + case ok(contactSLinkData_: ContactShortLinkData?, ownerVerification: OwnerVerification?) case ownLink case connecting(contact_: Contact?) case known(contact: Contact) } enum ContactAddressPlan: Decodable, Hashable { - case ok(contactSLinkData_: ContactShortLinkData?) + case ok(contactSLinkData_: ContactShortLinkData?, ownerVerification: OwnerVerification?) case ownLink case connectingConfirmReconnect case connectingProhibit(contact: Contact) @@ -1371,7 +1386,7 @@ public struct GroupShortLinkInfo: Decodable, Hashable { } enum GroupLinkPlan: Decodable, Hashable { - case ok(groupSLinkInfo_: GroupShortLinkInfo?, groupSLinkData_: GroupShortLinkData?) + case ok(groupSLinkInfo_: GroupShortLinkInfo?, groupSLinkData_: GroupShortLinkData?, ownerVerification: OwnerVerification?) case ownLink(groupInfo: GroupInfo) case connectingConfirmReconnect case connectingProhibit(groupInfo_: GroupInfo?) diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 02478aed80..94707c6602 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -503,6 +503,12 @@ func apiPlanForwardChatItems(type: ChatType, id: Int64, scope: GroupChatScope?, throw r.unexpected } +func apiShareChatMsgContent(shareChatType: ChatType, shareChatId: Int64, toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, sendAsGroup: Bool) async throws -> MsgContent { + let r: ChatResponse1 = try await chatSendCmd(.apiShareChatMsgContent(shareChatType: shareChatType, shareChatId: shareChatId, toChatType: toChatType, toChatId: toChatId, toScope: toScope, sendAsGroup: sendAsGroup)) + if case let .chatMsgContent(_, mc) = r { return mc } + throw r.unexpected +} + func apiForwardChatItems(toChatType: ChatType, toChatId: Int64, toScope: GroupChatScope?, sendAsGroup: Bool = false, fromChatType: ChatType, fromChatId: Int64, fromScope: GroupChatScope?, itemIds: [Int64], ttl: Int?) async -> [ChatItem]? { let cmd: ChatCommand = .apiForwardChatItems(toChatType: toChatType, toChatId: toChatId, toScope: toScope, sendAsGroup: sendAsGroup, fromChatType: fromChatType, fromChatId: fromChatId, fromScope: fromScope, itemIds: itemIds, ttl: ttl) return await processSendMessageCmd(toChatType: toChatType, cmd: cmd) @@ -1020,12 +1026,12 @@ func apiChangeConnectionUser(connId: Int64, userId: Int64) async throws -> Pendi if let r { throw r.unexpected } else { return nil } } -func apiConnectPlan(connLink: String, inProgress: BoxedValue) async -> ((CreatedConnLink, ConnectionPlan)?, Alert?) { +func apiConnectPlan(connLink: String, linkOwnerSig: LinkOwnerSig? = nil, inProgress: BoxedValue) async -> ((CreatedConnLink, ConnectionPlan)?, Alert?) { guard let userId = ChatModel.shared.currentUser?.userId else { logger.error("apiConnectPlan: no current user") return (nil, nil) } - let r: APIResult? = await chatApiSendCmdWithRetry(.apiConnectPlan(userId: userId, connLink: connLink), inProgress: inProgress) + let r: APIResult? = await chatApiSendCmdWithRetry(.apiConnectPlan(userId: userId, connLink: connLink, linkOwnerSig: linkOwnerSig), inProgress: inProgress) if case let .result(.connectionPlan(_, connLink, connPlan)) = r { return ((connLink, connPlan), nil) } let alert: Alert? = if let r { apiConnectResponseAlert(r) } else { nil } return (nil, alert) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift new file mode 100644 index 0000000000..d26506e871 --- /dev/null +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift @@ -0,0 +1,67 @@ +import SwiftUI +import SimpleXChat + +struct CIChatLinkHeader: View { + @EnvironmentObject var theme: AppTheme + @Environment(\.showTimestamp) var showTimestamp: Bool + var chatItem: ChatItem + var chatLink: MsgChatLink + var ownerSig: LinkOwnerSig? + var hasText: Bool + + @AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false + + var body: some View { + VStack(alignment: .leading) { + linkProfileView() + .padding(.horizontal, 2) + .padding(.top, 8) + .padding(.bottom, 6) + .overlay(DetermineWidth()) + VStack(alignment: .leading, spacing: 2) { + if let descr = chatLink.shortDescription { + Text(descr) + .font(.footnote) + .foregroundColor(theme.colors.secondary) + .lineLimit(2) + .padding(.bottom, 2) + } + Text(chatLink.infoLine(signed: ownerSig != nil)) + .font(.footnote) + .foregroundColor(theme.colors.secondary) + .padding(.bottom, 2) + let t = Text("Tap to open").foregroundColor(theme.colors.primary).font(.callout) + if hasText { + t + } else { + t + + Text(verbatim: " ") + + ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, colorMode: .transparent, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp) + } + } + .overlay(DetermineWidth()) + } + .padding(.horizontal, 12) + .padding(.vertical, 6) + } + + private func linkProfileView() -> some View { + HStack(alignment: .top) { + ProfileImage( + imageStr: chatLink.image, + iconName: chatLink.iconName, + size: 44, + color: Color(uiColor: .tertiaryLabel) + ) + .padding(.trailing, 4) + VStack(alignment: .leading) { + Text(chatLink.displayName).font(.headline).lineLimit(2) + let fn = chatLink.fullName + if fn != "" && fn != chatLink.displayName { + Text(fn).font(.subheadline).lineLimit(2) + } + } + .frame(minHeight: 44) + } + } +} diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift index ec8bc852c0..112aa33c31 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift @@ -169,6 +169,16 @@ struct FramedItemView: View { case let .link(_, preview): CILinkView(linkPreview: preview) ciMsgContentView(chatItem) + case let .chat(text, chatLink, ownerSig): + let hasText = text != chatLink.connLinkStr + CIChatLinkHeader(chatItem: chatItem, chatLink: chatLink, ownerSig: ownerSig, hasText: hasText) + .overlay(DetermineWidth()) + .simultaneousGesture(TapGesture().onEnded { + planAndConnect(chatLink.connLinkStr, linkOwnerSig: ownerSig, theme: theme, dismiss: false) + }) + if hasText { + ciMsgContentView(chatItem, stripLink: chatLink.connLinkStr) + } case let .unknown(_, text: text): if chatItem.file == nil { ciMsgContentView(chatItem) @@ -244,6 +254,11 @@ struct FramedItemView: View { ciQuotedMsgView(qi) .padding(.trailing, 20).frame(minWidth: msgWidth, alignment: .leading) ciQuoteIconView("mic.fill") + case let .chat(text, chatLink, _): + let prefix = NSAttributedString(string: chatLink.displayName + (text != chatLink.connLinkStr ? " - " : "")) + ciQuotedMsgView(qi, stripLink: chatLink.connLinkStr, prefix: prefix) + .padding(.trailing, 20).frame(minWidth: msgWidth, alignment: .leading) + ciQuoteIconView(chatLink.smallIconName) default: ciQuotedMsgView(qi) } @@ -260,7 +275,7 @@ struct FramedItemView: View { } } - private func ciQuotedMsgView(_ qi: CIQuote) -> some View { + private func ciQuotedMsgView(_ qi: CIQuote, stripLink: String? = nil, prefix: NSAttributedString? = nil) -> some View { Group { if let sender = qi.getSender(membership()) { VStack(alignment: .leading, spacing: 2) { @@ -268,10 +283,10 @@ struct FramedItemView: View { .font(.caption) .foregroundColor(qi.chatDir == .groupSnd ? .accentColor : theme.colors.secondary) .lineLimit(1) - ciQuotedMsgTextView(qi, lines: 2) + ciQuotedMsgTextView(qi, lines: 2, stripLink: stripLink, prefix: prefix) } } else { - ciQuotedMsgTextView(qi, lines: 3) + ciQuotedMsgTextView(qi, lines: 3, stripLink: stripLink, prefix: prefix) } } .fixedSize(horizontal: false, vertical: true) @@ -280,8 +295,8 @@ struct FramedItemView: View { } @inline(__always) - private func ciQuotedMsgTextView(_ qi: CIQuote, lines: Int) -> some View { - MsgContentView(chat: chat, text: qi.text, formattedText: qi.formattedText, textStyle: .subheadline) + private func ciQuotedMsgTextView(_ qi: CIQuote, lines: Int, stripLink: String? = nil, prefix: NSAttributedString? = nil) -> some View { + MsgContentView(chat: chat, text: qi.text, formattedText: qi.formattedText, textStyle: .subheadline, prefix: prefix, stripLink: stripLink) .lineLimit(lines) .padding(.bottom, 6) } @@ -303,7 +318,7 @@ struct FramedItemView: View { } } - @ViewBuilder private func ciMsgContentView(_ ci: ChatItem, txtPrefix: NSAttributedString? = nil) -> some View { + @ViewBuilder private func ciMsgContentView(_ ci: ChatItem, txtPrefix: NSAttributedString? = nil, stripLink: String? = nil) -> some View { let text = ci.meta.isLive ? ci.content.msgContent?.text ?? ci.text : ci.text let rtl = isRightToLeft(text) let ft = text == "" ? [] : ci.formattedText @@ -316,7 +331,8 @@ struct FramedItemView: View { mentions: ci.mentions, userMemberId: chat.chatInfo.groupInfo?.membership.memberId, rightToLeft: rtl, - prefix: txtPrefix + prefix: txtPrefix, + stripLink: stripLink ) .environment(\.containerBackground, UIColor(chatItemFrameColor(ci, theme))) .multilineTextAlignment(rtl ? .trailing : .leading) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift index 77bd41c5b8..2f4338c0af 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift @@ -39,6 +39,7 @@ struct MsgContentView: View { var userMemberId: String? = nil var rightToLeft = false var prefix: NSAttributedString? = nil + var stripLink: String? = nil @State private var showSecrets: Set = [] @State private var typingIdx = 0 @State private var timer: Timer? @@ -105,7 +106,8 @@ struct MsgContentView: View { showSecrets: showSecrets, commands: chat.chatInfo.useCommands && chat.chatInfo.sndReady, backgroundColor: containerBackground, - prefix: prefix + prefix: prefix, + stripLink: stripLink ) let s = r.string let t: Text @@ -289,8 +291,11 @@ func messageText( showSecrets: Set?, commands: Bool = false, backgroundColor: UIColor, - prefix: NSAttributedString? = nil + prefix: NSAttributedString? = nil, + stripLink: String? = nil ) -> MsgTextResult { + let text = if let stripLink { stripTextLink(text, stripLink) } else { text } + let formattedText = if let stripLink { stripFormattedTextLink(formattedText, stripLink) } else { formattedText } let res = NSMutableAttributedString() let descr = UIFontDescriptor.preferredFontDescriptor(withTextStyle: textStyle) let font = UIFont.preferredFont(forTextStyle: textStyle) @@ -465,6 +470,24 @@ func viaHost(_ smpHosts: [String]) -> String { "(via \(smpHosts.first ?? "?"))" } +func stripTextLink(_ text: String, _ link: String) -> String { + text == link + ? "" + : text.hasSuffix("\n" + link) + ? String(text.dropLast(link.count + 1)) + : text +} + +func stripFormattedTextLink(_ ft: [FormattedText]?, _ link: String) -> [FormattedText]? { + guard var ft, ft.last?.text == link else { return ft } + ft.removeLast() + if let i = ft.indices.last, ft[i].format == nil, ft[i].text.hasSuffix("\n") { + ft[i].text = String(ft[i].text.dropLast()) + if ft[i].text.isEmpty { ft.removeLast() } + } + return ft.isEmpty ? nil : ft +} + struct MsgContentView_Previews: PreviewProvider { static var previews: some View { let chatItem = ChatItem.getSample(1, .directSnd, .now, "hello") diff --git a/apps/ios/Shared/Views/Chat/ChatItemForwardingView.swift b/apps/ios/Shared/Views/Chat/ChatItemForwardingView.swift index dfc620c402..d83a5e8504 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemForwardingView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemForwardingView.swift @@ -14,9 +14,12 @@ struct ChatItemForwardingView: View { @EnvironmentObject var theme: AppTheme @Environment(\.dismiss) var dismiss - var chatItems: [ChatItem] - var fromChatInfo: ChatInfo - @Binding var composeState: ComposeState + var title: LocalizedStringKey = "Forward" + var chatItems: [ChatItem] = [] + var fromChatInfo: ChatInfo? = nil + var composeState: Binding? = nil + var isProhibited: ((Chat) -> Bool)? = nil + var onSelectChat: ((Chat) -> Void)? = nil @State private var searchText: String = "" @State private var alert: SomeAlert? @@ -32,7 +35,7 @@ struct ChatItemForwardingView: View { } } ToolbarItem(placement: .principal) { - Text("Forward") + Text(title) .bold() } } @@ -71,7 +74,7 @@ struct ChatItemForwardingView: View { } @ViewBuilder private func forwardListChatView(_ chat: Chat) -> some View { - let prohibited = chatItems.map { ci in + let prohibited = isProhibited?(chat) ?? chatItems.map { ci in chat.prohibitedByPref( hasSimplexLink: hasSimplexLink(ci.content.msgContent?.text), isMediaOrFileAttachment: ci.content.msgContent?.isMediaOrFileAttachment ?? false, @@ -88,16 +91,19 @@ struct ChatItemForwardingView: View { ), id: "forward prohibited by preferences" ) - } else { + } else if let onSelectChat { + dismiss() + onSelectChat(chat) + } else if let fromChatInfo, let composeState { dismiss() if chat.id == fromChatInfo.id { - composeState = ComposeState( - message: composeState.message, - preview: composeState.linkPreview != nil ? composeState.preview : .noPreview, + composeState.wrappedValue = ComposeState( + message: composeState.wrappedValue.message, + preview: composeState.wrappedValue.linkPreview != nil ? composeState.wrappedValue.preview : .noPreview, contextItem: .forwardingItems(chatItems: chatItems, fromChatInfo: fromChatInfo) ) } else { - composeState = ComposeState.init(forwardingItems: chatItems, fromChatInfo: fromChatInfo) + composeState.wrappedValue = ComposeState.init(forwardingItems: chatItems, fromChatInfo: fromChatInfo) ItemsModel.shared.loadOpenChat(chat.id) } } diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 7a0cd82cbc..e165c01710 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -260,7 +260,9 @@ struct ChatView: View { groupLinkMemberRole: $groupLinkMemberRole, showTitle: true, creatingGroup: false, - isChannel: groupInfo.useRelays + isChannel: groupInfo.useRelays, + groupInfo: groupInfo, + composeState: $composeState ) } } @@ -511,6 +513,7 @@ struct ChatView: View { } ), scrollToItemId: $scrollToItemId, + composeState: $composeState, onSearch: { focusSearch() }, localAlias: groupInfo.localAlias ) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift new file mode 100644 index 0000000000..d82029df0e --- /dev/null +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift @@ -0,0 +1,43 @@ +import SwiftUI +import SimpleXChat + +struct ComposeChatLinkView: View { + @EnvironmentObject var theme: AppTheme + var chatLink: MsgChatLink + var cancelPreview: () -> Void + let cancelEnabled: Bool + + var body: some View { + HStack(alignment: .center, spacing: 8) { + ProfileImage( + imageStr: chatLink.image, + iconName: chatLink.iconName, + size: 44 + ) + .padding(.leading, 12) + VStack(alignment: .leading, spacing: 2) { + Text(chatLink.displayName) + .font(.headline) + .lineLimit(1) + if let descr = chatLink.shortDescription { + Text(descr) + .font(.caption) + .foregroundColor(theme.colors.secondary) + .lineLimit(1) + } + } + .padding(.vertical, 5) + Spacer() + if cancelEnabled { + Button { cancelPreview() } label: { + Image(systemName: "multiply") + } + } + } + .padding(.vertical, 1) + .padding(.trailing, 12) + .background(theme.appColors.sentMessage) + .frame(minHeight: 54) + .frame(maxWidth: .infinity) + } +} diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 5728fbcd6b..656a222cd0 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -11,6 +11,7 @@ let MAX_NUMBER_OF_MENTIONS = 3 enum ComposePreview { case noPreview case linkPreview(linkPreview: LinkPreview?) + case chatLinkPreview(chatLink: MsgChatLink, ownerSig: LinkOwnerSig?) case mediaPreviews(mediaPreviews: [(String, UploadContent?)]) case voicePreview(recordingFileName: String, duration: Int) case filePreview(fileName: String, file: URL) @@ -172,6 +173,7 @@ struct ComposeState { switch preview { case let .mediaPreviews(media): return !media.isEmpty case .voicePreview: return voiceMessageRecordingState == .finished + case .chatLinkPreview: return true case .filePreview: return true default: return !whitespaceOnly || forwarding || liveMessage != nil || submittingValidReport } @@ -183,6 +185,7 @@ struct ComposeState { var linkPreviewAllowed: Bool { switch preview { + case .chatLinkPreview: return false case .mediaPreviews: return false case .voicePreview: return false case .filePreview: return false @@ -238,6 +241,7 @@ struct ComposeState { switch preview { case .noPreview: false case .linkPreview: false + case .chatLinkPreview: false case let .mediaPreviews(mediaPreviews): !mediaPreviews.isEmpty case .voicePreview: false case .filePreview: true @@ -1300,6 +1304,15 @@ struct ComposeView: View { cancelEnabled: !composeState.inProgress ) Divider() + case let .chatLinkPreview(chatLink, _): + ComposeChatLinkView( + chatLink: chatLink, + cancelPreview: { + composeState = composeState.copy(preview: .noPreview) + }, + cancelEnabled: !composeState.inProgress + ) + Divider() case let .mediaPreviews(mediaPreviews: media): ComposeImageView( images: media.map { (img, _) in img }, @@ -1458,6 +1471,10 @@ struct ComposeView: View { sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl, mentions: mentions) case .linkPreview: sent = await send(checkLinkPreview(), quoted: quoted, live: live, ttl: ttl, mentions: mentions) + case let .chatLinkPreview(chatLink, ownerSig): + let linkStr = chatLink.connLinkStr + let text = msgText.isEmpty ? linkStr : msgText + "\n" + linkStr + sent = await send(.chat(text: text, chatLink: chatLink, ownerSig: ownerSig), quoted: quoted, live: live, ttl: ttl, mentions: mentions) case let .mediaPreviews(media): // TODO: CHECK THIS let last = media.count - 1 @@ -1561,8 +1578,8 @@ struct ComposeView: View { case .report(_, let reason): return .report(text: msgText, reason: reason) // TODO [short links] update chat link - case let .chat(_, chatLink): - return .chat(text: msgText, chatLink: chatLink) + case let .chat(_, chatLink, ownerSig): + return .chat(text: msgText, chatLink: chatLink, ownerSig: ownerSig) case .unknown(let type, _): return .unknown(type: type, text: msgText) } diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift index 845442c75f..1f328b2061 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ContextItemView.swift @@ -71,7 +71,7 @@ struct ContextItemView: View { } private func contextMsgPreview(_ contextItem: ChatItem) -> some View { - let r = messageText(contextItem.text, contextItem.formattedText, sender: nil, preview: true, mentions: contextItem.mentions, userMemberId: nil, showSecrets: nil, backgroundColor: UIColor(background)) + let r = messageText(contextItem.text, contextItem.formattedText, sender: nil, preview: true, mentions: contextItem.mentions, userMemberId: nil, showSecrets: nil, backgroundColor: UIColor(background), stripLink: contextItem.content.msgContent?.chatLinkStr) let t = attachment() + Text(AttributedString(r.string)) return t.if(r.hasSecrets, transform: hiddenSecretsView) @@ -83,6 +83,9 @@ struct ContextItemView: View { case .file: return isFileLoaded ? image("doc.fill") : Text("") case .image: return image("photo") case .voice: return isFileLoaded ? image("play.fill") : Text("") + case let .chat(_, chatLink, _): + let hasText = contextItem.text != chatLink.connLinkStr + return image(chatLink.smallIconName) + Text(chatLink.displayName) + Text(verbatim: hasText ? " - " : "") default: return Text("") } } diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index c02f4dae36..afc314eb78 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -20,8 +20,10 @@ struct GroupChatInfoView: View { @ObservedObject var chat: Chat @Binding var groupInfo: GroupInfo @Binding var scrollToItemId: ChatItem.ID? + @Binding var composeState: ComposeState var onSearch: () -> Void @State var localAlias: String + @State private var showSharePicker = false @FocusState private var aliasTextFieldFocused: Bool @State private var alert: GroupChatInfoViewAlert? = nil @State private var groupLink: GroupLink? @@ -113,6 +115,11 @@ struct GroupChatInfoView: View { } label: { Label("Share link", systemImage: "square.and.arrow.up") } + Button { + showSharePicker = true + } label: { + Label("Share via chat", systemImage: "arrowshape.turn.up.forward") + } } if groupInfo.isOwner || members.contains(where: { $0.wrapped.memberRole >= .owner }) { channelMembersButton() @@ -248,6 +255,9 @@ struct GroupChatInfoView: View { } } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top) + .sheet(isPresented: $showSharePicker) { + shareChannelPicker(groupInfo: groupInfo, composeState: $composeState) + } .alert(item: $alert) { alertItem in switch(alertItem) { case .deleteGroupAlert: return deleteGroupAlert() @@ -638,7 +648,9 @@ struct GroupChatInfoView: View { groupLinkMemberRole: $groupLinkMemberRole, showTitle: false, creatingGroup: false, - isChannel: groupInfo.useRelays + isChannel: groupInfo.useRelays, + groupInfo: groupInfo, + composeState: $composeState ) .navigationBarTitle(groupInfo.useRelays ? "Channel link" : "Group link") .modifier(ThemedBackground(grouped: true)) @@ -1048,12 +1060,66 @@ func largeGroupReceiptsDisabledAlert() -> Alert { ) } +@ViewBuilder +func shareChannelPicker(groupInfo: GroupInfo, composeState: Binding? = nil) -> some View { + let v = ChatItemForwardingView( + title: "Share channel", + isProhibited: { $0.prohibitedByPref(hasSimplexLink: true, isMediaOrFileAttachment: false, isVoice: false) }, + onSelectChat: { chat in shareChatLink(chat, sourceGroupInfo: groupInfo, composeState: composeState) } + ) + if #available(iOS 16.0, *) { + v.presentationDetents([.fraction(0.8)]) + } else { + v + } +} + +func shareChatLink(_ destChat: Chat, sourceGroupInfo: GroupInfo, composeState: Binding? = nil) { + let sendAsGroup = if let gInfo = destChat.chatInfo.groupInfo { gInfo.useRelays && gInfo.membership.memberRole >= .owner } else { false } + Task { + do { + let mc = try await apiShareChatMsgContent( + shareChatType: .group, shareChatId: Int64(sourceGroupInfo.groupId), + toChatType: destChat.chatInfo.chatType, toChatId: destChat.chatInfo.apiId, + toScope: destChat.chatInfo.groupChatScope(), sendAsGroup: sendAsGroup + ) + if case let .chat(_, chatLink, ownerSig) = mc { + await MainActor.run { + dismissAllSheets { + let cs = ComposeState(preview: .chatLinkPreview(chatLink: chatLink, ownerSig: ownerSig)) + if let composeState { + composeState.wrappedValue = cs + } else { + ChatModel.shared.draft = cs + ChatModel.shared.draftChatId = destChat.id + } + if destChat.id != ChatModel.shared.chatId { + ItemsModel.shared.loadOpenChat(destChat.id) + } + } + } + } else { + logger.error("shareChatLink: unexpected MsgContent: \(String(describing: mc))") + await MainActor.run { + showAlert(NSLocalizedString("Error sharing channel", comment: "alert title"), message: String(describing: mc)) + } + } + } catch { + logger.error("shareChatLink error: \(error.localizedDescription)") + await MainActor.run { + showAlert(NSLocalizedString("Error sharing channel", comment: "alert title"), message: error.localizedDescription) + } + } + } +} + struct GroupChatInfoView_Previews: PreviewProvider { static var previews: some View { GroupChatInfoView( chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []), groupInfo: Binding.constant(GroupInfo.sampleData), scrollToItemId: Binding.constant(nil), + composeState: Binding.constant(ComposeState()), onSearch: {}, localAlias: "" ) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift index 56ee370402..22253c4808 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupLinkView.swift @@ -18,7 +18,10 @@ struct GroupLinkView: View { var showTitle: Bool = false var creatingGroup: Bool = false var isChannel: Bool = false + var groupInfo: GroupInfo? = nil + var composeState: Binding? = nil var linkCreatedCb: (() -> Void)? = nil + @State private var showSharePicker = false @State private var showShortLink = true @State private var creatingLink = false @State private var alert: GroupLinkAlert? @@ -104,6 +107,11 @@ struct GroupLinkView: View { } label: { Label("Share link", systemImage: "square.and.arrow.up") } + if groupInfo?.groupProfile.publicGroup != nil { + Button { showSharePicker = true } label: { + Label("Share via chat", systemImage: "arrowshape.turn.up.forward") + } + } if !creatingGroup && !isChannel { Button(role: .destructive) { alert = .deleteLink } label: { @@ -160,6 +168,11 @@ struct GroupLinkView: View { } } .modifier(ThemedBackground(grouped: true)) + .sheet(isPresented: $showSharePicker) { + if let gInfo = groupInfo { + shareChannelPicker(groupInfo: gInfo, composeState: composeState) + } + } } private func createGroupLink() { diff --git a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift index 24a52b4b60..126fcc57b3 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupProfileView.swift @@ -37,7 +37,7 @@ struct GroupProfileView: View { var body: some View { List { - EditProfileImage(profileImage: $groupProfile.image, showChooseSource: $showChooseSource) + EditProfileImage(profileImage: $groupProfile.image, iconName: groupInfo.chatIconName, showChooseSource: $showChooseSource) .if(!focusDisplayName) { $0.padding(.top) } Section { diff --git a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift index 3524ceff18..243d804685 100644 --- a/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatPreviewView.swift @@ -296,11 +296,23 @@ struct ChatPreviewView: View { } func chatItemPreview(_ cItem: ChatItem) -> (Text, Bool) { - let itemText = cItem.meta.itemDeleted == nil ? cItem.text(isChannel: chat.chatInfo.isChannel) : markedDeletedText() - let itemFormattedText = cItem.meta.itemDeleted == nil ? cItem.formattedText : nil + let (itemText, itemFormattedText) = chatItemPreviewText(cItem) let r = messageText(itemText, itemFormattedText, sender: cItem.meta.showGroupAsSender ? nil : cItem.memberDisplayName, preview: true, mentions: cItem.mentions, userMemberId: chat.chatInfo.groupInfo?.membership.memberId, showSecrets: nil, backgroundColor: UIColor(theme.colors.background), prefix: prefix()) return (Text(AttributedString(r.string)), r.hasSecrets) + func chatItemPreviewText(_ ci: ChatItem) -> (String, [FormattedText]?) { + if ci.meta.itemDeleted != nil { + return (markedDeletedText(), nil) + } + if case let .chat(_, chatLink, _) = ci.content.msgContent { + let descr = if let descr = chatLink.shortDescription?.trimmingCharacters(in: .whitespacesAndNewlines), + descr != "" { "\n" + descr } else { "" } + let text = chatLink.displayName + descr + return (text, nil) + } + return (ci.text(isChannel: chat.chatInfo.isChannel), ci.formattedText) + } + // same texts are in markedDeletedText in MarkedDeletedItemView, but it returns LocalizedStringKey; // can be refactored into a single function if functions calling these are changed to return same type func markedDeletedText() -> String { @@ -426,6 +438,18 @@ struct ChatPreviewView: View { smallContentPreviewFile(size: dynamicMediaSize) { CIFileView(file: ci.file, edited: ci.meta.itemEdited, smallViewSize: dynamicMediaSize) } + case let .chat(_, chatLink, ownerSig): + smallContentPreview(size: dynamicMediaSize, borderColor: chatLink.image != nil ? .secondary : .clear) { + ProfileImage( + imageStr: chatLink.image, + iconName: chatLink.iconName, + size: dynamicMediaSize, + color: Color(uiColor: .tertiaryLabel) + ) + .onTapGesture { + planAndConnect(chatLink.connLinkStr, linkOwnerSig: ownerSig, theme: theme, dismiss: false) + } + } default: EmptyView() } } @@ -499,12 +523,12 @@ func flagIcon(size: CGFloat, color: Color) -> some View { .foregroundColor(color) } -func smallContentPreview(size: CGFloat, _ view: @escaping () -> some View) -> some View { +func smallContentPreview(size: CGFloat, borderColor: Color = .secondary, _ view: @escaping () -> some View) -> some View { view() .frame(width: size, height: size) .cornerRadius(8) .overlay(RoundedRectangle(cornerSize: CGSize(width: 8, height: 8)) - .strokeBorder(.secondary, lineWidth: 0.3, antialiased: true)) + .strokeBorder(borderColor, lineWidth: 0.3, antialiased: true)) .padding(.vertical, size / 6) .padding(.leading, 3) .offset(x: 6) diff --git a/apps/ios/Shared/Views/Helpers/ShareSheet.swift b/apps/ios/Shared/Views/Helpers/ShareSheet.swift index 0f6b9d01e5..8b982ec0b7 100644 --- a/apps/ios/Shared/Views/Helpers/ShareSheet.swift +++ b/apps/ios/Shared/Views/Helpers/ShareSheet.swift @@ -101,6 +101,7 @@ class OpenChatAlertViewController: UIViewController { private let profileFullName: String private let profileImage: UIView private let subtitle: String? + private let information: String? private let cancelTitle: String private let confirmTitle: String? private let onCancel: () -> Void @@ -111,6 +112,7 @@ class OpenChatAlertViewController: UIViewController { profileFullName: String, profileImage: UIView, subtitle: String? = nil, + information: String? = nil, cancelTitle: String = "Cancel", confirmTitle: String? = "Open", onCancel: @escaping () -> Void = {}, @@ -120,6 +122,7 @@ class OpenChatAlertViewController: UIViewController { self.profileFullName = profileFullName self.profileImage = profileImage self.subtitle = subtitle + self.information = information self.cancelTitle = cancelTitle self.confirmTitle = confirmTitle self.onCancel = onCancel @@ -186,6 +189,18 @@ class OpenChatAlertViewController: UIViewController { profileViews.append(subtitleLabel) } + // Information label (e.g. owner verification) + if let information { + let infoLabel = UILabel() + infoLabel.text = information + infoLabel.font = UIFont.preferredFont(forTextStyle: .footnote) + infoLabel.textColor = .label + infoLabel.numberOfLines = 3 + infoLabel.textAlignment = .center + infoLabel.translatesAutoresizingMaskIntoConstraints = false + profileViews.append(infoLabel) + } + // Horizontal stack for image + name let stack = UIStackView(arrangedSubviews: profileViews) stack.axis = .vertical @@ -318,6 +333,7 @@ func showOpenChatAlert( profileImage: Content, theme: AppTheme, subtitle: String? = nil, + information: String? = nil, cancelTitle: String = "Cancel", confirmTitle: String? = "Open", onCancel: @escaping () -> Void = {}, @@ -334,6 +350,7 @@ func showOpenChatAlert( profileFullName: profileFullName, profileImage: hostedView, subtitle: subtitle, + information: information, cancelTitle: cancelTitle, confirmTitle: confirmTitle, onCancel: onCancel, diff --git a/apps/ios/Shared/Views/NewChat/AddChannelView.swift b/apps/ios/Shared/Views/NewChat/AddChannelView.swift index 9ee82158a1..e3409029e5 100644 --- a/apps/ios/Shared/Views/NewChat/AddChannelView.swift +++ b/apps/ios/Shared/Views/NewChat/AddChannelView.swift @@ -373,7 +373,8 @@ struct AddChannelView: View { groupLinkMemberRole: Binding.constant(.observer), // TODO [relays] starting role should be communicated in protocol from owner to relays showTitle: false, creatingGroup: true, - isChannel: true + isChannel: true, + groupInfo: gInfo ) { m.creatingChannelId = nil DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index d869a2e4ac..7a5e8fbbc1 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -916,11 +916,13 @@ private func showAskCurrentOrIncognitoProfileSheet( actionStyle: UIAlertAction.Style = .default, connectionLink: CreatedConnLink, connectionPlan: ConnectionPlan?, + ownerVerification: OwnerVerification? = nil, dismiss: Bool, cleanup: (() -> Void)? ) { showSheet( title, + message: ownerVerificationMessage(ownerVerification), actions: {[ UIAlertAction( title: NSLocalizedString("Use current profile", comment: "new chat action"), @@ -1056,6 +1058,7 @@ private func showOwnGroupLinkConfirmConnectSheet( private func showPrepareContactAlert( connectionLink: CreatedConnLink, contactShortLinkData: ContactShortLinkData, + ownerVerification: OwnerVerification? = nil, theme: AppTheme, dismiss: Bool, cleanup: (() -> Void)? @@ -1074,6 +1077,7 @@ private func showPrepareContactAlert( size: alertProfileImageSize ), theme: theme, + information: ownerVerificationMessage(ownerVerification), cancelTitle: NSLocalizedString("Cancel", comment: "new chat action"), confirmTitle: NSLocalizedString("Open new chat", comment: "new chat action"), onCancel: { cleanup?() }, @@ -1101,6 +1105,7 @@ private func showPrepareGroupAlert( connectionLink: CreatedConnLink, groupShortLinkInfo: GroupShortLinkInfo?, groupShortLinkData: GroupShortLinkData, + ownerVerification: OwnerVerification? = nil, theme: AppTheme, dismiss: Bool, cleanup: (() -> Void)? @@ -1120,6 +1125,7 @@ private func showPrepareGroupAlert( ), theme: theme, subtitle: isChannel ? subscriberCount : nil, + information: ownerVerificationMessage(ownerVerification), cancelTitle: NSLocalizedString("Cancel", comment: "new chat action"), confirmTitle: isChannel ? NSLocalizedString("Open new channel", comment: "new chat action") @@ -1217,6 +1223,7 @@ private func showOpenKnownGroupAlert( // Spec: spec/client/navigation.md#planAndConnect func planAndConnect( _ shortOrFullLink: String, + linkOwnerSig: LinkOwnerSig? = nil, theme: AppTheme, dismiss: Bool, cleanup: (() -> Void)? = nil, @@ -1241,7 +1248,7 @@ func planAndConnect( func connectTask(_ inProgress: BoxedValue) { Task { - let (result, alert) = await apiConnectPlan(connLink: shortOrFullLink, inProgress: inProgress) + let (result, alert) = await apiConnectPlan(connLink: shortOrFullLink, linkOwnerSig: linkOwnerSig, inProgress: inProgress) await MainActor.run { ConnectProgressManager.shared.stopConnectProgress() } @@ -1250,13 +1257,14 @@ func planAndConnect( switch connectionPlan { case let .invitationLink(ilp): switch ilp { - case let .ok(contactSLinkData_): + case let .ok(contactSLinkData_, ownerVerification): if let contactSLinkData = contactSLinkData_ { logger.debug("planAndConnect, .invitationLink, .ok, short link data present") await MainActor.run { showPrepareContactAlert( connectionLink: connectionLink, contactShortLinkData: contactSLinkData, + ownerVerification: ownerVerification, theme: theme, dismiss: dismiss, cleanup: cleanup @@ -1269,6 +1277,7 @@ func planAndConnect( title: NSLocalizedString("Connect via one-time link", comment: "new chat sheet title"), connectionLink: connectionLink, connectionPlan: connectionPlan, + ownerVerification: ownerVerification, dismiss: dismiss, cleanup: cleanup ) @@ -1311,13 +1320,14 @@ func planAndConnect( } case let .contactAddress(cap): switch cap { - case let .ok(contactSLinkData_): + case let .ok(contactSLinkData_, ownerVerification): if let contactSLinkData = contactSLinkData_ { logger.debug("planAndConnect, .contactAddress, .ok, short link data present") await MainActor.run { showPrepareContactAlert( connectionLink: connectionLink, contactShortLinkData: contactSLinkData, + ownerVerification: ownerVerification, theme: theme, dismiss: dismiss, cleanup: cleanup @@ -1330,6 +1340,7 @@ func planAndConnect( title: NSLocalizedString("Connect via contact address", comment: "new chat sheet title"), connectionLink: connectionLink, connectionPlan: connectionPlan, + ownerVerification: ownerVerification, dismiss: dismiss, cleanup: cleanup ) @@ -1389,7 +1400,7 @@ func planAndConnect( } case let .groupLink(glp): switch glp { - case let .ok(groupShortLinkInfo_, groupSLinkData_): + case let .ok(groupShortLinkInfo_, groupSLinkData_, ownerVerification): if let groupSLinkData = groupSLinkData_ { logger.debug("planAndConnect, .groupLink, .ok, short link data present") await MainActor.run { @@ -1397,6 +1408,7 @@ func planAndConnect( connectionLink: connectionLink, groupShortLinkInfo: groupShortLinkInfo_, groupShortLinkData: groupSLinkData, + ownerVerification: ownerVerification, theme: theme, dismiss: dismiss, cleanup: cleanup @@ -1409,6 +1421,7 @@ func planAndConnect( title: NSLocalizedString("Join group", comment: "new chat sheet title"), connectionLink: connectionLink, connectionPlan: connectionPlan, + ownerVerification: ownerVerification, dismiss: dismiss, cleanup: cleanup ) @@ -1629,6 +1642,14 @@ private func planToConnReqType(_ connectionPlan: ConnectionPlan) -> ConnReqType? } } +private func ownerVerificationMessage(_ ov: OwnerVerification?) -> String? { + switch ov { + case .verified: NSLocalizedString("Link signature verified.", comment: "owner verification") + case let .failed(reason): String.localizedStringWithFormat(NSLocalizedString("⚠️ Signature verification failed: %@.", comment: "owner verification"), reason) + case .none: nil + } +} + func connReqSentAlert(_ type: ConnReqType) -> Alert { return mkAlert( title: "Connection request sent!", diff --git a/apps/ios/Shared/Views/UserSettings/UserProfile.swift b/apps/ios/Shared/Views/UserSettings/UserProfile.swift index 569b5caf13..2e609c3f7d 100644 --- a/apps/ios/Shared/Views/UserSettings/UserProfile.swift +++ b/apps/ios/Shared/Views/UserSettings/UserProfile.swift @@ -26,7 +26,7 @@ struct UserProfile: View { var body: some View { List { - EditProfileImage(profileImage: $profile.image, showChooseSource: $showChooseSource) + EditProfileImage(profileImage: $profile.image, iconName: "person.crop.circle.fill", showChooseSource: $showChooseSource) .padding(.top) Section { @@ -178,6 +178,7 @@ struct EditProfileImage: View { @EnvironmentObject var theme: AppTheme @AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner @Binding var profileImage: String? + var iconName: String @Binding var showChooseSource: Bool var body: some View { @@ -193,7 +194,7 @@ struct EditProfileImage: View { } } else { ZStack(alignment: .center) { - ProfileImage(imageStr: profileImage, size: 160) + ProfileImage(imageStr: profileImage, iconName: iconName, size: 160) editImageButton { showChooseSource = true } } } diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index ef37f26097..7dd3a6c6ed 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -250,6 +250,8 @@ D7F0E33929964E7E0068AF69 /* LZString in Frameworks */ = {isa = PBXBuildFile; productRef = D7F0E33829964E7E0068AF69 /* LZString */; }; E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E51CC1E52C62085600DB91FE /* OneHandUICard.swift */; }; E559A0A12E3F77EE00B26F74 /* CommandsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */; }; + E5AEC0AB2F91A6EB00270665 /* CIChatLinkHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5AEC0AA2F91A6EA00270665 /* CIChatLinkHeader.swift */; }; + E5AEC0AF2F91A73500270665 /* ComposeChatLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5AEC0AE2F91A73500270665 /* ComposeChatLinkView.swift */; }; E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; }; E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; }; E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; }; @@ -617,6 +619,8 @@ D7AA2C3429A936B400737B40 /* MediaEncryption.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; name = MediaEncryption.playground; path = Shared/MediaEncryption.playground; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; E51CC1E52C62085600DB91FE /* OneHandUICard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OneHandUICard.swift; sourceTree = ""; }; E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandsMenuView.swift; sourceTree = ""; }; + E5AEC0AA2F91A6EA00270665 /* CIChatLinkHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIChatLinkHeader.swift; sourceTree = ""; }; + E5AEC0AE2F91A73500270665 /* ComposeChatLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeChatLinkView.swift; sourceTree = ""; }; E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; E5DCF9732C590275007928CC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; @@ -1079,6 +1083,7 @@ 6440C9FF288857A10062C672 /* CIEventView.swift */, 5C58BCD5292BEBE600AF9E4F /* CIChatFeatureView.swift */, 5C7031152953C97F00150A12 /* CIFeaturePreferenceView.swift */, + E5AEC0AA2F91A6EA00270665 /* CIChatLinkHeader.swift */, 644EFFE1292D089800525D5B /* FramedCIVoiceView.swift */, 644EFFE32937BE9700525D5B /* MarkedDeletedItemView.swift */, 1841511920742C6E152E469F /* AnimatedImageView.swift */, @@ -1095,6 +1100,7 @@ children = ( 5C9FD96D27A5D6ED0075386C /* SendMessageView.swift */, 5CEACCE227DE9246000BD591 /* ComposeView.swift */, + E5AEC0AE2F91A73500270665 /* ComposeChatLinkView.swift */, 64AA1C6827EE10C800AC7277 /* ContextItemView.swift */, 649BCD9F280460FD00C3A862 /* ComposeImageView.swift */, 6454036E2822A9750090DDFF /* ComposeFileView.swift */, @@ -1591,6 +1597,7 @@ 5C55A91F283AD0E400C4E99E /* CallManager.swift in Sources */, 649BCDA22805D6EF00C3A862 /* CIImageView.swift in Sources */, 5CADE79C292131E900072E13 /* ContactPreferencesView.swift in Sources */, + E5AEC0AF2F91A73500270665 /* ComposeChatLinkView.swift in Sources */, CEA6E91C2CBD21B0002B5DB4 /* UserDefault.swift in Sources */, 5CB346E52868AA7F001FD2EF /* SuspendChat.swift in Sources */, 8CAEF1502D11A6A000240F00 /* ChatItemsLoader.swift in Sources */, @@ -1604,6 +1611,7 @@ 8CB3476E2CF5F58B006787A5 /* ConditionsWebView.swift in Sources */, 5CC1C99527A6CF7F000D9FF6 /* ShareSheet.swift in Sources */, 5C5E5D3B2824468B00B0488A /* ActiveCallView.swift in Sources */, + E5AEC0AB2F91A6EB00270665 /* CIChatLinkHeader.swift in Sources */, B70A39732D24090D00E80A5F /* TagListView.swift in Sources */, 5C2E260727A2941F00F70299 /* SimpleXAPI.swift in Sources */, 64E5E3632DF71A4E00A4D530 /* ContextContactRequestActionsView.swift in Sources */, @@ -2289,6 +2297,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; ENABLE_CODE_COVERAGE = NO; + EXPORTED_SYMBOLS_FILE = "$(PROJECT_DIR)/SimpleXChat/exported_symbols.txt"; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 SimpleX Chat. All rights reserved."; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; @@ -2312,6 +2321,8 @@ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; + STRIP_INSTALLED_PRODUCT = YES; + STRIP_STYLE = "non-global"; SUPPORTS_MACCATALYST = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INCLUDE_PATHS = ""; @@ -2319,9 +2330,6 @@ SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - EXPORTED_SYMBOLS_FILE = "$(PROJECT_DIR)/SimpleXChat/exported_symbols.txt"; - STRIP_INSTALLED_PRODUCT = YES; - STRIP_STYLE = "non-global"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 88c3acc02a..0401664d74 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -4590,10 +4590,14 @@ public enum MsgContent: Equatable, Hashable { case voice(text: String, duration: Int) case file(String) case report(text: String, reason: ReportReason) - case chat(text: String, chatLink: MsgChatLink) + case chat(text: String, chatLink: MsgChatLink, ownerSig: LinkOwnerSig?) // TODO include original JSON, possibly using https://github.com/zoul/generic-json-swift case unknown(type: String, text: String) + public var chatLinkStr: String? { + if case let .chat(_, chatLink, _) = self { chatLink.connLinkStr } else { nil } + } + public var text: String { switch self { case let .text(text): return text @@ -4603,7 +4607,7 @@ public enum MsgContent: Equatable, Hashable { case let .voice(text, _): return text case let .file(text): return text case let .report(text, _): return text - case let .chat(text, _): return text + case let .chat(text, _, _): return text case let .unknown(_, text): return text } } @@ -4666,6 +4670,7 @@ public enum MsgContent: Equatable, Hashable { case duration case reason case chatLink + case ownerSig } public static func == (lhs: MsgContent, rhs: MsgContent) -> Bool { @@ -4677,7 +4682,7 @@ public enum MsgContent: Equatable, Hashable { case let (.voice(lt, ld), .voice(rt, rd)): return lt == rt && ld == rd case let (.file(lf), .file(rf)): return lf == rf case let (.report(lt, lr), .report(rt, rr)): return lt == rt && lr == rr - case let (.chat(lt, ll), .chat(rt, rl)): return lt == rt && ll == rl + case let (.chat(lt, ll, ls), .chat(rt, rl, rs)): return lt == rt && ll == rl && ls == rs case let (.unknown(lType, lt), .unknown(rType, rt)): return lType == rType && lt == rt default: return false } @@ -4720,7 +4725,8 @@ extension MsgContent: Decodable { case "chat": let text = try container.decode(String.self, forKey: CodingKeys.text) let chatLink = try container.decode(MsgChatLink.self, forKey: CodingKeys.chatLink) - self = .chat(text: text, chatLink: chatLink) + let ownerSig = try container.decodeIfPresent(LinkOwnerSig.self, forKey: CodingKeys.ownerSig) + self = .chat(text: text, chatLink: chatLink, ownerSig: ownerSig) default: let text = try? container.decode(String.self, forKey: CodingKeys.text) self = .unknown(type: type, text: text ?? "unknown message format") @@ -4762,10 +4768,11 @@ extension MsgContent: Encodable { try container.encode("report", forKey: .type) try container.encode(text, forKey: .text) try container.encode(reason, forKey: .reason) - case let .chat(text, chatLink): + case let .chat(text, chatLink, ownerSig): try container.encode("chat", forKey: .type) try container.encode(text, forKey: .text) try container.encode(chatLink, forKey: .chatLink) + try container.encodeIfPresent(ownerSig, forKey: .ownerSig) // TODO use original JSON and type case let .unknown(_, text): try container.encode("text", forKey: .type) @@ -4821,10 +4828,163 @@ public enum MsgContentTag: Codable, Hashable { } } -public enum MsgChatLink: Codable, Equatable, Hashable { +public enum MsgChatLink: Equatable, Hashable { case contact(connLink: String, profile: Profile, business: Bool) case invitation(invLink: String, profile: Profile) case group(connLink: String, groupProfile: GroupProfile) + + public var isPublicGroup: Bool { + if case let .group(_, gp) = self { gp.publicGroup != nil } else { false } + } + + public var connLinkStr: String { + switch self { + case let .group(connLink, _): connLink + case let .contact(connLink, _, _): connLink + case let .invitation(invLink, _): invLink + } + } + + public var image: String? { + switch self { + case let .group(_, groupProfile): groupProfile.image + case let .contact(_, profile, _): profile.image + case let .invitation(_, profile): profile.image + } + } + + public var displayName: String { + switch self { + case let .group(_, groupProfile): groupProfile.displayName + case let .contact(_, profile, _): profile.displayName + case let .invitation(_, profile): profile.displayName + } + } + + public var iconName: String { + switch self { + case let .group(_, groupProfile): + switch groupProfile.publicGroup?.groupType { + case .channel: "antenna.radiowaves.left.and.right.circle.fill" + case .unknown, .none: "person.2.circle.fill" + } + case let .contact(_, _, business): + business ? "briefcase.circle.fill" : "person.crop.circle.fill" + case .invitation: + "person.crop.circle.fill" + } + } + + public var smallIconName: String { + switch self { + case let .group(_, groupProfile): + switch groupProfile.publicGroup?.groupType { + case .channel: "antenna.radiowaves.left.and.right" + case .unknown, .none: "person.2" + } + case let .contact(_, _, business): + business ? "briefcase" : "person" + case .invitation: + "person" + } + } + + public var fullName: String { + switch self { + case let .group(_, groupProfile): groupProfile.fullName + case let .contact(_, profile, _): profile.fullName + case let .invitation(_, profile): profile.fullName + } + } + + public var shortDescription: String? { + let s: String? = switch self { + case let .group(_, groupProfile): groupProfile.shortDescr + case let .contact(_, profile, _): profile.shortDescr + case let .invitation(_, profile): profile.shortDescr + } + if let d = s?.trimmingCharacters(in: .whitespacesAndNewlines), !d.isEmpty { return d } + return nil + } + + public func infoLine(signed: Bool) -> String { + var s: String = switch self { + case let .group(_, groupProfile): + switch groupProfile.publicGroup?.groupType { + case .channel: NSLocalizedString("Channel link", comment: "chat link info line") + case .unknown, .none: NSLocalizedString("Group link", comment: "chat link info line") + } + case let .contact(_, _, business): + business + ? NSLocalizedString("Business address", comment: "chat link info line") + : NSLocalizedString("Contact address", comment: "chat link info line") + case .invitation: + NSLocalizedString("One-time link", comment: "chat link info line") + } + if signed { + s += " " + ( + self.isPublicGroup + ? NSLocalizedString("(from owner)", comment: "chat link info line") + : NSLocalizedString("(signed)", comment: "chat link info line") + ) + } + return s + } +} + +extension MsgChatLink: Decodable { + private enum CodingKeys: String, CodingKey { + case type, connLink, invLink, profile, business, groupProfile + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + let type = try container.decode(String.self, forKey: .type) + switch type { + case "contact": + let connLink = try container.decode(String.self, forKey: .connLink) + let profile = try container.decode(Profile.self, forKey: .profile) + let business = try container.decode(Bool.self, forKey: .business) + self = .contact(connLink: connLink, profile: profile, business: business) + case "invitation": + let invLink = try container.decode(String.self, forKey: .invLink) + let profile = try container.decode(Profile.self, forKey: .profile) + self = .invitation(invLink: invLink, profile: profile) + case "group": + let connLink = try container.decode(String.self, forKey: .connLink) + let groupProfile = try container.decode(GroupProfile.self, forKey: .groupProfile) + self = .group(connLink: connLink, groupProfile: groupProfile) + default: + throw DecodingError.dataCorruptedError(forKey: .type, in: container, debugDescription: "Unknown MsgChatLink type: \(type)") + } + } +} + +extension MsgChatLink: Encodable { + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case let .contact(connLink, profile, business): + try container.encode("contact", forKey: .type) + try container.encode(connLink, forKey: .connLink) + try container.encode(profile, forKey: .profile) + try container.encode(business, forKey: .business) + case let .invitation(invLink, profile): + try container.encode("invitation", forKey: .type) + try container.encode(invLink, forKey: .invLink) + try container.encode(profile, forKey: .profile) + case let .group(connLink, groupProfile): + try container.encode("group", forKey: .type) + try container.encode(connLink, forKey: .connLink) + try container.encode(groupProfile, forKey: .groupProfile) + } + } +} + +public struct LinkOwnerSig: Codable, Equatable, Hashable { + public var ownerId: String? + public var chatBinding: String + public var ownerSig: String } public struct FormattedText: Decodable, Hashable { diff --git a/plans/2026-04-16-ios-share-channel-link.md b/plans/2026-04-16-ios-share-channel-link.md new file mode 100644 index 0000000000..414016c9c4 --- /dev/null +++ b/plans/2026-04-16-ios-share-channel-link.md @@ -0,0 +1,407 @@ +# iOS — Share chat card (MCChat) + +Share a public group/channel link as a card in any chat. Backend (`APIShareChatMsgContent`, `SharePublicGroup`) exists. This plan covers: send-side UI (picker, compose, send), receive-side UI (card rendering, tap-to-connect with owner verification), and the plumbing between. + +--- + +## 0. UX flow + +1. Channel info screen (`GroupChatInfoView`): two entry points. + - **Quick-access action button** row (next to search/mute): "share" button — visible when `groupInfo.useRelays` and channel has a public link. Non-owners see it too. + - **Section button**: "Share via chat" inside the existing channel-link section (after existing system "Share link" button). +2. Tap either → **destination picker sheet** (reused from `ChatItemForwardingView` by parameterization, NOT a new view). +3. Tap a destination → sheet dismisses, navigates to the destination chat, compose shows **plaque** above input: "Sharing #channelName" (reused `ContextItemView` by parameterization, NOT a new view). +4. User may type optional text. Tap Send. +5. Backend builds MCChat: `text = \n` (link appended for old clients), signed with owner key if applicable. Sent as one message. +6. **Receive side**: card renders as a group-invitation-style tile (reused from `CIGroupInvitationView` by extracting shared component, NOT copy-pasted). Shows profile image + channel name + icon per link type + "from channel owner" if `ownerSig` present. Tap → `planAndConnect` flow with `linkOwnerSig` → alert shows owner verification result alongside standard plan info. + +--- + +## B. Implementation, file by file + +### 1. `SimpleXChat/ChatTypes.swift` — `LinkOwnerSig`, `OwnerVerification`, `MsgContent.chat` update + +**LinkOwnerSig** (new struct, near `MsgChatLink` ~line 4790): +```swift +public struct LinkOwnerSig: Codable, Equatable, Hashable { + public let ownerId: String? + public let chatBinding: String + public let ownerSig: String +} +``` + +**OwnerVerification** (new enum, near `GroupLinkPlan` in AppAPITypes.swift ~line 1379): +```swift +enum OwnerVerification: Decodable, Hashable { + case verified + case failed(reason: String) +} +``` + +**MsgContent.chat** — add `ownerSig` field: +- Case: `case chat(text: String, chatLink: MsgChatLink, ownerSig: LinkOwnerSig?)` +- CodingKeys: add `case ownerSig` +- Decoder (4719-4722): add `let ownerSig = try container.decodeIfPresent(LinkOwnerSig.self, forKey: .ownerSig)` +- Encoder (4764-4767): add `try container.encodeIfPresent(ownerSig, forKey: .ownerSig)` +- text getter (4605): `case let .chat(text, _, _)` +- `==` (4679): `case let (.chat(lt, ll, ls), .chat(rt, rl, rs)): return lt == rt && ll == rl && ls == rs` +- ComposeView.swift:1480: `case let .chat(_, chatLink, ownerSig): return .chat(text: msgText, chatLink: chatLink, ownerSig: ownerSig)` + +### 2. `Shared/Model/AppAPITypes.swift` — `SendRef`, plan types, command, response + +**SendRef** (new enum, near `ref()` helper ~line 580): +```swift +enum SendRef { + case direct(contactId: Int64) + case group(groupId: Int64, scope: GroupChatScope?, asGroup: Bool) +} + +func sendRef(_ r: SendRef) -> String { + switch r { + case let .direct(contactId): "@\(contactId)" + case let .group(groupId, scope, asGroup): + "#\(groupId)\(scopeRef(scope))\(asGroup ? "(as_group=on)" : "")" + } +} +``` + +**Plan types — add `ownerVerification`** to `.ok` cases: +- `InvitationLinkPlan.ok` (1352): `case ok(contactSLinkData_: ContactShortLinkData?, ownerVerification: OwnerVerification?)` +- `ContactAddressPlan.ok` (1359): `case ok(contactSLinkData_: ContactShortLinkData?, ownerVerification: OwnerVerification?)` +- `GroupLinkPlan.ok` (1374): `case ok(groupSLinkInfo_: GroupShortLinkInfo?, groupSLinkData_: GroupShortLinkData?, ownerVerification: OwnerVerification?)` + +**ChatCommand** — new case after `apiForwardChatItems` (line 64): +```swift +case apiShareChatMsgContent(shareChatType: ChatType, shareChatId: Int64, toSendRef: SendRef) +``` +cmdString: `"/_share chat content \(ref(shareChatType, shareChatId, scope: nil)) \(sendRef(toSendRef))"` + +**APIConnectPlan** — extend with `linkOwnerSig`: +- Current (line ~150ish): `case apiConnectPlan(userId: Int64, connLink: String?)` +- Change to: `case apiConnectPlan(userId: Int64, connLink: String?, linkOwnerSig: LinkOwnerSig?)` +- cmdString: append `linkOwnerSig.map { " sig=" + encodeJSON($0) } ?? ""` (matches Haskell parser `optional (" sig=" *> jsonP)`) + +**ChatResponse1** — new case after `newChatItems` (823): +```swift +case chatMsgContent(user: UserRef, msgContent: MsgContent) +``` +Plus `responseType` + `details` entries. + +### 3. `Shared/Model/SimpleXAPI.swift` — wrappers + +**apiShareChatMsgContent** (near apiForwardChatItems, line 506): +```swift +func apiShareChatMsgContent(shareChatType: ChatType, shareChatId: Int64, toSendRef: SendRef) async throws -> MsgContent { + let r: APIResult = await chatApiSendCmd( + .apiShareChatMsgContent(shareChatType: shareChatType, shareChatId: shareChatId, toSendRef: toSendRef) + ) + if case let .result(.chatMsgContent(_, mc)) = r { return mc } + throw r.unexpected +} +``` + +**apiConnectPlan** (line 1023-1032): add `linkOwnerSig: LinkOwnerSig? = nil` parameter, pass to `.apiConnectPlan(userId:connLink:linkOwnerSig:)`. + +### 4. `SimpleXChat/ChatUtils.swift` — NO new filter function + +Reuse `filterChatsToForwardTo` + `canForwardToChat` as-is. Chat cards ARE simplex links, so `prohibitedByPref(hasSimplexLink: true, ...)` applies and correctly gates by the destination's simplex-links preference + user's role. No separate filter. + +### 5. `ChatItemForwardingView.swift` — parameterize for dual use + +Add parameters to support both forwarding and sharing modes. **No new view file.** + +Add to the struct: +```swift +var title: String = "Forward" +var chats: [Chat] // caller provides filtered list (replaces internal filterChatsToForwardTo) +var isProhibited: ((Chat) -> Bool)? = nil // default: existing prohibitedByPref check; sharing overrides +var onSelect: (Chat) -> Void // replaces the inline tap handler +``` + +Remove `chatItems`, `fromChatInfo`, and `composeState` — the `onSelect` closure captures whatever the caller needs. The caller builds `ComposeState` and does navigation externally. + +Existing forwarding call site (`ChatView.swift:278`) adapts: +```swift +ChatItemForwardingView( + title: "Forward", + chats: filterChatsToForwardTo(chats: chatModel.chats), + isProhibited: { chat in forwardedChatItems.map { ci in chat.prohibitedByPref(...) }.contains(true) }, + onSelect: { chat in + dismiss forwarding sheet + set composeState to forwarding context + if different chat: loadOpenChat(chat.id) + } +) +``` + +Sharing call site (from GroupChatInfoView): +```swift +ChatItemForwardingView( + title: "Share channel", + chats: filterChatsToForwardTo(chats: chatModel.chats), // same filter + isProhibited: { chat in chat.prohibitedByPref(hasSimplexLink: true, isMediaOrFileAttachment: false, isVoice: false) }, + onSelect: { chat in + dismiss info sheet + set composeState to .sharingChatCard(sourceGroupInfo) + if different chat: loadOpenChat(chat.id) + } +) +``` + +### 6. `ContextItemView.swift` — parameterize for chat-card context + +Add an optional `customText: String?` property. When set, render that text instead of the ChatItem preview. Everything else (icon, cancel button, background, layout) stays the same. + +```swift +var customText: String? = nil // e.g., "Sharing #news" +``` + +When `customText != nil`: +- Display the string in place of the `msgContentView` / multi-message count +- Use `Color(uiColor: .tertiarySystemBackground)` for background (no ChatItem to derive color from) + +ComposeView's `contextItemView()` dispatch for the new case: +```swift +case let .sharingChatCard(sourceGroupInfo): + ContextItemView( + chat: chat, + contextItems: [], + contextIcon: "arrowshape.turn.up.forward", + cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }, + customText: "Sharing #\(sourceGroupInfo.groupProfile.displayName)" + ) + Divider() +``` + +### 7. `ComposeView.swift` — new context case + send dispatch + +**New `ComposeContextItem` case** (line 20-26): +```swift +case sharingChatCard(sourceGroupInfo: GroupInfo) +``` +Name is `sharingChatCard` (not channel-specific — MCChat is general). + +**Convenience init** (after `forwardingItems` init at 90-96): +```swift +init(sharingChatCard sourceGroupInfo: GroupInfo) { + self.message = "" + self.parsedMessage = [] + self.preview = .noPreview + self.contextItem = .sharingChatCard(sourceGroupInfo: sourceGroupInfo) + self.voiceMessageRecordingState = .noRecording +} +``` + +**Accessor** (after `forwarding` at 146-150): +```swift +var sharingChatCard: Bool { + switch contextItem { + case .sharingChatCard: return true + default: return false + } +} +``` + +**sendEnabled** (176): add `|| sharingChatCard`. + +**Draft-restore guard** (`ChatView.swift:758`): extend `!composeState.forwarding` to `!composeState.forwarding && !composeState.sharingChatCard`. + +**Send dispatch** in `sendMessageAsync` (before forwarding branch at 1354): +```swift +if case let .sharingChatCard(sourceGroupInfo) = composeState.contextItem { + sent = await shareChatCard(sourceGroupInfo, ttl) +} else if case let .forwardingItems(...) = ... { +``` + +**Helper** inside the same scope: +```swift +func shareChatCard(_ sourceGroupInfo: GroupInfo, _ ttl: Int?) async -> ChatItem? { + let toSendRef: SendRef + switch chat.chatInfo { + case let .direct(contact): + toSendRef = .direct(contactId: contact.contactId) + case let .group(gInfo, scope): + toSendRef = .group(groupId: gInfo.groupId, scope: scope, asGroup: gInfo.useRelays) + default: + return nil + } + do { + var mc = try await apiShareChatMsgContent( + shareChatType: .group, shareChatId: sourceGroupInfo.groupId, toSendRef: toSendRef + ) + // Append user-typed text: backend returns MCChat with text=link; prepend user message if present + if !composeState.message.isEmpty, case let .chat(text, chatLink, ownerSig) = mc { + mc = .chat(text: composeState.message + "\n" + text, chatLink: chatLink, ownerSig: ownerSig) + } + return await send(mc, quoted: nil, live: false, ttl: ttl, mentions: [:]) + } catch { + logger.error("shareChatCard failed: \(error.localizedDescription)") + return nil + } +} +``` + +**Post-send draft-restore** (1411-1417): mirror `wasForwarding` with `wasSharing`. + +### 8. `GroupChatInfoView.swift` — two entry points + composeState plumbing + +**Add to struct**: `@Binding var composeState: ComposeState` and `@State private var showSharePicker = false`. + +**Quick-access button** — in `infoActionButtons()` (line 354-370), add after `channelLinkActionButton` / `addMembersActionButton` branch: +```swift +if groupInfo.useRelays && groupInfo.groupProfile.publicGroup?.groupLink != nil { + InfoViewButton(image: "arrowshape.turn.up.forward", title: "share", width: buttonWidth) { + showSharePicker = true + } + .disabled(!groupInfo.ready) +} +``` +Adjust the `buttonWidth` divisor accordingly (4 → 5 if all four buttons can show). + +**Section button** — in `if groupInfo.useRelays` Section (line 104-125), after existing "Share link" button (115): +```swift +Button { + showSharePicker = true +} label: { + Label("Share via chat", systemImage: "arrowshape.turn.up.forward") +} +``` + +**Sheet** — on the body: +```swift +.sheet(isPresented: $showSharePicker) { + let shareChats = filterChatsToForwardTo(chats: ChatModel.shared.chats) + if #available(iOS 16.0, *) { + ChatItemForwardingView( + title: "Share channel", + chats: shareChats, + isProhibited: { $0.prohibitedByPref(hasSimplexLink: true, isMediaOrFileAttachment: false, isVoice: false) }, + onSelect: { chat in selectShareDestination(chat) } + ).presentationDetents([.fraction(0.8)]) + } else { + ChatItemForwardingView( + title: "Share channel", + chats: shareChats, + isProhibited: { $0.prohibitedByPref(hasSimplexLink: true, isMediaOrFileAttachment: false, isVoice: false) }, + onSelect: { chat in selectShareDestination(chat) } + ) + } +} +``` + +**selectShareDestination helper** in the same struct: +```swift +private func selectShareDestination(_ chat: Chat) { + showSharePicker = false + composeState = ComposeState(sharingChatCard: groupInfo) + if chat.id != ChatModel.shared.chatId { + ItemsModel.shared.loadOpenChat(chat.id) + } + dismiss() // dismiss info sheet too +} +``` + +**ChatView.swift:505-517**: pass `composeState: $composeState` to `GroupChatInfoView`. + +### 9. View rendering — `MsgContent.chat` text handling + +**On send**: text = `\n`. Link is the `strEncode groupLink` that the backend includes. If user typed nothing, text = just the link. + +**On display**: when rendering an `MCChat` message, strip the last line from `text` if it equals `chatLink`'s encoded link. This way: +- Old clients (no MCChat support) see text as-is: "hello\nhttps://simplex.chat/g#..." — usable. +- New clients (MCChat support) see "hello" + the rendered card — no redundant link. + +Implement in the card view's text rendering (§10 below). The stripping logic: +```swift +func chatCardText(_ text: String, _ chatLink: MsgChatLink) -> String { + let link = chatLinkStr(chatLink) + if text.hasSuffix("\n" + link) { + return String(text.dropLast(link.count + 1)) + } + return text +} +``` +Where `chatLinkStr` extracts the encoded link from the `MsgChatLink` variant. + +### 10. Card rendering — shared component from `CIGroupInvitationView` + +Extract a reusable **`CICardView`** from `CIGroupInvitationView`. This is a shared component that both views use (not a copy-paste). + +**`CICardView`** (new file `Shared/Views/Chat/ChatItem/CICardView.swift`): +Provides the outer frame: background with chat-tail padding, ZStack with bottomTrailing meta, VStack with: +- Header slot (profile image + name) +- Divider +- Body slot (action text, subtitle) + +Parameterized by: +```swift +struct CICardView: View { + @ObservedObject var chat: Chat + var chatItem: ChatItem + var header: Header + var body_: Body // avoid collision with View.body + var onTap: (() -> Void)? +} +``` + +**`CIGroupInvitationView`** refactored to use `CICardView`: +- Passes `groupInfoView(action)` as header +- Passes invitation text + "Tap to join" as body +- Passes `joinGroup(groupId)` as onTap +- All existing behaviour preserved (status checks, progress indicator, incognito) + +**`CIChatLinkView`** (new file, uses `CICardView`): +- Header: `ProfileImage` from `groupProfile.image` / `profile.image` + display name. Icon = same as chat list (no need to invent): + - `.group` channel (`publicGroup?.groupType == .channel`): `antenna.radiowaves.left.and.right.circle.fill` (from `GroupInfo.chatIconName` when `useRelays`) + - `.group` non-channel: `person.2.circle.fill` (from `GroupInfo.chatIconName` default) + - `.group` business: `briefcase.circle.fill` (from `GroupInfo.chatIconName` business case) + - `.contact` non-bot: `person.crop.circle.fill` (from `Contact.chatIconName`) + - `.contact` business address: `briefcase.circle.fill` + - `.invitation`: `person.crop.circle.fill` +- Body: stripped text (via `chatCardText`) + subtitle line: + - If `ownerSig != nil`: "signed" (secondary color) — same as CLI, it's a claim, verification happens on tap + - Action line: "Tap to open" (primary color) +- onTap (both sent and received): calls `planAndConnect(connLink, linkOwnerSig: ownerSig, ...)` — full connect flow with owner verification + +**Wire-in** at `ChatItemView.swift:73-90`, before the `isShortEmoji` check: +```swift +if case let .chat(_, chatLink, _) = ci.content.msgContent { + CIChatLinkView(chat: chat, chatItem: ci, chatLink: chatLink) +} else if let mc = ... { +``` + +### 11. Connect flow — owner verification in alerts + +**`planAndConnect`** (`NewChatView.swift:1218`): add optional `linkOwnerSig: LinkOwnerSig? = nil` parameter. Pass to `apiConnectPlan(connLink:linkOwnerSig:)`. + +**Alert text** — in the `.ok` branches of `planAndConnect` where the alert is built (lines 1255-1410), extend the alert body with owner verification info: +- `case .verified`: append "Channel owner signature verified." to alert message. +- `case .failed(let reason)`: append "Owner signature verification failed: \(reason)." to alert message. Consider making this a warning-styled alert. +- `nil` (no sig): no additional text. + +This surfaces in the standard connect-confirmation alert before the user taps "Connect" / "Join". + +### 12. Haskell — strip ownerSig on forward + +When a received MCChat message is forwarded (the existing forward-items path in `Library/Commands.hs`), the `dropSig` function already strips `ownerSig` for cross-chat forwarding (binding mismatch). The existing code at `Commands.hs:1000-1006` handles this. **No additional Haskell work for v1.** + +Card forwarding (subscriber shares the card further) naturally produces an unsigned card — the subscriber doesn't have the owner's key. This is correct. + +--- + +## C. Decisions — all resolved + +1. **Icon for "share" button**: `arrowshape.turn.up.forward` — easy to change later. +2. **Text stripping**: strip only the last line if it exactly matches the encoded link. User doesn't control the last line (backend appends it). If user also types the link, the typed copy remains — no special handling needed. +3. **"signed" label on card**: shown unconditionally when `ownerSig != nil`. It's a claim (same as CLI "signed"); verification happens on tap via `planAndConnect`. +4. **Card tap for sent items**: yes, same `planAndConnect` flow for both sent and received. +5. **Icons**: reuse existing `chatIconName` icons from chat list — `antenna.radiowaves.left.and.right.circle.fill` (channel), `person.2.circle.fill` (group), `briefcase.circle.fill` (business), `person.crop.circle.fill` (contact/invitation). Contact address sharing accounts for business address. + +--- + +## D. Items to lock during coding (not user decisions) + +- Exact `chatApiSendCmd` decode shape vs `chatSendCmd` / `processSendMessageCmd` for `apiShareChatMsgContent` response. +- `CICardView` exact slot API: whether to use `@ViewBuilder` closures or generic type params — decide during extraction from `CIGroupInvitationView` based on what minimises the diff. +- `planAndConnect` alert builder structure — may need a helper to format the owner-verification line, to be added inline during the `.ok` branch modifications. +- `chatLinkStr` extraction — how to get the encoded link string from `MsgChatLink` for text-stripping. Likely just `strEncode` equivalent on the `connLink` / `invLink` / `groupLink` field. diff --git a/scripts/nix/sha256map.nix b/scripts/nix/sha256map.nix index 6449ac8900..82bea05f89 100644 --- a/scripts/nix/sha256map.nix +++ b/scripts/nix/sha256map.nix @@ -1,5 +1,5 @@ { - "https://github.com/simplex-chat/simplexmq.git"."bc5ea42bec3a63e46b191e4150dd79957f114e01" = "0lswj7crfnwzh4g28kgxxl7g4i2a9pn03pxj7sqfqy3vs83m3bax"; + "https://github.com/simplex-chat/simplexmq.git"."95b17ada2795e1c5c84bbe2a50a0752ee66d0aad" = "0n10vjsslay4lkhripjwgyiclsx714prwcblmnf1vgwgc97md14s"; "https://github.com/simplex-chat/hs-socks.git"."a30cc7a79a08d8108316094f8f2f82a0c5e1ac51" = "0yasvnr7g91k76mjkamvzab2kvlb1g5pspjyjn2fr6v83swjhj38"; "https://github.com/simplex-chat/direct-sqlcipher.git"."f814ee68b16a9447fbb467ccc8f29bdd3546bfd9" = "1ql13f4kfwkbaq7nygkxgw84213i0zm7c1a8hwvramayxl38dq5d"; "https://github.com/simplex-chat/sqlcipher-simple.git"."a46bd361a19376c5211f1058908fc0ae6bf42446" = "1z0r78d8f0812kxbgsm735qf6xx8lvaz27k1a0b4a2m0sshpd5gl"; From a2fa2be87e1fde3717fbdbe64721ffef1faf7917 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 19 Apr 2026 11:26:54 +0100 Subject: [PATCH 039/152] android, desktop: sharing channel links (#6828) * android, desktop: sharing channel links - types, api, strings * implementation * fix build * improve layout * improve card layouts * better divider * preview image * icon, preview * better icons * bigger icon * darker icons * better icon colors * better layouts * compose preview for chat links * sizes * fix editing --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../Chat/ChatItem/CIChatLinkHeader.swift | 1 + .../ComposeMessage/ComposeChatLinkView.swift | 3 +- .../Chat/ComposeMessage/ComposeView.swift | 10 +- .../chat/simplex/common/model/ChatModel.kt | 91 ++- .../chat/simplex/common/model/SimpleXAPI.kt | 38 +- .../chat/simplex/common/ui/theme/Color.kt | 4 +- .../simplex/common/views/chat/ChatView.kt | 2 +- .../common/views/chat/ComposeChatLinkView.kt | 53 ++ .../simplex/common/views/chat/ComposeView.kt | 45 +- .../common/views/chat/ContextItemView.kt | 19 +- .../views/chat/group/GroupChatInfoView.kt | 16 +- .../common/views/chat/group/GroupLinkView.kt | 88 +-- .../views/chat/group/GroupProfileView.kt | 2 +- .../views/chat/item/CIChatLinkHeader.kt | 79 +++ .../common/views/chat/item/CIFileView.kt | 3 +- .../views/chat/item/CIGroupInvitationView.kt | 25 +- .../common/views/chat/item/FramedItemView.kt | 45 +- .../common/views/chat/item/TextItemView.kt | 20 + .../common/views/chatlist/ChatPreviewView.kt | 34 +- .../common/views/chatlist/ShareListView.kt | 8 +- .../common/views/helpers/AlertManager.kt | 11 + .../simplex/common/views/helpers/Enums.kt | 1 + .../common/views/newchat/AddChannelView.kt | 2 +- .../common/views/newchat/ConnectPlan.kt | 30 +- .../commonMain/resources/MR/base/strings.xml | 13 + .../ic_bigtop_updates_circle_filled.svg | 1 + .../MR/images/ic_bigtop_updates_padded.svg | 8 - plans/2026-04-17-kotlin-share-channel-link.md | 561 ++++++++++++++++++ 28 files changed, 1105 insertions(+), 108 deletions(-) create mode 100644 apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeChatLinkView.kt create mode 100644 apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIChatLinkHeader.kt create mode 100644 apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_circle_filled.svg delete mode 100644 apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_padded.svg create mode 100644 plans/2026-04-17-kotlin-share-channel-link.md diff --git a/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift b/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift index d26506e871..aaaa29929d 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/CIChatLinkHeader.swift @@ -18,6 +18,7 @@ struct CIChatLinkHeader: View { .padding(.top, 8) .padding(.bottom, 6) .overlay(DetermineWidth()) + Divider() VStack(alignment: .leading, spacing: 2) { if let descr = chatLink.shortDescription { Text(descr) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift index d82029df0e..650ea8a87f 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeChatLinkView.swift @@ -34,10 +34,9 @@ struct ComposeChatLinkView: View { } } } - .padding(.vertical, 1) + .padding(.vertical, 8) .padding(.trailing, 12) .background(theme.appColors.sentMessage) - .frame(minHeight: 54) .frame(maxWidth: .infinity) } } diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 656a222cd0..29daaf37fa 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -74,7 +74,11 @@ struct ComposeState { } init(editingItem: ChatItem) { - let text = editingItem.content.text + let text = if case let .chat(t, chatLink, _) = editingItem.content.msgContent { + stripTextLink(t, chatLink.connLinkStr) + } else { + editingItem.content.text + } self.message = text self.parsedMessage = editingItem.formattedText ?? FormattedText.plain(text) self.preview = chatItemPreview(chatItem: editingItem) @@ -1577,9 +1581,9 @@ struct ComposeView: View { return .file(msgText) case .report(_, let reason): return .report(text: msgText, reason: reason) - // TODO [short links] update chat link case let .chat(_, chatLink, ownerSig): - return .chat(text: msgText, chatLink: chatLink, ownerSig: ownerSig) + let text = msgText.isEmpty ? chatLink.connLinkStr : msgText + "\n" + chatLink.connLinkStr + return .chat(text: text, chatLink: chatLink, ownerSig: ownerSig) case .unknown(let type, _): return .unknown(type: type, text: msgText) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 7078c4c404..591dde89cd 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -2113,7 +2113,7 @@ data class GroupInfo ( val chatIconName: ImageResource get() = if (useRelays) { - MR.images.ic_bigtop_updates_padded + MR.images.ic_bigtop_updates_circle_filled } else when (businessChat?.chatType) { null -> MR.images.ic_supervised_user_circle_filled BusinessChatType.Business -> MR.images.ic_work_filled_padded @@ -4307,7 +4307,7 @@ sealed class MsgContent { @Serializable(with = MsgContentSerializer::class) class MCVoice(override val text: String, val duration: Int): MsgContent() @Serializable(with = MsgContentSerializer::class) class MCFile(override val text: String): MsgContent() @Serializable(with = MsgContentSerializer::class) class MCReport(override val text: String, val reason: ReportReason): MsgContent() - @Serializable(with = MsgContentSerializer::class) class MCChat(override val text: String, val chatLink: MsgChatLink): MsgContent() + @Serializable(with = MsgContentSerializer::class) class MCChat(override val text: String, val chatLink: MsgChatLink, val ownerSig: LinkOwnerSig? = null): MsgContent() @Serializable(with = MsgContentSerializer::class) class MCUnknown(val type: String? = null, override val text: String, val json: JsonElement): MsgContent() val isVoice: Boolean get() = @@ -4428,7 +4428,8 @@ object MsgContentSerializer : KSerializer { } "chat" -> { val chatLink = decoder.json.decodeFromString(json["chatLink"].toString()) - MsgContent.MCChat(text, chatLink) + val ownerSig = json["ownerSig"]?.let { decoder.json.decodeFromJsonElement(it) } + MsgContent.MCChat(text, chatLink, ownerSig) } else -> MsgContent.MCUnknown(t, text, json) } @@ -4489,6 +4490,7 @@ object MsgContentSerializer : KSerializer { put("type", "chat") put("text", value.text) put("chatLink", json.encodeToJsonElement(value.chatLink)) + value.ownerSig?.let { put("ownerSig", json.encodeToJsonElement(it)) } } is MsgContent.MCUnknown -> value.json } @@ -4548,8 +4550,91 @@ sealed class MsgChatLink { @Serializable @SerialName("contact") data class Contact(val connLink: String, val profile: Profile, val business: Boolean) : MsgChatLink() @Serializable @SerialName("invitation") data class Invitation(val invLink: String, val profile: Profile) : MsgChatLink() @Serializable @SerialName("group") data class Group(val connLink: String, val groupProfile: GroupProfile) : MsgChatLink() + + val isPublicGroup: Boolean + get() = (this as? Group)?.groupProfile?.publicGroup != null + + val connLinkStr: String + get() = when (this) { + is Group -> connLink + is Contact -> connLink + is Invitation -> invLink + } + + val image: String? + get() = when (this) { + is Group -> groupProfile.image + is Contact -> profile.image + is Invitation -> profile.image + } + + val displayName: String + get() = when (this) { + is Group -> groupProfile.displayName + is Contact -> profile.displayName + is Invitation -> profile.displayName + } + + val fullName: String + get() = when (this) { + is Group -> groupProfile.fullName + is Contact -> profile.fullName + is Invitation -> profile.fullName + } + + val shortDescription: String? + get() { + val s = when (this) { + is Group -> groupProfile.shortDescr + is Contact -> profile.shortDescr + is Invitation -> profile.shortDescr + } + return s?.trim()?.ifEmpty { null } + } + + val iconRes: ImageResource + get() = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> MR.images.ic_bigtop_updates_circle_filled + else -> MR.images.ic_supervised_user_circle_filled + } + is Contact -> if (business) MR.images.ic_work_filled_padded else MR.images.ic_account_circle_filled + is Invitation -> MR.images.ic_account_circle_filled + } + + val smallIconRes: ImageResource + get() = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> MR.images.ic_bigtop_updates + else -> MR.images.ic_group + } + is Contact -> if (business) MR.images.ic_work else MR.images.ic_person + is Invitation -> MR.images.ic_person + } + + fun infoLine(signed: Boolean): String { + var s = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> generalGetString(MR.strings.chat_link_channel) + else -> generalGetString(MR.strings.chat_link_group) + } + is Contact -> if (business) generalGetString(MR.strings.chat_link_business_address) else generalGetString(MR.strings.chat_link_contact_address) + is Invitation -> generalGetString(MR.strings.chat_link_one_time) + } + if (signed) { + s += " " + if (isPublicGroup) generalGetString(MR.strings.chat_link_from_owner) else generalGetString(MR.strings.chat_link_signed) + } + return s + } } +@Serializable +data class LinkOwnerSig( + val ownerId: String? = null, + val chatBinding: String, + val ownerSig: String +) + @Serializable class FormattedText(val text: String, val format: Format? = null) { val linkUri: String? get() = diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index fc4471f395..d4f1fa203d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1135,6 +1135,13 @@ object ChatController { return processSendMessageCmd(rh, cmd)?.map { it.chatItem } } + suspend fun apiShareChatMsgContent(rh: Long?, shareChatType: ChatType, shareChatId: Long, toChatType: ChatType, toChatId: Long, toScope: GroupChatScope?, sendAsGroup: Boolean): MsgContent? { + val r = sendCmd(rh, CC.ApiShareChatMsgContent(shareChatType, shareChatId, toChatType, toChatId, toScope, sendAsGroup)) + if (r is API.Result && r.res is CR.ChatMsgContent) return r.res.msgContent + apiErrorAlert("apiShareChatMsgContent", generalGetString(MR.strings.error_sharing_channel), r) + return null + } + suspend fun apiPlanForwardChatItems(rh: Long?, fromChatType: ChatType, fromChatId: Long, fromScope: GroupChatScope?, chatItemIds: List): CR.ForwardPlan? { val r = sendCmd(rh, CC.ApiPlanForwardChatItems(fromChatType, fromChatId, fromScope, chatItemIds)) if (r is API.Result && r.res is CR.ForwardPlan) return r.res @@ -1485,9 +1492,9 @@ object ChatController { return null } - suspend fun apiConnectPlan(rh: Long?, connLink: String, inProgress: MutableState): Pair? { + suspend fun apiConnectPlan(rh: Long?, connLink: String, linkOwnerSig: LinkOwnerSig? = null, inProgress: MutableState): Pair? { val userId = kotlin.runCatching { currentUserId("apiConnectPlan") }.getOrElse { return null } - val r = sendCmdWithRetry(rh, CC.APIConnectPlan(userId, connLink), inProgress = inProgress) + val r = sendCmdWithRetry(rh, CC.APIConnectPlan(userId, connLink, linkOwnerSig), inProgress = inProgress) if (r is API.Result && r.res is CR.CRConnectionPlan) return r.res.connLink to r.res.connectionPlan if (inProgress.value && r != null) apiConnectResponseAlert(r) return null @@ -3624,6 +3631,7 @@ sealed class CC { class ApiGetReactionMembers(val userId: Long, val groupId: Long, val itemId: Long, val reaction: MsgReaction): CC() class ApiPlanForwardChatItems(val fromChatType: ChatType, val fromChatId: Long, val fromScope: GroupChatScope?, val chatItemIds: List): CC() class ApiForwardChatItems(val toChatType: ChatType, val toChatId: Long, val toScope: GroupChatScope?, val sendAsGroup: Boolean, val fromChatType: ChatType, val fromChatId: Long, val fromScope: GroupChatScope?, val itemIds: List, val ttl: Int?): CC() + class ApiShareChatMsgContent(val shareChatType: ChatType, val shareChatId: Long, val toChatType: ChatType, val toChatId: Long, val toScope: GroupChatScope?, val sendAsGroup: Boolean): CC() class ApiNewGroup(val userId: Long, val incognito: Boolean, val groupProfile: GroupProfile): CC() class ApiNewPublicGroup(val userId: Long, val incognito: Boolean, val relayIds: List, val groupProfile: GroupProfile): CC() class ApiGetGroupRelays(val groupId: Long): CC() @@ -3683,7 +3691,7 @@ sealed class CC { class APIAddContact(val userId: Long, val incognito: Boolean): CC() class ApiSetConnectionIncognito(val connId: Long, val incognito: Boolean): CC() class ApiChangeConnectionUser(val connId: Long, val userId: Long): CC() - class APIConnectPlan(val userId: Long, val connLink: String): CC() + class APIConnectPlan(val userId: Long, val connLink: String, val linkOwnerSig: LinkOwnerSig? = null): CC() class APIPrepareContact(val userId: Long, val connLink: CreatedConnLink, val contactShortLinkData: ContactShortLinkData): CC() class APIPrepareGroup(val userId: Long, val connLink: CreatedConnLink, val directLink: Boolean, val groupShortLinkData: GroupShortLinkData): CC() class APIChangePreparedContactUser(val contactId: Long, val newUserId: Long): CC() @@ -3822,6 +3830,9 @@ sealed class CC { val ttlStr = if (ttl != null) "$ttl" else "default" "/_forward ${chatRef(toChatType, toChatId, toScope)}${if (sendAsGroup) " as_group=on" else ""} ${chatRef(fromChatType, fromChatId, fromScope)} ${itemIds.joinToString(",")} ttl=${ttlStr}" } + is ApiShareChatMsgContent -> { + "/_share chat content ${chatRef(shareChatType, shareChatId, null)} ${chatRef(toChatType, toChatId, toScope)}${if (sendAsGroup) "(as_group=on)" else ""}" + } is ApiPlanForwardChatItems -> { "/_forward plan ${chatRef(fromChatType, fromChatId, fromScope)} ${chatItemIds.joinToString(",")}" } @@ -3884,7 +3895,10 @@ sealed class CC { is APIAddContact -> "/_connect $userId incognito=${onOff(incognito)}" is ApiSetConnectionIncognito -> "/_set incognito :$connId ${onOff(incognito)}" is ApiChangeConnectionUser -> "/_set conn user :$connId $userId" - is APIConnectPlan -> "/_connect plan $userId $connLink" + is APIConnectPlan -> { + val sigStr = if (linkOwnerSig != null) " sig=${json.encodeToString(linkOwnerSig)}" else "" + "/_connect plan $userId $connLink$sigStr" + } is APIPrepareContact -> "/_prepare contact $userId ${connLink.connFullLink} ${connLink.connShortLink ?: ""} ${json.encodeToString(contactShortLinkData)}" is APIPrepareGroup -> "/_prepare group $userId ${connLink.connFullLink} ${connLink.connShortLink ?: ""} direct=${onOff(directLink)} ${json.encodeToString(groupShortLinkData)}" is APIChangePreparedContactUser -> "/_set contact user @$contactId $newUserId" @@ -4003,6 +4017,7 @@ sealed class CC { is ApiChatItemReaction -> "apiChatItemReaction" is ApiGetReactionMembers -> "apiGetReactionMembers" is ApiForwardChatItems -> "apiForwardChatItems" + is ApiShareChatMsgContent -> "apiShareChatMsgContent" is ApiPlanForwardChatItems -> "apiPlanForwardChatItems" is ApiNewGroup -> "apiNewGroup" is ApiNewPublicGroup -> "apiNewPublicGroup" @@ -6318,6 +6333,7 @@ sealed class CR { @Serializable @SerialName("subscriptionStatus") class SubscriptionStatusEvt(val subscriptionStatus: SubscriptionStatus, val connections: List): CR() @Serializable @SerialName("chatInfoUpdated") class ChatInfoUpdated(val user: UserRef, val chatInfo: ChatInfo): CR() @Serializable @SerialName("newChatItems") class NewChatItems(val user: UserRef, val chatItems: List): CR() + @Serializable @SerialName("chatMsgContent") class ChatMsgContent(val user: UserRef, val msgContent: MsgContent): CR() @Serializable @SerialName("chatItemsStatusesUpdated") class ChatItemsStatusesUpdated(val user: UserRef, val chatItems: List): CR() @Serializable @SerialName("chatItemUpdated") class ChatItemUpdated(val user: UserRef, val chatItem: AChatItem): CR() @Serializable @SerialName("chatItemNotChanged") class ChatItemNotChanged(val user: UserRef, val chatItem: AChatItem): CR() @@ -6506,6 +6522,7 @@ sealed class CR { is SubscriptionStatusEvt -> "subscriptionStatus" is ChatInfoUpdated -> "chatInfoUpdated" is NewChatItems -> "newChatItems" + is ChatMsgContent -> "chatMsgContent" is ChatItemsStatusesUpdated -> "chatItemsStatusesUpdated" is ChatItemUpdated -> "chatItemUpdated" is ChatItemNotChanged -> "chatItemNotChanged" @@ -6686,6 +6703,7 @@ sealed class CR { is SubscriptionStatusEvt -> "subscriptionStatus $subscriptionStatus\nconnections: $connections" is ChatInfoUpdated -> withUser(user, json.encodeToString(chatInfo)) is NewChatItems -> withUser(user, chatItems.joinToString("\n") { json.encodeToString(it) }) + is ChatMsgContent -> withUser(user, msgContent.toString()) is ChatItemsStatusesUpdated -> withUser(user, chatItems.joinToString("\n") { json.encodeToString(it) }) is ChatItemUpdated -> withUser(user, json.encodeToString(chatItem)) is ChatItemNotChanged -> withUser(user, json.encodeToString(chatItem)) @@ -6840,6 +6858,12 @@ fun simplexChatLink(uri: String): String = if (uri.startsWith("simplex:/")) uri.replace("simplex:/", "https://simplex.chat/") else uri +@Serializable +sealed class OwnerVerification { + @Serializable @SerialName("verified") object Verified : OwnerVerification() + @Serializable @SerialName("failed") class Failed(val reason: String) : OwnerVerification() +} + @Serializable sealed class ConnectionPlan { @Serializable @SerialName("invitationLink") class InvitationLink(val invitationLinkPlan: InvitationLinkPlan): ConnectionPlan() @@ -6850,7 +6874,7 @@ sealed class ConnectionPlan { @Serializable sealed class InvitationLinkPlan { - @Serializable @SerialName("ok") class Ok(val contactSLinkData_: ContactShortLinkData? = null): InvitationLinkPlan() + @Serializable @SerialName("ok") class Ok(val contactSLinkData_: ContactShortLinkData? = null, val ownerVerification: OwnerVerification? = null): InvitationLinkPlan() @Serializable @SerialName("ownLink") object OwnLink: InvitationLinkPlan() @Serializable @SerialName("connecting") class Connecting(val contact_: Contact? = null): InvitationLinkPlan() @Serializable @SerialName("known") class Known(val contact: Contact): InvitationLinkPlan() @@ -6858,7 +6882,7 @@ sealed class InvitationLinkPlan { @Serializable sealed class ContactAddressPlan { - @Serializable @SerialName("ok") class Ok(val contactSLinkData_: ContactShortLinkData? = null): ContactAddressPlan() + @Serializable @SerialName("ok") class Ok(val contactSLinkData_: ContactShortLinkData? = null, val ownerVerification: OwnerVerification? = null): ContactAddressPlan() @Serializable @SerialName("ownLink") object OwnLink: ContactAddressPlan() @Serializable @SerialName("connectingConfirmReconnect") object ConnectingConfirmReconnect: ContactAddressPlan() @Serializable @SerialName("connectingProhibit") class ConnectingProhibit(val contact: Contact): ContactAddressPlan() @@ -6868,7 +6892,7 @@ sealed class ContactAddressPlan { @Serializable sealed class GroupLinkPlan { - @Serializable @SerialName("ok") class Ok(val groupSLinkInfo_: GroupShortLinkInfo? = null, val groupSLinkData_: GroupShortLinkData? = null): GroupLinkPlan() + @Serializable @SerialName("ok") class Ok(val groupSLinkInfo_: GroupShortLinkInfo? = null, val groupSLinkData_: GroupShortLinkData? = null, val ownerVerification: OwnerVerification? = null): GroupLinkPlan() @Serializable @SerialName("ownLink") class OwnLink(val groupInfo: GroupInfo): GroupLinkPlan() @Serializable @SerialName("connectingConfirmReconnect") object ConnectingConfirmReconnect: GroupLinkPlan() @Serializable @SerialName("connectingProhibit") class ConnectingProhibit(val groupInfo_: GroupInfo? = null): GroupLinkPlan() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Color.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Color.kt index c50ea5c349..e3c86352d2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Color.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Color.kt @@ -29,8 +29,8 @@ val GroupDark = Color(80, 80, 80, 60) val IncomingCallLight = Color(239, 237, 236, 255) val WarningOrange = Color(255, 127, 0, 255) val WarningYellow = Color(255, 192, 0, 255) -val FileLight = Color(183, 190, 199, 255) -val FileDark = Color(101, 101, 106, 255) +val FileLight = Color(191, 194, 199, 255) +val FileDark = Color(94, 94, 98, 255) val MenuTextColor: Color @Composable get () = if (isInDarkTheme()) LocalContentColor.current.copy(alpha = 0.8f) else Color.Black val NoteFolderIconColor: Color @Composable get() = MaterialTheme.appColors.primaryVariant2 diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index dc5747e69e..40a89dd8a6 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -3204,7 +3204,7 @@ fun openGroupLink(groupInfo: GroupInfo, rhId: Long?, view: Any? = null, close: ( val link = chatModel.controller.apiGetGroupLink(rhId, groupInfo.groupId) close?.invoke() ModalManager.end.showModalCloseable(true) { - GroupLinkView(chatModel, rhId, groupInfo, link, onGroupLinkUpdated = null, isChannel = groupInfo.useRelays) + GroupLinkView(chatModel, rhId, groupInfo, link, onGroupLinkUpdated = null, isChannel = groupInfo.useRelays, shareGroupInfo = groupInfo) } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeChatLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeChatLinkView.kt new file mode 100644 index 0000000000..14edea3ed6 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeChatLinkView.kt @@ -0,0 +1,53 @@ +package chat.simplex.common.views.chat + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.* +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import chat.simplex.common.model.MsgChatLink +import chat.simplex.common.ui.theme.appColors +import chat.simplex.common.views.helpers.ProfileImage +import dev.icerock.moko.resources.compose.painterResource +import chat.simplex.res.MR + +@Composable +fun ComposeChatLinkView( + chatLink: MsgChatLink, + cancelEnabled: Boolean, + cancelPreview: () -> Unit +) { + val sentColor = MaterialTheme.appColors.sentMessage + Row( + Modifier + .fillMaxWidth() + .padding(top = 8.dp) + .background(sentColor) + .padding(start = 8.dp, top = 6.dp, bottom = 6.dp), + verticalAlignment = Alignment.CenterVertically + ) { + ProfileImage(size = 54.dp, image = chatLink.image, icon = chatLink.iconRes) + Column( + Modifier.fillMaxWidth().weight(1f).padding(horizontal = 8.dp) + ) { + Text(chatLink.displayName, maxLines = 1, overflow = TextOverflow.Ellipsis) + chatLink.shortDescription?.let { descr -> + Text( + descr, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.body2, + color = MaterialTheme.colors.secondary, + ) + } + } + if (cancelEnabled) { + IconButton(onClick = cancelPreview) { + Icon(painterResource(MR.images.ic_close), null, tint = MaterialTheme.colors.primary) + } + } + } +} diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index 69990764de..83e76a87ff 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -57,6 +57,7 @@ const val MAX_NUMBER_OF_MENTIONS = 3 sealed class ComposePreview { @Serializable object NoPreview: ComposePreview() @Serializable class CLinkPreview(val linkPreview: LinkPreview?): ComposePreview() + @Serializable class ChatLinkPreview(val chatLink: MsgChatLink, val ownerSig: LinkOwnerSig? = null): ComposePreview() @Serializable class MediaPreview(val images: List, val content: List): ComposePreview() @Serializable data class VoicePreview(val voice: String, val durationMs: Int, val finished: Boolean): ComposePreview() @Serializable class FilePreview(val fileName: String, val uri: URI): ComposePreview() @@ -112,7 +113,12 @@ data class ComposeState( val mentions: MentionedMembers = emptyMap() ) { constructor(editingItem: ChatItem, liveMessage: LiveMessage? = null, useLinkPreviews: Boolean): this( - ComposeMessage(editingItem.content.text), + ComposeMessage( + when (val mc = editingItem.content.msgContent) { + is MsgContent.MCChat -> stripTextLink(mc.text, mc.chatLink.connLinkStr) + else -> editingItem.content.text + } + ), editingItem.formattedText ?: FormattedText.plain(editingItem.content.text), liveMessage, chatItemPreview(editingItem), @@ -163,6 +169,7 @@ data class ComposeState( val hasContent = when (preview) { is ComposePreview.MediaPreview -> true is ComposePreview.VoicePreview -> true + is ComposePreview.ChatLinkPreview -> true is ComposePreview.FilePreview -> true else -> !whitespaceOnly || forwarding || liveMessage != null || submittingValidReport } @@ -174,6 +181,7 @@ data class ComposeState( val linkPreviewAllowed: Boolean get() = when (preview) { + is ComposePreview.ChatLinkPreview -> false is ComposePreview.MediaPreview -> false is ComposePreview.VoicePreview -> false is ComposePreview.FilePreview -> false @@ -200,6 +208,7 @@ data class ComposeState( get() = when (preview) { ComposePreview.NoPreview -> false is ComposePreview.CLinkPreview -> false + is ComposePreview.ChatLinkPreview -> false is ComposePreview.MediaPreview -> preview.content.isNotEmpty() is ComposePreview.VoicePreview -> false is ComposePreview.FilePreview -> true @@ -468,6 +477,7 @@ fun ComposeView( is SharedContent.File -> listOf(shared.uri.toString()) is SharedContent.Text -> emptyList() is SharedContent.Forward -> emptyList() + is SharedContent.ChatLink -> emptyList() } // When sharing a file and pasting it in SimpleX itself, the file shouldn't be deleted before sending or before leaving the chat after sharing chatModel.filesToDelete.removeAll { file -> @@ -672,8 +682,11 @@ fun ComposeView( is MsgContent.MCVoice -> MsgContent.MCVoice(msgText, duration = msgContent.duration) is MsgContent.MCFile -> MsgContent.MCFile(msgText) is MsgContent.MCReport -> MsgContent.MCReport(msgText, reason = msgContent.reason) - // TODO [short links] update chat link - is MsgContent.MCChat -> MsgContent.MCChat(msgText, chatLink = msgContent.chatLink) + is MsgContent.MCChat -> { + val linkStr = msgContent.chatLink.connLinkStr + val text = if (msgText.isEmpty()) linkStr else "$msgText\n$linkStr" + MsgContent.MCChat(text, chatLink = msgContent.chatLink, ownerSig = msgContent.ownerSig) + } is MsgContent.MCUnknown -> MsgContent.MCUnknown(type = msgContent.type, text = msgText, json = msgContent.json) } } @@ -760,6 +773,11 @@ fun ComposeView( when (val preview = cs.preview) { ComposePreview.NoPreview -> msgs.add(MsgContent.MCText(msgText)) is ComposePreview.CLinkPreview -> msgs.add(checkLinkPreview()) + is ComposePreview.ChatLinkPreview -> { + val linkStr = preview.chatLink.connLinkStr + val text = if (msgText.isEmpty()) linkStr else "$msgText\n$linkStr" + msgs.add(MsgContent.MCChat(text, preview.chatLink, preview.ownerSig)) + } is ComposePreview.MediaPreview -> { // TODO batch send: batch media previews preview.content.forEachIndexed { index, it -> @@ -1060,6 +1078,11 @@ fun ComposeView( ::cancelLinkPreview, cancelEnabled = !composeState.value.inProgress ) + is ComposePreview.ChatLinkPreview -> ComposeChatLinkView( + chatLink = preview.chatLink, + cancelEnabled = !composeState.value.inProgress, + cancelPreview = { composeState.value = composeState.value.copy(preview = ComposePreview.NoPreview) } + ) is ComposePreview.MediaPreview -> ComposeImageView( preview, ::cancelImages, @@ -1440,6 +1463,22 @@ fun ComposeView( contextItem = ComposeContextItem.ForwardingItems(shared.chatItems, shared.fromChatInfo), preview = if (composeState.value.preview is ComposePreview.CLinkPreview) composeState.value.preview else ComposePreview.NoPreview ) + is SharedContent.ChatLink -> { + val cInfo = chat.chatInfo + val sendAsGroup = (cInfo as? ChatInfo.Group)?.groupInfo?.let { it.useRelays && it.membership.memberRole >= GroupMemberRole.Owner } ?: false + withBGApi { + val mc = chatModel.controller.apiShareChatMsgContent( + chat.remoteHostId, ChatType.Group, shared.groupInfo.groupId, + cInfo.chatType, cInfo.apiId, + cInfo.groupChatScope(), sendAsGroup + ) + if (mc is MsgContent.MCChat) { + composeState.value = composeState.value.copy( + preview = ComposePreview.ChatLinkPreview(mc.chatLink, mc.ownerSig) + ) + } + } + } null -> {} } chatModel.sharedContent.value = null diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt index 1501fb7938..e681c4fed7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ContextItemView.kt @@ -39,7 +39,7 @@ fun ContextItemView( val receivedColor = MaterialTheme.appColors.receivedMessage @Composable - fun MessageText(contextItem: ChatItem, attachment: ImageResource?, lines: Int) { + fun MessageText(contextItem: ChatItem, attachment: ImageResource?, lines: Int, prefix: AnnotatedString? = null, stripLink: String? = null) { val inlineContent: Pair Unit, Map>? = if (attachment != null) { remember(contextItem.id) { val inlineContentBuilder: AnnotatedString.Builder.() -> Unit = { @@ -68,24 +68,35 @@ fun ContextItemView( userMemberId = when { chatInfo is ChatInfo.Group -> chatInfo.groupInfo.membership.memberId else -> null - } + }, + prefix = prefix, + stripLink = stripLink, ) } fun attachment(contextItem: ChatItem): ImageResource? { val fileIsLoaded = getLoadedFilePath(contextItem.file) != null - return when (contextItem.content.msgContent) { + val mc = contextItem.content.msgContent + return when (mc) { is MsgContent.MCFile -> if (fileIsLoaded) MR.images.ic_draft_filled else null is MsgContent.MCImage -> MR.images.ic_image is MsgContent.MCVoice -> if (fileIsLoaded) MR.images.ic_play_arrow_filled else null + is MsgContent.MCChat -> mc.chatLink.smallIconRes else -> null } } @Composable fun ContextMsgPreview(contextItem: ChatItem, lines: Int) { - MessageText(contextItem, remember(contextItem.id) { attachment(contextItem) }, lines) + val mc = contextItem.content.msgContent + if (mc is MsgContent.MCChat) { + val hasText = contextItem.text != mc.chatLink.connLinkStr + val prefix = buildAnnotatedString { append(mc.chatLink.displayName + if (hasText) " - " else "") } + MessageText(contextItem, remember(contextItem.id) { mc.chatLink.smallIconRes }, lines, prefix = prefix, stripLink = mc.chatLink.connLinkStr) + } else { + MessageText(contextItem, remember(contextItem.id) { attachment(contextItem) }, lines) + } } val sent = contextItems[0].chatDir.sent diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index 78eb31ccbe..767eb46923 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -167,7 +167,7 @@ fun ModalData.GroupChatInfoView( clearChat = { clearChatDialog(chat, close) }, leaveGroup = { leaveGroupDialog(rhId, groupInfo, chatModel, close) }, manageGroupLink = { - ModalManager.end.showModal { GroupLinkView(chatModel, rhId, groupInfo, groupLink, onGroupLinkUpdated, isChannel = groupInfo.useRelays) } + ModalManager.end.showModal { GroupLinkView(chatModel, rhId, groupInfo, groupLink, onGroupLinkUpdated, isChannel = groupInfo.useRelays, shareGroupInfo = groupInfo) } }, onSearchClicked = onSearchClicked, deletingItems = deletingItems @@ -554,6 +554,11 @@ fun ModalData.GroupChatInfoLayout( } else if (channelLink != null) { anyTopSectionRowShow = true ChannelLinkQRCodeSection(channelLink) + ShareViaChatButton { + chatModel.sharedContent.value = SharedContent.ChatLink(groupInfo) + chatModel.chatId.value = null + ModalManager.closeAllModalsEverywhere() + } } if (groupInfo.isOwner || activeSortedMembers.any { it.memberRole >= GroupMemberRole.Owner }) { anyTopSectionRowShow = true @@ -1138,6 +1143,15 @@ private fun ChannelLinkQRCodeSection(groupLink: String) { } } +@Composable +private fun ShareViaChatButton(onClick: () -> Unit) { + SectionItemView(onClick) { + Icon(painterResource(MR.images.ic_forward), null, tint = MaterialTheme.colors.primary) + Spacer(Modifier.width(8.dp)) + Text(stringResource(MR.strings.share_via_chat), color = MaterialTheme.colors.primary) + } +} + @Composable private fun ChannelMembersButton(rhId: Long?, groupInfo: GroupInfo, showMemberInfo: (GroupMember, GroupRelay?) -> Unit) { val title = if (groupInfo.isOwner) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupLinkView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupLinkView.kt index c9745359b9..c0b107b5dd 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupLinkView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupLinkView.kt @@ -33,6 +33,7 @@ fun GroupLinkView( onGroupLinkUpdated: ((GroupLink?) -> Unit)?, creatingGroup: Boolean = false, isChannel: Boolean = false, + shareGroupInfo: GroupInfo? = null, close: (() -> Unit)? = null ) { var groupLinkVar by rememberSaveable(stateSaver = GroupLink.nullableStateSaver) { mutableStateOf(groupLink) } @@ -124,6 +125,7 @@ fun GroupLinkView( groupLinkMemberRole, creatingLink, isChannel = isChannel, + shareGroupInfo = shareGroupInfo, createLink = ::createLink, showAddShortLinkAlert = ::showAddShortLinkAlert, updateLink = { @@ -171,6 +173,7 @@ fun GroupLinkLayout( groupLinkMemberRole: MutableState, creatingLink: Boolean, isChannel: Boolean = false, + shareGroupInfo: GroupInfo? = null, createLink: () -> Unit, showAddShortLinkAlert: ((() -> Unit)?) -> Unit, updateLink: () -> Unit, @@ -230,40 +233,56 @@ fun GroupLinkLayout( } else null) { SimpleXCreatedLinkQRCode(groupLink.connLinkContact, short = showShortLink.value) } - Row( - horizontalArrangement = Arrangement.spacedBy(10.dp), - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(horizontal = DEFAULT_PADDING, vertical = 10.dp) - ) { - val clipboard = LocalClipboardManager.current - SimpleButton( - stringResource(MR.strings.share_link), - icon = painterResource(MR.images.ic_share), - click = { - if (!isChannel && groupLink.shouldBeUpgraded) { - showAddShortLinkAlert { - clipboard.shareText(groupLink.connLinkContact.simplexChatUri(short = showShortLink.value)) - } - } else { + if (!isChannel && groupLink.shouldBeUpgraded) { + SettingsActionItem( + painterResource(MR.images.ic_add), + stringResource(MR.strings.upgrade_group_link), + click = { showAddShortLinkAlert(null) }, + iconColor = MaterialTheme.colors.primary, + textColor = MaterialTheme.colors.primary, + ) + } + val clipboard = LocalClipboardManager.current + SettingsActionItem( + painterResource(MR.images.ic_share), + stringResource(MR.strings.share_link), + click = { + if (!isChannel && groupLink.shouldBeUpgraded) { + showAddShortLinkAlert { clipboard.shareText(groupLink.connLinkContact.simplexChatUri(short = showShortLink.value)) } + } else { + clipboard.shareText(groupLink.connLinkContact.simplexChatUri(short = showShortLink.value)) } + }, + iconColor = MaterialTheme.colors.primary, + textColor = MaterialTheme.colors.primary, + ) + if (shareGroupInfo != null) { + SettingsActionItem( + painterResource(MR.images.ic_forward), + stringResource(MR.strings.share_via_chat), + click = { + chatModel.sharedContent.value = SharedContent.ChatLink(shareGroupInfo) + chatModel.chatId.value = null + ModalManager.closeAllModalsEverywhere() + }, + iconColor = MaterialTheme.colors.primary, + textColor = MaterialTheme.colors.primary, ) - if (creatingGroup && close != null) { - ContinueButton(close) - } else if (!isChannel) { - SimpleButton( - stringResource(MR.strings.delete_link), - icon = painterResource(MR.images.ic_delete), - color = Color.Red, - click = deleteLink - ) - } } - if (!isChannel && groupLink.shouldBeUpgraded) { - AddShortLinkButton(text = stringResource(MR.strings.upgrade_group_link)) { - showAddShortLinkAlert(null) - } + if (!creatingGroup && !isChannel) { + SettingsActionItem( + painterResource(MR.images.ic_delete), + stringResource(MR.strings.delete_link), + click = deleteLink, + iconColor = Color.Red, + textColor = Color.Red, + ) + } + if (creatingGroup && close != null) { + Spacer(Modifier.height(DEFAULT_PADDING_HALF)) + ContinueButton(close) } } } @@ -271,17 +290,6 @@ fun GroupLinkLayout( } } -@Composable -private fun AddShortLinkButton(text: String, onClick: () -> Unit) { - SettingsActionItem( - painterResource(MR.images.ic_add), - text, - onClick, - iconColor = MaterialTheme.colors.primary, - textColor = MaterialTheme.colors.primary, - ) -} - @Composable private fun RoleSelectionRow(groupInfo: GroupInfo, selectedRole: MutableState, enabled: Boolean = true) { Row( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt index d144065399..6e91ad92d6 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupProfileView.kt @@ -119,7 +119,7 @@ fun GroupProfileLayout( ) { Box(contentAlignment = Alignment.TopEnd) { Box(contentAlignment = Alignment.Center) { - ProfileImage(108.dp, profileImage.value, color = MaterialTheme.colors.secondary.copy(alpha = 0.1f)) + ProfileImage(108.dp, profileImage.value, icon = groupInfo.chatIconName, color = MaterialTheme.colors.secondary.copy(alpha = 0.1f)) EditImageButton { scope.launch { bottomSheetModalState.show() } } } if (profileImage.value != null) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIChatLinkHeader.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIChatLinkHeader.kt new file mode 100644 index 0000000000..3c3e4baf49 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIChatLinkHeader.kt @@ -0,0 +1,79 @@ +package chat.simplex.common.views.chat.item + +import androidx.compose.foundation.layout.* +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import chat.simplex.common.model.* +import chat.simplex.common.ui.theme.* +import chat.simplex.common.views.helpers.ProfileImage +import chat.simplex.res.MR +import dev.icerock.moko.resources.compose.stringResource + +@Composable +fun CIChatLinkHeader( + chatLink: MsgChatLink, + ownerSig: LinkOwnerSig?, + hasText: Boolean, +) { + Column( + Modifier + .defaultMinSize(minWidth = 220.dp) + .padding(start = 8.dp, end = 12.dp, top = 8.dp, bottom = 4.dp) + ) { + Row( + Modifier.defaultMinSize(minWidth = 220.dp) + ) { + ProfileImage( + size = 54.dp, + image = chatLink.image, + icon = chatLink.iconRes, + color = if (isInDarkTheme()) FileDark else FileLight + ) + Spacer(Modifier.width(8.dp)) + Column( + Modifier.defaultMinSize(minHeight = 54.dp), + verticalArrangement = Arrangement.Center + ) { + Text( + chatLink.displayName, + style = MaterialTheme.typography.caption, + fontWeight = FontWeight.Medium, + maxLines = 2, + overflow = TextOverflow.Ellipsis + ) + val fn = chatLink.fullName + if (fn.isNotEmpty() && fn != chatLink.displayName) { + Text(fn, maxLines = 2, overflow = TextOverflow.Ellipsis) + } + } + } + Divider(Modifier.fillMaxWidth().padding(top = 8.dp)) + Column(Modifier.padding(top = 8.dp, bottom = 4.dp, start = 4.dp), verticalArrangement = Arrangement.spacedBy(2.dp)) { + chatLink.shortDescription?.let { descr -> + Text( + descr, + color = MaterialTheme.colors.secondary, + fontSize = 13.sp, + lineHeight = 18.sp, + maxLines = 2, + overflow = TextOverflow.Ellipsis, + ) + } + Text( + chatLink.infoLine(signed = ownerSig != null), + color = MaterialTheme.colors.secondary, + fontSize = 13.sp, + lineHeight = 18.sp, + ) + Text( + stringResource(MR.strings.tap_to_open), + color = MaterialTheme.colors.primary, + ) + } + } +} diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt index 542623028a..afd55ed928 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIFileView.kt @@ -127,7 +127,8 @@ fun CIFileView( fun fileIndicator() { Box( Modifier - .size(42.sp.toDp() * sizeMultiplier) + .padding(top = 2.sp.toDp()) + .size(40.sp.toDp() * sizeMultiplier) .clip(RoundedCornerShape(4.sp.toDp() * sizeMultiplier)), contentAlignment = Alignment.Center ) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt index 39bb9545e1..9b8393f66a 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/CIGroupInvitationView.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* import chat.simplex.common.model.* @@ -52,15 +53,12 @@ fun CIGroupInvitationView( else if (isInDarkTheme()) FileDark else FileLight Row( - Modifier - .defaultMinSize(minWidth = 220.dp) - .padding(vertical = 4.dp) - .padding(end = 2.dp) + Modifier.defaultMinSize(minWidth = 220.dp) ) { - ProfileImage(size = 60.dp, image = groupInvitation.groupProfile.image, icon = MR.images.ic_supervised_user_circle_filled, color = iconColor) - Spacer(Modifier.padding(horizontal = 3.dp)) + ProfileImage(size = 54.dp, image = groupInvitation.groupProfile.image, icon = MR.images.ic_supervised_user_circle_filled, color = iconColor) + Spacer(Modifier.width(8.dp)) Column( - Modifier.defaultMinSize(minHeight = 60.dp), + Modifier.defaultMinSize(minHeight = 54.dp), verticalArrangement = Arrangement.Center ) { Text(p.displayName, style = MaterialTheme.typography.caption, fontWeight = FontWeight.Medium, maxLines = 2, overflow = TextOverflow.Ellipsis) @@ -98,8 +96,7 @@ fun CIGroupInvitationView( Box( Modifier .width(IntrinsicSize.Min) - .padding(vertical = 3.dp) - .padding(start = 8.dp, end = 12.dp), + .padding(start = 8.dp, end = 12.dp, top = 8.dp, bottom = 4.dp), contentAlignment = Alignment.BottomEnd ) { Box( @@ -112,10 +109,10 @@ fun CIGroupInvitationView( ) { groupInfoView() val secondaryColor = MaterialTheme.colors.secondary - Column(Modifier.padding(top = 2.dp, start = 5.dp)) { - Divider(Modifier.fillMaxWidth().padding(bottom = 4.dp)) + Divider(Modifier.fillMaxWidth().padding(top = 8.dp)) + Column(Modifier.padding(top = 8.dp, bottom = 4.dp, start = 4.dp), verticalArrangement = Arrangement.spacedBy(2.dp)) { if (action) { - Text(groupInvitationStr()) + Text(groupInvitationStr(), fontSize = 13.sp, lineHeight = 18.sp) Text( buildAnnotatedString { append(generalGetString(if (chatIncognito) MR.strings.group_invitation_tap_to_join_incognito else MR.strings.group_invitation_tap_to_join)) @@ -131,7 +128,9 @@ fun CIGroupInvitationView( buildAnnotatedString { append(groupInvitationStr()) withStyle(reserveTimestampStyle) { append(reserveSpaceForMeta(ci.meta, timedMessagesTTL, encrypted = null, showStatus = false, showEdited = false, secondaryColor = secondaryColor, showTimestamp = showTimestamp)) } - } + }, + fontSize = 13.sp, + lineHeight = 18.sp, ) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt index 8aab0bbbb6..f2788715fe 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/FramedItemView.kt @@ -23,6 +23,7 @@ import chat.simplex.common.platform.* import chat.simplex.common.ui.theme.* import chat.simplex.common.views.chat.* import chat.simplex.common.views.helpers.* +import chat.simplex.common.views.newchat.planAndConnect import chat.simplex.res.MR import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -55,7 +56,7 @@ fun FramedItemView( } @Composable - fun ciQuotedMsgTextView(qi: CIQuote, lines: Int, showTimestamp: Boolean) { + fun ciQuotedMsgTextView(qi: CIQuote, lines: Int, showTimestamp: Boolean, stripLink: String? = null, prefix: AnnotatedString? = null) { MarkdownText( qi.text, qi.formattedText, @@ -66,11 +67,13 @@ fun FramedItemView( linkMode = linkMode, uriHandler = if (appPlatform.isDesktop) uriHandler else null, showTimestamp = showTimestamp, + prefix = prefix, + stripLink = stripLink, ) } @Composable - fun ciQuotedMsgView(qi: CIQuote) { + fun ciQuotedMsgView(qi: CIQuote, stripLink: String? = null, prefix: AnnotatedString? = null) { Box( Modifier // this width limitation prevents crash on calculating constraints that may happen if you post veeeery long message and then quote it. @@ -89,10 +92,10 @@ fun FramedItemView( style = TextStyle(fontSize = 13.5.sp, color = if (qi.chatDir is CIDirection.GroupSnd) CurrentColors.value.colors.primary else CurrentColors.value.colors.secondary), maxLines = 1 ) - ciQuotedMsgTextView(qi, lines = 2, showTimestamp = showTimestamp) + ciQuotedMsgTextView(qi, lines = 2, showTimestamp = showTimestamp, stripLink = stripLink, prefix = prefix) } } else { - ciQuotedMsgTextView(qi, lines = 3, showTimestamp = showTimestamp) + ciQuotedMsgTextView(qi, lines = 3, showTimestamp = showTimestamp, stripLink = stripLink, prefix = prefix) } } } @@ -177,6 +180,20 @@ fun FramedItemView( tint = if (isInDarkTheme()) FileDark else FileLight ) } + is MsgContent.MCChat -> { + val prefix = buildAnnotatedString { + append(qi.content.chatLink.displayName + if (qi.content.text != qi.content.chatLink.connLinkStr) " - " else "") + } + Box(Modifier.fillMaxWidth().weight(1f)) { + ciQuotedMsgView(qi, stripLink = qi.content.chatLink.connLinkStr, prefix = prefix) + } + Icon( + painterResource(qi.content.chatLink.smallIconRes), + null, + Modifier.padding(top = 6.dp, end = 4.dp).size(22.dp), + tint = if (isInDarkTheme()) FileDark else FileLight + ) + } else -> ciQuotedMsgView(qi) } } @@ -329,6 +346,22 @@ fun FramedItemView( CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp) } } + is MsgContent.MCChat -> { + val hasText = mc.text != mc.chatLink.connLinkStr + Box( + Modifier.combinedClickable( + onClick = { + withBGApi { planAndConnect(chat.remoteHostId, mc.chatLink.connLinkStr, linkOwnerSig = mc.ownerSig, close = null) } + }, + onLongClick = { showMenu.value = true } + ) + ) { + CIChatLinkHeader(chatLink = mc.chatLink, ownerSig = mc.ownerSig, hasText = hasText) + } + if (hasText) { + CIMarkdownText(chatsCtx, ci, chat, chatTTL, linkMode, uriHandler, showViaProxy = showViaProxy, showTimestamp = showTimestamp, stripLink = mc.chatLink.connLinkStr) + } + } is MsgContent.MCReport -> { val prefix = buildAnnotatedString { withStyle(SpanStyle(color = Color.Red, fontStyle = FontStyle.Italic)) { @@ -366,7 +399,8 @@ fun CIMarkdownText( onLinkLongClick: (link: String) -> Unit = {}, showViaProxy: Boolean, showTimestamp: Boolean, - prefix: AnnotatedString? = null + prefix: AnnotatedString? = null, + stripLink: String? = null ) { val chatInfo = chat.chatInfo val text = if (ci.meta.isLive) ci.content.msgContent?.text ?: ci.text else ci.text @@ -382,6 +416,7 @@ fun CIMarkdownText( else -> null }, uriHandler = uriHandler, senderBold = true, onLinkLongClick = onLinkLongClick, showViaProxy = showViaProxy, showTimestamp = showTimestamp, prefix = prefix, + stripLink = stripLink, selectionRange = selection.highlightRange, onTextLayoutResult = selection.onTextLayoutResult ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt index b8691c70f8..9db87b156d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt @@ -109,9 +109,12 @@ fun MarkdownText ( showViaProxy: Boolean = false, showTimestamp: Boolean = true, prefix: AnnotatedString? = null, + stripLink: String? = null, selectionRange: IntRange? = null, onTextLayoutResult: ((TextLayoutResult) -> Unit)? = null ) { + val text = if (stripLink != null) stripTextLink(text.toString(), stripLink) else text + val formattedText = if (stripLink != null) stripFormattedTextLink(formattedText, stripLink) else formattedText val textLayoutDirection = remember (text) { if (isRtl(text.subSequence(0, kotlin.math.min(50, text.length)))) LayoutDirection.Rtl else LayoutDirection.Ltr } @@ -532,3 +535,20 @@ private fun isRtl(s: CharSequence): Boolean { } fun mentionText(name: String): String = if (name.contains(" @")) "@'$name'" else "@$name" + +fun stripTextLink(text: String, link: String): String = + if (text == link) "" + else if (text.endsWith("\n$link")) text.dropLast(link.length + 1) + else text + +fun stripFormattedTextLink(ft: List?, link: String): List? { + if (ft == null || ft.isEmpty() || ft.last().text != link) return ft + val result = ft.toMutableList() + result.removeLast() + val i = result.lastIndex + if (i >= 0 && result[i].format == null && result[i].text.endsWith("\n")) { + result[i] = FormattedText(result[i].text.dropLast(1), null) + if (result[i].text.isEmpty()) result.removeLast() + } + return result.ifEmpty { null } +} diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt index f5e0389043..346e9bac95 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatPreviewView.kt @@ -31,6 +31,7 @@ import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.GroupInfo import chat.simplex.common.platform.* import chat.simplex.common.views.chat.* +import chat.simplex.common.views.newchat.planAndConnect import chat.simplex.common.views.chat.item.* import chat.simplex.res.MR import dev.icerock.moko.resources.ImageResource @@ -241,12 +242,18 @@ fun ChatPreviewView( Text(previewText.first, color = previewText.second) } else if (ci != null && showChatPreviews) { val (text: CharSequence, inlineTextContent) = when { - ci.meta.itemDeleted == null -> ci.text(chat.chatInfo.isChannel) to null - else -> markedDeletedText(ci, chat.chatInfo) to null + ci.meta.itemDeleted != null -> markedDeletedText(ci, chat.chatInfo) to null + ci.content.msgContent is MsgContent.MCChat -> { + val chatLink = (ci.content.msgContent as MsgContent.MCChat).chatLink + val descr = chatLink.shortDescription?.let { "\n$it" } ?: "" + (chatLink.displayName + descr) to null + } + else -> ci.text(chat.chatInfo.isChannel) to null } - val formattedText = when { - ci.meta.itemDeleted == null -> ci.formattedText - else -> null + val formattedText: List? = when { + ci.meta.itemDeleted != null -> null + ci.content.msgContent is MsgContent.MCChat -> null + else -> ci.formattedText } val prefix = when (val mc = ci.content.msgContent) { is MsgContent.MCReport -> @@ -332,6 +339,19 @@ fun ChatPreviewView( withBGApi { chatModel.controller.receiveFile(chat.remoteHostId, user, it) } } } + is MsgContent.MCChat -> SmallContentPreview(borderColor = if (mc.chatLink.image != null) MaterialTheme.colors.onSurface.copy(alpha = 0.12f) else Color.Transparent) { + Box( + Modifier.fillMaxSize().clickable { withBGApi { planAndConnect(chat.remoteHostId, mc.chatLink.connLinkStr, linkOwnerSig = mc.ownerSig, close = null) } }, + contentAlignment = Alignment.Center + ) { + val image = mc.chatLink.image + if (image != null) { + Image(base64ToBitmap(image), null, contentScale = ContentScale.Crop, modifier = Modifier.fillMaxSize()) + } else { + Icon(painterResource(mc.chatLink.iconRes), null, Modifier.size(44.sp.toDp()), tint = if (isInDarkTheme()) FileDark else FileLight) + } + } + } else -> {} } } @@ -500,8 +520,8 @@ fun ChatPreviewView( } @Composable -private fun SmallContentPreview(content: @Composable BoxScope.() -> Unit) { - Box(Modifier.padding(top = 2.sp.toDp(), end = 8.sp.toDp()).size(36.sp.toDp()).border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(22)).clip(RoundedCornerShape(22))) { +private fun SmallContentPreview(borderColor: Color = MaterialTheme.colors.onSurface.copy(alpha = 0.12f), content: @Composable BoxScope.() -> Unit) { + Box(Modifier.padding(top = 2.sp.toDp(), end = 8.sp.toDp()).size(36.sp.toDp()).border(0.5.dp, borderColor, RoundedCornerShape(22)).clip(RoundedCornerShape(22))) { content() } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt index aa9847c98a..cf92ec2f49 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt @@ -51,6 +51,9 @@ fun ShareListView(chatModel: ChatModel, stopped: Boolean) { } } } + is SharedContent.ChatLink -> { + hasSimplexLink = true + } null -> {} } if (chatModel.chats.value.isNotEmpty()) { @@ -98,7 +101,7 @@ private fun ShareListToolbar(chatModel: ChatModel, stopped: Boolean, onSearchVal val navButton: @Composable RowScope.() -> Unit = { when { showSearch -> NavigationButtonBack(hideSearchOnBack) - (users.size > 1 || chatModel.remoteHosts.isNotEmpty()) && remember { chatModel.sharedContent }.value !is SharedContent.Forward -> { + (users.size > 1 || chatModel.remoteHosts.isNotEmpty()) && remember { chatModel.sharedContent }.value !is SharedContent.Forward && remember { chatModel.sharedContent }.value !is SharedContent.ChatLink -> { val allRead = users .filter { u -> !u.user.activeUser && !u.user.hidden } .all { u -> u.unreadCount == 0 } @@ -129,6 +132,8 @@ private fun ShareListToolbar(chatModel: ChatModel, stopped: Boolean, onSearchVal chatModel.sharedContent.value = null if (sharedContent is SharedContent.Forward) { chatModel.chatId.value = sharedContent.fromChatInfo.id + } else if (sharedContent is SharedContent.ChatLink) { + chatModel.chatId.value = sharedContent.groupInfo.id } }) } @@ -144,6 +149,7 @@ private fun ShareListToolbar(chatModel: ChatModel, stopped: Boolean, onSearchVal is SharedContent.Media -> stringResource(MR.strings.share_image) is SharedContent.File -> stringResource(MR.strings.share_file) is SharedContent.Forward -> if (v.chatItems.size > 1) stringResource(MR.strings.forward_multiple) else stringResource(MR.strings.forward_message) + is SharedContent.ChatLink -> stringResource(MR.strings.share_channel) null -> stringResource(MR.strings.share_message) }, color = MaterialTheme.colors.onBackground, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt index 6bfe8d7869..3d670d1c43 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/AlertManager.kt @@ -273,6 +273,7 @@ class AlertManager { profileFullName: String, profileImage: @Composable () -> Unit, subtitle: String? = null, + information: String? = null, confirmText: String? = generalGetString(MR.strings.connect_plan_open_chat), onConfirm: (() -> Unit)? = null, dismissText: String = generalGetString(MR.strings.cancel_verb), @@ -329,6 +330,16 @@ class AlertManager { modifier = Modifier.fillMaxWidth() ) } + if (information != null) { + Spacer(Modifier.height(DEFAULT_PADDING_HALF)) + Text( + information, + textAlign = TextAlign.Center, + style = MaterialTheme.typography.body2, + maxLines = 3, + modifier = Modifier.fillMaxWidth() + ) + } } Column( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Enums.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Enums.kt index 30811d5c94..cf3281f776 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Enums.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/Enums.kt @@ -15,6 +15,7 @@ sealed class SharedContent { data class Media(val text: String, val uris: List): SharedContent() data class File(val text: String, val uri: URI): SharedContent() data class Forward(val chatItems: List, val fromChatInfo: ChatInfo): SharedContent() + data class ChatLink(val groupInfo: GroupInfo): SharedContent() } enum class AnimatedViewState { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt index 944cd70255..2f030ef1dc 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt @@ -65,7 +65,7 @@ fun AddChannelView(chatModel: ChatModel, close: () -> Unit, closeAll: () -> Unit withBGApi { openGroupChat(null, gInfo.groupId) ModalManager.end.showModalCloseable(true) { close -> - GroupLinkView(chatModel, rhId = null, groupInfo = gInfo, groupLink = groupLink.value, onGroupLinkUpdated = null, creatingGroup = true, isChannel = true, close = close) + GroupLinkView(chatModel, rhId = null, groupInfo = gInfo, groupLink = groupLink.value, onGroupLinkUpdated = null, creatingGroup = true, isChannel = true, shareGroupInfo = gInfo, close = close) } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt index e83d26c394..b38fbf9f51 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/ConnectPlan.kt @@ -24,6 +24,7 @@ enum class ConnectionLinkType { suspend fun planAndConnect( rhId: Long?, shortOrFullLink: String, + linkOwnerSig: LinkOwnerSig? = null, close: (() -> Unit)?, cleanup: (() -> Unit)? = null, filterKnownContact: ((Contact) -> Unit)? = null, @@ -44,12 +45,13 @@ suspend fun planAndConnect( inProgress.value = false cleanup?.invoke() } - return planAndConnectTask(rhId, shortOrFullLink, close, cleanup, filterKnownContact, filterKnownGroup, inProgress) + return planAndConnectTask(rhId, shortOrFullLink, linkOwnerSig, close, cleanup, filterKnownContact, filterKnownGroup, inProgress) } private suspend fun planAndConnectTask( rhId: Long?, shortOrFullLink: String, + linkOwnerSig: LinkOwnerSig? = null, close: (() -> Unit)?, cleanup: (() -> Unit)? = null, filterKnownContact: ((Contact) -> Unit)? = null, @@ -66,7 +68,7 @@ private suspend fun planAndConnectTask( cleanup?.invoke() completable.complete(!completable.isActive) } - val result = chatModel.controller.apiConnectPlan(rhId, shortOrFullLink, inProgress = inProgress) + val result = chatModel.controller.apiConnectPlan(rhId, shortOrFullLink, linkOwnerSig, inProgress = inProgress) connectProgressManager.stopConnectProgress() if (!inProgress.value) { return completable } if (result != null) { @@ -85,6 +87,7 @@ private suspend fun planAndConnectTask( rhId, connectionLink, connectionPlan.invitationLinkPlan.contactSLinkData_, + ownerVerification = connectionPlan.invitationLinkPlan.ownerVerification, close, cleanup ) @@ -96,6 +99,7 @@ private suspend fun planAndConnectTask( text = generalGetString(MR.strings.profile_will_be_sent_to_contact_sending_link) + linkText, connectDestructive = false, cleanup = cleanup, + ownerVerification = connectionPlan.invitationLinkPlan.ownerVerification, ) } InvitationLinkPlan.OwnLink -> { @@ -146,6 +150,7 @@ private suspend fun planAndConnectTask( rhId, connectionLink, connectionPlan.contactAddressPlan.contactSLinkData_, + ownerVerification = connectionPlan.contactAddressPlan.ownerVerification, close, cleanup ) @@ -157,6 +162,7 @@ private suspend fun planAndConnectTask( text = generalGetString(MR.strings.profile_will_be_sent_to_contact_sending_link) + linkText, connectDestructive = false, cleanup, + ownerVerification = connectionPlan.contactAddressPlan.ownerVerification, ) } ContactAddressPlan.OwnLink -> { @@ -215,6 +221,7 @@ private suspend fun planAndConnectTask( connectionLink, connectionPlan.groupLinkPlan.groupSLinkInfo_, connectionPlan.groupLinkPlan.groupSLinkData_, + ownerVerification = connectionPlan.groupLinkPlan.ownerVerification, close, cleanup ) @@ -226,6 +233,7 @@ private suspend fun planAndConnectTask( text = generalGetString(MR.strings.you_will_join_group) + linkText, connectDestructive = false, cleanup = cleanup, + ownerVerification = connectionPlan.groupLinkPlan.ownerVerification, ) } is GroupLinkPlan.OwnLink -> { @@ -292,7 +300,7 @@ private suspend fun planAndConnectTask( ProfileImage( size = alertProfileImageSize, image = groupSLinkData.groupProfile.image, - icon = MR.images.ic_bigtop_updates_padded + icon = MR.images.ic_bigtop_updates_circle_filled ) }, subtitle = generalGetString(MR.strings.channel_no_active_relays_try_later), @@ -375,10 +383,12 @@ fun askCurrentOrIncognitoProfileAlert( text: String? = null, connectDestructive: Boolean, cleanup: (() -> Unit)?, + ownerVerification: OwnerVerification? = null, ) { + val fullText = listOfNotNull(text, ownerVerificationMessage(ownerVerification)).joinToString("\n\n").ifEmpty { null } AlertManager.privacySensitive.showAlertDialogButtonsColumn( title = title, - text = text, + text = fullText, buttons = { Column { val connectColor = if (connectDestructive) MaterialTheme.colors.error else MaterialTheme.colors.primary @@ -573,6 +583,7 @@ fun showPrepareContactAlert( rhId: Long?, connectionLink: CreatedConnLink, contactShortLinkData: ContactShortLinkData, + ownerVerification: OwnerVerification? = null, close: (() -> Unit)?, cleanup: (() -> Unit)? ) { @@ -589,6 +600,7 @@ fun showPrepareContactAlert( else MR.images.ic_account_circle_filled ) }, + information = ownerVerificationMessage(ownerVerification), confirmText = generalGetString(MR.strings.connect_plan_open_new_chat), onConfirm = { AlertManager.privacySensitive.hideAlert() @@ -614,6 +626,7 @@ fun showPrepareGroupAlert( connectionLink: CreatedConnLink, groupShortLinkInfo: GroupShortLinkInfo?, groupShortLinkData: GroupShortLinkData, + ownerVerification: OwnerVerification? = null, close: (() -> Unit)?, cleanup: (() -> Unit)? ) { @@ -626,10 +639,11 @@ fun showPrepareGroupAlert( ProfileImage( size = alertProfileImageSize, image = groupShortLinkData.groupProfile.image, - icon = if (isChannel) MR.images.ic_bigtop_updates_padded else MR.images.ic_supervised_user_circle_filled + icon = if (isChannel) MR.images.ic_bigtop_updates_circle_filled else MR.images.ic_supervised_user_circle_filled ) }, subtitle = subscriberCount, + information = ownerVerificationMessage(ownerVerification), confirmText = generalGetString(if (isChannel) MR.strings.connect_plan_open_new_channel else MR.strings.connect_plan_open_new_group), onConfirm = { AlertManager.privacySensitive.hideAlert() @@ -657,3 +671,9 @@ fun showPrepareGroupAlert( } ) } + +fun ownerVerificationMessage(ov: OwnerVerification?): String? = when (ov) { + is OwnerVerification.Verified -> generalGetString(MR.strings.owner_verification_passed) + is OwnerVerification.Failed -> String.format(generalGetString(MR.strings.owner_verification_failed), ov.reason) + null -> null +} diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index a106b53176..0630dffe22 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -533,8 +533,21 @@ Share file… Forward message… Forward messages… + Share channel… Cannot send message Selected chat preferences prohibit this message. + Share via chat + Tap to open + Channel link + Group link + Business address + Contact address + One-time link + (from owner) + (signed) + Error sharing channel + Link signature verified. + ⚠️ Signature verification failed: %s. Attach diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_circle_filled.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_circle_filled.svg new file mode 100644 index 0000000000..c88692fc12 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_circle_filled.svg @@ -0,0 +1 @@ + diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_padded.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_padded.svg deleted file mode 100644 index 9f4edcfd98..0000000000 --- a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_bigtop_updates_padded.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/plans/2026-04-17-kotlin-share-channel-link.md b/plans/2026-04-17-kotlin-share-channel-link.md new file mode 100644 index 0000000000..0133ca377c --- /dev/null +++ b/plans/2026-04-17-kotlin-share-channel-link.md @@ -0,0 +1,561 @@ +# Kotlin/Desktop — Share chat card (MCChat) — Implementation Plan + +Port of iOS commit `f49d98511` to Kotlin multiplatform codebase. Every section maps an iOS change to its Kotlin equivalent with file:line anchors. + +--- + +## 1. Types — `ChatModel.kt` + +### 1.1 Add `LinkOwnerSig` (new type, near line 4551 after `MsgChatLink`) + +```kotlin +@Serializable +data class LinkOwnerSig( + val ownerId: String? = null, + val chatBinding: String, + val ownerSig: String +) +``` + +iOS equivalent: `ChatTypes.swift` `LinkOwnerSig` struct. + +### 1.2 Add `ownerSig` to `MCChat` (line ~4310) + +Current: `class MCChat(override val text: String, val chatLink: MsgChatLink): MsgContent()` +Change to: `class MCChat(override val text: String, val chatLink: MsgChatLink, val ownerSig: LinkOwnerSig? = null): MsgContent()` + +### 1.3 Add `chatLinkStr` property to `MsgContent` (near `text` property) + +```kotlin +val chatLinkStr: String? + get() = (this as? MCChat)?.chatLink?.connLinkStr +``` + +### 1.4 Update `MsgContentSerializer` (lines 4366-4496) + +In the `"chat"` case of the deserializer, add `ownerSig` field: +```kotlin +"chat" -> { + val text = json["text"]?.jsonPrimitive?.content ?: "" + val chatLink = Json.decodeFromJsonElement(json["chatLink"]!!) + val ownerSig = json["ownerSig"]?.let { Json.decodeFromJsonElement(it) } + MCChat(text, chatLink, ownerSig) +} +``` + +In the serializer, add `ownerSig` to the `MCChat` case: +```kotlin +is MCChat -> buildJsonObject { + put("type", "chat") + put("text", mc.text) + put("chatLink", Json.encodeToJsonElement(mc.chatLink)) + mc.ownerSig?.let { put("ownerSig", Json.encodeToJsonElement(it)) } +} +``` + +### 1.5 Add computed properties to `MsgChatLink` (line ~4547) + +The existing `MsgChatLink` sealed class uses `@SerialName` annotations for JSON. The Haskell side uses `taggedObjectJSON` format (`{"type": "group", ...}`). Need to verify the existing `@SerialName` produces the right format — it should, since kotlinx.serialization with `classDiscriminator = "type"` matches. + +Add after the sealed class definition: +```kotlin +sealed class MsgChatLink { + // ... existing cases ... + + val isPublicGroup: Boolean + get() = (this as? Group)?.groupProfile?.publicGroup != null + + val connLinkStr: String + get() = when (this) { + is Group -> connLink + is Contact -> connLink + is Invitation -> invLink + } + + val image: String? + get() = when (this) { + is Group -> groupProfile.image + is Contact -> profile.image + is Invitation -> profile.image + } + + val displayName: String + get() = when (this) { + is Group -> groupProfile.displayName + is Contact -> profile.displayName + is Invitation -> profile.displayName + } + + val fullName: String + get() = when (this) { + is Group -> groupProfile.fullName + is Contact -> profile.fullName + is Invitation -> profile.fullName + } + + val shortDescription: String? + get() { + val s = when (this) { + is Group -> groupProfile.shortDescr + is Contact -> profile.shortDescr + is Invitation -> profile.shortDescr + } + return s?.trim()?.ifEmpty { null } + } + + val iconRes: ImageResource // for ProfileImage icon parameter + get() = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> MR.images.ic_bigtop_updates_padded + else -> MR.images.ic_supervised_user_circle_filled + } + is Contact -> if (business) MR.images.ic_work_filled_padded else MR.images.ic_account_circle_filled + is Invitation -> MR.images.ic_account_circle_filled + } + + val smallIconRes: ImageResource // for inline icon in context/quote views + get() = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> MR.images.ic_bigtop_updates + else -> MR.images.ic_group + } + is Contact -> if (business) MR.images.ic_work else MR.images.ic_person + is Invitation -> MR.images.ic_person + } + + fun infoLine(signed: Boolean): String { + var s = when (this) { + is Group -> when (groupProfile.publicGroup?.groupType) { + GroupType.Channel -> generalGetString(MR.strings.channel_link) + else -> generalGetString(MR.strings.group_link) + } + is Contact -> if (business) generalGetString(MR.strings.business_address) else generalGetString(MR.strings.contact_address) + is Invitation -> generalGetString(MR.strings.one_time_link) + } + if (signed) { + s += " " + if (isPublicGroup) generalGetString(MR.strings.from_owner) else generalGetString(MR.strings.signed_parentheses) + } + return s + } +} +``` + +Icons resolved — see "Resolved decisions" section 1. + +### 1.6 Add `OwnerVerification` type (near ConnectionPlan, line ~6844 of SimpleXAPI.kt) + +```kotlin +@Serializable +sealed class OwnerVerification { + @Serializable @SerialName("verified") object Verified : OwnerVerification() + @Serializable @SerialName("failed") class Failed(val reason: String) : OwnerVerification() +} +``` + +### 1.7 Update plan types with `ownerVerification` (SimpleXAPI.kt lines 6852-6877) + +- `InvitationLinkPlan.Ok`: add `val ownerVerification: OwnerVerification? = null` +- `ContactAddressPlan.Ok`: add `val ownerVerification: OwnerVerification? = null` +- `GroupLinkPlan.Ok`: add `val ownerVerification: OwnerVerification? = null` + +--- + +## 2. API commands — `SimpleXAPI.kt` + +### 2.1 Add `ApiShareChatMsgContent` command class (near line 3626) + +```kotlin +class ApiShareChatMsgContent( + val shareChatType: ChatType, val shareChatId: Long, + val toChatType: ChatType, val toChatId: Long, + val toScope: GroupChatScope?, val sendAsGroup: Boolean +): CC() +``` + +Add `cmdString`: +```kotlin +is ApiShareChatMsgContent -> { + val asGroup = if (sendAsGroup) "(as_group=on)" else "" + "/_share chat content ${chatRef(shareChatType, shareChatId)} ${chatRef(toChatType, toChatId, toScope)}$asGroup" +} +``` + +### 2.2 Add `CR.ChatMsgContent` response (near line 6320) + +```kotlin +@Serializable @SerialName("chatMsgContent") +class ChatMsgContent(val user: UserRef, val msgContent: MsgContent): CR() +``` + +### 2.3 Add `apiShareChatMsgContent` wrapper function (near line 1133) + +```kotlin +suspend fun apiShareChatMsgContent( + rh: Long?, shareChatType: ChatType, shareChatId: Long, + toChatType: ChatType, toChatId: Long, + toScope: GroupChatScope?, sendAsGroup: Boolean +): MsgContent? { + val r = sendCmd(rh, CC.ApiShareChatMsgContent(shareChatType, shareChatId, toChatType, toChatId, toScope, sendAsGroup)) + if (r is CR.ChatMsgContent) return r.msgContent + apiErrorAlert("apiShareChatMsgContent", r) + return null +} +``` + +### 2.4 Update `apiConnectPlan` (line 1488) + +Add `linkOwnerSig: LinkOwnerSig? = null` parameter. Update the `CC.APIConnectPlan` class to include it. Update cmdString to append `sig=` when present. + +--- + +## 3. Compose state — `ComposeView.kt` + `Enums.kt` + +### 3.1 Add `SharedContent.ChatLink` to `Enums.kt` (line 13-18) + +```kotlin +data class ChatLink(val groupInfo: GroupInfo): SharedContent() +``` + +This triggers the share flow: sets `chatModel.sharedContent.value = SharedContent.ChatLink(groupInfo)` → navigates to chat list → user picks destination. + +### 3.2 Add `ChatLinkPreview` to `ComposePreview` (`ComposeView.kt` line 57-63) + +```kotlin +@Serializable class ChatLinkPreview(val chatLink: MsgChatLink, val ownerSig: LinkOwnerSig?): ComposePreview() +``` + +### 3.3 Update `ComposeState` (`ComposeView.kt` line 103-240) + +- `sendEnabled`: add `is ComposePreview.ChatLinkPreview -> true` case +- `linkPreviewAllowed`: add `is ComposePreview.ChatLinkPreview -> false` +- `attachmentPreview`: add `is ComposePreview.ChatLinkPreview -> false` + +### 3.4 Add compose preview rendering + +In the compose area where previews are rendered, add a case for `ChatLinkPreview` that shows `ComposeChatLinkView` (new composable). + +### 3.5 Add send handling + +In the send function, add case for `ChatLinkPreview`: +```kotlin +is ComposePreview.ChatLinkPreview -> { + val linkStr = preview.chatLink.connLinkStr + val text = if (msgText.isEmpty()) linkStr else "$msgText\n$linkStr" + send(MsgContent.MCChat(text, preview.chatLink, preview.ownerSig), ...) +} +``` + +### 3.6 Handle `SharedContent.ChatLink` in `ComposeView.kt` (line 1431-1446, `LaunchedEffect(chatModel.sharedContent.value)`) + +When the destination chat opens with `SharedContent.ChatLink`, the `LaunchedEffect` fires. At this point: +- `chatModel.chatId.value` = destination chat ID +- `shared.groupInfo` = source group (what we're sharing) +- The current chat's `ChatInfo` provides destination type/id/scope for the API call + +```kotlin +is SharedContent.ChatLink -> { + // chat variable is available in ComposeView scope — it's the destination chat + val cInfo = chat.chatInfo + val sendAsGroup = cInfo.groupInfo?.let { it.useRelays && it.membership.memberRole >= GroupMemberRole.Owner } ?: false + withBGApi { + val mc = chatModel.controller.apiShareChatMsgContent( + chat.remoteHostId, ChatType.Group, shared.groupInfo.groupId, + cInfo.chatType, cInfo.apiId, + cInfo.groupChatScope(), sendAsGroup + ) + if (mc is MsgContent.MCChat) { + composeState.value = composeState.value.copy( + preview = ComposePreview.ChatLinkPreview(mc.chatLink, mc.ownerSig) + ) + } else if (mc != null) { + AlertManager.shared.showAlertMsg( + generalGetString(MR.strings.error_sharing_channel), + mc.toString() + ) + } + } +} +``` + +Note: `chat` is available as a parameter in the ComposeView composable scope. `withBGApi` is needed because `apiShareChatMsgContent` is a suspend function and `LaunchedEffect` already runs in a coroutine but the API call should use the standard error handling pattern. + +### 3.7 Handle `SharedContent.ChatLink` in `ShareListView.kt` (line 33-54) + +Add filtering case in the `when (sharedContent)` block: +```kotlin +is SharedContent.ChatLink -> { + hasSimplexLink = true // chat cards ARE simplex links, prohibited by SimplexLinks group pref +} +``` + +This means in `ShareListNavLinkView` (line 44): `simplexLinkProhibited = hasSimplexLink && !chat.groupFeatureEnabled(GroupFeature.SimplexLinks)` — groups where simplex links are disabled will show as prohibited (disabled row + alert on tap). Direct chats and local notes are unaffected (line 30-31 don't check simplex links for direct). + +### 3.8 Handle `SharedContent.ChatLink` in `ShareListNavLinkView.kt` (line 28-67) + +The existing `when (chat.chatInfo)` dispatch handles click actions per chat type. For `SharedContent.ChatLink`, the click action (line 37 `directChatAction`, line 54 `groupChatAction`) opens the destination chat. `ComposeView`'s `LaunchedEffect` (§3.6) then picks up the `SharedContent.ChatLink` and sets up the compose preview. + +No changes needed to `ShareListNavLinkView` click handlers — they already open the correct chat. The `SharedContent.ChatLink` is consumed by `ComposeView`. + +### 3.9 Handle `SharedContent.ChatLink` in `ShareListToolbar` (line 142-147) + +Add title for the share list toolbar: +```kotlin +is SharedContent.ChatLink -> stringResource(MR.strings.share_channel) +``` + +### 3.10 Handle back navigation from share list with `SharedContent.ChatLink` (line 126-133) + +When user taps back on the share list with `SharedContent.ChatLink`, should navigate back to the source chat (like Forward navigates back to `fromChatInfo.id`): +```kotlin +if (sharedContent is SharedContent.ChatLink) { + chatModel.chatId.value = sharedContent.groupInfo.id +} +``` + +--- + +## 4. New composables + +### 4.1 `ComposeChatLinkView.kt` (new file) + +Near `ComposeView.kt`. Shows ProfileImage + displayName + optional shortDescription. Cancel button. Mirrors iOS `ComposeChatLinkView`. + +### 4.2 `CIChatLinkHeader.kt` (new file) + +Near `FramedItemView.kt`. Shows profile header (image + name + fullName), shortDescription, info line, "Tap to open" + meta. Mirrors iOS `CIChatLinkHeader`. + +--- + +## 5. Message rendering — `FramedItemView.kt` + +### 5.1 Add `MCChat` case in content dispatch (line ~296-341) + +After the `MCLink` case: +```kotlin +is MsgContent.MCChat -> { + val hasText = mc.text != mc.chatLink.connLinkStr + CIChatLinkHeader(chatItem = ci, chatLink = mc.chatLink, ownerSig = mc.ownerSig, hasText = hasText) + // tap gesture → planAndConnect(mc.chatLink.connLinkStr, linkOwnerSig = mc.ownerSig) + if (hasText) { + CIMarkdownText(..., stripLink = mc.chatLink.connLinkStr) + } +} +``` + +### 5.2 Add `MCChat` case in quote dispatch (line ~142-183) + +```kotlin +is MsgContent.MCChat -> { + val prefix = buildAnnotatedString { + append(mc.chatLink.displayName) + append(if (mc.text != mc.chatLink.connLinkStr) " - " else "") + } + CIQuotedMsgView(qi, stripLink = mc.chatLink.connLinkStr, prefix = prefix) + // + small icon +} +``` + +### 5.3 Add `stripLink` parameter to text rendering + +`CIMarkdownText` / `MarkdownText` (TextItemView.kt) needs `stripLink: String? = null` parameter. Inside, strip the text and formattedText before rendering. + +Add `stripTextLink` and `stripFormattedTextLink` functions near `MarkdownText`: + +```kotlin +fun stripTextLink(text: String, link: String): String = + if (text == link) "" + else if (text.endsWith("\n$link")) text.dropLast(link.length + 1) + else text + +fun stripFormattedTextLink(ft: List?, link: String): List? { + if (ft == null || ft.isEmpty() || ft.last().text != link) return ft + val result = ft.toMutableList() + result.removeLast() + val i = result.lastIndex + if (i >= 0 && result[i].format == null && result[i].text.endsWith("\n")) { + result[i] = result[i].copy(text = result[i].text.dropLast(1)) + if (result[i].text.isEmpty()) result.removeLast() + } + return result.ifEmpty { null } +} +``` + +--- + +## 6. Chat list preview — `ChatPreviewView.kt` + +### 6.1 Add content preview for `MCChat` (line ~293-337) + +```kotlin +is MsgContent.MCChat -> { + SmallContentPreview(borderColor = if (mc.chatLink.image != null) ...) { + ProfileImage(mc.chatLink.image, mc.chatLink.iconName, size) + // onClick → planAndConnect + } +} +``` + +### 6.2 Update text preview (line ~217-290) + +For `MCChat`, show `displayName + description` instead of raw text: +```kotlin +is MsgContent.MCChat -> { + val descr = mc.chatLink.shortDescription?.let { "\n$it" } ?: "" + itemText = mc.chatLink.displayName + descr + formattedText = null +} +``` + +--- + +## 7. Context/forwarding view — `ContextItemView.kt` + +### 7.1 Add `MCChat` attachment icon (line 75-84, `fun attachment()`) + +```kotlin +is MsgContent.MCChat -> mc.chatLink.smallIconRes +``` + +This returns the small icon (e.g., `MR.images.ic_bigtop_updates` for channels). The icon is rendered inline via the existing `inlineContent` mechanism in `MessageText` (line 42-58). + +### 7.2 Add `MCChat` case in `ContextMsgPreview` or `MessageText` (line 87-89) + +For MCChat, `MessageText` needs: +1. The attachment icon (from §7.1) — rendered inline by existing mechanism +2. `prefix` with `chatLink.displayName + " - "` (or just displayName if no text) — `MarkdownText` already has `prefix: AnnotatedString?` +3. `stripLink = chatLink.connLinkStr` — strips the link from text + +Modify `ContextMsgPreview` (line 87-89) or add a special case: +```kotlin +fun ContextMsgPreview(contextItem: ChatItem, lines: Int) { + val mc = contextItem.content.msgContent + if (mc is MsgContent.MCChat) { + val hasText = contextItem.text != mc.chatLink.connLinkStr + val prefix = buildAnnotatedString { append(mc.chatLink.displayName + if (hasText) " - " else "") } + MessageText(contextItem, mc.chatLink.smallIconRes, lines, prefix = prefix, stripLink = mc.chatLink.connLinkStr) + } else { + MessageText(contextItem, remember(contextItem.id) { attachment(contextItem) }, lines) + } +} +``` + +This requires `MessageText` to accept optional `prefix` and `stripLink` parameters and pass them to `MarkdownText`. + +--- + +## 8. Group link / info views + +### 8.1 `GroupLinkView.kt` (line ~27) + +Add parameter: `groupInfo: GroupInfo? = null`. +Add "Share via chat" button when `groupInfo?.groupProfile?.publicGroup != null`. +Button action: `chatModel.sharedContent.value = SharedContent.ChatLink(groupInfo)` + close modals + navigate to chat list. + +### 8.2 `GroupChatInfoView.kt` + +Add "Share via chat" button in the channel link section (next to existing "Share link" button). +Button action: same as 8.1 — sets `SharedContent.ChatLink` and navigates. + +No `composeState` parameter needed (unlike iOS) — the `SharedContent` pattern handles state transfer without bindings. + +### 8.3 Channel creation (equivalent of `AddChannelView`) + +Find the Kotlin channel creation flow and pass `groupInfo` to `GroupLinkView` so "Share via chat" is available during creation. + +### 8.4 Share flow summary (no separate `shareChatLink` function needed) + +Unlike iOS which has a separate `shareChatLink` free function (due to sheet-based navigation), Kotlin's flow is: + +1. User taps "Share via chat" → `chatModel.sharedContent.value = SharedContent.ChatLink(groupInfo)` + `chatModel.chatId.value = null` (navigates to chat list showing `ShareListView`) +2. `ShareListView` shows filtered chats with `hasSimplexLink = true` prohibition +3. User picks destination → `directChatAction`/`groupChatAction` opens the chat +4. `ComposeView`'s `LaunchedEffect` fires (§3.6) → calls `apiShareChatMsgContent` → sets `ComposePreview.ChatLinkPreview` +5. User types optional text, taps Send +6. Send dispatch (§3.5) constructs `MCChat(text + link, chatLink, ownerSig)` and sends + +The API call happens in `ComposeView`'s `LaunchedEffect`, not in a separate function. Error handling: if the API fails, show alert and clear `sharedContent`. + +For the **channel creation flow** (no chat open yet): when `SharedContent.ChatLink` is consumed in `ComposeView` and the API call succeeds, the preview is set directly. No draft fallback needed — the chat IS already open at that point (the user picked it from the share list). + +--- + +## 9. Connect flow + +### 9.1 Update `planAndConnect` equivalent + +Add `linkOwnerSig: LinkOwnerSig? = null` parameter. Pass to `apiConnectPlan`. Thread `ownerVerification` from plan result to connect alerts. + +### 9.2 Add `ownerVerificationMessage` function + +```kotlin +fun ownerVerificationMessage(ov: OwnerVerification?): String? = when (ov) { + is OwnerVerification.Verified -> generalGetString(MR.strings.link_signature_verified) + is OwnerVerification.Failed -> "⚠️ " + String.format(generalGetString(MR.strings.signature_verification_failed), ov.reason) + null -> null +} +``` + +### 9.3 Update connect alerts + +Add `information: String? = null` parameter to `AlertManager.showOpenChatAlert` (`AlertManager.kt` line 271). Render as a separate `Text` below subtitle with `MaterialTheme.colors.onSurface` color (not secondary — more prominent). + +Update `showPrepareContactAlert` (ConnectPlan.kt line 572) and `showPrepareGroupAlert` (line 612) to accept and pass `ownerVerification`. Thread from `planAndConnectTask` `.Ok` cases. + +--- + +## 10. String resources + +Add to `strings.xml` (all platforms). No collisions found with existing keys: +- `chat_link_channel` = "Channel link" +- `chat_link_group` = "Group link" +- `chat_link_business_address` = "Business address" +- `chat_link_contact_address` = "Contact address" +- `chat_link_one_time` = "One-time link" +- `chat_link_from_owner` = "(from owner)" +- `chat_link_signed` = "(signed)" +- `owner_verification_passed` = "Link signature verified." +- `owner_verification_failed` = "⚠️ Signature verification failed: %s." +- `error_sharing_channel` = "Error sharing channel" +- `share_via_chat` = "Share via chat" +- `share_channel` = "Share channel" +- `tap_to_open` = "Tap to open" + +--- + +## Resolved decisions (from investigation) + +### 1. Icon resource names (verified from `ChatModel.kt` and MR/images/) +- **Channel**: `MR.images.ic_bigtop_updates_padded` (used in `GroupInfo.chatIconName` when `useRelays`) +- **Group**: `MR.images.ic_supervised_user_circle_filled` (used in `GroupInfo.chatIconName` default) +- **Business**: `MR.images.ic_work_filled_padded` (used in `GroupInfo.chatIconName` business case) +- **Contact**: `MR.images.ic_account_circle_filled` (used in `Contact.chatIconName`) +- **Small (inline text) icons**: `MR.images.ic_bigtop_updates` (channel), `MR.images.ic_group` (group), `MR.images.ic_work` (business), `MR.images.ic_person` (contact/invitation) + +### 2. MsgChatLink JSON serialization +Existing `@Serializable` sealed class with `@SerialName` annotations already produces `{"type": "group", ...}` format. No custom serializer needed (confirmed by user). Keep existing pattern. + +### 3. Forwarding/sharing picker pattern +Kotlin uses `SharedContent` + navigate to chat list, NOT a sheet picker: +- Forward: sets `chatModel.sharedContent.value = SharedContent.Forward(items, fromInfo)` + `chatModel.chatId.value = null` (returns to chat list) +- Share: add `SharedContent.ChatLink(groupInfo: GroupInfo)` case → sets `sharedContent` → user picks chat from `ShareListView` → opens chat with `ChatLinkPreview` in compose + +`ShareListView.kt` (line 44) dispatches on `SharedContent` type for filtering. Add `SharedContent.ChatLink` case there with `hasSimplexLink = true` filtering. + +### 4. Navigation after share +- `ModalManager.closeAllModalsEverywhere()` dismisses all modals +- Setting `chatModel.chatId.value = chatId` navigates to a chat +- For the share flow: `shareChatLink` calls API → on success → `ModalManager.closeAllModalsEverywhere()` → sets `composeState` preview → sets `chatModel.chatId.value = destChat.id` + +### 5. Draft mechanism (verified at `ChatModel.kt:203-204`) +Same as iOS: `chatModel.draft: MutableState` and `chatModel.draftChatId: MutableState`. Used in `ComposeView.kt:435-444` for save/restore. Same fallback pattern as iOS for the channel creation flow. + +### 6. `planAndConnect` (verified at `ConnectPlan.kt:24-48`) +Single function `suspend fun planAndConnect(rhId, shortOrFullLink, close, cleanup, filterKnownContact, filterKnownGroup)` in `ConnectPlan.kt`. Add `linkOwnerSig: LinkOwnerSig? = null` parameter. Thread to `apiConnectPlan`. Thread `ownerVerification` to alert functions. + +Alert functions: `showPrepareContactAlert` (line 572) and `showPrepareGroupAlert` (line 612) use `AlertManager.privacySensitive.showOpenChatAlert(...)` which has `subtitle: String?`. Add `information: String? = null` parameter. + +### 7. Forwarding view parameterization +No `ChatItemForwardingView` to parameterize — Kotlin uses `ShareListView` which dispatches on `SharedContent` type. Add a new `SharedContent.ChatLink` case. `ShareListView` filters chats and shows the list. When user picks a chat, `ComposeView` reads `sharedContent` and sets compose state accordingly (line 1439: `is SharedContent.Forward -> composeState.value = ...`). Add handling for `SharedContent.ChatLink`. + +### 8. String resource naming +Need to check existing strings to avoid collisions. Use `chat_link_channel`, `chat_link_group`, etc. prefix pattern to avoid collision with existing `group_link` string. From a7c6f0af9570679f84555da4d4a9c4201bf4c40f Mon Sep 17 00:00:00 2001 From: Evgeny Date: Sun, 19 Apr 2026 14:13:13 +0100 Subject: [PATCH 040/152] ui: fix link icons, use backward compatible Java api (#6839) Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- apps/ios/Shared/Views/NewChat/AddChannelView.swift | 4 ++-- apps/ios/Shared/Views/NewChat/AddGroupView.swift | 2 +- .../chat/simplex/common/views/chat/item/TextItemView.kt | 2 +- .../chat/simplex/common/views/chatlist/ShareListView.kt | 2 +- .../chat/simplex/common/views/newchat/AddChannelView.kt | 4 ++-- .../kotlin/chat/simplex/common/views/newchat/AddGroupView.kt | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/ios/Shared/Views/NewChat/AddChannelView.swift b/apps/ios/Shared/Views/NewChat/AddChannelView.swift index e3409029e5..5a07084fa6 100644 --- a/apps/ios/Shared/Views/NewChat/AddChannelView.swift +++ b/apps/ios/Shared/Views/NewChat/AddChannelView.swift @@ -47,7 +47,7 @@ struct AddChannelView: View { Group { ZStack(alignment: .center) { ZStack(alignment: .topTrailing) { - ProfileImage(imageStr: profile.image, size: 128) + ProfileImage(imageStr: profile.image, iconName: "antenna.radiowaves.left.and.right.circle.fill", size: 128) if profile.image != nil { Button { profile.image = nil @@ -256,7 +256,7 @@ struct AddChannelView: View { let total = groupRelays.count return List { Group { - ProfileImage(imageStr: gInfo.groupProfile.image, size: 128) + ProfileImage(imageStr: gInfo.groupProfile.image, iconName: "antenna.radiowaves.left.and.right.circle.fill", size: 128) .frame(maxWidth: .infinity, alignment: .center) Text(gInfo.groupProfile.displayName) diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index c74e016974..87cf377623 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -68,7 +68,7 @@ struct AddGroupView: View { Group { ZStack(alignment: .center) { ZStack(alignment: .topTrailing) { - ProfileImage(imageStr: profile.image, size: 128) + ProfileImage(imageStr: profile.image, iconName: "person.2.circle.fill", size: 128) if profile.image != nil { Button { profile.image = nil diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt index 9db87b156d..15d67d8e20 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/item/TextItemView.kt @@ -544,7 +544,7 @@ fun stripTextLink(text: String, link: String): String = fun stripFormattedTextLink(ft: List?, link: String): List? { if (ft == null || ft.isEmpty() || ft.last().text != link) return ft val result = ft.toMutableList() - result.removeLast() + result.removeAt(result.lastIndex) val i = result.lastIndex if (i >= 0 && result[i].format == null && result[i].text.endsWith("\n")) { result[i] = FormattedText(result[i].text.dropLast(1), null) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt index cf92ec2f49..2be17052ad 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ShareListView.kt @@ -196,7 +196,7 @@ private fun ShareList( val oneHandUI = remember { appPrefs.oneHandUI.state } val chats by remember(search) { derivedStateOf { - val sorted = chatModel.chats.value.toList().filter { it.chatInfo.ready }.sortedByDescending { it.chatInfo is ChatInfo.Local } + val sorted = chatModel.chats.value.toList().filter { it.chatInfo.ready && it.chatInfo.sendMsgEnabled }.sortedByDescending { it.chatInfo is ChatInfo.Local } filteredChats(mutableStateOf(false), mutableStateOf(null), search, sorted) } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt index 2f030ef1dc..a0e1359e90 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt @@ -249,7 +249,7 @@ private fun ProfileStepView( ) { Box(contentAlignment = Alignment.TopEnd) { Box(contentAlignment = Alignment.Center) { - ProfileImage(108.dp, image = profileImage.value) + ProfileImage(108.dp, image = profileImage.value, icon = MR.images.ic_bigtop_updates_circle_filled) EditImageButton { scope.launch { bottomSheetModalState.show() } } } if (profileImage.value != null) { @@ -376,7 +376,7 @@ private fun ProgressStepView( Modifier.fillMaxWidth().padding(bottom = 8.dp), contentAlignment = Alignment.Center ) { - ProfileImage(108.dp, image = gInfo.groupProfile.image) + ProfileImage(108.dp, image = gInfo.groupProfile.image, icon = MR.images.ic_bigtop_updates_circle_filled) } Text( gInfo.groupProfile.displayName, diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt index 0494cbb463..d197460e2e 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt @@ -108,7 +108,7 @@ fun AddGroupLayout( ) { Box(contentAlignment = Alignment.TopEnd) { Box(contentAlignment = Alignment.Center) { - ProfileImage(108.dp, image = profileImage.value) + ProfileImage(108.dp, image = profileImage.value, icon = MR.images.ic_supervised_user_circle_filled) EditImageButton { scope.launch { bottomSheetModalState.show() } } } if (profileImage.value != null) { From 2eb25d124fab3a6df078c30dde2a121b594a2cc9 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 20 Apr 2026 08:17:42 +0000 Subject: [PATCH 041/152] core, ui: better error on failed channel creation (#6825) --- apps/ios/Shared/Model/AppAPITypes.swift | 8 ++ apps/ios/Shared/Model/SimpleXAPI.swift | 32 ++++++- .../Shared/Views/NewChat/AddChannelView.swift | 35 +++++-- .../chat/simplex/common/model/SimpleXAPI.kt | 36 ++++++- .../common/views/newchat/AddChannelView.kt | 40 +++++--- .../commonMain/resources/MR/base/strings.xml | 4 + bots/api/COMMANDS.md | 5 + bots/api/TYPES.md | 10 ++ bots/src/API/Docs/Commands.hs | 2 +- bots/src/API/Docs/Responses.hs | 1 + bots/src/API/Docs/Types.hs | 2 + .../types/typescript/src/commands.ts | 2 +- .../types/typescript/src/responses.ts | 8 ++ .../types/typescript/src/types.ts | 5 + src/Simplex/Chat/Controller.hs | 9 ++ src/Simplex/Chat/Library/Commands.hs | 95 +++++++++++-------- .../SQLite/Migrations/chat_query_plans.txt | 4 + src/Simplex/Chat/View.hs | 9 ++ tests/ChatTests/Groups.hs | 28 ++++++ 19 files changed, 268 insertions(+), 67 deletions(-) diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift index 6c7544e724..c93cc233f5 100644 --- a/apps/ios/Shared/Model/AppAPITypes.swift +++ b/apps/ios/Shared/Model/AppAPITypes.swift @@ -942,6 +942,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { // group responses case groupCreated(user: UserRef, groupInfo: GroupInfo) case publicGroupCreated(user: UserRef, groupInfo: GroupInfo, groupLink: GroupLink, groupRelays: [GroupRelay]) + case publicGroupCreationFailed(user: UserRef, addRelayResults: [AddRelayResult]) case groupRelays(user: UserRef, groupInfo: GroupInfo, groupRelays: [GroupRelay]) case sentGroupInvitation(user: UserRef, groupInfo: GroupInfo, contact: Contact, member: GroupMember) case userAcceptedGroupSent(user: UserRef, groupInfo: GroupInfo, hostContact: Contact?) @@ -994,6 +995,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { switch self { case .groupCreated: "groupCreated" case .publicGroupCreated: "publicGroupCreated" + case .publicGroupCreationFailed: "publicGroupCreationFailed" case .groupRelays: "groupRelays" case .sentGroupInvitation: "sentGroupInvitation" case .userAcceptedGroupSent: "userAcceptedGroupSent" @@ -1042,6 +1044,7 @@ enum ChatResponse2: Decodable, ChatAPIResult { switch self { case let .groupCreated(u, groupInfo): return withUser(u, String(describing: groupInfo)) case let .publicGroupCreated(u, groupInfo, groupLink, groupRelays): return withUser(u, "groupInfo: \(groupInfo)\ngroupLink: \(groupLink)\ngroupRelays: \(groupRelays)") + case let .publicGroupCreationFailed(u, addRelayResults): return withUser(u, "addRelayResults: \(addRelayResults)") case let .groupRelays(u, groupInfo, groupRelays): return withUser(u, "groupInfo: \(groupInfo)\ngroupRelays: \(groupRelays)") case let .sentGroupInvitation(u, groupInfo, contact, member): return withUser(u, "groupInfo: \(groupInfo)\ncontact: \(contact)\nmember: \(member)") case let .userAcceptedGroupSent(u, groupInfo, hostContact): return withUser(u, "groupInfo: \(groupInfo)\nhostContact: \(String(describing: hostContact))") @@ -1981,6 +1984,11 @@ struct RelayConnectionResult: Decodable { var relayError: ChatError? } +struct AddRelayResult: Decodable { + var relay: UserChatRelay + var relayError: ChatError? +} + enum ProtocolTestStep: String, Decodable, Equatable { case connect case disconnect diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift index 94707c6602..20653ab9db 100644 --- a/apps/ios/Shared/Model/SimpleXAPI.swift +++ b/apps/ios/Shared/Model/SimpleXAPI.swift @@ -1117,6 +1117,27 @@ private func apiConnectResponseAlert(_ r: APIResult) -> Alert { } } +func connErrorText(_ e: ChatError) -> String { + switch e { + case .error(.invalidConnReq): + NSLocalizedString("Invalid connection link", comment: "conn error description") + case .error(.unsupportedConnReq): + NSLocalizedString("Unsupported connection link", comment: "conn error description") + case .errorAgent(.SMP(_, .AUTH)): + NSLocalizedString("Connection error (AUTH)", comment: "conn error description") + case let .errorAgent(.SMP(_, .BLOCKED(info))): + NSLocalizedString("Connection blocked: \(info.reason.text)", comment: "conn error description") + case .errorAgent(.SMP(_, .QUOTA)): + NSLocalizedString("The connection reached the limit of undelivered messages", comment: "conn error description") + default: + if getNetworkErrorAlert(e) != nil { + NSLocalizedString("Network error", comment: "conn error description") + } else { + "\(NSLocalizedString("Error", comment: "conn error description")): \(responseError(e))" + } + } +} + func contactAlreadyExistsAlert(_ contact: Contact) -> Alert { mkAlert( title: "Contact already exists", @@ -1847,12 +1868,19 @@ func apiNewGroup(incognito: Bool, groupProfile: GroupProfile) throws -> GroupInf throw r.unexpected } -func apiNewPublicGroup(incognito: Bool, relayIds: [Int64], groupProfile: GroupProfile) async throws -> (GroupInfo, GroupLink, [GroupRelay])? { +enum PublicGroupCreationResult { + case created(GroupInfo, GroupLink, [GroupRelay]) + case creationFailed([AddRelayResult]) +} + +func apiNewPublicGroup(incognito: Bool, relayIds: [Int64], groupProfile: GroupProfile) async throws -> PublicGroupCreationResult? { let userId = try currentUserId("apiNewPublicGroup") let r: APIResult? = await chatApiSendCmdWithRetry(.apiNewPublicGroup(userId: userId, incognito: incognito, relayIds: relayIds, groupProfile: groupProfile)) switch r { case let .result(.publicGroupCreated(_, groupInfo, groupLink, groupRelays)): - return (groupInfo, groupLink, groupRelays) + return .created(groupInfo, groupLink, groupRelays) + case let .result(.publicGroupCreationFailed(_, addRelayResults)): + return .creationFailed(addRelayResults) default: if let r { throw r.unexpected } else { return nil } } } diff --git a/apps/ios/Shared/Views/NewChat/AddChannelView.swift b/apps/ios/Shared/Views/NewChat/AddChannelView.swift index 5a07084fa6..3951d8261e 100644 --- a/apps/ios/Shared/Views/NewChat/AddChannelView.swift +++ b/apps/ios/Shared/Views/NewChat/AddChannelView.swift @@ -174,20 +174,32 @@ struct AddChannelView: View { } return } - guard let (gInfo, gLink, gRelays) = try await apiNewPublicGroup( + guard let result = try await apiNewPublicGroup( incognito: false, relayIds: relayIds, groupProfile: profile ) else { await MainActor.run { creationInProgress = false } return } - await MainActor.run { - m.updateGroup(gInfo) - m.creatingChannelId = gInfo.id - groupInfo = gInfo - groupLink = gLink - groupRelays = gRelays.sorted { relayDisplayName($0) < relayDisplayName($1) } - channelRelaysModel.set(groupId: gInfo.groupId, groupRelays: gRelays) - creationInProgress = false + switch result { + case let .created(gInfo, gLink, gRelays): + await MainActor.run { + m.updateGroup(gInfo) + m.creatingChannelId = gInfo.id + groupInfo = gInfo + groupLink = gLink + groupRelays = gRelays.sorted { relayDisplayName($0) < relayDisplayName($1) } + channelRelaysModel.set(groupId: gInfo.groupId, groupRelays: gRelays) + creationInProgress = false + } + case let .creationFailed(relayResults): + await MainActor.run { + creationInProgress = false + showAlert( + NSLocalizedString("Error creating channel", comment: "alert title"), + message: NSLocalizedString("Relay results:", comment: "alert message") + "\n" + + relayResults.map { "\(chatRelayDisplayName($0.relay)): \($0.relayError.map { connErrorText($0) } ?? "ok")" }.joined(separator: "\n") + ) + } } } catch { await MainActor.run { @@ -429,6 +441,11 @@ func relayDisplayName(_ relay: GroupRelay) -> String { return "relay \(relay.groupRelayId)" } +private func chatRelayDisplayName(_ relay: UserChatRelay) -> String { + if !relay.displayName.isEmpty { return relay.displayName } + return relay.address +} + func relayStatusIndicator(_ status: RelayStatus, connFailed: Bool = false, memberStatus: GroupMemberStatus? = nil) -> some View { let removed = memberStatus.map { [.memLeft, .memRemoved, .memGroupDeleted].contains($0) } ?? false let color: Color = connFailed || removed ? .red : (status == .rsActive ? .green : .yellow) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt index d4f1fa203d..a1ff579c27 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/SimpleXAPI.kt @@ -1564,6 +1564,23 @@ object ChatController { } } + fun connErrorText(e: ChatError): String = when { + e is ChatError.ChatErrorChat && e.errorType is ChatErrorType.InvalidConnReq -> + generalGetString(MR.strings.invalid_connection_link) + e is ChatError.ChatErrorChat && e.errorType is ChatErrorType.UnsupportedConnReq -> + generalGetString(MR.strings.unsupported_connection_link) + e is ChatError.ChatErrorAgent && e.agentError is AgentErrorType.SMP && e.agentError.smpErr is SMPErrorType.AUTH -> + generalGetString(MR.strings.connection_error_auth) + e is ChatError.ChatErrorAgent && e.agentError is AgentErrorType.SMP && e.agentError.smpErr is SMPErrorType.BLOCKED -> + "${generalGetString(MR.strings.connection_error_blocked)}: ${e.agentError.smpErr.blockInfo.reason.text}" + e is ChatError.ChatErrorAgent && e.agentError is AgentErrorType.SMP && e.agentError.smpErr is SMPErrorType.QUOTA -> + generalGetString(MR.strings.connection_reached_limit_of_undelivered_messages) + e is ChatError.ChatErrorAgent && e.agentError is AgentErrorType.BROKER -> + generalGetString(MR.strings.network_error) + else -> + "${generalGetString(MR.strings.error_prefix)}: ${e.string}" + } + suspend fun apiPrepareContact(rh: Long?, connLink: CreatedConnLink, contactShortLinkData: ContactShortLinkData): Chat? { val userId = try { currentUserId("apiPrepareContact") } catch (e: Exception) { return null } val r = sendCmd(rh, CC.APIPrepareContact(userId, connLink, contactShortLinkData)) @@ -2118,10 +2135,16 @@ object ChatController { return null } - suspend fun apiNewPublicGroup(rh: Long?, incognito: Boolean, relayIds: List, groupProfile: GroupProfile): Triple>? { + sealed class PublicGroupCreationResult { + data class Created(val groupInfo: GroupInfo, val groupLink: GroupLink, val groupRelays: List): PublicGroupCreationResult() + data class CreationFailed(val addRelayResults: List): PublicGroupCreationResult() + } + + suspend fun apiNewPublicGroup(rh: Long?, incognito: Boolean, relayIds: List, groupProfile: GroupProfile): PublicGroupCreationResult? { val userId = kotlin.runCatching { currentUserId("apiNewPublicGroup") }.getOrElse { return null } val r = sendCmdWithRetry(rh, CC.ApiNewPublicGroup(userId, incognito, relayIds, groupProfile)) - if (r is API.Result && r.res is CR.PublicGroupCreated) return Triple(r.res.groupInfo, r.res.groupLink, r.res.groupRelays) + if (r is API.Result && r.res is CR.PublicGroupCreated) return PublicGroupCreationResult.Created(r.res.groupInfo, r.res.groupLink, r.res.groupRelays) + if (r is API.Result && r.res is CR.PublicGroupCreationFailed) return PublicGroupCreationResult.CreationFailed(r.res.addRelayResults) if (r != null) throw Exception("${r.responseType}: ${r.details}") return null } @@ -4569,6 +4592,12 @@ data class RelayConnectionResult( val relayError: ChatError? = null ) +@Serializable +data class AddRelayResult( + val relay: UserChatRelay, + val relayError: ChatError? = null +) + @Serializable data class GroupShortLinkInfo( val direct: Boolean, @@ -6345,6 +6374,7 @@ sealed class CR { // group events @Serializable @SerialName("groupCreated") class GroupCreated(val user: UserRef, val groupInfo: GroupInfo): CR() @Serializable @SerialName("publicGroupCreated") class PublicGroupCreated(val user: UserRef, val groupInfo: GroupInfo, val groupLink: GroupLink, val groupRelays: List): CR() + @Serializable @SerialName("publicGroupCreationFailed") class PublicGroupCreationFailed(val user: UserRef, val addRelayResults: List): CR() @Serializable @SerialName("groupRelays") class GroupRelays(val user: UserRef, val groupInfo: GroupInfo, val groupRelays: List): CR() @Serializable @SerialName("sentGroupInvitation") class SentGroupInvitation(val user: UserRef, val groupInfo: GroupInfo, val contact: Contact, val member: GroupMember): CR() @Serializable @SerialName("userAcceptedGroupSent") class UserAcceptedGroupSent (val user: UserRef, val groupInfo: GroupInfo, val hostContact: Contact? = null): CR() @@ -6533,6 +6563,7 @@ sealed class CR { is ForwardPlan -> "forwardPlan" is GroupCreated -> "groupCreated" is PublicGroupCreated -> "publicGroupCreated" + is PublicGroupCreationFailed -> "publicGroupCreationFailed" is GroupRelays -> "groupRelays" is SentGroupInvitation -> "sentGroupInvitation" is UserAcceptedGroupSent -> "userAcceptedGroupSent" @@ -6714,6 +6745,7 @@ sealed class CR { is ForwardPlan -> withUser(user, "itemsCount: $itemsCount\nchatItemIds: ${json.encodeToString(chatItemIds)}\nforwardConfirmation: ${json.encodeToString(forwardConfirmation)}") is GroupCreated -> withUser(user, json.encodeToString(groupInfo)) is PublicGroupCreated -> withUser(user, "groupInfo: $groupInfo\ngroupLink: $groupLink\ngroupRelays: $groupRelays") + is PublicGroupCreationFailed -> withUser(user, "addRelayResults: $addRelayResults") is GroupRelays -> withUser(user, "groupInfo: $groupInfo\ngroupRelays: $groupRelays") is SentGroupInvitation -> withUser(user, "groupInfo: $groupInfo\ncontact: $contact\nmember: $member") is UserAcceptedGroupSent -> json.encodeToString(groupInfo) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt index a0e1359e90..f0bba5c4ec 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt @@ -130,19 +130,31 @@ fun AddChannelView(chatModel: ChatModel, close: () -> Unit, closeAll: () -> Unit relayIds = relayIds, groupProfile = profile ) - if (result != null) { - val (gI, gL, gR) = result - withContext(Dispatchers.Main) { - chatModel.chatsContext.updateGroup(rhId = null, gI) - chatModel.creatingChannelId.value = gI.id - groupInfo.value = gI - groupLink.value = gL - groupRelays.value = gR.sortedBy { relayDisplayName(it) } - ChannelRelaysModel.set(gI.groupId, gR) - creationInProgress.value = false + when (result) { + is ChatController.PublicGroupCreationResult.Created -> { + withContext(Dispatchers.Main) { + chatModel.chatsContext.updateGroup(rhId = null, result.groupInfo) + chatModel.creatingChannelId.value = result.groupInfo.id + groupInfo.value = result.groupInfo + groupLink.value = result.groupLink + groupRelays.value = result.groupRelays.sortedBy { relayDisplayName(it) } + ChannelRelaysModel.set(result.groupInfo.groupId, result.groupRelays) + creationInProgress.value = false + } + } + is ChatController.PublicGroupCreationResult.CreationFailed -> { + withContext(Dispatchers.Main) { + creationInProgress.value = false + AlertManager.shared.showAlertMsg( + title = generalGetString(MR.strings.error_creating_channel), + text = generalGetString(MR.strings.relay_results) + "\n" + + result.addRelayResults.joinToString("\n") { "${chatRelayDisplayName(it.relay)}: ${it.relayError?.let { e -> ChatController.connErrorText(e) } ?: "ok"}" } + ) + } + } + null -> { + withContext(Dispatchers.Main) { creationInProgress.value = false } } - } else { - withContext(Dispatchers.Main) { creationInProgress.value = false } } } catch (e: Exception) { withContext(Dispatchers.Main) { @@ -545,6 +557,10 @@ fun relayDisplayName(relay: GroupRelay): String { return "relay ${relay.groupRelayId}" } +private fun chatRelayDisplayName(relay: UserChatRelay): String { + if (relay.displayName.isNotEmpty()) return relay.displayName + return relay.address +} @Composable fun RelayStatusIndicator(status: RelayStatus, connFailed: Boolean = false, memberStatus: GroupMemberStatus? = null) { diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 0630dffe22..abb1d55942 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -2943,6 +2943,10 @@ Channel name Creating channel Error creating channel + Relay results: + The connection reached the limit of undelivered messages + Network error + Error Cancel creating channel? Cancel Enable at least one chat relay to create a channel. diff --git a/bots/api/COMMANDS.md b/bots/api/COMMANDS.md index 07bb692e0f..ab3ec3d241 100644 --- a/bots/api/COMMANDS.md +++ b/bots/api/COMMANDS.md @@ -983,6 +983,11 @@ PublicGroupCreated: Public group created. - groupLink: [GroupLink](./TYPES.md#grouplink) - groupRelays: [[GroupRelay](./TYPES.md#grouprelay)] +PublicGroupCreationFailed: Public group creation failed. +- type: "publicGroupCreationFailed" +- user: [User](./TYPES.md#user) +- addRelayResults: [[AddRelayResult](./TYPES.md#addrelayresult)] + ChatCmdError: Command error (only used in WebSockets API). - type: "chatCmdError" - chatError: [ChatError](./TYPES.md#chaterror) diff --git a/bots/api/TYPES.md b/bots/api/TYPES.md index ec62577a72..23fc79b634 100644 --- a/bots/api/TYPES.md +++ b/bots/api/TYPES.md @@ -5,6 +5,7 @@ This file is generated automatically. - [ACIReaction](#acireaction) - [AChat](#achat) - [AChatItem](#achatitem) +- [AddRelayResult](#addrelayresult) - [AddressSettings](#addresssettings) - [AgentCryptoError](#agentcryptoerror) - [AgentErrorType](#agenterrortype) @@ -220,6 +221,15 @@ This file is generated automatically. - chatItem: [ChatItem](#chatitem) +--- + +## AddRelayResult + +**Record type**: +- relay: [UserChatRelay](#userchatrelay) +- relayError: [ChatError](#chaterror)? + + --- ## AddressSettings diff --git a/bots/src/API/Docs/Commands.hs b/bots/src/API/Docs/Commands.hs index de91c751d2..ae8ce7c05b 100644 --- a/bots/src/API/Docs/Commands.hs +++ b/bots/src/API/Docs/Commands.hs @@ -117,7 +117,7 @@ chatCommandsDocsData = ("APILeaveGroup", [], "Leave group.", ["CRLeftMemberUser", "CRChatCmdError"], [], Just UNBackground, "/_leave #" <> Param "groupId"), ("APIListMembers", [], "Get group members.", ["CRGroupMembers", "CRChatCmdError"], [], Nothing, "/_members #" <> Param "groupId"), ("APINewGroup", [], "Create group.", ["CRGroupCreated", "CRChatCmdError"], [], Nothing, "/_group " <> Param "userId" <> OnOffParam "incognito" "incognito" (Just False) <> " " <> Json "groupProfile"), - ("APINewPublicGroup", [], "Create public group.", ["CRPublicGroupCreated", "CRChatCmdError"], [], Just UNInteractive, "/_public group " <> Param "userId" <> OnOffParam "incognito" "incognito" (Just False) <> " " <> Join ',' "relayIds" <> " " <> Json "groupProfile"), + ("APINewPublicGroup", [], "Create public group.", ["CRPublicGroupCreated", "CRPublicGroupCreationFailed", "CRChatCmdError"], [], Just UNInteractive, "/_public group " <> Param "userId" <> OnOffParam "incognito" "incognito" (Just False) <> " " <> Join ',' "relayIds" <> " " <> Json "groupProfile"), ("APIGetGroupRelays", [], "Get group relays.", ["CRGroupRelays", "CRChatCmdError"], [], Nothing, "/_get relays #" <> Param "groupId"), ("APIUpdateGroupProfile", [], "Update group profile.", ["CRGroupUpdated", "CRChatCmdError"], [], Just UNBackground, "/_group_profile #" <> Param "groupId" <> " " <> Json "groupProfile") ] diff --git a/bots/src/API/Docs/Responses.hs b/bots/src/API/Docs/Responses.hs index eb67c5670b..c3ab85ece6 100644 --- a/bots/src/API/Docs/Responses.hs +++ b/bots/src/API/Docs/Responses.hs @@ -69,6 +69,7 @@ chatResponsesDocsData = ("CRGroupLinkDeleted", ""), ("CRGroupCreated", ""), ("CRPublicGroupCreated", ""), + ("CRPublicGroupCreationFailed", ""), ("CRGroupRelays", ""), ("CRGroupMembers", ""), ("CRGroupUpdated", ""), diff --git a/bots/src/API/Docs/Types.hs b/bots/src/API/Docs/Types.hs index 18b7d5e43b..e2f67c88c6 100644 --- a/bots/src/API/Docs/Types.hs +++ b/bots/src/API/Docs/Types.hs @@ -202,6 +202,7 @@ chatTypesDocsData = (sti @(ContactUserPref SimplePreference), STUnion, "CUP", [], "", ""), (sti @(ContactUserPreference SimplePreference), STRecord, "", [], "", ""), (sti @(CreatedConnLink 'CMContact), STRecord, "", [], Param "connFullLink" <> Optional "" (" " <> Param "$0") "connShortLink", ""), + (sti @AddRelayResult, STRecord, "", [], "", ""), (sti @AddressSettings, STRecord, "", [], "", ""), (sti @AgentCryptoError, STUnion, "", ["RATCHET_EARLIER", "RATCHET_SKIPPED"], "", ""), -- TODO add fields to types (sti @AgentErrorType, STUnion, "", [], "", ""), @@ -405,6 +406,7 @@ deriving instance Generic (CIReaction c d) deriving instance Generic (ContactUserPref p) deriving instance Generic (ContactUserPreference p) deriving instance Generic (CreatedConnLink m) +deriving instance Generic AddRelayResult deriving instance Generic AddressSettings deriving instance Generic AgentCryptoError deriving instance Generic AgentErrorType diff --git a/packages/simplex-chat-client/types/typescript/src/commands.ts b/packages/simplex-chat-client/types/typescript/src/commands.ts index 2f2b114bfe..36692739dd 100644 --- a/packages/simplex-chat-client/types/typescript/src/commands.ts +++ b/packages/simplex-chat-client/types/typescript/src/commands.ts @@ -351,7 +351,7 @@ export interface APINewPublicGroup { } export namespace APINewPublicGroup { - export type Response = CR.PublicGroupCreated | CR.ChatCmdError + export type Response = CR.PublicGroupCreated | CR.PublicGroupCreationFailed | CR.ChatCmdError export function cmdString(self: APINewPublicGroup): string { return '/_public group ' + self.userId + (self.incognito ? ' incognito=on' : '') + ' ' + self.relayIds.join(',') + ' ' + JSON.stringify(self.groupProfile) diff --git a/packages/simplex-chat-client/types/typescript/src/responses.ts b/packages/simplex-chat-client/types/typescript/src/responses.ts index 8d4f68c000..02aa29444b 100644 --- a/packages/simplex-chat-client/types/typescript/src/responses.ts +++ b/packages/simplex-chat-client/types/typescript/src/responses.ts @@ -28,6 +28,7 @@ export type ChatResponse = | CR.GroupLinkDeleted | CR.GroupCreated | CR.PublicGroupCreated + | CR.PublicGroupCreationFailed | CR.GroupRelays | CR.GroupMembers | CR.GroupUpdated @@ -81,6 +82,7 @@ export namespace CR { | "groupLinkDeleted" | "groupCreated" | "publicGroupCreated" + | "publicGroupCreationFailed" | "groupRelays" | "groupMembers" | "groupUpdated" @@ -258,6 +260,12 @@ export namespace CR { groupRelays: T.GroupRelay[] } + export interface PublicGroupCreationFailed extends Interface { + type: "publicGroupCreationFailed" + user: T.User + addRelayResults: T.AddRelayResult[] + } + export interface GroupRelays extends Interface { type: "groupRelays" user: T.User diff --git a/packages/simplex-chat-client/types/typescript/src/types.ts b/packages/simplex-chat-client/types/typescript/src/types.ts index 9b0934d67b..6f4f0b6525 100644 --- a/packages/simplex-chat-client/types/typescript/src/types.ts +++ b/packages/simplex-chat-client/types/typescript/src/types.ts @@ -17,6 +17,11 @@ export interface AChatItem { chatItem: ChatItem } +export interface AddRelayResult { + relay: UserChatRelay + relayError?: ChatError +} + export interface AddressSettings { businessAddress: boolean autoAccept?: AutoAccept diff --git a/src/Simplex/Chat/Controller.hs b/src/Simplex/Chat/Controller.hs index 3b128a3183..e989e520a5 100644 --- a/src/Simplex/Chat/Controller.hs +++ b/src/Simplex/Chat/Controller.hs @@ -651,6 +651,12 @@ data RelayConnectionResult = RelayConnectionResult } deriving (Show) +data AddRelayResult = AddRelayResult + { relay :: UserChatRelay, + relayError :: Maybe ChatError + } + deriving (Show) + data RelayTestStep = RTSGetLink | RTSDecodeLink @@ -721,6 +727,7 @@ data ChatResponse | CRWelcome {user :: User} | CRGroupCreated {user :: User, groupInfo :: GroupInfo} | CRPublicGroupCreated {user :: User, groupInfo :: GroupInfo, groupLink :: GroupLink, groupRelays :: [GroupRelay]} + | CRPublicGroupCreationFailed {user :: User, addRelayResults :: [AddRelayResult]} | CRGroupRelays {user :: User, groupInfo :: GroupInfo, groupRelays :: [GroupRelay]} | CRGroupMembers {user :: User, group :: Group} | CRMemberSupportChats {user :: User, groupInfo :: GroupInfo, members :: [GroupMember]} @@ -1713,6 +1720,8 @@ $(JQ.deriveJSON (sumTypeJSON $ dropPrefix "TE") ''TerminalEvent) $(JQ.deriveJSON defaultJSON ''RelayConnectionResult) +$(JQ.deriveJSON defaultJSON ''AddRelayResult) + $(JQ.deriveJSON (enumJSON $ dropPrefix "RTS") ''RelayTestStep) $(JQ.deriveJSON defaultJSON ''RelayTestFailure) diff --git a/src/Simplex/Chat/Library/Commands.hs b/src/Simplex/Chat/Library/Commands.hs index 95c5014d41..042280e062 100644 --- a/src/Simplex/Chat/Library/Commands.hs +++ b/src/Simplex/Chat/Library/Commands.hs @@ -2479,13 +2479,29 @@ processChatCommand vr nm = \case APINewPublicGroup userId incognito relayIds groupProfile -> withUserId userId $ \user -> do (gProfile', memberId, groupKeys, setupLink) <- prepareGroupLink user gInfo <- newGroup user incognito gProfile' True memberId (Just groupKeys) (Just 1) - (gLink, groupRelays) <- setupLink gInfo `catchAllErrors` \e -> do + (gLink, results) <- setupLink gInfo `catchAllErrors` \e -> do deleteInProgressGroup user gInfo throwError e - createNewGroupItems user gInfo - pure $ CRPublicGroupCreated user gInfo gLink groupRelays + case partitionEithers (map snd results) of + ([], groupRelays) -> do + createNewGroupItems user gInfo + pure $ CRPublicGroupCreated user gInfo gLink groupRelays + (errors@(e : _), _) -> do + deleteInProgressGroup user gInfo + -- If all errors are temporary (network, timeout, host), throw to allow retry + if all isTempErr errors + then throwError e + else do + let relayResults = map toRelayResult results + toRelayResult (r, Left e) = AddRelayResult r (Just e) + toRelayResult (r, Right _) = AddRelayResult r Nothing + pure $ CRPublicGroupCreationFailed user relayResults where - prepareGroupLink :: User -> CM (GroupProfile, MemberId, GroupKeys, GroupInfo -> CM (GroupLink, [GroupRelay])) + isTempErr :: ChatError -> Bool + isTempErr = \case + ChatErrorAgent {agentError = e} -> temporaryOrHostError e + _ -> False + prepareGroupLink :: User -> CM (GroupProfile, MemberId, GroupKeys, GroupInfo -> CM (GroupLink, [(UserChatRelay, Either ChatError GroupRelay)])) prepareGroupLink user = do gVar <- asks random groupLinkId <- GroupLinkId <$> drgRandomBytes 16 @@ -2514,8 +2530,8 @@ processChatCommand vr nm = \case subRole <- asks $ channelSubscriberRole . config gLink <- withFastStore $ \db -> createGroupLink db gVar user gInfo connId ccLink' groupLinkId subRole subMode relays <- withFastStore $ \db -> mapM (getChatRelayById db user) (L.toList relayIds) - groupRelays <- addRelays user gInfo sLnk relays - pure (gLink, groupRelays) + results <- addRelays user gInfo sLnk relays + pure (gLink, results) pure (groupProfile', memberId, groupKeys, setupLink) NewPublicGroup incognito relayIds gProfile -> withUser $ \User {userId} -> processChatCommand vr nm $ APINewPublicGroup userId incognito relayIds gProfile @@ -3862,44 +3878,43 @@ processChatCommand vr nm = \case toView $ CEvtNewChatItems user [AChatItem SCTDirect SMDSnd (DirectChat ct) ci] forM_ (timed_ >>= timedDeleteAt') $ startProximateTimedItemThread user (ChatRef CTDirect contactId Nothing, chatItemId' ci) - addRelays :: User -> GroupInfo -> ShortLinkContact -> [UserChatRelay] -> CM [GroupRelay] + addRelays :: User -> GroupInfo -> ShortLinkContact -> [UserChatRelay] -> CM [(UserChatRelay, Either ChatError GroupRelay)] addRelays user gInfo@GroupInfo {membership} groupSLink relays = mapConcurrently addRelay relays where - addRelay :: UserChatRelay -> CM GroupRelay + addRelay :: UserChatRelay -> CM (UserChatRelay, Either ChatError GroupRelay) addRelay relay@UserChatRelay {address} = do - -- TODO [relays] owner: track and reuse relay profiles - -- TODO - single profile linked to relay configuration record (chat_relays) - -- TODO - update when fetching link data from relay address - (FixedLinkData {linkConnReq = cReq}, _cData) <- getShortLinkConnReq nm user address - lift (withAgent' $ \a -> connRequestPQSupport a PQSupportOff cReq) >>= \case - Nothing -> throwChatError CEInvalidConnReq - Just (agentV, _) -> do - let chatV = agentToChatVersion agentV - gVar <- asks random - subMode <- chatReadVar subscriptionMode - connId <- withAgent $ \a -> prepareConnectionToJoin a (aUserId user) True cReq PQSupportOff - (relayMember, conn, groupRelay) <- withFastStore $ \db -> do - relayMember <- createRelayForOwner db vr gVar user gInfo relay - groupRelay <- createGroupRelayRecord db gInfo relayMember relay - conn <- createRelayConnection db vr user (groupMemberId' relayMember) connId ConnPrepared chatV subMode - pure (relayMember, conn, groupRelay) - let GroupMember {memberRole = userRole, memberId = userMemberId} = membership - allowSimplexLinks = groupFeatureUserAllowed SGFSimplexLinks gInfo - membershipProfile = redactedMemberProfile allowSimplexLinks $ fromLocalProfile $ memberProfile membership - GroupMember {memberId = relayMemberId} = relayMember - relayInv = GroupRelayInvitation { - fromMember = MemberIdRole userMemberId userRole, - fromMemberProfile = membershipProfile, - relayMemberId, - groupLink = groupSLink - } - dm <- encodeConnInfo $ XGrpRelayInv relayInv - (sqSecured, _serviceId) <- withAgent $ \a -> joinConnection a nm (aUserId user) (aConnId conn) True cReq dm PQSupportOff subMode - let newConnStatus = if sqSecured then ConnSndReady else ConnJoined - withFastStore' $ \db -> do - void $ updateConnectionStatusFromTo db conn ConnPrepared newConnStatus - updateRelayStatusFromTo db groupRelay RSNew RSInvited + r <- tryAllErrors $ do + (FixedLinkData {linkConnReq = cReq}, _cData) <- getShortLinkConnReq nm user address + lift (withAgent' $ \a -> connRequestPQSupport a PQSupportOff cReq) >>= \case + Nothing -> throwChatError CEInvalidConnReq + Just (agentV, _) -> do + let chatV = agentToChatVersion agentV + gVar <- asks random + subMode <- chatReadVar subscriptionMode + connId <- withAgent $ \a -> prepareConnectionToJoin a (aUserId user) True cReq PQSupportOff + (relayMember, conn, groupRelay) <- withFastStore $ \db -> do + relayMember <- createRelayForOwner db vr gVar user gInfo relay + groupRelay <- createGroupRelayRecord db gInfo relayMember relay + conn <- createRelayConnection db vr user (groupMemberId' relayMember) connId ConnPrepared chatV subMode + pure (relayMember, conn, groupRelay) + let GroupMember {memberRole = userRole, memberId = userMemberId} = membership + allowSimplexLinks = groupFeatureUserAllowed SGFSimplexLinks gInfo + membershipProfile = redactedMemberProfile allowSimplexLinks $ fromLocalProfile $ memberProfile membership + GroupMember {memberId = relayMemberId} = relayMember + relayInv = GroupRelayInvitation { + fromMember = MemberIdRole userMemberId userRole, + fromMemberProfile = membershipProfile, + relayMemberId, + groupLink = groupSLink + } + dm <- encodeConnInfo $ XGrpRelayInv relayInv + (sqSecured, _serviceId) <- withAgent $ \a -> joinConnection a nm (aUserId user) (aConnId conn) True cReq dm PQSupportOff subMode + let newConnStatus = if sqSecured then ConnSndReady else ConnJoined + withFastStore' $ \db -> do + void $ updateConnectionStatusFromTo db conn ConnPrepared newConnStatus + updateRelayStatusFromTo db groupRelay RSNew RSInvited + pure (relay, r) privateGetUser :: UserId -> CM User privateGetUser userId = tryAllErrors (withStore (`getUser` userId)) >>= \case diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 231b1a73bf..82ca68a663 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -7131,6 +7131,10 @@ Query: UPDATE groups SET relay_own_status = ?, updated_at = ? WHERE group_id = ? Plan: SEARCH groups USING INTEGER PRIMARY KEY (rowid=?) +Query: UPDATE groups SET relay_request_err_reason = ?, updated_at = ? WHERE group_id = ? +Plan: +SEARCH groups USING INTEGER PRIMARY KEY (rowid=?) + Query: UPDATE groups SET request_shared_msg_id = ? WHERE group_id = ? Plan: SEARCH groups USING INTEGER PRIMARY KEY (rowid=?) diff --git a/src/Simplex/Chat/View.hs b/src/Simplex/Chat/View.hs index ba5d006c25..ce0f55cf01 100644 --- a/src/Simplex/Chat/View.hs +++ b/src/Simplex/Chat/View.hs @@ -180,6 +180,7 @@ chatResponseToView hu cfg@ChatConfig {logLevel, showReactions, testView} liveIte CRContactRequestRejected u UserContactRequest {localDisplayName = c} _ct_ -> ttyUser u [ttyContact c <> ": contact request rejected"] CRGroupCreated u g -> ttyUser u $ viewGroupCreated g testView CRPublicGroupCreated u g _groupLink _relays -> ttyUser u $ viewGroupCreated g testView + CRPublicGroupCreationFailed u results -> ttyUser u $ viewPublicGroupCreationFailed results CRGroupRelays u g relays -> ttyUser u $ viewGroupRelays g relays CRGroupMembers u g -> ttyUser u $ viewGroupMembers g CRMemberSupportChats u g ms -> ttyUser u $ viewMemberSupportChats g ms @@ -1238,6 +1239,14 @@ viewGroupCreated g testView = where relaysInstruction = "wait for selected relay(s) to join, then you can invite members via group link" +viewPublicGroupCreationFailed :: [AddRelayResult] -> [StyledString] +viewPublicGroupCreationFailed results = + ["channel not created, results:"] + <> map showRelayResult results + where + showRelayResult (AddRelayResult UserChatRelay {chatRelayId = DBEntityId i} err_) = + " relay " <> sShow i <> ": " <> maybe "ok" (plain . tshow) err_ + viewCannotResendInvitation :: GroupInfo -> ContactName -> [StyledString] viewCannotResendInvitation g c = [ ttyContact c <> " is already invited to group " <> ttyGroup' g, diff --git a/tests/ChatTests/Groups.hs b/tests/ChatTests/Groups.hs index 9cba9e6b74..1a1bc4b82f 100644 --- a/tests/ChatTests/Groups.hs +++ b/tests/ChatTests/Groups.hs @@ -265,6 +265,7 @@ chatGroupTests = do it "relay should leave channel" testChannelRelayLeave it "owner should update profile in channel (signed)" testChannelOwnerProfileUpdate it "subscriber should update profile in channel (signed)" testChannelSubscriberProfileUpdate + it "should report relay results when one relay deleted its address" testChannelCreateDeletedRelay describe "channel message operations" $ do it "should update channel message" testChannelMessageUpdate it "should delete channel message" testChannelMessageDelete @@ -9539,6 +9540,33 @@ testChannelSubscriberProfileUpdate ps = dan `hasContactProfiles` ["alice", "bob", "kate", "dave"] eve `hasContactProfiles` ["alice", "bob", "kate", "dave", "eve"] +testChannelCreateDeletedRelay :: HasCallStack => TestParams -> IO () +testChannelCreateDeletedRelay ps = + withNewTestChat ps "alice" aliceProfile $ \alice -> do + withNewTestChatOpts ps relayTestOpts "bob" bobProfile $ \bob -> + withNewTestChatOpts ps relayTestOpts "cath" cathProfile $ \cath -> do + bob ##> "/ad" + (bobSLink, _) <- getContactLinks bob True + cath ##> "/ad" + (cathSLink, _) <- getContactLinks cath True + + alice ##> ("/relays name=bob " <> bobSLink <> " name=cath " <> cathSLink) + alice <## "ok" + + -- cath deletes her address - simulates relay becoming unavailable + cath ##> "/da" + cath <## "Your chat address is deleted - accepted contacts will remain connected." + cath <## "To create a new chat address use /ad" + + -- channel creation fails because one relay's address was deleted + alice ##> "/public group relays=1,2 #team" + alice <## "channel not created, results:" + alice <## " relay 1: ok" + alice <##. " relay 2: ChatErrorAgent" + -- deleteInProgressGroup deletes relay connection alice joined on bob; + -- bob's agent reports AUTH error when the queue is gone — drain it. + void $ getTermLine bob + testChannelMessageUpdate :: HasCallStack => TestParams -> IO () testChannelMessageUpdate ps = withNewTestChat ps "alice" aliceProfile $ \alice -> From 260bd676cc0748981a202ff5984d7e82e13c90f2 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 20 Apr 2026 10:58:59 +0000 Subject: [PATCH 042/152] ui: fix channel creation with relays of disabled operator (#6841) --- apps/ios/Shared/Views/NewChat/AddChannelView.swift | 2 ++ .../kotlin/chat/simplex/common/views/newchat/AddChannelView.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/apps/ios/Shared/Views/NewChat/AddChannelView.swift b/apps/ios/Shared/Views/NewChat/AddChannelView.swift index 3951d8261e..4e9a42971c 100644 --- a/apps/ios/Shared/Views/NewChat/AddChannelView.swift +++ b/apps/ios/Shared/Views/NewChat/AddChannelView.swift @@ -222,6 +222,7 @@ struct AddChannelView: View { var operatorGroups: [[UserChatRelay]] = [] var customRelays: [UserChatRelay] = [] for op in servers { + guard op.operator?.enabled ?? true else { continue } let relays = op.chatRelays.filter { $0.enabled && !$0.deleted && $0.chatRelayId != nil } guard !relays.isEmpty else { continue } if op.operator != nil { @@ -256,6 +257,7 @@ struct AddChannelView: View { private func checkHasRelays() async -> Bool { guard let servers = try? await getUserServers() else { return false } return servers.contains { op in + (op.operator?.enabled ?? true) && op.chatRelays.contains { $0.enabled && !$0.deleted && $0.chatRelayId != nil } } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt index f0bba5c4ec..e60fcfc921 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddChannelView.kt @@ -180,6 +180,7 @@ private suspend fun chooseRandomRelays(): List { val operatorGroups = mutableListOf>() var customRelays = mutableListOf() for (op in servers) { + if (op.operator?.enabled == false) continue val relays = op.chatRelays.filter { it.enabled && !it.deleted && it.chatRelayId != null } if (relays.isEmpty()) continue if (op.operator != null) { @@ -212,6 +213,7 @@ private suspend fun chooseRandomRelays(): List { private suspend fun checkHasRelays(): Boolean { val servers = try { getUserServers(rh = null) } catch (_: Exception) { null } ?: return false return servers.any { op -> + (op.operator?.enabled ?: true) && op.chatRelays.any { it.enabled && !it.deleted && it.chatRelayId != null } } } From d3a2c9d08dca16a0c8f9dca2953e06341b6512fa Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 20 Apr 2026 12:10:02 +0100 Subject: [PATCH 043/152] ui: opt-in alert for link previews (#6799) * ios: opt-in alert for link previews * rename back * kotlin: opt-in alert for link previews * reset hints, refactor * refactor hints * move functions * better UX * ios buttons * ios: two buttons * kotlin refactor * kotlin: two buttons * show spinner only after preview decision --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> --- .../Chat/ComposeMessage/ComposeView.swift | 56 ++++++++++--- .../Views/UserSettings/AppSettings.swift | 2 +- .../Views/UserSettings/DeveloperView.swift | 7 ++ .../Views/UserSettings/PrivacySettings.swift | 6 +- .../Views/UserSettings/SettingsView.swift | 4 + apps/ios/SimpleX SE/ShareModel.swift | 3 +- apps/ios/SimpleXChat/AppGroup.swift | 82 ++++++++++--------- .../chat/simplex/common/model/SimpleXAPI.kt | 1 + .../simplex/common/views/chat/ComposeView.kt | 77 +++++++++++++++-- .../commonMain/resources/MR/base/strings.xml | 7 ++ 10 files changed, 180 insertions(+), 65 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift index 29daaf37fa..fd47ddfacb 100644 --- a/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift +++ b/apps/ios/Shared/Views/Chat/ComposeMessage/ComposeView.swift @@ -370,6 +370,8 @@ struct ComposeView: View { @UserDefault(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false @AppStorage(GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS, store: groupDefaults) private var privacySanitizeLinks = false + @AppStorage(GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS, store: groupDefaults) private var useLinkPreviews = true + @AppStorage(GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS_SHOW_ALERT, store: groupDefaults) private var linkPreviewsShowAlert = true @State private var updatingCompose = false @State private var relayListExpanded = false @StateObject private var channelRelaysModel = ChannelRelaysModel.shared @@ -561,7 +563,7 @@ struct ComposeView: View { } else { composeState = composeState.copy(parsedMessage: parsedMsg ?? FormattedText.plain(msg)) } - if composeState.linkPreviewAllowed && UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_LINK_PREVIEWS) { + if composeState.linkPreviewAllowed && useLinkPreviews { if !msg.isEmpty { showLinkPreview(parsedMsg) } else { @@ -1878,21 +1880,55 @@ struct ComposeView: View { // Spec: spec/client/compose.md#loadLinkPreview private func loadLinkPreview(_ urlStr: String) { if pendingLinkUrl == urlStr, let url = URL(string: urlStr) { - composeState = composeState.copy(preview: .linkPreview(linkPreview: nil)) - getLinkPreview(url: url) { linkPreview in - if let linkPreview, pendingLinkUrl == urlStr { - privacyLinkPreviewsShowAlertGroupDefault.set(false) // to avoid showing alert to current users, show alert in v6.5 - composeState = composeState.copy(preview: .linkPreview(linkPreview: linkPreview)) - } else { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - composeState = composeState.copy(preview: .noPreview) + if linkPreviewsShowAlert { + showLinkPreviewsConfirmAlert { enable in + if let enable { + linkPreviewsShowAlert = false + useLinkPreviews = enable + UserDefaults.standard.set(enable, forKey: DEFAULT_PRIVACY_LINK_PREVIEWS) + if enable { + fetchLinkPreview(url, urlStr: urlStr) + } else { + pendingLinkUrl = nil + composeState = composeState.copy(preview: .noPreview) + } + } else { + cancelLinkPreview() } } - pendingLinkUrl = nil + return } + fetchLinkPreview(url, urlStr: urlStr) } } + private func fetchLinkPreview(_ url: URL, urlStr: String) { + composeState = composeState.copy(preview: .linkPreview(linkPreview: nil)) + getLinkPreview(url: url) { linkPreview in + if let linkPreview, pendingLinkUrl == urlStr { + composeState = composeState.copy(preview: .linkPreview(linkPreview: linkPreview)) + } else { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + composeState = composeState.copy(preview: .noPreview) + } + } + pendingLinkUrl = nil + } + } + + private func showLinkPreviewsConfirmAlert(onChoice: @escaping (Bool?) -> Void) { + showAlert( + NSLocalizedString("Enable link previews?", comment: "alert title"), + message: NSLocalizedString("Sending a link preview may reveal your IP address to the website. You can change this in Privacy settings later.", comment: "alert message"), + actions: { + [ + UIAlertAction(title: NSLocalizedString("Disable", comment: "alert button"), style: .destructive) { _ in onChoice(false) }, + UIAlertAction(title: NSLocalizedString("Enable", comment: "alert button"), style: .default) { _ in onChoice(true) } + ] + } + ) + } + private func resetLinkPreview() { linkUrl = nil prevLinkUrl = nil diff --git a/apps/ios/Shared/Views/UserSettings/AppSettings.swift b/apps/ios/Shared/Views/UserSettings/AppSettings.swift index 44e0b20958..8be0798fb1 100644 --- a/apps/ios/Shared/Views/UserSettings/AppSettings.swift +++ b/apps/ios/Shared/Views/UserSettings/AppSettings.swift @@ -76,7 +76,7 @@ extension AppSettings { c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get() c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get() c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get() - c.privacyLinkPreviews = def.bool(forKey: DEFAULT_PRIVACY_LINK_PREVIEWS) + c.privacyLinkPreviews = privacyLinkPreviewsGroupDefault.get() c.privacyShowChatPreviews = def.bool(forKey: DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS) c.privacySaveLastDraft = def.bool(forKey: DEFAULT_PRIVACY_SAVE_LAST_DRAFT) c.privacyProtectScreen = def.bool(forKey: DEFAULT_PRIVACY_PROTECT_SCREEN) diff --git a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift index 6df2d5422e..184b03e679 100644 --- a/apps/ios/Shared/Views/UserSettings/DeveloperView.swift +++ b/apps/ios/Shared/Views/UserSettings/DeveloperView.swift @@ -91,6 +91,11 @@ struct DeveloperView: View { UserDefaults.standard.set(val, forKey: def) } } + for def in hintGroupDefaults { + if let val = groupAppDefaults[def] as? Bool { + groupDefaults.set(val, forKey: def) + } + } hintsUnchanged = true } } @@ -98,6 +103,8 @@ struct DeveloperView: View { private func hintDefaultsUnchanged() -> Bool { hintDefaults.allSatisfy { def in appDefaults[def] as? Bool == UserDefaults.standard.bool(forKey: def) + } && hintGroupDefaults.allSatisfy { def in + groupAppDefaults[def] as? Bool == groupDefaults.bool(forKey: def) } } diff --git a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift index eec820833c..3ae9f0eacd 100644 --- a/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift +++ b/apps/ios/Shared/Views/UserSettings/PrivacySettings.swift @@ -13,7 +13,7 @@ struct PrivacySettings: View { @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme @AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true - @AppStorage(DEFAULT_PRIVACY_LINK_PREVIEWS) private var useLinkPreviews = true + @AppStorage(GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS, store: groupDefaults) private var useLinkPreviews = true @AppStorage(GROUP_DEFAULT_PRIVACY_SANITIZE_LINKS, store: groupDefaults) private var privacySanitizeLinks = false @AppStorage(DEFAULT_PRIVACY_SHOW_CHAT_PREVIEWS) private var showChatPreviews = true @AppStorage(DEFAULT_PRIVACY_SAVE_LAST_DRAFT) private var saveLastDraft = true @@ -74,8 +74,8 @@ struct PrivacySettings: View { settingsRow("network", color: theme.colors.secondary) { Toggle("Send link previews", isOn: $useLinkPreviews) .onChange(of: useLinkPreviews) { linkPreviews in - privacyLinkPreviewsGroupDefault.set(linkPreviews) - privacyLinkPreviewsShowAlertGroupDefault.set(false) // to avoid showing alert to current users, show alert in v6.5 + UserDefaults.standard.set(linkPreviews, forKey: DEFAULT_PRIVACY_LINK_PREVIEWS) + privacyLinkPreviewsShowAlertGroupDefault.set(false) } } settingsRow("link", color: theme.colors.secondary) { diff --git a/apps/ios/Shared/Views/UserSettings/SettingsView.swift b/apps/ios/Shared/Views/UserSettings/SettingsView.swift index c091224098..65e34a0ac5 100644 --- a/apps/ios/Shared/Views/UserSettings/SettingsView.swift +++ b/apps/ios/Shared/Views/UserSettings/SettingsView.swift @@ -150,6 +150,10 @@ let hintDefaults = [ DEFAULT_SHOW_DELETE_CONTACT_NOTICE ] +let hintGroupDefaults = [ + GROUP_DEFAULT_PRIVACY_LINK_PREVIEWS_SHOW_ALERT +] + // not used anymore enum ConnectViaLinkTab: String { case scan diff --git a/apps/ios/SimpleX SE/ShareModel.swift b/apps/ios/SimpleX SE/ShareModel.swift index fd5c4c990f..18f3e2c344 100644 --- a/apps/ios/SimpleX SE/ShareModel.swift +++ b/apps/ios/SimpleX SE/ShareModel.swift @@ -465,8 +465,7 @@ fileprivate func getSharedContent(_ ip: NSItemProvider) async -> Result = remember { mutableStateOf(RecordingState.NotStarted) } AttachmentSelection(composeState, attachmentOption, composeState::processPickedFile) { uris, text -> CoroutineScope(Dispatchers.IO).launch { composeState.processPickedMedia(uris, text) } } + suspend fun fetchAndUpdateLinkPreview(url: String) { + composeState.value = composeState.value.copy(preview = ComposePreview.CLinkPreview(null)) + val lp = getLinkPreview(url) + if (lp != null && pendingLinkUrl.value == url) { + composeState.value = composeState.value.copy(preview = ComposePreview.CLinkPreview(lp)) + pendingLinkUrl.value = null + } else if (pendingLinkUrl.value == url) { + composeState.value = composeState.value.copy(preview = ComposePreview.NoPreview) + pendingLinkUrl.value = null + } + } + fun loadLinkPreview(url: String, wait: Long? = null) { if (pendingLinkUrl.value == url) { - composeState.value = composeState.value.copy(preview = ComposePreview.CLinkPreview(null)) withLongRunningApi(slow = 60_000) { if (wait != null) delay(wait) - val lp = getLinkPreview(url) - if (lp != null && pendingLinkUrl.value == url) { - chatModel.controller.appPrefs.privacyLinkPreviewsShowAlert.set(false) // to avoid showing alert to current users, show alert in v6.5 - composeState.value = composeState.value.copy(preview = ComposePreview.CLinkPreview(lp)) - pendingLinkUrl.value = null - } else if (pendingLinkUrl.value == url) { - composeState.value = composeState.value.copy(preview = ComposePreview.NoPreview) - pendingLinkUrl.value = null + if (pendingLinkUrl.value != url) return@withLongRunningApi + if (chatModel.controller.appPrefs.privacyLinkPreviewsShowAlert.get() + && !chatModel.controller.appPrefs.networkUseSocksProxy.get()) { + showLinkPreviewsConfirmAlert { enable -> + if (enable != null) { + chatModel.controller.appPrefs.privacyLinkPreviewsShowAlert.set(false) + chatModel.controller.appPrefs.privacyLinkPreviews.set(enable) + if (enable) { + withLongRunningApi(slow = 60_000) { fetchAndUpdateLinkPreview(url) } + } else if (pendingLinkUrl.value == url) { + composeState.value = composeState.value.copy(preview = ComposePreview.NoPreview) + pendingLinkUrl.value = null + } + } else { + cancelledLinks.add(url) + if (pendingLinkUrl.value == url) { + composeState.value = composeState.value.copy(preview = ComposePreview.NoPreview) + pendingLinkUrl.value = null + } + } + } + return@withLongRunningApi } + fetchAndUpdateLinkPreview(url) } } } @@ -1672,6 +1701,36 @@ fun ComposeView( } } +private fun showLinkPreviewsConfirmAlert(onChoice: (Boolean?) -> Unit) { + AlertManager.shared.showAlertDialogButtonsColumn( + title = generalGetString(MR.strings.link_previews_alert_title), + text = AnnotatedString(generalGetString(MR.strings.link_previews_alert_desc)), + onDismissRequest = { onChoice(null) }, + buttons = { + Column { + SectionItemView({ + AlertManager.shared.hideAlert() + onChoice(false) + }) { + Text(stringResource(MR.strings.link_previews_alert_disable), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = Color.Red) + } + SectionItemView({ + AlertManager.shared.hideAlert() + onChoice(true) + }) { + Text(stringResource(MR.strings.link_previews_alert_enable), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.primary) + } +// SectionItemView({ +// AlertManager.shared.hideAlert() +// onChoice(null) +// }) { +// Text(stringResource(MR.strings.cancel_verb), Modifier.fillMaxWidth(), textAlign = TextAlign.Center, color = MaterialTheme.colors.onBackground) +// } + } + } + ) +} + @Composable private fun OwnerChannelRelayBar( chatModel: ChatModel, diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index abb1d55942..f1ab9b7c30 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -2970,4 +2970,11 @@ Unblock subscriber for all? + + + Enable link previews? + Sending a link preview may reveal your IP address to the website. You can change this in Privacy settings later. + Enable + Disable + \ No newline at end of file From e8d16349ae2ecc513f991cc76509a97474de16ce Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 20 Apr 2026 13:28:01 +0000 Subject: [PATCH 044/152] core: fix changing profile of prepared chats losing chat items (#6843) --- src/Simplex/Chat/Store/Direct.hs | 8 ++++++++ src/Simplex/Chat/Store/Groups.hs | 8 ++++++++ .../Store/SQLite/Migrations/chat_query_plans.txt | 16 ++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/src/Simplex/Chat/Store/Direct.hs b/src/Simplex/Chat/Store/Direct.hs index 9128404244..60f898e52e 100644 --- a/src/Simplex/Chat/Store/Direct.hs +++ b/src/Simplex/Chat/Store/Direct.hs @@ -429,6 +429,14 @@ updatePreparedContactUser WHERE contact_profile_id = ? |] (newUserId, currentTs, profileId) + DB.execute + db + [sql| + UPDATE chat_items + SET user_id = ?, updated_at = ? + WHERE contact_id = ? + |] + (newUserId, currentTs, contactId) safeDeleteLDN db user oldLDN getContact db vr newUser contactId diff --git a/src/Simplex/Chat/Store/Groups.hs b/src/Simplex/Chat/Store/Groups.hs index 93fdf1868a..c4e7210637 100644 --- a/src/Simplex/Chat/Store/Groups.hs +++ b/src/Simplex/Chat/Store/Groups.hs @@ -687,6 +687,14 @@ updatePreparedGroupUser db vr user gInfo@GroupInfo {groupId, membership} hostMem WHERE group_profile_id IN (SELECT group_profile_id FROM groups WHERE group_id = ?) |] (newUserId, currentTs, groupId) + DB.execute + db + [sql| + UPDATE chat_items + SET user_id = ?, updated_at = ? + WHERE group_id = ? + |] + (newUserId, currentTs, groupId) safeDeleteLDN db user oldGroupLDN updateMembership GroupMember {groupMemberId = membershipId} currentTs = DB.execute diff --git a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt index 82ca68a663..366074acc2 100644 --- a/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt +++ b/src/Simplex/Chat/Store/SQLite/Migrations/chat_query_plans.txt @@ -446,6 +446,14 @@ Query: Plan: SEARCH chat_items USING INTEGER PRIMARY KEY (rowid=?) +Query: + UPDATE chat_items + SET user_id = ?, updated_at = ? + WHERE group_id = ? + +Plan: +SEARCH chat_items USING COVERING INDEX idx_chat_items_group_id (group_id=?) + Query: UPDATE contact_profiles SET display_name = ?, @@ -1063,6 +1071,14 @@ SEARCH m USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN SEARCH g USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN SEARCH h USING INDEX idx_sent_probe_hashes_sent_probe_id (sent_probe_id=?) +Query: + UPDATE chat_items + SET user_id = ?, updated_at = ? + WHERE contact_id = ? + +Plan: +SEARCH chat_items USING COVERING INDEX idx_chat_items_contact_id (contact_id=?) + Query: UPDATE chat_items SET item_status = ?, item_viewed = 1, updated_at = ? WHERE user_id = ? AND group_id = ? AND item_status = ? AND chat_item_id = ? From 05f99634c470f8bddac20046947a0606938b22ad Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 20 Apr 2026 18:01:38 +0100 Subject: [PATCH 045/152] docs: update privacy policy (#6786) What changed: Stronger privacy commitments: - explicitly states that preset servers do not log IP addresses. - you can verify clients and servers via reproducible builds. - quantum-resistant end-to-end encryption. - messages are irreversibly removed from preset servers on delivery or after 21 days. - transparency commitment by client apps. New private one-time connection links and public addresses: - your profile data is encrypted on the server - only people with the link can access it, not the servers. - one-time link profile data is removed once the connection is established. Public channels (beta): - chat relays are used to deliver messages to channel subscribers. - chat relays cannot identify subscribers. --------- --- PRIVACY.md | 66 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 26 deletions(-) diff --git a/PRIVACY.md b/PRIVACY.md index 18e5539726..5713f8e134 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -27,17 +27,17 @@ permalink: /privacy/index.html SimpleX Chat (also referred to as SimpleX) is the first communication network based on a new protocol stack that builds on the same ideas of complete openness and decentralization as email and web, with the focus on providing security and privacy of communications, and without compromising on usability. -SimpleX messaging protocol is the first protocol that has no user profile IDs of any kind, not even random numbers, cryptographic keys or hashes that identify the users. SimpleX apps allow their users to send messages and files via relay server infrastructure. Relay server owners and operators do not have any access to your messages, thanks to double-ratchet end-to-end encryption algorithm (also known as Signal algorithm - do not confuse with Signal protocols or platform) and additional encryption layers, and they also have no access to your profile and contacts - as they do not host user accounts. +SimpleX messaging protocol is the first protocol that has no user profile IDs of any kind, not even random numbers, cryptographic keys or hashes that identify the users. SimpleX apps allow their users to send messages and files via relay server infrastructure. Relay server owners and operators do not have any access to your messages, thanks to quantum-resistant double-ratchet end-to-end encryption algorithm (also known as Signal algorithm - do not confuse with Signal protocols or platform) and additional encryption layers, and they also have no access to your profile and contacts - as they do not host user accounts. Double ratchet algorithm has such important properties as [forward secrecy](/docs/GLOSSARY.md#forward-secrecy), sender [repudiation](/docs/GLOSSARY.md#) and break-in recovery (also known as [post-compromise security](/docs/GLOSSARY.md#post-compromise-security)). -If you believe that any part of this document is not aligned with SimpleX network mission or values, please raise it via [email](mailto:chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion). +If you believe that any part of this document is not aligned with SimpleX network mission or values, please raise it via [email](mailto:chat@simplex.chat) or [chat](https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw). ## Privacy Policy ### General principles -SimpleX network software uses the best industry practices for security and encryption to provide client and server software for secure [end-to-end encrypted](/docs/GLOSSARY.md#end-to-end-encryption) messaging via private connections. This encryption is protected from being compromised by the relays servers, even if they are modified or compromised, via [man-in-the-middle attack](/docs/GLOSSARY.md#man-in-the-middle-attack). +SimpleX network software uses established industry practices for security and encryption to provide secure [end-to-end encrypted](/docs/GLOSSARY.md#end-to-end-encryption) messaging via private connections. This encryption is protected from [man-in-the-middle attack](/docs/GLOSSARY.md#man-in-the-middle-attack) by the relay servers, even if they are modified or compromised. SimpleX software is built on top of SimpleX messaging and application protocols, based on a new message routing protocol allowing to establish private connections without having identifiers assigned to its users - it does not use emails, phone numbers, usernames, identity keys or any other user profile identifiers to pass messages between the user applications. @@ -45,7 +45,7 @@ SimpleX software is similar in its design approach to email clients and browsers SimpleX network operators are not communication service provider, and provide public relays "as is", as experimental, without any guarantees of availability or data retention. The operators of the relay servers preset in the app ("Preset Server Operators"), including SimpleX Chat Ltd, are committed to maintain a high level of availability, reliability and security. SimpleX client apps can have multiple preset relay server operators that you can opt-in or opt-out of using. You are and will continue to be able to use any other operators or your own servers. -SimpleX network design is based on the principles of users and data sovereignty, and device and operator portability. +SimpleX network design is based on the principles of user and data sovereignty, and device and operator portability. The implementation security assessment of SimpleX cryptography and networking was done in October 2022 by [Trail of Bits](https://www.trailofbits.com/about), and most fixes were released in v4.2 – see [the announcement](/blog/20221108-simplex-chat-v4.2-security-audit-new-website.md). @@ -69,22 +69,26 @@ Your message history is stored only on your own device and the devices of your c #### Private message delivery -You do not have control over which servers are used to send messages to your contacts - these servers are chosen by your contacts. To send messages your client by default uses configured servers to forward messages to the destination servers, thus protecting your IP address from the servers chosen by your contacts. +You do not have control over which servers are used to receive messages by your contacts - these servers are chosen by your contacts. To send messages your client by default uses configured servers to forward messages to the destination servers, thus protecting your IP address from the servers chosen by your contacts. In case you use preset servers of more than one operator, the app will prefer to use a server of an operator different from the operator of the destination server to forward messages, preventing destination server to correlate messages as belonging to one client. +Preset servers do not log IP addresses of the user devices that connect to them. + You can additionally use VPN or some overlay network (e.g., Tor) to hide your IP address from the servers chosen by you. *Please note*: the clients allow changing configuration to connect to the destination servers directly. It is not recommended - if you make such change, your IP address will be visible to the destination servers. #### Storage of messages and files on the servers -The messages are removed from the relay servers as soon as all messages of the file they were stored in are delivered and saving new messages switches to another file, as long as these servers use unmodified published code. Undelivered messages are also marked as delivered after the time that is configured in the messaging servers you use (21 days for preset messaging servers). +The messages stored on the servers are end-to-end encrypted, and cannot be read by server owners. + +The messages are irreversibly removed from the preset relay servers as soon as they are delivered or after 21 days. + +Other relay servers may use message logs that would result in longer storage of delivered messages, until the log file is rotated, which normally should happen within one month if servers use the same code as preset servers. The files are stored on file relay servers for the time configured in the relay servers you use (48 hours for preset file servers). -The encrypted messages can be stored for some time after they are delivered or expired (because servers use append-only logs for message storage). This time varies, and may be longer in connections with fewer messages, but it is usually limited to 1 month, including any backup storage. - #### Connections with other users When you create a connection with another user, two messaging queues (you can think about them as mailboxes) are created on messaging relay servers (chosen by you and your contact each), that can be the preset servers or the servers that you and your contact configured in the app. SimpleX messaging protocol uses separate queues for direct and response messages, and the apps prefer to create these queues on two different relay servers, or, if available, the relays of two different operators, for increased privacy, in case you have more than one relay server configured in the app, which is the default. @@ -93,15 +97,11 @@ Preset and unmodified SimpleX relay servers do not store information about which #### Connection links privacy -When you create a connection with another user, the app generates a link/QR code that can be shared with the user to establish the connection via any channel (email, any other messenger, or a video call). This link is safe to share via insecure channels, as long as you can identify the recipient and also trust that this channel did not replace this link (to mitigate the latter risk you can validate the security code via the app). +When you create a connection with another user, the app generates a one-time link/QR code that can be shared with the user to establish the connection via any channel (email, any other messenger, or a video call). This link is safe to share via insecure channels, as long as you can identify the recipient and also trust that this channel did not replace this link (to mitigate the latter risk you can validate the security code via the app). -While the connection "links" contain SimpleX Chat Ltd domain name `simplex.chat`, this site is never accessed by the app, and is only used for these purposes: -- to direct the new users to the app download instructions, -- to show connection QR code that can be scanned via the app, -- to "namespace" these links, -- to open links directly in the installed app when it is clicked outside of the app. +The connection link contains the address of the server used to establish the connection. Your profile name and picture are stored on this server in encrypted form until your contact uses the link, after which this data is removed. The server cannot access this data without the link. -You can always safely replace the initial part of the link `https://simplex.chat/` either with `simplex:/` (which is a URI scheme provisionally registered with IANA) or with any other domain name where you can self-host the app download instructions and show the connection QR code (but in case it is your domain, it will not open in the app). Also, while the page renders QR code, all the information needed to render it is only available to the browser, as the part of the "link" after `#` symbol is not sent to the website server. +The old connection "links" contained SimpleX Chat Ltd domain name `simplex.chat`, but this site is never accessed by the app - you could replace the initial part of the old link `https://simplex.chat/` either with `simplex:/` or with any other domain name. #### iOS Push Notifications @@ -117,11 +117,15 @@ You can read more about the design of iOS push notifications [here](./blog/20220 Additional technical information can be stored on the network servers, including randomly generated authentication tokens, keys, push tokens, and other material that is necessary to transmit messages. SimpleX network design limits this additional technical information to the minimum required to operate the software and servers. To prevent server overloading or attacks, the servers can temporarily store data that can link to particular users or devices, including IP addresses, geographic location, or information related to the transport sessions. This information is not stored for the absolute majority of the app users, even for those who use the servers very actively. +Because SimpleX servers do not create user accounts and do not store any identifiers linking transport data to message queues or user profiles, this technical data cannot be used by server operators to identify any person. + #### SimpleX Directory -This section applies only to the experimental group directory operated by SimpleX Chat Ltd. +This section applies only to the experimental group directory chat bot operated by SimpleX Chat Ltd. -[SimpleX Directory](/docs/DIRECTORY.md) stores: your search requests, the messages and the members profiles in the registered groups. You can connect to SimpleX Directory via [this address](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion). +[SimpleX Directory](/docs/DIRECTORY.md) bot stores: your search requests, the messages and the members profiles in the registered groups. You can connect to SimpleX Directory via [this address](https://smp4.simplex.im/a#lXUjJW5vHYQzoLYgmi8GbxkGP41_kjefFvBrdwg-0Ok). + +You can also view the groups registered in SimpleX directory via the browser at [simplex.chat/directory](https://simplex.chat/directory) #### Public groups and content channels @@ -131,15 +135,23 @@ You may participate in a public group and receive content from a public channel - to retain a copy of your messages according to the Group settings (e.g., the Group may allow irreversible message deletion from the recipient devices for a limited period of time, or it may only allow to edit and mark messages as deleted on recipient devices). Deleting message from the recipient devices or marking message as deleted revokes the license to share the message. - to Group owners: to share your messages with the new Group members as history of the Group. Currently, the Group history shared with the new members is limited to 100 messages. -Group owners may use chat relays or automated bots (Chat Relays) to re-broadcast member messages to all members, for efficiency. The Chat Relays may be operated by the group owners, by preset operators or by 3rd parties. The Chat Relays have access to and will retain messages in line with Group settings, for technical functioning of the Group. Neither you nor group owners grant any content license to Chat Relay operators. +#### Public channels and chat relays (beta) + +Public channels are experimental - their functionality and privacy properties may change. + +Channel owners use chat relays that retain messages to deliver them to channel subscribers. The chat relays may be operated by the channel owners, by preset operators or by 3rd parties. The chat relays are client applications on SimpleX network - they cannot identify subscribers. Neither you nor channel owners grant any content license to chat relay operators. + +#### Public contact, group and channel addresses + +Public addresses contain profile name, picture and other profile details. This data is encrypted on the servers, and can only be accessed via the address. Server operators cannot list addresses and cannot access this data without having the address. Public address data remains on the servers until removed by the user via the app. If you lose access to the app without a backup, server operators have no way to verify address ownership and can only remove addresses following due process. #### User Support -The app includes support contact operated by SimpleX Chat Ltd. If you contact support, any personal data you share is kept only for the purposes of researching the issue and contacting you about your case. We recommend contacting support [via chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion) when it is possible, and avoid sharing any personal information. +The app includes support contact operated by SimpleX Chat Ltd. If you contact support, any personal data you share is kept only for the purposes of researching the issue and contacting you about your case. We recommend contacting support [via chat](https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw) when it is possible, and avoid sharing any personal information. ### Preset Server Operators -Preset server operators will not share the information on their servers with each other, other than aggregate usage statistics. +Preset server operators will not share the information or any metadata on their servers with each other, other than aggregate usage statistics. Preset server operators must not provide general access to their servers or the data on their servers to each other. @@ -149,7 +161,7 @@ Preset server operators will provide non-administrative access to control port o The preset server operators use third parties. While they do not have access and cannot share any user data, these third parties may access the encrypted user messages (but NOT the actual unencrypted message content or size) as it is stored or transmitted via the servers. Hosting and network providers can also store IP addresses and other transport information as part of their logs. -SimpleX Chat Ltd uses a third party for email services - if you ask for support via email, your and SimpleX Chat Ltd email providers may access these emails according to their privacy policies and terms. When the request is sensitive, please contact us via SimpleX Chat apps or using encrypted email using PGP key published at [openpgp.org](https://keys.openpgp.org/search?q=chat%40simplex.chat). +SimpleX Chat Ltd uses a third party for email services - if you ask for support via email, your and SimpleX Chat Ltd email providers may access these emails according to their privacy policies and terms. When the request is sensitive, please contact us via SimpleX Chat apps or using encrypted email using PGP key published at [openpgp.org](https://keys.openpgp.org/vks/v1/by-fingerprint/FB44AF81A45BDE327319797C85107E357D4A17FC). The cases when the preset server operators may share the data temporarily stored on the servers: @@ -158,9 +170,7 @@ The cases when the preset server operators may share the data temporarily stored - To detect, prevent, or otherwise address fraud, security, or technical issues. - To protect against harm to the rights, property, or safety of software users, operators of preset servers, or the public as required or permitted by law. -By the time of updating this document, the preset server operators were not served with any enforceable requests and did not provide any information from the servers to any third parties. If the preset server operators are ever requested to provide such access or information, they will follow the due legal process to limit any information shared with the third parties to the minimally required by law. - -Preset server operators will publish information they are legally allowed to share about such requests in the [Transparency reports](./docs/TRANSPARENCY.md). +Reports on requests for user data are published in [Transparency reports](./docs/TRANSPARENCY.md). To date, no user information was provided in response to any requests. If the preset server operators are ever required to provide information, they will follow the due legal process to limit any information shared to the minimally required by law. ### Source code license @@ -168,6 +178,8 @@ As this software is fully open-source and provided under AGPLv3 license, all inf In addition to the AGPLv3 license terms, the preset relay server operators are committed to the software users that these servers will always be compiled from the [published open-source code](https://github.com/simplex-chat/simplexmq), without any modifications. +Users can independently [reproduce builds](./docs/REPRODUCE.md) to verify that the published client and server binaries were compiled from the published code. + ### Updates This Privacy Policy applies to SimpleX Chat Ltd and all other preset server operators you use in the app. @@ -176,7 +188,7 @@ This Privacy Policy may be updated as needed so that it is current, accurate, an Please also read The Conditions of Use of Software and Infrastructure below. -If you have questions about this Privacy Policy please contact SimpleX Chat Ltd via [email](mailto:chat@simplex.chat) or [chat](https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23%2F%3Fv%3D1%26dh%3DMCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion). +If you have questions about this Privacy Policy or data protection please contact SimpleX Chat Ltd (company number 13691484, registered at 20-22 Wenlock Road, London, United Kingdom N1 7GU) via [email](mailto:chat@simplex.chat) or [chat](https://smp6.simplex.im/a#lrdvu2d8A1GumSmoKb2krQmtKhWXq-tyGpHuM7aMwsw). ## Conditions of Use of Software and Infrastructure @@ -188,6 +200,8 @@ You accept the Conditions of Use of Software and Infrastructure ("Conditions") b **Client applications**. SimpleX Chat client application Software (referred to as "app" or "apps") also has no modifications compared with published open-source code, and any developers of the alternative client apps based on SimpleX Chat code are required to publish any modifications under the same AGPLv3 license. Client applications should not include any tracking or analytics code, and do not share any tracking information with SimpleX Chat Ltd, preset server operators or any other third parties. If you ever discover any tracking or analytics code, please report it to SimpleX Chat Ltd, so it can be removed. +Client applications must not include any code that could compromise the security of end-to-end encryption of files and messages. Client applications must not send anything not directly required for users communications without explicit users' consent. + **Accessing the infrastructure**. For the efficiency of the network access, the client Software by default accesses all queues your app creates on any relay server within one user profile via the same network (TCP/IP) connection. At the cost of additional traffic this configuration can be changed to use different transport session for each connection. Relay servers do not collect information about which queues were created or accessed via the same connection, so the relay servers cannot establish which queues belong to the same user profile. Whoever might observe your network traffic would know which relay servers you use, and how much data you send, but not to whom it is sent - the data that leaves the servers is always different from the data they receive - there are no identifiers or ciphertext in common, even inside TLS encryption layer. Please refer to the [technical design document](https://github.com/simplex-chat/simplexmq/blob/master/protocol/overview-tjr.md) for more information about the privacy model and known security and privacy risks. **Privacy of user data**. Servers do not retain any data you transmit for any longer than necessary to deliver the messages between apps. Preset server operators collect aggregate statistics across all their servers, as supported by published code and can be enabled by any infrastructure operator, but not any statistics per-user, or per geographic location, or per IP address, or per transport session. SimpleX Chat Ltd does not have information about how many people use SimpleX Chat applications, it only knows an approximate number of app installations and the aggregate traffic through the preset servers. In any case, preset server operators do not and will not sell or in any way monetize user data. The future business model assumes charging for some optional Software features instead, in a transparent and fair way. @@ -243,4 +257,4 @@ You accept the Conditions of Use of Software and Infrastructure ("Conditions") b **Ending these conditions**. You may end these Conditions with SimpleX Chat Ltd and preset server operators at any time by deleting the Applications from your devices and discontinuing use of the Infrastructure of SimpleX Chat Ltd and preset server operators. The provisions related to Licenses, Disclaimers, Limitation of Liability, Resolving dispute, Availability, Changes to the conditions, Enforcing the conditions, and Ending these conditions will survive termination of your relationship with SimpleX Chat Ltd and/or preset server operators. -Updated March 3, 2025 +Updated April 18, 2026 From f088220c131517bcfd26cb4317318c68d6ac6689 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Mon, 20 Apr 2026 19:14:47 +0100 Subject: [PATCH 046/152] core: update privacy policy commit (#6848) --- src/Simplex/Chat/Operators.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simplex/Chat/Operators.hs b/src/Simplex/Chat/Operators.hs index 3bbfb02d0a..03cc38e12a 100644 --- a/src/Simplex/Chat/Operators.hs +++ b/src/Simplex/Chat/Operators.hs @@ -60,10 +60,10 @@ import Simplex.Messaging.Transport.Client (TransportHost (..)) import Simplex.Messaging.Util (atomicModifyIORef'_, safeDecodeUtf8) usageConditionsCommit :: Text -usageConditionsCommit = "7471fd2af5838dc0467aebc570b5ea75e5df3209" +usageConditionsCommit = "05f99634c470f8bddac20046947a0606938b22ad" previousConditionsCommit :: Text -previousConditionsCommit = "a5061f3147165a05979d6ace33960aced2d6ac03" +previousConditionsCommit = "7471fd2af5838dc0467aebc570b5ea75e5df3209" usageConditionsText :: Text usageConditionsText = From 27b06dfb385fc6b79cf1dae92f27c3c258dbf3b3 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:01:09 +0000 Subject: [PATCH 047/152] ui: channel preferences (#6842) --- .../Views/Chat/Group/GroupChatInfoView.swift | 30 +++--- .../Chat/Group/GroupPreferencesView.swift | 41 ++++---- .../views/chat/group/GroupChatInfoView.kt | 35 +++---- .../views/chat/group/GroupPreferences.kt | 95 ++++++++++++++----- .../commonMain/resources/MR/base/strings.xml | 2 + 5 files changed, 126 insertions(+), 77 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift index afc314eb78..9279c53c83 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupChatInfoView.swift @@ -157,19 +157,17 @@ struct GroupChatInfoView: View { if groupInfo.groupProfile.description != nil || (groupInfo.isOwner && groupInfo.businessChat == nil) { addOrEditWelcomeMessage() } - if !groupInfo.useRelays { - GroupPreferencesButton(groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, currentPreferences: groupInfo.fullGroupPreferences) - } + GroupPreferencesButton(groupInfo: $groupInfo, preferences: groupInfo.fullGroupPreferences, currentPreferences: groupInfo.fullGroupPreferences) } footer: { - if !groupInfo.useRelays { - let label: LocalizedStringKey = ( - groupInfo.businessChat == nil - ? "Only group owners can change group preferences." - : "Only chat owners can change preferences." - ) - Text(label) - .foregroundColor(theme.colors.secondary) - } + let label: LocalizedStringKey = ( + groupInfo.useRelays + ? "Only channel owners can change channel preferences." + : groupInfo.businessChat == nil + ? "Only group owners can change group preferences." + : "Only chat owners can change preferences." + ) + Text(label) + .foregroundColor(theme.colors.secondary) } Section { @@ -988,7 +986,9 @@ struct GroupPreferencesButton: View { var creatingGroup: Bool = false private var label: LocalizedStringKey { - groupInfo.businessChat == nil ? "Group preferences" : "Chat preferences" + groupInfo.useRelays ? "Channel preferences" + : groupInfo.businessChat == nil ? "Group preferences" + : "Chat preferences" } var body: some View { @@ -1005,7 +1005,9 @@ struct GroupPreferencesButton: View { .navigationBarTitleDisplayMode(.large) .onDisappear { let saveText = NSLocalizedString( - creatingGroup ? "Save" : "Save and notify group members", + creatingGroup ? "Save" + : groupInfo.useRelays ? "Save and notify subscribers" + : "Save and notify group members", comment: "alert button" ) diff --git a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift index 55b1dc6d2e..84e852f5a3 100644 --- a/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift +++ b/apps/ios/Shared/Views/Chat/Group/GroupPreferencesView.swift @@ -27,26 +27,33 @@ struct GroupPreferencesView: View { @State private var showSaveDialogue = false var body: some View { - let saveText: LocalizedStringKey = creatingGroup ? "Save" : "Save and notify group members" + let saveText: LocalizedStringKey = creatingGroup ? "Save" : groupInfo.useRelays ? "Save and notify subscribers" : "Save and notify group members" VStack { List { - Section { - MemberAdmissionButton( - groupInfo: $groupInfo, - admission: groupInfo.groupProfile.memberAdmission_, - currentAdmission: groupInfo.groupProfile.memberAdmission_, - creatingGroup: creatingGroup - ) + if !groupInfo.useRelays { + Section { + MemberAdmissionButton( + groupInfo: $groupInfo, + admission: groupInfo.groupProfile.memberAdmission_, + currentAdmission: groupInfo.groupProfile.memberAdmission_, + creatingGroup: creatingGroup + ) + } + featureSection(.timedMessages, $preferences.timedMessages.enable) + featureSection(.fullDelete, $preferences.fullDelete.enable) + featureSection(.directMessages, $preferences.directMessages.enable, $preferences.directMessages.role) + featureSection(.reactions, $preferences.reactions.enable) + featureSection(.voice, $preferences.voice.enable, $preferences.voice.role) + featureSection(.files, $preferences.files.enable, $preferences.files.role) + featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role) + featureSection(.reports, $preferences.reports.enable) + featureSection(.history, $preferences.history.enable) + } else { + featureSection(.timedMessages, $preferences.timedMessages.enable) + featureSection(.fullDelete, $preferences.fullDelete.enable) + featureSection(.reactions, $preferences.reactions.enable) + featureSection(.history, $preferences.history.enable) } - featureSection(.timedMessages, $preferences.timedMessages.enable) - featureSection(.fullDelete, $preferences.fullDelete.enable) - featureSection(.directMessages, $preferences.directMessages.enable, $preferences.directMessages.role) - featureSection(.reactions, $preferences.reactions.enable) - featureSection(.voice, $preferences.voice.enable, $preferences.voice.role) - featureSection(.files, $preferences.files.enable, $preferences.files.role) - featureSection(.simplexLinks, $preferences.simplexLinks.enable, $preferences.simplexLinks.role) - featureSection(.reports, $preferences.reports.enable) - featureSection(.history, $preferences.history.enable) if groupInfo.isOwner { Section { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt index 767eb46923..156ad2cd97 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupChatInfoView.kt @@ -599,32 +599,27 @@ fun ModalData.GroupChatInfoLayout( } } } - val showEditSection = (groupInfo.isOwner && groupInfo.businessChat?.chatType == null) - || groupInfo.groupProfile.description != null - || !groupInfo.useRelays if (anyTopSectionRowShow) { SectionDividerSpaced(maxBottomPadding = false) } - if (showEditSection) { - SectionView { - if (groupInfo.isOwner && groupInfo.businessChat?.chatType == null) { - val editProfileTitleId = if (groupInfo.useRelays) MR.strings.button_edit_channel_profile else MR.strings.button_edit_group_profile - EditGroupProfileButton(editProfileTitleId, editGroupProfile) - } - if (groupInfo.groupProfile.description != null || (groupInfo.isOwner && groupInfo.businessChat?.chatType == null)) { - AddOrEditWelcomeMessage(groupInfo.groupProfile.description, addOrEditWelcomeMessage) - } - if (!groupInfo.useRelays) { - val prefsTitleId = if (groupInfo.businessChat == null) MR.strings.group_preferences else MR.strings.chat_preferences - GroupPreferencesButton(prefsTitleId, openPreferences) - } + SectionView { + if (groupInfo.isOwner && groupInfo.businessChat?.chatType == null) { + val editProfileTitleId = if (groupInfo.useRelays) MR.strings.button_edit_channel_profile else MR.strings.button_edit_group_profile + EditGroupProfileButton(editProfileTitleId, editGroupProfile) } - if (!groupInfo.useRelays) { - val footerId = if (groupInfo.businessChat == null) MR.strings.only_group_owners_can_change_prefs else MR.strings.only_chat_owners_can_change_prefs - SectionTextFooter(stringResource(footerId)) + if (groupInfo.groupProfile.description != null || (groupInfo.isOwner && groupInfo.businessChat?.chatType == null)) { + AddOrEditWelcomeMessage(groupInfo.groupProfile.description, addOrEditWelcomeMessage) } - SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) + val prefsTitleId = if (groupInfo.useRelays) MR.strings.channel_preferences + else if (groupInfo.businessChat == null) MR.strings.group_preferences + else MR.strings.chat_preferences + GroupPreferencesButton(prefsTitleId, openPreferences) } + val footerId = if (groupInfo.useRelays) MR.strings.only_channel_owners_can_change_prefs + else if (groupInfo.businessChat == null) MR.strings.only_group_owners_can_change_prefs + else MR.strings.only_chat_owners_can_change_prefs + SectionTextFooter(stringResource(footerId)) + SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) SectionView { if (!groupInfo.useRelays) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt index ddf0456822..902b4c9828 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/group/GroupPreferences.kt @@ -10,6 +10,7 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable +import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.compose.stringResource import chat.simplex.common.ui.theme.* import chat.simplex.common.views.helpers.* @@ -56,10 +57,12 @@ fun GroupPreferencesView(m: ChatModel, rhId: Long?, chatId: String, close: () -> afterSave() } } + val saveTextId = if (gInfo.useRelays) MR.strings.save_and_notify_channel_subscribers + else MR.strings.save_and_notify_group_members ModalView( close = { if (preferences == currentPreferences) close() - else showUnsavedChangesAlert({ savePrefs(close) }, close) + else showUnsavedChangesAlert({ savePrefs(close) }, close, saveTextId) }, ) { GroupPreferencesLayout( @@ -97,17 +100,11 @@ private fun GroupPreferencesLayout( savePrefs: () -> Unit, openMemberAdmission: () -> Unit, ) { - ColumnWithScrollBar { - val titleId = if (groupInfo.businessChat == null) MR.strings.group_preferences else MR.strings.chat_preferences - AppBarTitle(stringResource(titleId)) - if (groupInfo.businessChat == null) { - MemberAdmissionButton(openMemberAdmission) - SectionDividerSpaced(maxBottomPadding = false) - } + val onTTLUpdated = { ttl: Int? -> + applyPrefs(preferences.copy(timedMessages = preferences.timedMessages.copy(ttl = ttl))) + } + @Composable fun TimedMessagesPreference() { val timedMessages = remember(preferences) { mutableStateOf(preferences.timedMessages.enable) } - val onTTLUpdated = { ttl: Int? -> - applyPrefs(preferences.copy(timedMessages = preferences.timedMessages.copy(ttl = ttl))) - } FeatureSection(GroupFeature.TimedMessages, timedMessages, null, groupInfo, preferences, onTTLUpdated) { enable, _ -> if (enable == GroupFeatureEnabled.ON) { applyPrefs(preferences.copy(timedMessages = TimedMessagesGroupPreference(enable = enable, ttl = preferences.timedMessages.ttl ?: 86400))) @@ -115,58 +112,104 @@ private fun GroupPreferencesLayout( applyPrefs(preferences.copy(timedMessages = TimedMessagesGroupPreference(enable = enable, ttl = currentPreferences.timedMessages.ttl))) } } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun DirectMessagesPreference() { val allowDirectMessages = remember(preferences) { mutableStateOf(preferences.directMessages.enable) } val directMessagesRole = remember(preferences) { mutableStateOf(preferences.directMessages.role) } FeatureSection(GroupFeature.DirectMessages, allowDirectMessages, directMessagesRole, groupInfo, preferences, onTTLUpdated) { enable, role -> applyPrefs(preferences.copy(directMessages = RoleGroupPreference(enable = enable, role))) } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun FullDeletePreference() { val allowFullDeletion = remember(preferences) { mutableStateOf(preferences.fullDelete.enable) } FeatureSection(GroupFeature.FullDelete, allowFullDeletion, null, groupInfo, preferences, onTTLUpdated) { enable, _ -> applyPrefs(preferences.copy(fullDelete = GroupPreference(enable = enable))) } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun ReactionsPreference() { val allowReactions = remember(preferences) { mutableStateOf(preferences.reactions.enable) } FeatureSection(GroupFeature.Reactions, allowReactions, null, groupInfo, preferences, onTTLUpdated) { enable, _ -> applyPrefs(preferences.copy(reactions = GroupPreference(enable = enable))) } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun VoicePreference() { val allowVoice = remember(preferences) { mutableStateOf(preferences.voice.enable) } val voiceRole = remember(preferences) { mutableStateOf(preferences.voice.role) } FeatureSection(GroupFeature.Voice, allowVoice, voiceRole, groupInfo, preferences, onTTLUpdated) { enable, role -> applyPrefs(preferences.copy(voice = RoleGroupPreference(enable = enable, role))) } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun FilesPreference() { val allowFiles = remember(preferences) { mutableStateOf(preferences.files.enable) } val filesRole = remember(preferences) { mutableStateOf(preferences.files.role) } FeatureSection(GroupFeature.Files, allowFiles, filesRole, groupInfo, preferences, onTTLUpdated) { enable, role -> applyPrefs(preferences.copy(files = RoleGroupPreference(enable = enable, role))) } - - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun SimplexLinksPreference() { val allowSimplexLinks = remember(preferences) { mutableStateOf(preferences.simplexLinks.enable) } val simplexLinksRole = remember(preferences) { mutableStateOf(preferences.simplexLinks.role) } FeatureSection(GroupFeature.SimplexLinks, allowSimplexLinks, simplexLinksRole, groupInfo, preferences, onTTLUpdated) { enable, role -> applyPrefs(preferences.copy(simplexLinks = RoleGroupPreference(enable = enable, role))) } - - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun ReportsPreference() { val enableReports = remember(preferences) { mutableStateOf(preferences.reports.enable) } FeatureSection(GroupFeature.Reports, enableReports, null, groupInfo, preferences, onTTLUpdated) { enable, _ -> applyPrefs(preferences.copy(reports = GroupPreference(enable = enable))) } - SectionDividerSpaced(true, maxBottomPadding = false) + } + @Composable fun HistoryPreference() { val enableHistory = remember(preferences) { mutableStateOf(preferences.history.enable) } FeatureSection(GroupFeature.History, enableHistory, null, groupInfo, preferences, onTTLUpdated) { enable, _ -> applyPrefs(preferences.copy(history = GroupPreference(enable = enable))) } + } + ColumnWithScrollBar { + val titleId = if (groupInfo.useRelays) MR.strings.channel_preferences + else if (groupInfo.businessChat == null) MR.strings.group_preferences + else MR.strings.chat_preferences + AppBarTitle(stringResource(titleId)) + if (!groupInfo.useRelays) { + if (groupInfo.businessChat == null) { + MemberAdmissionButton(openMemberAdmission) + SectionDividerSpaced(maxBottomPadding = false) + } + TimedMessagesPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + DirectMessagesPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + FullDeletePreference() + SectionDividerSpaced(true, maxBottomPadding = false) + ReactionsPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + VoicePreference() + SectionDividerSpaced(true, maxBottomPadding = false) + FilesPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + SimplexLinksPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + ReportsPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + HistoryPreference() + } else { + TimedMessagesPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + FullDeletePreference() + SectionDividerSpaced(true, maxBottomPadding = false) + ReactionsPreference() + SectionDividerSpaced(true, maxBottomPadding = false) + HistoryPreference() + } if (groupInfo.isOwner) { SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) + val saveTextId = if (groupInfo.useRelays) MR.strings.save_and_notify_channel_subscribers + else MR.strings.save_and_notify_group_members ResetSaveButtons( reset = reset, save = savePrefs, - disabled = preferences == currentPreferences + disabled = preferences == currentPreferences, + saveTextId = saveTextId ) } SectionBottomSpacer() @@ -253,21 +296,21 @@ private fun FeatureSection( } @Composable -private fun ResetSaveButtons(reset: () -> Unit, save: () -> Unit, disabled: Boolean) { +private fun ResetSaveButtons(reset: () -> Unit, save: () -> Unit, disabled: Boolean, saveTextId: StringResource) { SectionView { SectionItemView(reset, disabled = disabled) { Text(stringResource(MR.strings.reset_verb), color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) } SectionItemView(save, disabled = disabled) { - Text(stringResource(MR.strings.save_and_notify_group_members), color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) + Text(stringResource(saveTextId), color = if (disabled) MaterialTheme.colors.secondary else MaterialTheme.colors.primary) } } } -private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit) { +private fun showUnsavedChangesAlert(save: () -> Unit, revert: () -> Unit, confirmTextId: StringResource) { AlertManager.shared.showAlertDialogStacked( title = generalGetString(MR.strings.save_preferences_question), - confirmText = generalGetString(MR.strings.save_and_notify_group_members), + confirmText = generalGetString(confirmTextId), dismissText = generalGetString(MR.strings.exit_without_saving), onConfirm = save, onDismiss = revert, diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index f1ab9b7c30..9796d276c7 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -1875,6 +1875,7 @@ Error creating member contact Error sending invitation Only group owners can change group preferences. + Only channel owners can change channel preferences. Only chat owners can change preferences. Address Share address @@ -2217,6 +2218,7 @@ Chat preferences Contact preferences Group preferences + Channel preferences Set group preferences Set member admission Your preferences From 6f86c5af2e3cbe6fba2c19a8438c30f0d12b6c96 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Tue, 21 Apr 2026 15:59:02 +0000 Subject: [PATCH 048/152] ui: channels preset tag (#6850) --- .../Shared/Views/ChatList/ChatListView.swift | 13 +++++++++--- apps/ios/SimpleXChat/ChatTypes.swift | 20 ++++++++----------- .../chat/simplex/common/model/ChatModel.kt | 18 ++++++----------- .../common/views/chatlist/ChatListView.kt | 9 +++++++-- .../commonMain/resources/MR/base/strings.xml | 1 + 5 files changed, 32 insertions(+), 29 deletions(-) diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 3050b0d4cd..c881b5c583 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -38,8 +38,9 @@ enum PresetTag: Int, Identifiable, CaseIterable, Equatable { case favorites = 1 case contacts = 2 case groups = 3 - case business = 4 - case notes = 5 + case channels = 4 + case business = 5 + case notes = 6 var id: Int { rawValue } @@ -881,6 +882,7 @@ struct TagsView: View { case .favorites: (active ? "star.fill" : "star", "Favorites") case .contacts: (active ? "person.fill" : "person", "Contacts") case .groups: (active ? "person.2.fill" : "person.2", "Groups") + case .channels: (active ? "antenna.radiowaves.left.and.right.circle.fill" : "antenna.radiowaves.left.and.right.circle", "Channels") case .business: (active ? "briefcase.fill" : "briefcase", "Businesses") case .notes: (active ? "folder.fill" : "folder", "Notes") } @@ -924,7 +926,12 @@ func presetTagMatchesChat(_ tag: PresetTag, _ chatInfo: ChatInfo, _ chatStats: C } case .groups: switch chatInfo { - case let .group(groupInfo, _): groupInfo.businessChat == nil + case let .group(groupInfo, _): groupInfo.businessChat == nil && !groupInfo.isChannel + default: false + } + case .channels: + switch chatInfo { + case let .group(groupInfo, _): groupInfo.isChannel default: false } case .business: diff --git a/apps/ios/SimpleXChat/ChatTypes.swift b/apps/ios/SimpleXChat/ChatTypes.swift index 0401664d74..83b8d61ea1 100644 --- a/apps/ios/SimpleXChat/ChatTypes.swift +++ b/apps/ios/SimpleXChat/ChatTypes.swift @@ -2371,6 +2371,7 @@ public struct GroupInfo: Identifiable, Decodable, NamedChat, Hashable { public var ready: Bool { get { true } } public var nextConnectPrepared: Bool { if let preparedGroup { !preparedGroup.connLinkStartedConnection } else { false } } public var profileChangeProhibited: Bool { preparedGroup?.connLinkPreparedConnection ?? false } + public var isChannel: Bool { groupProfile.isChannel } public var displayName: String { localAlias == "" ? groupProfile.displayName : localAlias } public var fullName: String { get { groupProfile.fullName } } public var shortDescr: String? { groupProfile.shortDescr } @@ -2499,6 +2500,8 @@ public struct GroupProfile: Codable, NamedChat, Hashable { set { memberAdmission = newValue } } + public var isChannel: Bool { publicGroup?.groupType == .channel } + public static let sampleData = GroupProfile( displayName: "team", fullName: "My Team" @@ -4864,10 +4867,7 @@ public enum MsgChatLink: Equatable, Hashable { public var iconName: String { switch self { case let .group(_, groupProfile): - switch groupProfile.publicGroup?.groupType { - case .channel: "antenna.radiowaves.left.and.right.circle.fill" - case .unknown, .none: "person.2.circle.fill" - } + groupProfile.isChannel ? "antenna.radiowaves.left.and.right.circle.fill" : "person.2.circle.fill" case let .contact(_, _, business): business ? "briefcase.circle.fill" : "person.crop.circle.fill" case .invitation: @@ -4878,10 +4878,7 @@ public enum MsgChatLink: Equatable, Hashable { public var smallIconName: String { switch self { case let .group(_, groupProfile): - switch groupProfile.publicGroup?.groupType { - case .channel: "antenna.radiowaves.left.and.right" - case .unknown, .none: "person.2" - } + groupProfile.isChannel ? "antenna.radiowaves.left.and.right" : "person.2" case let .contact(_, _, business): business ? "briefcase" : "person" case .invitation: @@ -4910,10 +4907,9 @@ public enum MsgChatLink: Equatable, Hashable { public func infoLine(signed: Bool) -> String { var s: String = switch self { case let .group(_, groupProfile): - switch groupProfile.publicGroup?.groupType { - case .channel: NSLocalizedString("Channel link", comment: "chat link info line") - case .unknown, .none: NSLocalizedString("Group link", comment: "chat link info line") - } + groupProfile.isChannel + ? NSLocalizedString("Channel link", comment: "chat link info line") + : NSLocalizedString("Group link", comment: "chat link info line") case let .contact(_, _, business): business ? NSLocalizedString("Business address", comment: "chat link info line") diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index 591dde89cd..ca002a8746 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -2094,6 +2094,7 @@ data class GroupInfo ( ChatFeature.Calls -> false } override val timedMessagesTTL: Int? get() = with(fullGroupPreferences.timedMessages) { if (on) ttl else null } + val isChannel: Boolean get() = groupProfile.isChannel override val displayName get() = localAlias.ifEmpty { groupProfile.displayName } override val fullName get() = groupProfile.fullName override val shortDescr get() = groupProfile.shortDescr @@ -2213,6 +2214,8 @@ data class GroupProfile ( val groupPreferences: GroupPreferences? = null, val memberAdmission: GroupMemberAdmission? = null ): NamedChat { + val isChannel: Boolean get() = publicGroup?.groupType == GroupType.Channel + companion object { val sampleData = GroupProfile( displayName = "team", @@ -4594,30 +4597,21 @@ sealed class MsgChatLink { val iconRes: ImageResource get() = when (this) { - is Group -> when (groupProfile.publicGroup?.groupType) { - GroupType.Channel -> MR.images.ic_bigtop_updates_circle_filled - else -> MR.images.ic_supervised_user_circle_filled - } + is Group -> if (groupProfile.isChannel) MR.images.ic_bigtop_updates_circle_filled else MR.images.ic_supervised_user_circle_filled is Contact -> if (business) MR.images.ic_work_filled_padded else MR.images.ic_account_circle_filled is Invitation -> MR.images.ic_account_circle_filled } val smallIconRes: ImageResource get() = when (this) { - is Group -> when (groupProfile.publicGroup?.groupType) { - GroupType.Channel -> MR.images.ic_bigtop_updates - else -> MR.images.ic_group - } + is Group -> if (groupProfile.isChannel) MR.images.ic_bigtop_updates else MR.images.ic_group is Contact -> if (business) MR.images.ic_work else MR.images.ic_person is Invitation -> MR.images.ic_person } fun infoLine(signed: Boolean): String { var s = when (this) { - is Group -> when (groupProfile.publicGroup?.groupType) { - GroupType.Channel -> generalGetString(MR.strings.chat_link_channel) - else -> generalGetString(MR.strings.chat_link_group) - } + is Group -> if (groupProfile.isChannel) generalGetString(MR.strings.chat_link_channel) else generalGetString(MR.strings.chat_link_group) is Contact -> if (business) generalGetString(MR.strings.chat_link_business_address) else generalGetString(MR.strings.chat_link_contact_address) is Invitation -> generalGetString(MR.strings.chat_link_one_time) } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index a42f66c6cf..d05b610aff 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -46,7 +46,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.serialization.json.Json import kotlin.time.Duration.Companion.seconds -enum class PresetTagKind { GROUP_REPORTS, FAVORITES, CONTACTS, GROUPS, BUSINESS, NOTES } +enum class PresetTagKind { GROUP_REPORTS, FAVORITES, CONTACTS, GROUPS, CHANNELS, BUSINESS, NOTES } sealed class ActiveFilter { data class PresetTag(val tag: PresetTagKind) : ActiveFilter() @@ -1236,7 +1236,11 @@ fun presetTagMatchesChat(tag: PresetTagKind, chatInfo: ChatInfo, chatStats: Chat else -> false } PresetTagKind.GROUPS -> when (chatInfo) { - is ChatInfo.Group -> chatInfo.groupInfo.businessChat == null + is ChatInfo.Group -> chatInfo.groupInfo.businessChat == null && !chatInfo.groupInfo.isChannel + else -> false + } + PresetTagKind.CHANNELS -> when (chatInfo) { + is ChatInfo.Group -> chatInfo.groupInfo.isChannel else -> false } PresetTagKind.BUSINESS -> when (chatInfo) { @@ -1255,6 +1259,7 @@ private fun presetTagLabel(tag: PresetTagKind, active: Boolean): Pair (if (active) MR.images.ic_star_filled else MR.images.ic_star) to MR.strings.chat_list_favorites PresetTagKind.CONTACTS -> (if (active) MR.images.ic_person_filled else MR.images.ic_person) to MR.strings.chat_list_contacts PresetTagKind.GROUPS -> (if (active) MR.images.ic_group_filled else MR.images.ic_group) to MR.strings.chat_list_groups + PresetTagKind.CHANNELS -> (if (active) MR.images.ic_bigtop_updates_circle_filled else MR.images.ic_bigtop_updates) to MR.strings.chat_list_channels PresetTagKind.BUSINESS -> (if (active) MR.images.ic_work_filled else MR.images.ic_work) to MR.strings.chat_list_businesses PresetTagKind.NOTES -> (if (active) MR.images.ic_folder_closed_filled else MR.images.ic_folder_closed) to MR.strings.chat_list_notes } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 9796d276c7..1477e4f607 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -497,6 +497,7 @@ Favorites Contacts Groups + Channels Businesses Notes Reports From 035a2f954c015b85489b8a9e2d080ab00b42dc41 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Apr 2026 17:41:52 +0100 Subject: [PATCH 049/152] ui: new UX for making connections after / as part of onboarding (#6753) * ui: additional images, views for making connections and creating groups (#6750) * ios: setup for additional assets * ios build config * header * fix * update layout * more views with images * layout * layout * android images and view * fix path * fix desktop * fix desktop build * smaller image * layout * more layout * more kotlin views * group layout * padding * create group layout * more create group layout * layout * tweak layout * more tweak * config --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * ios: connecting as part of onboarding (#6754) * ios: implementation of "connecting" cards * ios: revision * fix flip * fixes * fix frame * replace nav stack with tab view * rename * update gradient and card label material * fix gradient * debug * remove debug code * update card labels * card label layout * landscape cards * layout * safe area * less bold * debug landscape * refactor titles, back inline with title in landscape * remove ignoreSafeArea * remove extra padding * refactor * clean * layout spec added to plan --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * android, desktop: connecting during onboarding - new cards (#6757) * android, desktop: connecting during onboarding - new cards * fix * change layout * fixes * fix * fix * layout * fix layout * animation * import * paddings * 350ms * font * fonts * layout * box * more layout * layout * simpler * hide toolbar heading in onboarding mode * simpler desktop layout * better desktop * revert desktop toolbar * bigger font, landscape * fix desktop * cap width * refactor, simplify * qr code scanner icon * use icon without assets * cleaner * fix * fix --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * android, desktop: connect banner after onboarding (#6761) * android, desktop: connect banner after onboarding * improve * smaller button * bigger icon, same string * fallback gradients * improve build * simpler connect screens during onboarding * left-align * update strings * improve state machine * text, padding * strings * primary color for tap to paste link * fix race condition * fix loading race --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * ios: banner and connect screens (#6767) * ios: banner and connect screens * fix * return nav * remove padding * refactor * refactor * refactor 2 * refactor 3 * refactor 4 * header * xcode files * improve * fix toolbar * toolbar 2 * no assets * no assets 2 * padding * android padding * simplify * layout * fix --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> * fix refreshable * text * fix toolbar color * rework address share logic * padding --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> --- apps/ios/.gitignore | 4 + apps/ios/Debug.xcconfig | 2 + apps/ios/README.md | 21 + apps/ios/Release.xcconfig | 1 + .../SimpleXAssets.xcassets/Contents.json | 6 + .../Shared/Views/ChatList/ChatListView.swift | 53 +- .../Shared/Views/NewChat/AddGroupView.swift | 43 +- .../Views/NewChat/NewChatMenuButton.swift | 10 +- .../Shared/Views/NewChat/NewChatView.swift | 125 ++++- .../Views/NewChat/OnboardingCards.swift | 309 +++++++++++ .../Onboarding/AddressCreationCard.swift | 110 ---- .../Views/Onboarding/ConnectBannerCard.swift | 113 ++++ .../Views/UserSettings/UserAddressView.swift | 120 ++++- apps/ios/SimpleX.xcodeproj/project.pbxproj | 48 +- .../xcshareddata/swiftpm/Package.resolved | 2 +- apps/multiplatform/.gitignore | 5 +- apps/multiplatform/build.gradle.kts | 3 + apps/multiplatform/common/build.gradle.kts | 30 ++ .../kotlin/chat/simplex/common/App.kt | 5 +- .../chat/simplex/common/model/ChatModel.kt | 4 +- .../chat/simplex/common/ui/theme/Theme.kt | 1 + .../common/views/chatlist/ChatListView.kt | 235 +++++--- .../common/views/helpers/BlurModifier.kt | 4 +- .../common/views/newchat/AddGroupView.kt | 35 +- .../common/views/newchat/NewChatSheet.kt | 4 +- .../common/views/newchat/NewChatView.kt | 194 ++++--- .../common/views/newchat/OnboardingCards.kt | 422 +++++++++++++++ .../views/usersettings/UserAddressView.kt | 158 ++++-- .../commonMain/resources/MR/base/strings.xml | 24 +- .../MR/images/ic_qr_code_scanner.svg | 1 + .../default/MR/images/banner_create_link.svg | 4 + .../MR/images/banner_create_link_light.svg | 4 + .../default/MR/images/banner_paste_link.svg | 4 + .../MR/images/banner_paste_link_light.svg | 4 + .../MR/images/card_connect_via_link_alpha.svg | 4 + .../card_connect_via_link_alpha_light.svg | 4 + .../card_create_your_public_address_alpha.svg | 4 + ...create_your_public_address_alpha_light.svg | 4 + .../card_invite_someone_privately_alpha.svg | 4 + ...d_invite_someone_privately_alpha_light.svg | 4 + .../card_let_someone_connect_to_you_alpha.svg | 4 + ...let_someone_connect_to_you_alpha_light.svg | 4 + .../default/MR/images/connect_via_link.svg | 4 + .../MR/images/connect_via_link_light.svg | 4 + .../MR/images/connect_via_link_small.svg | 4 + .../images/connect_via_link_small_light.svg | 4 + .../assets/default/MR/images/create_group.svg | 4 + .../default/MR/images/create_group_light.svg | 4 + .../default/MR/images/one_time_link.svg | 4 + .../default/MR/images/one_time_link_light.svg | 4 + .../default/MR/images/one_time_link_small.svg | 4 + .../MR/images/one_time_link_small_light.svg | 4 + .../default/MR/images/simplex_address.svg | 4 + .../MR/images/simplex_address_light.svg | 4 + .../MR/images/simplex_address_small.svg | 4 + .../MR/images/simplex_address_small_light.svg | 4 + .../chat/simplex/common/StoreWindowState.kt | 3 +- apps/multiplatform/local.properties.example | 2 + plans/2026-04-06-onboarding-cards-compose.md | 492 +++++++++++++++++ plans/2026-04-06-onboarding-cards-ios.md | 501 ++++++++++++++++++ scripts/android/copy-assets.sh | 21 + scripts/ios/copy-assets.sh | 50 ++ 62 files changed, 2858 insertions(+), 407 deletions(-) create mode 100644 apps/ios/Debug.xcconfig create mode 100644 apps/ios/Release.xcconfig create mode 100644 apps/ios/Shared/SimpleXAssets.xcassets/Contents.json create mode 100644 apps/ios/Shared/Views/NewChat/OnboardingCards.swift delete mode 100644 apps/ios/Shared/Views/Onboarding/AddressCreationCard.swift create mode 100644 apps/ios/Shared/Views/Onboarding/ConnectBannerCard.swift create mode 100644 apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/OnboardingCards.kt create mode 100644 apps/multiplatform/common/src/commonMain/resources/MR/images/ic_qr_code_scanner.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_light.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small.svg create mode 100644 apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small_light.svg create mode 100644 plans/2026-04-06-onboarding-cards-compose.md create mode 100644 plans/2026-04-06-onboarding-cards-ios.md create mode 100755 scripts/android/copy-assets.sh create mode 100755 scripts/ios/copy-assets.sh diff --git a/apps/ios/.gitignore b/apps/ios/.gitignore index 3d152a0610..ea8e911891 100644 --- a/apps/ios/.gitignore +++ b/apps/ios/.gitignore @@ -69,3 +69,7 @@ Libraries/ Shared/MyPlayground.playground/* testpush.sh + +# Local build config and generated assets +Local.xcconfig +Shared/SimpleXAssets.xcassets/*.imageset diff --git a/apps/ios/Debug.xcconfig b/apps/ios/Debug.xcconfig new file mode 100644 index 0000000000..7f0389c760 --- /dev/null +++ b/apps/ios/Debug.xcconfig @@ -0,0 +1,2 @@ +SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; +#include? "Local.xcconfig" diff --git a/apps/ios/README.md b/apps/ios/README.md index fb6a6ed40d..1e987f655e 100644 --- a/apps/ios/README.md +++ b/apps/ios/README.md @@ -85,6 +85,27 @@ Workflow: - `Product > Export Localizations` - Export XLIFF files - `Product > Import Localizations` - Import updated translations +## SimpleX Assets + +The app includes optional assets behind the `SIMPLEX_ASSETS` Swift compilation flag. Without setup, the app builds normally without them. + +### Setup + +Create `Local.xcconfig` (gitignored) in the `apps/ios/` directory: +``` +SIMPLEX_ASSETS_DIR = /path/to/assets +SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) SIMPLEX_ASSETS +``` + +The copy script (`scripts/ios/copy-assets.sh`) runs as a build phase on each build but exits immediately if `SIMPLEX_ASSETS` is not set. + +### Updating assets + +When source images change, regenerate resized images (requires ImageMagick): +```bash +cd path/to/assets && ./resize.sh +``` + ## Background Capabilities Configured in Info.plist: diff --git a/apps/ios/Release.xcconfig b/apps/ios/Release.xcconfig new file mode 100644 index 0000000000..234f81e782 --- /dev/null +++ b/apps/ios/Release.xcconfig @@ -0,0 +1 @@ +#include? "Local.xcconfig" diff --git a/apps/ios/Shared/SimpleXAssets.xcassets/Contents.json b/apps/ios/Shared/SimpleXAssets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/apps/ios/Shared/SimpleXAssets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index c881b5c583..967fedf293 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -294,36 +294,40 @@ struct ChatListView: View { @ToolbarContentBuilder var topToolbar: some ToolbarContent { ToolbarItem(placement: .topBarLeading) { leadingToolbarItem } - ToolbarItem(placement: .principal) { SubsStatusIndicator() } + ToolbarItem(placement: .principal) { if !shouldShowOnboarding { SubsStatusIndicator() } } ToolbarItem(placement: .topBarTrailing) { trailingToolbarItem } } - + @ToolbarContentBuilder var bottomToolbar: some ToolbarContent { let padding: Double = Self.hasHomeIndicator ? 0 : 14 ToolbarItem(placement: .bottomBar) { HStack { leadingToolbarItem.padding(.bottom, padding) Spacer() - SubsStatusIndicator().padding(.bottom, padding) - Spacer() + if !shouldShowOnboarding { + SubsStatusIndicator().padding(.bottom, padding) + Spacer() + } trailingToolbarItem.padding(.bottom, padding) } .contentShape(Rectangle()) .onTapGesture { scrollToSearchBar = true } } } - + @ToolbarContentBuilder func bottomToolbarGroup() -> some ToolbarContent { let padding: Double = Self.hasHomeIndicator ? 0 : 14 ToolbarItemGroup(placement: viewOnScreen ? .bottomBar : .principal) { leadingToolbarItem.padding(.bottom, padding) Spacer() - SubsStatusIndicator().padding(.bottom, padding) - Spacer() + if !shouldShowOnboarding { + SubsStatusIndicator().padding(.bottom, padding) + Spacer() + } trailingToolbarItem.padding(.bottom, padding) } } - + @ViewBuilder var leadingToolbarItem: some View { let user = chatModel.currentUser ?? User.sampleData ZStack(alignment: .topTrailing) { @@ -349,7 +353,34 @@ struct ChatListView: View { } } - private var chatList: some View { + private var shouldShowOnboarding: Bool { + !addressCreationCardShown && !chatModel.chats.isEmpty && !hasConversations + } + + private var hasConversations: Bool { + chatModel.chats.contains { chat in + switch chat.chatInfo { + case .local: return false + case let .direct(contact): return !contact.chatDeleted && !contact.isContactCard + case .group: return true + case .contactRequest: return false + case .contactConnection: return false + case .invalidJSON: return false + } + } + } + + @ViewBuilder private var chatList: some View { + if shouldShowOnboarding { + ConnectOnboardingView() + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) + .modifier(ThemedBackground()) + } else { + chatListContent + } + } + + private var chatListContent: some View { let cs = filteredChats() return ZStack { ScrollViewReader { scrollProxy in @@ -396,8 +427,8 @@ struct ChatListView: View { .listRowSeparator(.hidden) .listRowBackground(Color.clear) } - if !addressCreationCardShown { - AddressCreationCard() + if !addressCreationCardShown && hasConversations { + ConnectBannerCard() .padding(.vertical, 6) .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) .listRowSeparator(.hidden) diff --git a/apps/ios/Shared/Views/NewChat/AddGroupView.swift b/apps/ios/Shared/Views/NewChat/AddGroupView.swift index 87cf377623..3ce4d1fa40 100644 --- a/apps/ios/Shared/Views/NewChat/AddGroupView.swift +++ b/apps/ios/Shared/Views/NewChat/AddGroupView.swift @@ -10,6 +10,7 @@ import SwiftUI import SimpleXChat struct AddGroupView: View { + @Environment(\.colorScheme) var colorScheme @EnvironmentObject var m: ChatModel @EnvironmentObject var theme: AppTheme @Environment(\.dismiss) var dismiss: DismissAction @@ -66,29 +67,39 @@ struct AddGroupView: View { func createGroupView() -> some View { List { Group { - ZStack(alignment: .center) { - ZStack(alignment: .topTrailing) { - ProfileImage(imageStr: profile.image, iconName: "person.2.circle.fill", size: 128) - if profile.image != nil { - Button { - profile.image = nil - } label: { - Image(systemName: "multiply") - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 12) + HStack(spacing: 0) { + ZStack(alignment: .center) { + ZStack(alignment: .topTrailing) { + ProfileImage(imageStr: profile.image, iconName: "person.2.circle.fill", size: 128) + if profile.image != nil { + Button { + profile.image = nil + } label: { + Image(systemName: "multiply") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 12) + } } } - } - editImageButton { showChooseSource = true } - .buttonStyle(BorderlessButtonStyle()) // otherwise whole "list row" is clickable + editImageButton { showChooseSource = true } + .buttonStyle(BorderlessButtonStyle()) // otherwise whole "list row" is clickable + } + .frame(maxWidth: .infinity) + #if SIMPLEX_ASSETS + Image(colorScheme == .light ? "create-group" : "create-group-light") + .resizable() + .scaledToFit() + .frame(height: 140) + .frame(maxWidth: .infinity) + #endif } - .frame(maxWidth: .infinity, alignment: .center) + .frame(maxWidth: .infinity) } .listRowBackground(Color.clear) .listRowSeparator(.hidden) - .listRowInsets(EdgeInsets(top: 8, leading: 0, bottom: 8, trailing: 0)) + .listRowInsets(EdgeInsets(top: 8, leading: 0, bottom: 0, trailing: 0)) Section { groupNameTextField() diff --git a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift index 8e62923f3f..177f8761f4 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatMenuButton.swift @@ -55,7 +55,7 @@ struct NewChatSheet: View { let showArchive = chatModel.chats.contains { $0.chatInfo.contact?.chatDeleted == true } let v = NavigationView { viewBody(showArchive) - .navigationTitle("New message") + .navigationTitle("New chat") .navigationBarTitleDisplayMode(.large) .navigationBarHidden(searchMode) .modifier(ThemedBackground(grouped: true)) @@ -99,9 +99,8 @@ struct NewChatSheet: View { Section { NavigationLink(isActive: $isAddContactActive) { NewChatView(selection: .invite) - .navigationTitle("New chat") .modifier(ThemedBackground(grouped: true)) - .navigationBarTitleDisplayMode(.large) + .navigationBarTitleDisplayMode(.inline) } label: { navigateOnTap(Label("Create 1-time link", systemImage: "link.badge.plus")) { isAddContactActive = true @@ -109,9 +108,8 @@ struct NewChatSheet: View { } NavigationLink(isActive: $isScanPasteLinkActive) { NewChatView(selection: .connect, showQRCodeScanner: true) - .navigationTitle("New chat") .modifier(ThemedBackground(grouped: true)) - .navigationBarTitleDisplayMode(.large) + .navigationBarTitleDisplayMode(.inline) } label: { navigateOnTap(Label("Scan / Paste link", systemImage: "qrcode")) { isScanPasteLinkActive = true @@ -131,7 +129,7 @@ struct NewChatSheet: View { .modifier(ThemedBackground(grouped: true)) .navigationBarTitleDisplayMode(.large) } label: { - Label("Create public channel (BETA)", systemImage: "antenna.radiowaves.left.and.right.circle.fill") + Label("Create public channel (BETA)", systemImage: "antenna.radiowaves.left.and.right") } } diff --git a/apps/ios/Shared/Views/NewChat/NewChatView.swift b/apps/ios/Shared/Views/NewChat/NewChatView.swift index 7a5e8fbbc1..fab8f8a143 100644 --- a/apps/ios/Shared/Views/NewChat/NewChatView.swift +++ b/apps/ios/Shared/Views/NewChat/NewChatView.swift @@ -80,6 +80,7 @@ struct NewChatView: View { @EnvironmentObject var theme: AppTheme @State var selection: NewChatOption @State var showQRCodeScanner = false + var onboarding: Bool = false @State private var invitationUsed: Bool = false @State private var connLinkInvitation: CreatedConnLink = CreatedConnLink(connFullLink: "", connShortLink: nil) @State private var showShortLink = true @@ -91,17 +92,19 @@ struct NewChatView: View { var body: some View { VStack(alignment: .leading) { - Picker("New chat", selection: $selection) { - Label("1-time link", systemImage: "link") - .tag(NewChatOption.invite) - Label("Connect via link", systemImage: "qrcode") - .tag(NewChatOption.connect) - } - .pickerStyle(.segmented) - .padding() - .onChange(of: $selection.wrappedValue) { opt in - if opt == NewChatOption.connect { - showQRCodeScanner = true + if !onboarding { + Picker("New chat", selection: $selection) { + Label("1-time link", systemImage: "link") + .tag(NewChatOption.invite) + Label("Connect via link", systemImage: "qrcode") + .tag(NewChatOption.connect) + } + .pickerStyle(.segmented) + .padding() + .onChange(of: $selection.wrappedValue) { opt in + if opt == NewChatOption.connect { + showQRCodeScanner = true + } } } @@ -116,7 +119,7 @@ struct NewChatView: View { } } if case .connect = selection { - ConnectView(showQRCodeScanner: $showQRCodeScanner, pastedLink: $pastedLink, alert: $alert) + ConnectView(showQRCodeScanner: $showQRCodeScanner, pastedLink: $pastedLink, alert: $alert, onboarding: onboarding) .transition(.move(edge: .trailing)) } } @@ -141,16 +144,22 @@ struct NewChatView: View { } default: () } - } + }, + including: onboarding ? .subviews : .all ) } .toolbar { ToolbarItem(placement: .navigationBarTrailing) { - InfoSheetButton { - AddContactLearnMore(showTitle: true) + if !onboarding { + InfoSheetButton { + AddContactLearnMore(showTitle: true) + } + } else { + Image(systemName: "info.circle").opacity(0) } } } + .if(onboarding) { $0.navigationBarTitleDisplayMode(.inline) } .modifier(ThemedBackground(grouped: true)) .onChange(of: invitationUsed) { used in if used && !(m.showingInvitation?.connChatUsed ?? true) { @@ -179,7 +188,8 @@ struct NewChatView: View { contactConnection: $contactConnection, connLinkInvitation: $connLinkInvitation, showShortLink: $showShortLink, - choosingProfile: $choosingProfile + choosingProfile: $choosingProfile, + onboarding: onboarding ) } else if creatingConnReq { creatingLinkProgressView() @@ -239,6 +249,7 @@ private func incognitoProfileImage() -> some View { } private struct InviteView: View { + @Environment(\.colorScheme) var colorScheme @EnvironmentObject var chatModel: ChatModel @EnvironmentObject var theme: AppTheme @Binding var invitationUsed: Bool @@ -246,18 +257,19 @@ private struct InviteView: View { @Binding var connLinkInvitation: CreatedConnLink @Binding var showShortLink: Bool @Binding var choosingProfile: Bool + var onboarding: Bool = false @AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false var body: some View { List { - Section(header: Text("Share this 1-time invite link").foregroundColor(theme.colors.secondary)) { + Section(header: sectionHeader) { shareLinkView() } .listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)) qrCodeView() - if let selectedProfile = chatModel.currentUser { + if !onboarding, let selectedProfile = chatModel.currentUser { Section { NavigationLink { ActiveProfilePicker( @@ -281,9 +293,9 @@ private struct InviteView: View { } header: { Text("Share profile").foregroundColor(theme.colors.secondary) } footer: { - if incognitoDefault { - Text("A new random profile will be shared.") - } + if incognitoDefault { + Text("A new random profile will be shared.") + } } } } @@ -295,16 +307,52 @@ private struct InviteView: View { } } + private var sectionHeader: some View { + #if SIMPLEX_ASSETS + VStack(alignment: .leading, spacing: 0) { + Image(colorScheme == .light + ? (onboarding ? "one-time-link" : "one-time-link-small") + : (onboarding ? "one-time-link-light" : "one-time-link-small-light")) + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity) + sectionHeaderText + } + .padding(.bottom, 6) + #else + sectionHeaderText + .if(onboarding) { $0.padding(.bottom, 6) } + #endif + } + + @ViewBuilder private var sectionHeaderText: some View { + if onboarding { + Text("Send the link via any messenger - it's secure. Ask to paste into SimpleX.") + .font(.body).foregroundColor(theme.colors.onBackground).textCase(nil) + } else { + Text("Share this 1-time invite link").foregroundColor(theme.colors.secondary) + } + } + private func shareLinkView() -> some View { - HStack { + HStack(spacing: 8) { let link = connLinkInvitation.simplexChatUri(short: showShortLink) linkTextView(link) + Button { + UIPasteboard.general.string = link + setInvitationUsed() + } label: { + Image(systemName: "doc.on.doc") + .padding(.top, -7) + .padding(.horizontal, 8) + } Button { showShareSheet(items: [link]) setInvitationUsed() } label: { Image(systemName: "square.and.arrow.up") .padding(.top, -7) + .padding(.horizontal, 8) } } .frame(maxWidth: .infinity) @@ -324,7 +372,11 @@ private struct InviteView: View { .listRowSeparator(.hidden) .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) } header: { - ToggleShortLinkHeader(text: Text("Or show this code"), link: connLinkInvitation, short: $showShortLink) + if onboarding { + Text("Or show QR in person or via video call.").font(.body).foregroundColor(theme.colors.onBackground).textCase(nil) + } else { + ToggleShortLinkHeader(text: Text("Or show this code"), link: connLinkInvitation, short: $showShortLink) + } } } @@ -587,20 +639,24 @@ private struct ActiveProfilePicker: View { } private struct ConnectView: View { + @Environment(\.colorScheme) var colorScheme @StateObject private var connectProgressManager = ConnectProgressManager.shared @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject var theme: AppTheme @Binding var showQRCodeScanner: Bool @Binding var pastedLink: String @Binding var alert: NewChatViewAlert? + var onboarding: Bool = false @State var scannerPaused: Bool = false @State private var pasteboardHasStrings = UIPasteboard.general.hasStrings var body: some View { List { - Section(header: Text("Paste the link you received").foregroundColor(theme.colors.secondary)) { + Section(header: connectSectionHeader) { pasteLinkView() } + .listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20)) + Section(header: Text("Or scan QR code").foregroundColor(theme.colors.secondary)) { ScannerInView(showQRCodeScanner: $showQRCodeScanner, scannerPaused: $scannerPaused, processQRCode: processQRCode) } @@ -630,7 +686,7 @@ private struct ConnectView: View { } } } label: { - Text("Tap to paste link") + Text("Tap to paste link").foregroundColor(theme.colors.primary) } .disabled(!pasteboardHasStrings) .frame(maxWidth: .infinity, alignment: .center) @@ -669,6 +725,23 @@ private struct ConnectView: View { } } + private var connectSectionHeader: some View { + #if SIMPLEX_ASSETS + VStack(alignment: .leading, spacing: 0) { + Image(colorScheme == .light + ? (onboarding ? "connect-via-link" : "connect-via-link-small") + : (onboarding ? "connect-via-link-light" : "connect-via-link-small-light")) + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity) + Text("Paste the link you received").foregroundColor(theme.colors.secondary) + } + .padding(.bottom, 4) + #else + Text("Paste the link you received").foregroundColor(theme.colors.secondary) + #endif + } + private func connect(_ link: String) { scannerPaused = true planAndConnect( @@ -765,7 +838,7 @@ struct ScannerInView: View { } -private func linkTextView(_ link: String) -> some View { +func linkTextView(_ link: String) -> some View { Text(link) .lineLimit(1) .font(.caption) diff --git a/apps/ios/Shared/Views/NewChat/OnboardingCards.swift b/apps/ios/Shared/Views/NewChat/OnboardingCards.swift new file mode 100644 index 0000000000..913fdf5577 --- /dev/null +++ b/apps/ios/Shared/Views/NewChat/OnboardingCards.swift @@ -0,0 +1,309 @@ +// +// OnboardingCards.swift +// SimpleX (iOS) +// +// Created by simplex-chat on 06.04.2026. +// Copyright © 2026 SimpleX Chat. All rights reserved. +// + +import SwiftUI +import SimpleXChat + +// MARK: - Card component + +struct OnboardingCardView: View { + @Environment(\.colorScheme) var colorScheme + @EnvironmentObject var theme: AppTheme + @AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial + let imageName: String + let icon: String + let title: LocalizedStringKey + var subtitle: LocalizedStringKey? = nil + let labelHeightRatio: CGFloat + let action: () -> Void + + static let lightStops: [Gradient.Stop] = [ + .init(color: Color(red: 0.824, green: 0.910, blue: 1.0), location: 0.0), + .init(color: Color(red: 0.800, green: 0.914, blue: 1.0), location: 0.5), + .init(color: Color(red: 0.875, green: 1.0, blue: 1.0), location: 0.9), + .init(color: Color(red: 1.0, green: 0.988, blue: 0.918), location: 1.0) + ] + + static let darkStops: [Gradient.Stop] = [ + .init(color: Color(red: 0.016, green: 0.039, blue: 0.141), location: 0.4), + .init(color: Color(red: 0.220, green: 0.329, blue: 0.671), location: 0.72), + .init(color: Color(red: 0.659, green: 0.929, blue: 0.953), location: 0.9), + .init(color: Color(red: 1.0, green: 0.965, blue: 0.878), location: 1.0) + ] + + static let gradientAngle: Double = 80.0 * .pi / 180.0 + + static func gradientPoints(aspectRatio: CGFloat, scale: CGFloat) -> (start: UnitPoint, end: UnitPoint) { + let r = Double(aspectRatio) + let s = Double(scale) + let dx = cos(gradientAngle) + let dy = -sin(gradientAngle) / r + let dLenSq = dx * dx + dy * dy + let projections = [ + -0.5 * dx + (-0.5) * dy, + 0.5 * dx + (-0.5) * dy, + -0.5 * dx + 0.5 * dy, + 0.5 * dx + 0.5 * dy + ] + let tMin = projections.min()! + let tMax = projections.max()! + let startX = 0.5 + tMin * dx / dLenSq + let startY = 0.5 + tMin * dy / dLenSq + let endX = 0.5 + tMax * dx / dLenSq + let endY = 0.5 + tMax * dy / dLenSq + return ( + start: .init(x: 0.5 + (startX - 0.5) * s, y: 0.5 + (startY - 0.5) * s), + end: .init(x: 0.5 + (endX - 0.5) * s, y: 0.5 + (endY - 0.5) * s) + ) + } + + var body: some View { + Button(action: action) { + GeometryReader { geo in + let labelHeight = geo.size.width * labelHeightRatio + let imageHeight = max(geo.size.height - labelHeight, 1) + let imageAspect = imageHeight / geo.size.width + let gp = Self.gradientPoints(aspectRatio: imageAspect, scale: colorScheme == .light ? 1.2 : 1.5) + VStack(spacing: 0) { + ZStack { + LinearGradient( + stops: colorScheme == .light ? Self.lightStops : Self.darkStops, + startPoint: gp.start, + endPoint: gp.end + ) + #if SIMPLEX_ASSETS + Image(colorScheme == .light ? imageName : "\(imageName)-light") + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity, maxHeight: .infinity) + .clipped() + #else + Image(systemName: icon) + .font(.system(size: imageHeight * 0.25)) + .foregroundColor(theme.colors.primary) + #endif + } + .frame(height: imageHeight) + + labelRow(height: labelHeight) + } + } + .clipShape(RoundedRectangle(cornerRadius: 24)) + } + .buttonStyle(.plain) + } + + private func labelRow(height: CGFloat) -> some View { + VStack { + HStack { + #if SIMPLEX_ASSETS + Image(systemName: icon) + .font(.system(size: 24)) + .foregroundColor(theme.colors.primary) + #endif + Text(title) + .font(.body) + .fontWeight(.medium) + .foregroundColor(theme.colors.onBackground) + .lineLimit(1) + .minimumScaleFactor(0.75) + } + if let subtitle { + Text(subtitle) + .font(.footnote) + .foregroundColor(theme.colors.onBackground.opacity(0.7)) + } + } + .frame(height: height) + .frame(maxWidth: .infinity, alignment: .center) + .padding(.horizontal, 16) + .background(ToolbarMaterial.material(toolbarMaterial)) + } +} + +// MARK: - Onboarding pager + +private let backButtonHeight: CGFloat = 44 + +struct ConnectOnboardingView: View { + @EnvironmentObject var m: ChatModel + @EnvironmentObject var theme: AppTheme + @Environment(\.verticalSizeClass) private var verticalSizeClass + @State private var currentPage = 0 + @State private var showConnectViaLink = false + @State private var showInviteSomeone = false + @State private var showCreateAddress = false + + var body: some View { + TabView(selection: $currentPage) { + talkToSomeonePage.tag(0) + connectWithSomeonePage.tag(1) + } + .tabViewStyle(.page(indexDisplayMode: .never)) + .sheet(isPresented: $showConnectViaLink) { + NavigationView { + NewChatView(selection: .connect, showQRCodeScanner: true, onboarding: true) + .modifier(ThemedBackground(grouped: true)) + } + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) + } + .sheet(isPresented: $showInviteSomeone) { + NavigationView { + NewChatView(selection: .invite, onboarding: true) + .modifier(ThemedBackground(grouped: true)) + } + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) + } + .sheet(isPresented: $showCreateAddress) { + NavigationView { + UserAddressView(autoCreate: true, onboarding: true) + .modifier(ThemedBackground(grouped: true)) + } + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) + } + } + + @ViewBuilder + private func cardPair( + _ geo: GeometryProxy, + @ViewBuilder card1: () -> C1, + @ViewBuilder card2: () -> C2 + ) -> some View { + let padding: CGFloat = 20 + let spacing: CGFloat = 20 + let isLandscape = verticalSizeClass == .compact + let cardWidth = isLandscape + ? (geo.size.width - padding * 2 - spacing) / 2 + : geo.size.width - padding * 2 + let maxCardHeight = cardWidth * 0.75 + + if isLandscape { + HStack(spacing: spacing) { + card1().frame(maxHeight: maxCardHeight) + card2().frame(maxHeight: maxCardHeight) + } + .padding(.horizontal, padding) + } else { + VStack(spacing: spacing) { + card1().frame(maxHeight: maxCardHeight) + card2().frame(maxHeight: maxCardHeight) + } + .padding(.horizontal, padding) + } + } + + // MARK: Screen 1 + + @ViewBuilder + private func pageHeader(_ title: LocalizedStringKey, showBack: Bool) -> some View { + let isLandscape = verticalSizeClass == .compact + let titleView = Text(title) + .font(.largeTitle) + .bold() + .lineLimit(1) + .minimumScaleFactor(0.75) + .frame(maxWidth: .infinity, alignment: .center) + if isLandscape { + ZStack(alignment: .leading) { + if showBack { backButton } + titleView + } + .padding(.horizontal, 16) + } else { + VStack(spacing: 0) { + if showBack { + backButton.frame(maxWidth: .infinity, alignment: .leading) + } else { + Color.clear.frame(height: backButtonHeight) + } + titleView + } + .padding(.horizontal, 16) + } + } + + private var backButton: some View { + Button { + withAnimation { currentPage = 0 } + } label: { + HStack(spacing: 4) { + Image(systemName: "chevron.left") + Text("Back") + } + } + .frame(height: backButtonHeight) + } + + // MARK: Screen 1 + + private var talkToSomeonePage: some View { + GeometryReader { geo in + VStack(spacing: 0) { + pageHeader("Talk to someone", showBack: false) + + Spacer(minLength: 16) + + cardPair(geo) { + OnboardingCardView( + imageName: "card-let-someone-connect-to-you-alpha", + icon: "link.badge.plus", + title: "Let someone connect to you", + labelHeightRatio: 0.132, + action: { withAnimation { currentPage = 1 } } + ) + } card2: { + OnboardingCardView( + imageName: "card-connect-via-link-alpha", + icon: "qrcode.viewfinder", + title: "Connect via link or QR code", + labelHeightRatio: 0.132, + action: { showConnectViaLink = true } + ) + } + + Spacer(minLength: 16) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } + + // MARK: Screen 2 + + private var connectWithSomeonePage: some View { + GeometryReader { geo in + VStack(spacing: 0) { + pageHeader("Connect with someone", showBack: true) + + Spacer(minLength: 16) + + cardPair(geo) { + OnboardingCardView( + imageName: "card-invite-someone-privately-alpha", + icon: "link.badge.plus", + title: "Invite someone privately", + subtitle: "A link for one person to connect", + labelHeightRatio: 0.195, + action: { showInviteSomeone = true } + ) + } card2: { + OnboardingCardView( + imageName: "card-create-your-public-address-alpha", + icon: "qrcode", + title: m.userAddress != nil ? "Your public address" : "Create your public address", + subtitle: "For anyone to reach you", + labelHeightRatio: 0.195, + action: { showCreateAddress = true } + ) + } + + Spacer(minLength: 16) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + } + } +} diff --git a/apps/ios/Shared/Views/Onboarding/AddressCreationCard.swift b/apps/ios/Shared/Views/Onboarding/AddressCreationCard.swift deleted file mode 100644 index f22d59fcac..0000000000 --- a/apps/ios/Shared/Views/Onboarding/AddressCreationCard.swift +++ /dev/null @@ -1,110 +0,0 @@ -// -// AddressCreationCard.swift -// SimpleX (iOS) -// -// Created by Diogo Cunha on 13/11/2024. -// Copyright © 2024 SimpleX Chat. All rights reserved. -// -// Spec: spec/client/navigation.md - -import SwiftUI -import SimpleXChat - -struct AddressCreationCard: View { - @EnvironmentObject var theme: AppTheme - @EnvironmentObject private var chatModel: ChatModel - @Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize - @AppStorage(DEFAULT_ADDRESS_CREATION_CARD_SHOWN) private var addressCreationCardShown = false - @State private var showAddressCreationAlert = false - @State private var showAddressSheet = false - @State private var showAddressInfoSheet = false - - var body: some View { - let addressExists = chatModel.userAddress != nil - let chats = chatModel.chats.filter { chat in - !chat.chatInfo.chatDeleted && !chat.chatInfo.contactCard - } - ZStack(alignment: .topTrailing) { - HStack(alignment: .top, spacing: 16) { - let envelopeSize = dynamicSize(userFont).profileImageSize - Image(systemName: "envelope.circle.fill") - .resizable() - .frame(width: envelopeSize, height: envelopeSize) - .foregroundColor(.accentColor) - VStack(alignment: .leading) { - Text("Your SimpleX address") - .font(.title3) - Spacer() - Text("How to use it") + textSpace + Text(Image(systemName: "info.circle")).foregroundColor(theme.colors.secondary) - } - } - .frame(maxWidth: .infinity, alignment: .leading) - VStack(alignment: .trailing) { - Image(systemName: "multiply") - .foregroundColor(theme.colors.secondary) - .onTapGesture { - showAddressCreationAlert = true - } - Spacer() - Text("Create") - .foregroundColor(.accentColor) - .onTapGesture { - showAddressSheet = true - } - } - } - .onTapGesture { - showAddressInfoSheet = true - } - .padding() - .background(theme.appColors.sentMessage) - .cornerRadius(12) - .frame(height: dynamicSize(userFont).rowHeight) - .alert(isPresented: $showAddressCreationAlert) { - Alert( - title: Text("SimpleX address"), - message: Text("Tap Create SimpleX address in the menu to create it later."), - dismissButton: .default(Text("Ok")) { - withAnimation { - addressCreationCardShown = true - } - } - ) - } - .sheet(isPresented: $showAddressSheet) { - NavigationView { - UserAddressView(autoCreate: true) - .navigationTitle("SimpleX address") - .navigationBarTitleDisplayMode(.large) - .modifier(ThemedBackground(grouped: true)) - } - } - .sheet(isPresented: $showAddressInfoSheet) { - NavigationView { - UserAddressLearnMore(showCreateAddressButton: true) - .navigationTitle("Address or 1-time link?") - .navigationBarTitleDisplayMode(.inline) - .modifier(ThemedBackground(grouped: true)) - } - } - .onChange(of: addressExists) { exists in - if exists, !addressCreationCardShown { - addressCreationCardShown = true - } - } - .onChange(of: chats.count) { size in - if size >= 3, !addressCreationCardShown { - addressCreationCardShown = true - } - } - .onAppear { - if addressExists, !addressCreationCardShown { - addressCreationCardShown = true - } - } - } -} - -#Preview { - AddressCreationCard() -} diff --git a/apps/ios/Shared/Views/Onboarding/ConnectBannerCard.swift b/apps/ios/Shared/Views/Onboarding/ConnectBannerCard.swift new file mode 100644 index 0000000000..460ab9b141 --- /dev/null +++ b/apps/ios/Shared/Views/Onboarding/ConnectBannerCard.swift @@ -0,0 +1,113 @@ +// +// ConnectBannerCard.swift +// SimpleX (iOS) +// +// Copyright © 2026 SimpleX Chat. All rights reserved. +// + +import SwiftUI +import SimpleXChat + +private let bannerImageRatio: CGFloat = 800 / 505 + +struct ConnectBannerCard: View { + @Environment(\.colorScheme) var colorScheme + @EnvironmentObject var theme: AppTheme + @AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial + @AppStorage(DEFAULT_ADDRESS_CREATION_CARD_SHOWN) private var addressCreationCardShown = false + @State private var showNewLink = false + @State private var showPasteLink = false + + var body: some View { + VStack(alignment: .trailing, spacing: 3) { + Button { + withAnimation { addressCreationCardShown = true } + } label: { + Image(systemName: "multiply") + .font(.system(size: 14, weight: .semibold)) + .foregroundColor(theme.colors.secondary) + .frame(width: 30, height: 30) + .background(theme.colors.onBackground.opacity(0.08), in: Circle()) + } + HStack(spacing: 2) { + bannerHalf( + imageName: "banner-create-link", + icon: "link.badge.plus", + title: "New 1-time link", + action: { showNewLink = true } + ) + bannerHalf( + imageName: "banner-paste-link", + icon: "qrcode.viewfinder", + title: "Paste link / Scan", + action: { showPasteLink = true } + ) + } + .clipShape(RoundedRectangle(cornerRadius: 18)) + } + .sheet(isPresented: $showNewLink) { + NavigationView { + NewChatView(selection: .invite) + .modifier(ThemedBackground(grouped: true)) + } + } + .sheet(isPresented: $showPasteLink) { + NavigationView { + NewChatView(selection: .connect, showQRCodeScanner: true) + .modifier(ThemedBackground(grouped: true)) + } + } + } + + @ViewBuilder + private func bannerHalf(imageName: String, icon: String, title: LocalizedStringKey, action: @escaping () -> Void) -> some View { + Button(action: action) { + VStack(spacing: 0) { + #if SIMPLEX_ASSETS + Image(colorScheme == .light ? imageName : "\(imageName)-light") + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity) + #else + gradientFallback(icon: icon) + #endif + HStack(spacing: 8) { + #if SIMPLEX_ASSETS + Image(systemName: icon) + .font(.system(size: 18)) + .foregroundColor(theme.colors.primary) + #endif + Text(title) + .font(.footnote) + .foregroundColor(theme.colors.onBackground) + .lineLimit(1) + .minimumScaleFactor(0.75) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 8) + .background(ToolbarMaterial.material(toolbarMaterial)) + } + } + .buttonStyle(.plain) + } + + @ViewBuilder + private func gradientFallback(icon: String) -> some View { + let gp = OnboardingCardView.gradientPoints( + aspectRatio: 1 / bannerImageRatio, + scale: colorScheme == .light ? 1.2 : 1.5 + ) + ZStack { + LinearGradient( + stops: colorScheme == .light ? OnboardingCardView.lightStops : OnboardingCardView.darkStops, + startPoint: gp.start, + endPoint: gp.end + ) + Image(systemName: icon) + .font(.system(size: 40)) + .foregroundColor(theme.colors.primary) + } + .aspectRatio(bannerImageRatio, contentMode: .fit) + .frame(maxWidth: .infinity) + } +} diff --git a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift index d40ec116f4..4df58f8b0c 100644 --- a/apps/ios/Shared/Views/UserSettings/UserAddressView.swift +++ b/apps/ios/Shared/Views/UserSettings/UserAddressView.swift @@ -11,11 +11,13 @@ import MessageUI @preconcurrency import SimpleXChat struct UserAddressView: View { + @Environment(\.colorScheme) var colorScheme @Environment(\.dismiss) var dismiss: DismissAction @EnvironmentObject private var chatModel: ChatModel @EnvironmentObject var theme: AppTheme @State var shareViaProfile = false @State var autoCreate = false + var onboarding: Bool = false @State private var showShortLink = true @State private var settings = AddressSettingsState() @State private var savedSettings = AddressSettingsState() @@ -54,6 +56,14 @@ struct UserAddressView: View { } } } + .if(onboarding) { v in + v.toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Image(systemName: "info.circle").opacity(0) + } + } + .navigationBarTitleDisplayMode(.inline) + } .onAppear { if chatModel.userAddress == nil, autoCreate { createAddress() @@ -64,12 +74,16 @@ struct UserAddressView: View { private func userAddressView() -> some View { List { if let userAddress = chatModel.userAddress { - existingAddressView(userAddress) - .onAppear { - settings = AddressSettingsState(settings: userAddress.addressSettings) - savedSettings = AddressSettingsState(settings: userAddress.addressSettings) - } - } else { + if onboarding { + onboardingAddressView(userAddress) + } else { + existingAddressView(userAddress) + .onAppear { + settings = AddressSettingsState(settings: userAddress.addressSettings) + savedSettings = AddressSettingsState(settings: userAddress.addressSettings) + } + } + } else if !onboarding { Section { createAddressButton() } header: { @@ -121,8 +135,8 @@ struct UserAddressView: View { ) case .shareOnCreate: return Alert( - title: Text("Share address with contacts?"), - message: Text("Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts."), + title: Text("Share address with SimpleX contacts?"), + message: Text("Add address to your profile, so that your SimpleX contacts can share it with other people. Profile update will be sent to your SimpleX contacts."), primaryButton: .default(Text("Share")) { setProfileAddress($progressIndicator, true) shareViaProfile = true @@ -157,7 +171,19 @@ struct UserAddressView: View { } addressSettingsButton(userAddress) } header: { + #if SIMPLEX_ASSETS + VStack(alignment: .leading, spacing: 0) { + Image(colorScheme == .light ? "simplex-address-small" : "simplex-address-small-light") + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity) + .padding(.top, -20) + ToggleShortLinkHeader(text: Text("For social media"), link: userAddress.connLinkContact, short: $showShortLink) + } + .padding(.bottom, 4) + #else ToggleShortLinkHeader(text: Text("For social media"), link: userAddress.connLinkContact, short: $showShortLink) + #endif } footer: { if settings.businessAddress { Text("Add your team members to the conversations.") @@ -184,6 +210,59 @@ struct UserAddressView: View { } } + @ViewBuilder private func onboardingAddressView(_ userAddress: UserContactLink) -> some View { + Section { + HStack(spacing: 8) { + let link = userAddress.connLinkContact.simplexChatUri(short: showShortLink) + linkTextView(link) + Button { UIPasteboard.general.string = link } label: { + Image(systemName: "doc.on.doc") + .padding(.top, -7) + .padding(.horizontal, 8) + } + Button { showShareSheet(items: [link]) } label: { + Image(systemName: "square.and.arrow.up") + .padding(.top, -7) + .padding(.horizontal, 8) + } + } + .frame(maxWidth: .infinity) + } header: { + #if SIMPLEX_ASSETS + VStack(alignment: .leading) { + Image(colorScheme == .light ? "simplex-address" : "simplex-address-light") + .resizable() + .scaledToFit() + .frame(maxWidth: .infinity) + Text("Use this address in your social media profile, website, or email signature.") + .font(.body).foregroundColor(theme.colors.onBackground).textCase(nil) + } + .padding(.bottom, 4) + #else + Text("Use this address in your social media profile, website, or email signature.") + .font(.body).foregroundColor(theme.colors.onBackground).textCase(nil) + .padding(.bottom, 6) + #endif + } + .listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10)) + + Section { + SimpleXCreatedLinkQRCode(link: userAddress.connLinkContact, short: $showShortLink) + .id("simplex-contact-address-qrcode-\(userAddress.connLinkContact.simplexChatUri(short: showShortLink))") + .padding() + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color(uiColor: .secondarySystemGroupedBackground)) + ) + .padding(.horizontal) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)) + } header: { + Text("Or use this QR - print or show online.").font(.body).foregroundColor(theme.colors.onBackground).textCase(nil) + } + } + private func createAddressButton() -> some View { Button { createAddress() @@ -200,9 +279,22 @@ struct UserAddressView: View { DispatchQueue.main.async { if let connLinkContact { chatModel.userAddress = UserContactLink(connLinkContact) - alert = .shareOnCreate + let hasRelevantContacts = chatModel.chats.contains { chat in + if case let .direct(contact) = chat.chatInfo { + return contact.active && !contact.isContactCard && !contact.contactConnIncognito + } + return false + } + if hasRelevantContacts { + alert = .shareOnCreate + progressIndicator = false + } else { + setProfileAddress($progressIndicator, true) + shareViaProfile = true + } + } else { + progressIndicator = false } - progressIndicator = false } } catch let error { logger.error("UserAddressView apiCreateUserAddress: \(responseError(error))") @@ -486,15 +578,15 @@ struct UserAddressSettingsView: View { private func shareWithContactsButton() -> some View { settingsRow("person", color: theme.colors.secondary) { - Toggle("Share with contacts", isOn: $shareViaProfile) + Toggle("Share with SimpleX contacts", isOn: $shareViaProfile) .onChange(of: shareViaProfile) { on in if ignoreShareViaProfileChange { ignoreShareViaProfileChange = false } else { if on { showAlert( - NSLocalizedString("Share address with contacts?", comment: "alert title"), - message: NSLocalizedString("Profile update will be sent to your contacts.", comment: "alert message"), + NSLocalizedString("Share address with SimpleX contacts?", comment: "alert title"), + message: NSLocalizedString("Profile update will be sent to your SimpleX contacts.", comment: "alert message"), actions: {[ UIAlertAction( title: NSLocalizedString("Cancel", comment: "alert action"), @@ -516,7 +608,7 @@ struct UserAddressSettingsView: View { } else { showAlert( NSLocalizedString("Stop sharing address?", comment: "alert title"), - message: NSLocalizedString("Profile update will be sent to your contacts.", comment: "alert message"), + message: NSLocalizedString("Profile update will be sent to your SimpleX contacts.", comment: "alert message"), actions: {[ UIAlertAction( title: NSLocalizedString("Cancel", comment: "alert action"), diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 7dd3a6c6ed..ac9bb3ff43 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -225,7 +225,6 @@ B728945B2D0C62BF00F7A19A /* ElegantEmojiPicker in Frameworks */ = {isa = PBXBuildFile; productRef = B728945A2D0C62BF00F7A19A /* ElegantEmojiPicker */; }; B73EFE532CE5FA3500C778EA /* CreateSimpleXAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = B73EFE522CE5FA3500C778EA /* CreateSimpleXAddress.swift */; }; B76E6C312C5C41D900EC11AA /* ContactListNavLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = B76E6C302C5C41D900EC11AA /* ContactListNavLink.swift */; }; - B79ADAFF2CE4EF930083DFFD /* AddressCreationCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = B79ADAFE2CE4EF930083DFFD /* AddressCreationCard.swift */; }; CE176F202C87014C00145DBC /* InvertedForegroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE176F1F2C87014C00145DBC /* InvertedForegroundStyle.swift */; }; CE1EB0E42C459A660099D896 /* ShareAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE1EB0E32C459A660099D896 /* ShareAPI.swift */; }; CE2AD9CE2C452A4D00E844E3 /* ChatUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2AD9CD2C452A4D00E844E3 /* ChatUtils.swift */; }; @@ -252,12 +251,16 @@ E559A0A12E3F77EE00B26F74 /* CommandsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */; }; E5AEC0AB2F91A6EB00270665 /* CIChatLinkHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5AEC0AA2F91A6EA00270665 /* CIChatLinkHeader.swift */; }; E5AEC0AF2F91A73500270665 /* ComposeChatLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5AEC0AE2F91A73500270665 /* ComposeChatLinkView.swift */; }; + E5C0BBE82F82B45500EA7527 /* SimpleXAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E5C0BBE72F82B45500EA7527 /* SimpleXAssets.xcassets */; }; + E5C0BBE92F82B45500EA7527 /* SimpleXAssets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E5C0BBE72F82B45500EA7527 /* SimpleXAssets.xcassets */; }; + E5DBF1932F88169800E1D7FD /* ConnectBannerCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DBF1922F88169800E1D7FD /* ConnectBannerCard.swift */; }; E5DCF8DB2C56FAC1007928CC /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; }; E5DCF9712C590272007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF96F2C590272007928CC /* Localizable.strings */; }; E5DCF9842C5902CE007928CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9822C5902CE007928CC /* Localizable.strings */; }; E5DCF9982C5906FF007928CC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E5DCF9962C5906FF007928CC /* InfoPlist.strings */; }; E5DDBE6E2DC4106800A0EFF0 /* AppAPITypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDBE6D2DC4106200A0EFF0 /* AppAPITypes.swift */; }; E5DDBE702DC4217900A0EFF0 /* NSEAPITypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5DDBE6F2DC4217900A0EFF0 /* NSEAPITypes.swift */; }; + E5E418012F83D2CA00252B9E /* OnboardingCards.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5E418002F83D2CA00252B9E /* OnboardingCards.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -596,7 +599,6 @@ B70CE9E52D4BE5930080F36D /* GroupMentions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupMentions.swift; sourceTree = ""; }; B73EFE522CE5FA3500C778EA /* CreateSimpleXAddress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CreateSimpleXAddress.swift; sourceTree = ""; }; B76E6C302C5C41D900EC11AA /* ContactListNavLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactListNavLink.swift; sourceTree = ""; }; - B79ADAFE2CE4EF930083DFFD /* AddressCreationCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressCreationCard.swift; sourceTree = ""; }; CE176F1F2C87014C00145DBC /* InvertedForegroundStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvertedForegroundStyle.swift; sourceTree = ""; }; CE1EB0E32C459A660099D896 /* ShareAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareAPI.swift; sourceTree = ""; }; CE2AD9CD2C452A4D00E844E3 /* ChatUtils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatUtils.swift; sourceTree = ""; }; @@ -621,6 +623,10 @@ E559A0A02E3F77EE00B26F74 /* CommandsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandsMenuView.swift; sourceTree = ""; }; E5AEC0AA2F91A6EA00270665 /* CIChatLinkHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIChatLinkHeader.swift; sourceTree = ""; }; E5AEC0AE2F91A73500270665 /* ComposeChatLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeChatLinkView.swift; sourceTree = ""; }; + E5C0BBE72F82B45500EA7527 /* SimpleXAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = SimpleXAssets.xcassets; sourceTree = ""; }; + E5C0BBFD2F82BBC000EA7527 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + E5C0BBFE2F82BBC900EA7527 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + E5DBF1922F88169800E1D7FD /* ConnectBannerCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectBannerCard.swift; sourceTree = ""; }; E5DCF9702C590272007928CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; E5DCF9722C590274007928CC /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = ""; }; E5DCF9732C590275007928CC /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; @@ -675,6 +681,7 @@ E5DCF9A82C590732007928CC /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/InfoPlist.strings; sourceTree = ""; }; E5DDBE6D2DC4106200A0EFF0 /* AppAPITypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppAPITypes.swift; sourceTree = ""; }; E5DDBE6F2DC4217900A0EFF0 /* NSEAPITypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSEAPITypes.swift; sourceTree = ""; }; + E5E418002F83D2CA00252B9E /* OnboardingCards.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingCards.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -876,6 +883,8 @@ 5CA059BD279559F40002BEB4 = { isa = PBXGroup; children = ( + E5C0BBFD2F82BBC000EA7527 /* Debug.xcconfig */, + E5C0BBFE2F82BBC900EA7527 /* Release.xcconfig */, 5C55A92D283D0FDE00C4E99E /* sounds */, 5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */, 5CC2C0FA2809BF11000C35E3 /* Localizable.strings */, @@ -901,6 +910,7 @@ 5C764E87279CBC8E000C6508 /* Model */, 5C2E260D27A30E2400F70299 /* Views */, 5CA059C5279559F40002BEB4 /* Assets.xcassets */, + E5C0BBE72F82B45500EA7527 /* SimpleXAssets.xcassets */, D7AA2C3429A936B400737B40 /* MediaEncryption.playground */, 5C13730C2815740A00F43030 /* DebugJSON.playground */, ); @@ -947,7 +957,7 @@ 5C9A5BDA2871E05400A5B906 /* SetNotificationsMode.swift */, 5CBD285B29575B8E00EC2CF4 /* WhatsNewView.swift */, 640743602CD360E600158442 /* ChooseServerOperators.swift */, - B79ADAFE2CE4EF930083DFFD /* AddressCreationCard.swift */, + E5DBF1922F88169800E1D7FD /* ConnectBannerCard.swift */, ); path = Onboarding; sourceTree = ""; @@ -969,6 +979,7 @@ 640417CB2B29B8C200CCB412 /* NewChatMenuButton.swift */, 640417CC2B29B8C200CCB412 /* NewChatView.swift */, 5CC1C99127A6C7F5000D9FF6 /* QRCode.swift */, + E5E418002F83D2CA00252B9E /* OnboardingCards.swift */, 6442E0B9287F169300CEC0F9 /* AddGroupView.swift */, 64D0C2C529FAC1EC00B38D5F /* AddContactLearnMore.swift */, 647B15E72F4C8D2500EB431E /* AddChannelView.swift */, @@ -1236,6 +1247,7 @@ isa = PBXNativeTarget; buildConfigurationList = 5CA059F3279559F40002BEB4 /* Build configuration list for PBXNativeTarget "SimpleX (iOS)" */; buildPhases = ( + E5C0BBF02F82B50C00EA7527 /* Run Script */, 5CA059C6279559F40002BEB4 /* Sources */, 5CA059C7279559F40002BEB4 /* Frameworks */, 5CA059C8279559F40002BEB4 /* Resources */, @@ -1426,6 +1438,7 @@ 5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */, 5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */, 5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */, + E5C0BBE82F82B45500EA7527 /* SimpleXAssets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1457,12 +1470,35 @@ buildActionMask = 2147483647; files = ( E5DCF9712C590272007928CC /* Localizable.strings in Resources */, + E5C0BBE92F82B45500EA7527 /* SimpleXAssets.xcassets in Resources */, E5DCF9982C5906FF007928CC /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + E5C0BBF02F82B50C00EA7527 /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "${SRCROOT}/../../scripts/ios/copy-assets.sh\n"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ 5CA059C6279559F40002BEB4 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -1475,11 +1511,11 @@ 640743612CD360E600158442 /* ChooseServerOperators.swift in Sources */, 64A779FE2DC3AFF200FDEF2F /* MemberSupportChatToolbar.swift in Sources */, 5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */, + E5E418012F83D2CA00252B9E /* OnboardingCards.swift in Sources */, 5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */, 64A779F82DBFDBF200FDEF2F /* MemberSupportView.swift in Sources */, 5C93292F29239A170090FFF9 /* ProtocolServersView.swift in Sources */, 5CB924D727A8563F00ACCCDD /* SettingsView.swift in Sources */, - B79ADAFF2CE4EF930083DFFD /* AddressCreationCard.swift in Sources */, 5CEACCE327DE9246000BD591 /* ComposeView.swift in Sources */, E51CC1E62C62085600DB91FE /* OneHandUICard.swift in Sources */, 5C65DAF929D0CC20003CEE45 /* DeveloperView.swift in Sources */, @@ -1620,6 +1656,7 @@ 5C5F2B7027EBC704006A9D5F /* ProfileImage.swift in Sources */, 5C9329412929248A0090FFF9 /* ScanProtocolServer.swift in Sources */, 8C7DF3202B7CDB0A00C886D0 /* MigrateFromDevice.swift in Sources */, + E5DBF1932F88169800E1D7FD /* ConnectBannerCard.swift in Sources */, 64EEB0F72C353F1C00972D62 /* ServersSummaryView.swift in Sources */, 64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */, 5C93293F2928E0FD0090FFF9 /* AudioRecPlay.swift in Sources */, @@ -1899,6 +1936,7 @@ /* Begin XCBuildConfiguration section */ 5CA059F1279559F40002BEB4 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E5C0BBFD2F82BBC000EA7527 /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; @@ -1953,7 +1991,6 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; @@ -1961,6 +1998,7 @@ }; 5CA059F2279559F40002BEB4 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = E5C0BBFE2F82BBC900EA7527 /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; diff --git a/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2bddf5b5b8..978e1d9630 100644 --- a/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/apps/ios/SimpleX.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "07434ae88cbf078ce3d27c91c1f605836aaebff0e0cef5f25317795151c77db1", + "originHash" : "60aeecb7917535a5e44ade0dbb5411ab112a959283e565a04c212c8af4e7dee9", "pins" : [ { "identity" : "codescanner", diff --git a/apps/multiplatform/.gitignore b/apps/multiplatform/.gitignore index 5d39eb29f2..bc00225c87 100644 --- a/apps/multiplatform/.gitignore +++ b/apps/multiplatform/.gitignore @@ -16,4 +16,7 @@ android/build android/release common/build desktop/build -release \ No newline at end of file +release + +# Generated SimpleX assets +common/src/commonMain/resources/assets/simplex/ \ No newline at end of file diff --git a/apps/multiplatform/build.gradle.kts b/apps/multiplatform/build.gradle.kts index a2e1eb07c3..64dd34afbf 100644 --- a/apps/multiplatform/build.gradle.kts +++ b/apps/multiplatform/build.gradle.kts @@ -25,6 +25,9 @@ buildscript { extra.set("application_id.suffix", prop["application_id.suffix"] ?: "") // Compression level for debug AND release apk. 0 = disable compression. Max is 9 extra.set("compression.level", (prop["compression.level"] as String?)?.toIntOrNull() ?: 0) + if (prop["simplex.assets.dir"] != null) { + extra.set("simplex.assets.dir", prop["simplex.assets.dir"]) + } // NOTE: If you need a different version of something, provide it in `local.properties` // like so: compose.version=123, or gradle.plugin.version=1.2.3, etc diff --git a/apps/multiplatform/common/build.gradle.kts b/apps/multiplatform/common/build.gradle.kts index ea5579ed7d..65f0acd86c 100644 --- a/apps/multiplatform/common/build.gradle.kts +++ b/apps/multiplatform/common/build.gradle.kts @@ -11,6 +11,25 @@ plugins { group = "chat.simplex" version = extra["android.version_name"] as String +val simplexAssetsDir = rootProject.findProperty("simplex.assets.dir") as String? +val simplexAssetsLocal = file("src/commonMain/resources/assets/simplex") +val hasSimplexAssets = simplexAssetsDir != null + +if (simplexAssetsDir != null) { + val resolvedAssetsDir = rootProject.rootDir.resolve(simplexAssetsDir).absolutePath + tasks.register("copySimplexAssets") { + commandLine( + "${rootProject.rootDir}/../../scripts/android/copy-assets.sh", + resolvedAssetsDir, + simplexAssetsLocal.absolutePath + ) + } +} else { + tasks.register("cleanSimplexAssets") { + delete(simplexAssetsLocal) + } +} + kotlin { androidTarget() jvm("desktop") @@ -31,6 +50,11 @@ kotlin { } val commonMain by getting { + if (hasSimplexAssets) { + resources.srcDir(simplexAssetsLocal) + } else { + resources.srcDir("src/commonMain/resources/assets/default") + } dependencies { api(compose.runtime) api(compose.foundation) @@ -160,12 +184,18 @@ buildConfig { buildConfigField("int", "DESKTOP_VERSION_CODE", "${extra["desktop.version_code"]}") buildConfigField("String", "DATABASE_BACKEND", "\"${extra["database.backend"]}\"") buildConfigField("Boolean", "ANDROID_BUNDLE", "${extra["android.bundle"]}") + buildConfigField("Boolean", "SIMPLEX_ASSETS", "$hasSimplexAssets") } } afterEvaluate { tasks.named("generateMRcommonMain") { dependsOn("adjustFormatting") + if (hasSimplexAssets) { + dependsOn("copySimplexAssets") + } else { + dependsOn("cleanSimplexAssets") + } } tasks.create("adjustFormatting") { doLast { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt index d9439a5474..e1696fe37b 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/App.kt @@ -34,6 +34,7 @@ import chat.simplex.common.views.helpers.* import chat.simplex.common.views.helpers.ModalManager.Companion.fromEndToStartTransition import chat.simplex.common.views.helpers.ModalManager.Companion.fromStartToEndTransition import chat.simplex.common.views.localauth.VerticalDivider +import chat.simplex.common.views.newchat.* import chat.simplex.common.views.onboarding.* import chat.simplex.common.views.usersettings.* import chat.simplex.res.MR @@ -383,7 +384,9 @@ fun CenterPartOfScreen() { } when (currentChatId.value) { null -> { - if (!rememberUpdatedState(ModalManager.center.hasModalsOpen()).value) { + if (shouldShowOnboarding()) { + ConnectOnboardingView() + } else if (!rememberUpdatedState(ModalManager.center.hasModalsOpen()).value) { Box( Modifier .fillMaxSize() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt index ca002a8746..bc81c958e7 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/model/ChatModel.kt @@ -1157,10 +1157,10 @@ object ChatModel { showingInvitation.value = null chatsContext.chatItems.clearAndNotify() chatModel.chatId.value = withId + ModalManager.start.closeModals() + ModalManager.end.closeModals() } } - ModalManager.start.closeModals() - ModalManager.end.closeModals() } } diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Theme.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Theme.kt index 1b5a81a819..1de47df7ce 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Theme.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/ui/theme/Theme.kt @@ -626,6 +626,7 @@ val DEFAULT_BOTTOM_BUTTON_PADDING = 20.dp val DEFAULT_MIN_SECTION_ITEM_HEIGHT = 50.dp val DEFAULT_MIN_SECTION_ITEM_PADDING_VERTICAL = 15.dp +val DEFAULT_WINDOW_WIDTH = 1366.dp val DEFAULT_START_MODAL_WIDTH = 388.dp val DEFAULT_MIN_CENTER_MODAL_WIDTH = 590.dp val DEFAULT_END_MODAL_WIDTH = 388.dp diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt index d05b610aff..8f836c3c29 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chatlist/ChatListView.kt @@ -24,7 +24,13 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.* +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.unit.IntSize import chat.simplex.common.AppLock +import chat.simplex.common.BuildConfigCommon import chat.simplex.common.model.* import chat.simplex.common.model.ChatController.appPrefs import chat.simplex.common.model.ChatController.stopRemoteHostAndReloadHosts @@ -234,53 +240,120 @@ private fun ChatListCard( } } +private const val BANNER_IMAGE_RATIO = 800f / 505f + @Composable -private fun AddressCreationCard() { - ChatListCard( - close = { - appPrefs.addressCreationCardShown.set(true) - AlertManager.shared.showAlertMsg( - title = generalGetString(MR.strings.simplex_address), - text = generalGetString(MR.strings.address_creation_instruction), +private fun BannerGradientBox(isDark: Boolean, content: @Composable () -> Unit) { + val stops = if (isDark) darkStops else lightStops + val scale = if (isDark) 1.5f else 1.2f + val gp = gradientPoints(1f / BANNER_IMAGE_RATIO, scale) + var size by remember { mutableStateOf(IntSize.Zero) } + val brush = remember(size, isDark) { + if (size.width > 0 && size.height > 0) { + Brush.linearGradient( + colorStops = stops, + start = Offset(gp.startX * size.width, gp.startY * size.height), + end = Offset(gp.endX * size.width, gp.endY * size.height) ) - }, - onCardClick = { - ModalManager.start.showModal { - UserAddressLearnMore(showCreateAddressButton = true) - } + } else { + Brush.linearGradient(colorStops = stops) } - ) { - Box(modifier = Modifier.matchParentSize().padding(end = (DEFAULT_PADDING_HALF + 2.dp) * fontSizeSqrtMultiplier, bottom = 2.dp), contentAlignment = Alignment.BottomEnd) { - TextButton( - onClick = { - ModalManager.start.showModalCloseable { close -> - UserAddressView(chatModel = chatModel, shareViaProfile = false, autoCreateAddress = true, close = close) - } - }, - ) { - Text(stringResource(MR.strings.create_address_button), style = MaterialTheme.typography.body1) - } + } + Box( + Modifier.fillMaxWidth().aspectRatio(BANNER_IMAGE_RATIO).background(brush).onSizeChanged { size = it }, + contentAlignment = Alignment.Center + ) { content() } +} + +@Composable +private fun ConnectBannerCard() { + val isDark = isInDarkTheme() + val labelBg = MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.97f) + .copy(alpha = appPrefs.inAppBarsAlpha.get()) + val buttonSize = 30.dp * fontSizeSqrtMultiplier + val gap = 3.dp * fontSizeSqrtMultiplier + + Column(horizontalAlignment = Alignment.End) { + IconButton( + onClick = { appPrefs.addressCreationCardShown.set(true) }, + modifier = Modifier.size(buttonSize) + ) { + Icon( + painterResource(MR.images.ic_close), + contentDescription = stringResource(MR.strings.icon_descr_close_button), + modifier = Modifier + .size(buttonSize) + .background(MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.92f), CircleShape) + .padding(buttonSize * 0.15f), + tint = MaterialTheme.colors.secondary + ) } + Spacer(Modifier.height(gap)) Row( Modifier .fillMaxWidth() - .padding(DEFAULT_PADDING), - verticalAlignment = Alignment.CenterVertically + .height(IntrinsicSize.Min) + .clip(RoundedCornerShape(18.dp)) ) { - Box(Modifier.padding(vertical = 4.dp)) { - Box(Modifier.background(MaterialTheme.colors.primary, CircleShape).padding(12.dp)) { - ProfileImage(size = 37.dp, null, icon = MR.images.ic_mail_filled, color = Color.White, backgroundColor = Color.Red) + Column( + Modifier.weight(1f).clickable { + ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = close) + } + } + ) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isDark) MR.images.banner_create_link_light else MR.images.banner_create_link), + contentDescription = null, + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() + ) + } else { + BannerGradientBox(isDark) { + Icon(painterResource(MR.images.ic_add_link), contentDescription = null, modifier = Modifier.size(40.dp), tint = MaterialTheme.colors.primary) + } + } + Box(Modifier.fillMaxWidth().background(labelBg).padding(vertical = 8.dp), contentAlignment = Alignment.Center) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Icon(painterResource(MR.images.ic_add_link), contentDescription = null, modifier = Modifier.size(18.dp), tint = MaterialTheme.colors.primary) + Text(stringResource(MR.strings.new_1_time_link), style = MaterialTheme.typography.body2, color = MaterialTheme.colors.onBackground) + } + } else { + Text(stringResource(MR.strings.new_1_time_link), style = MaterialTheme.typography.body2, color = MaterialTheme.colors.onBackground) + } } } - Column(modifier = Modifier.padding(start = DEFAULT_PADDING)) { - Text(stringResource(MR.strings.your_simplex_contact_address), style = MaterialTheme.typography.h3) - Spacer(Modifier.fillMaxWidth().padding(DEFAULT_PADDING_HALF)) - Row(verticalAlignment = Alignment.CenterVertically) { - Text(stringResource(MR.strings.how_to_use_simplex_chat), Modifier.padding(end = DEFAULT_SPACE_AFTER_ICON), style = MaterialTheme.typography.body1) - Icon( - painterResource(MR.images.ic_info), - null, + Spacer(Modifier.width(2.dp).fillMaxHeight().background(MaterialTheme.colors.background)) + Column( + Modifier.weight(1f).clickable { + ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = close) + } + } + ) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isDark) MR.images.banner_paste_link_light else MR.images.banner_paste_link), + contentDescription = null, + contentScale = ContentScale.FillWidth, + modifier = Modifier.fillMaxWidth() ) + } else { + BannerGradientBox(isDark) { + Icon(painterResource(MR.images.ic_qr_code_scanner), contentDescription = null, modifier = Modifier.size(40.dp), tint = MaterialTheme.colors.primary) + } + } + Box(Modifier.fillMaxWidth().background(labelBg).padding(vertical = 8.dp), contentAlignment = Alignment.Center) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Icon(painterResource(MR.images.ic_qr_code_scanner), contentDescription = null, modifier = Modifier.size(18.dp), tint = MaterialTheme.colors.primary) + Text(stringResource(if (appPlatform.isAndroid) MR.strings.scan_paste_link else MR.strings.paste_link), style = MaterialTheme.typography.body2, color = MaterialTheme.colors.onBackground) + } + } else { + Text(stringResource(if (appPlatform.isAndroid) MR.strings.scan_paste_link else MR.strings.paste_link), style = MaterialTheme.typography.body2, color = MaterialTheme.colors.onBackground) + } } } } @@ -289,15 +362,31 @@ private fun AddressCreationCard() { @Composable private fun BoxScope.ChatListWithLoadingScreen(searchText: MutableState, listState: LazyListState) { - if (!chatModel.desktopNoUserNoRemote) { - ChatList(searchText = searchText, listState) + if (chatModel.chatRunning.value == null) { + Text(stringResource(MR.strings.loading_chats), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) + } else if (shouldShowOnboarding()) { + if (appPlatform.isAndroid) AndroidOnboardingCards() + } else { + if (!chatModel.desktopNoUserNoRemote) { + ChatList(searchText = searchText, listState) + } + if (chatModel.chats.value.isEmpty() && !chatModel.switchingUsersAndHosts.value && !chatModel.desktopNoUserNoRemote) { + Text(stringResource(MR.strings.you_have_no_chats), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) + } } - if (chatModel.chats.value.isEmpty() && !chatModel.switchingUsersAndHosts.value && !chatModel.desktopNoUserNoRemote) { - Text( - stringResource( - if (chatModel.chatRunning.value == null) MR.strings.loading_chats else MR.strings.you_have_no_chats - ), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary - ) +} + +@Composable +private fun AndroidOnboardingCards() { + val oneHandUI = remember { appPrefs.oneHandUI.state } + val topPad = topPaddingToContent(false) + val bottomPad = if (oneHandUI.value) { + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + AppBarHeight * fontSizeSqrtMultiplier + } else { + WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + } + Box(Modifier.fillMaxSize().padding(top = topPad, bottom = bottomPad)) { + ConnectOnboardingView() } } @@ -454,31 +543,33 @@ private fun ChatListToolbar(userPickerState: MutableStateFlow } }, title = { - Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(DEFAULT_SPACE_AFTER_ICON)) { - Text( - stringResource(MR.strings.your_chats), - color = MaterialTheme.colors.onBackground, - fontWeight = FontWeight.SemiBold, - ) - SubscriptionStatusIndicator( - click = { - ModalManager.start.closeModals() - val summary = serversSummary.value - ModalManager.start.showModalCloseable( - endButtons = { - if (summary != null) { - ShareButton { - val json = Json { - prettyPrint = true + if (!shouldShowOnboarding()) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(DEFAULT_SPACE_AFTER_ICON)) { + Text( + stringResource(MR.strings.your_chats), + color = MaterialTheme.colors.onBackground, + fontWeight = FontWeight.SemiBold, + ) + SubscriptionStatusIndicator( + click = { + ModalManager.start.closeModals() + val summary = serversSummary.value + ModalManager.start.showModalCloseable( + endButtons = { + if (summary != null) { + ShareButton { + val json = Json { + prettyPrint = true + } + val text = json.encodeToString(PresentedServersSummary.serializer(), summary) + clipboard.shareText(text) } - val text = json.encodeToString(PresentedServersSummary.serializer(), summary) - clipboard.shareText(text) } } - } - ) { ServersSummaryView(chatModel.currentRemoteHost.value, serversSummary) } - } - ) + ) { ServersSummaryView(chatModel.currentRemoteHost.value, serversSummary) } + } + ) + } } }, onTitleClick = if (canScrollToZero.value) { { scrollToBottom(scope, listState) } } else null, @@ -860,14 +951,6 @@ private fun BoxScope.ChatList(searchText: MutableState, listStat } } - if (!addressCreationCardShown.value) { - LaunchedEffect(chatModel.userAddress.value) { - if (chatModel.userAddress.value != null) { - appPrefs.addressCreationCardShown.set(true) - } - } - } - LaunchedEffect(activeFilter.value) { searchText.value = TextFieldValue("") } @@ -914,8 +997,8 @@ private fun ChatListFeatureCards() { if (!oneHandUICardShown.value && !oneHandUI.value) { ToggleChatListCard() } - if (!addressCreationCardShown.value) { - AddressCreationCard() + if (!addressCreationCardShown.value && hasConversations(chatModel.chats.value)) { + ConnectBannerCard() } if (!oneHandUICardShown.value && oneHandUI.value) { ToggleChatListCard() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/BlurModifier.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/BlurModifier.kt index 096b6c55ac..c7553b6ed0 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/BlurModifier.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/helpers/BlurModifier.kt @@ -64,7 +64,7 @@ private fun Modifier.androidBlurredModifier( } } .drawBehind { - drawRect(Color.Black) + drawRect(CurrentColors.value.colors.background) if (onTop) { clipRect { if (backgroundGraphicsLayer.size != IntSize.Zero) { @@ -110,7 +110,7 @@ private fun Modifier.desktopBlurredModifier( clip = blurRadius.value > 0 } .drawBehind { - drawRect(Color.Black) + drawRect(CurrentColors.value.colors.background) if (onTop) { clipRect { if (backgroundGraphicsLayer.size != IntSize.Zero) { diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt index d197460e2e..fa27672270 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/AddGroupView.kt @@ -27,6 +27,8 @@ import chat.simplex.common.views.* import chat.simplex.common.views.chat.group.GroupLinkView import chat.simplex.common.views.chatlist.openGroupChat import chat.simplex.common.views.usersettings.* +import androidx.compose.ui.layout.ContentScale +import chat.simplex.common.BuildConfigCommon import chat.simplex.res.MR import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -99,22 +101,33 @@ fun AddGroupLayout( ) { ModalView(close = close) { ColumnWithScrollBar { - AppBarTitle(stringResource(MR.strings.create_secret_group_title), hostDevice(rhId)) - Box( + AppBarTitle(stringResource(MR.strings.create_secret_group_title), hostDevice(rhId), bottomPadding = DEFAULT_PADDING_HALF) + Row( Modifier .fillMaxWidth() - .padding(bottom = 24.dp), - contentAlignment = Alignment.Center + .padding(vertical = DEFAULT_PADDING_HALF), + horizontalArrangement = if (BuildConfigCommon.SIMPLEX_ASSETS) Arrangement.SpaceEvenly else Arrangement.Center, + verticalAlignment = Alignment.CenterVertically ) { - Box(contentAlignment = Alignment.TopEnd) { - Box(contentAlignment = Alignment.Center) { - ProfileImage(108.dp, image = profileImage.value, icon = MR.images.ic_supervised_user_circle_filled) - EditImageButton { scope.launch { bottomSheetModalState.show() } } - } - if (profileImage.value != null) { - DeleteImageButton { profileImage.value = null } + Box(contentAlignment = Alignment.Center) { + Box(contentAlignment = Alignment.TopEnd) { + Box(contentAlignment = Alignment.Center) { + ProfileImage(128.dp, image = profileImage.value, icon = MR.images.ic_supervised_user_circle_filled) + EditImageButton { scope.launch { bottomSheetModalState.show() } } + } + if (profileImage.value != null) { + DeleteImageButton { profileImage.value = null } + } } } + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isInDarkTheme()) MR.images.create_group_light else MR.images.create_group), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.height(140.dp) + ) + } } Row(Modifier.padding(start = DEFAULT_PADDING, end = DEFAULT_PADDING, bottom = DEFAULT_PADDING_HALF).fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { Text( diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt index 292aa10f70..1eceaf4158 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatSheet.kt @@ -74,7 +74,7 @@ fun ModalData.NewChatSheet(rh: RemoteHostInfo?, close: () -> Unit) { Column(Modifier.align(Alignment.BottomCenter)) { DefaultAppBar( navigationButton = { NavigationButtonBack(onButtonClicked = close) }, - fixedTitleText = generalGetString(MR.strings.new_message), + fixedTitleText = generalGetString(MR.strings.new_chat), onTop = false, ) } @@ -359,7 +359,7 @@ private fun ModalData.NewChatSheetLayout( item { Box(Modifier.padding(top = blankSpaceSize)) { AppBarTitle( - stringResource(MR.strings.new_message), + stringResource(MR.strings.new_chat), hostDevice(rh?.remoteHostId), bottomPadding = DEFAULT_PADDING ) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt index f520a86999..72311cd7fe 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/NewChatView.kt @@ -21,9 +21,11 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp @@ -39,6 +41,7 @@ import chat.simplex.common.views.chat.item.CIFileViewScope import chat.simplex.common.views.chat.topPaddingToContent import chat.simplex.common.views.helpers.* import chat.simplex.common.views.usersettings.* +import chat.simplex.common.BuildConfigCommon import chat.simplex.res.MR import kotlinx.coroutines.* @@ -47,7 +50,7 @@ enum class NewChatOption { } @Composable -fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRCodeScanner: Boolean = false, close: () -> Unit) { +fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRCodeScanner: Boolean = false, onboarding: Boolean = false, close: () -> Unit) { val selection = remember { stateGetOrPut("selection") { selection } } val showQRCodeScanner = remember { stateGetOrPut("showQRCodeScanner") { showQRCodeScanner } } val contactConnection: MutableState = rememberSaveable(stateSaver = serializableSaver()) { mutableStateOf(chatModel.showingInvitation.value?.conn) } @@ -104,60 +107,71 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC } } - BoxWithConstraints { + if (onboarding) { ColumnWithScrollBar { - AppBarTitle(stringResource(MR.strings.new_chat), hostDevice(rh?.remoteHostId), bottomPadding = DEFAULT_PADDING) - val scope = rememberCoroutineScope() - val pagerState = rememberPagerState( - initialPage = selection.value.ordinal, - initialPageOffsetFraction = 0f - ) { NewChatOption.values().size } - KeyChangeEffect(pagerState.currentPage) { - selection.value = NewChatOption.values()[pagerState.currentPage] + Spacer(Modifier.height(DEFAULT_PADDING)) + when (selection.value) { + NewChatOption.INVITE -> PrepareAndInviteView(rh?.remoteHostId, contactConnection, connLinkInvitation, creatingConnReq, onboarding = true) + NewChatOption.CONNECT -> ConnectView(rh?.remoteHostId, showQRCodeScanner, pastedLink, close, onboarding = true) } - TabRow( - selectedTabIndex = pagerState.currentPage, - backgroundColor = Color.Transparent, - contentColor = MaterialTheme.colors.primary, - ) { - tabTitles.forEachIndexed { index, it -> - LeadingIconTab( - selected = pagerState.currentPage == index, - onClick = { - scope.launch { - pagerState.animateScrollToPage(index) - } - }, - text = { Text(it, fontSize = 13.sp) }, - icon = { - Icon( - if (NewChatOption.INVITE.ordinal == index) painterResource(MR.images.ic_repeat_one) else painterResource(MR.images.ic_qr_code), - it - ) - }, - selectedContentColor = MaterialTheme.colors.primary, - unselectedContentColor = MaterialTheme.colors.secondary, - ) + SectionBottomSpacer() + } + } else { + BoxWithConstraints { + ColumnWithScrollBar { + AppBarTitle(stringResource(MR.strings.new_chat), hostDevice(rh?.remoteHostId), bottomPadding = DEFAULT_PADDING) + val scope = rememberCoroutineScope() + val pagerState = rememberPagerState( + initialPage = selection.value.ordinal, + initialPageOffsetFraction = 0f + ) { NewChatOption.values().size } + KeyChangeEffect(pagerState.currentPage) { + selection.value = NewChatOption.values()[pagerState.currentPage] } - } - - HorizontalPager(state = pagerState, Modifier, pageNestedScrollConnection = LocalAppBarHandler.current!!.connection, verticalAlignment = Alignment.Top, userScrollEnabled = appPlatform.isAndroid) { index -> - Column( - Modifier - .fillMaxWidth() - .heightIn(min = this@BoxWithConstraints.maxHeight - 150.dp), - verticalArrangement = if (index == NewChatOption.INVITE.ordinal && connLinkInvitation.connFullLink.isEmpty()) Arrangement.Center else Arrangement.Top + TabRow( + selectedTabIndex = pagerState.currentPage, + backgroundColor = Color.Transparent, + contentColor = MaterialTheme.colors.primary, ) { - Spacer(Modifier.height(DEFAULT_PADDING)) - when (index) { - NewChatOption.INVITE.ordinal -> { - PrepareAndInviteView(rh?.remoteHostId, contactConnection, connLinkInvitation, creatingConnReq) - } - NewChatOption.CONNECT.ordinal -> { - ConnectView(rh?.remoteHostId, showQRCodeScanner, pastedLink, close) - } + tabTitles.forEachIndexed { index, it -> + LeadingIconTab( + selected = pagerState.currentPage == index, + onClick = { + scope.launch { + pagerState.animateScrollToPage(index) + } + }, + text = { Text(it, fontSize = 13.sp) }, + icon = { + Icon( + if (NewChatOption.INVITE.ordinal == index) painterResource(MR.images.ic_repeat_one) else painterResource(MR.images.ic_qr_code), + it + ) + }, + selectedContentColor = MaterialTheme.colors.primary, + unselectedContentColor = MaterialTheme.colors.secondary, + ) + } + } + + HorizontalPager(state = pagerState, Modifier, pageNestedScrollConnection = LocalAppBarHandler.current!!.connection, verticalAlignment = Alignment.Top, userScrollEnabled = appPlatform.isAndroid) { index -> + Column( + Modifier + .fillMaxWidth() + .heightIn(min = this@BoxWithConstraints.maxHeight - 150.dp), + verticalArrangement = if (index == NewChatOption.INVITE.ordinal && connLinkInvitation.connFullLink.isEmpty()) Arrangement.Center else Arrangement.Top + ) { + Spacer(Modifier.height(DEFAULT_PADDING)) + when (index) { + NewChatOption.INVITE.ordinal -> { + PrepareAndInviteView(rh?.remoteHostId, contactConnection, connLinkInvitation, creatingConnReq) + } + NewChatOption.CONNECT.ordinal -> { + ConnectView(rh?.remoteHostId, showQRCodeScanner, pastedLink, close) + } + } + SectionBottomSpacer() } - SectionBottomSpacer() } } } @@ -165,12 +179,13 @@ fun ModalData.NewChatView(rh: RemoteHostInfo?, selection: NewChatOption, showQRC } @Composable -private fun PrepareAndInviteView(rhId: Long?, contactConnection: MutableState, connLinkInvitation: CreatedConnLink, creatingConnReq: MutableState) { +private fun PrepareAndInviteView(rhId: Long?, contactConnection: MutableState, connLinkInvitation: CreatedConnLink, creatingConnReq: MutableState, onboarding: Boolean = false) { if (connLinkInvitation.connFullLink.isNotEmpty()) { InviteView( rhId, connLinkInvitation = connLinkInvitation, contactConnection = contactConnection, + onboarding = onboarding, ) } else if (creatingConnReq.value) { CreatingLinkProgressView() @@ -448,23 +463,53 @@ fun ActiveProfilePicker( } @Composable -private fun InviteView(rhId: Long?, connLinkInvitation: CreatedConnLink, contactConnection: MutableState) { +private fun InviteView(rhId: Long?, connLinkInvitation: CreatedConnLink, contactConnection: MutableState, onboarding: Boolean = false) { val showShortLink = remember { mutableStateOf(true) } - Spacer(Modifier.height(10.dp)) - SectionView(stringResource(MR.strings.share_this_1_time_link).uppercase(), headerBottomPadding = 5.dp) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isInDarkTheme()) { + if (onboarding) MR.images.one_time_link_light else MR.images.one_time_link_small_light + } else { + if (onboarding) MR.images.one_time_link else MR.images.one_time_link_small + }), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.fillMaxWidth() + ) + } else { + Spacer(Modifier.height(10.dp)) + } + + if (onboarding) { + Text( + stringResource(MR.strings.onboarding_send_1_time_link), + Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), + style = MaterialTheme.typography.body1 + ) LinkTextView(connLinkInvitation.simplexChatUri(short = showShortLink.value), true) - } - - Spacer(Modifier.height(DEFAULT_PADDING)) - - SectionViewWithButton( - stringResource(MR.strings.or_show_this_qr_code).uppercase(), - titleButton = if (connLinkInvitation.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null - ) { + Text( + stringResource(MR.strings.onboarding_or_show_qr_code), + Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), + style = MaterialTheme.typography.body1 + ) SimpleXCreatedLinkQRCode(connLinkInvitation, short = showShortLink.value, onShare = { chatModel.markShowingInvitationUsed() }) + } else { + SectionView(stringResource(MR.strings.share_this_1_time_link).uppercase(), headerBottomPadding = 5.dp) { + LinkTextView(connLinkInvitation.simplexChatUri(short = showShortLink.value), true) + } + + Spacer(Modifier.height(DEFAULT_PADDING)) + + SectionViewWithButton( + stringResource(MR.strings.or_show_this_qr_code).uppercase(), + titleButton = if (connLinkInvitation.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null + ) { + SimpleXCreatedLinkQRCode(connLinkInvitation, short = showShortLink.value, onShare = { chatModel.markShowingInvitationUsed() }) + } } + if (!onboarding) { Spacer(Modifier.height(DEFAULT_PADDING)) val incognito by remember(chatModel.showingInvitation.value?.conn?.incognito, controller.appPrefs.incognito.get()) { derivedStateOf { @@ -531,6 +576,7 @@ private fun InviteView(rhId: Long?, connLinkInvitation: CreatedConnLink, contact SectionTextFooter(generalGetString(MR.strings.connect__a_new_random_profile_will_be_shared)) } } + } } @Composable @@ -577,13 +623,26 @@ fun AddContactLearnMoreButton() { } @Composable -private fun ConnectView(rhId: Long?, showQRCodeScanner: MutableState, pastedLink: MutableState, close: () -> Unit) { +private fun ConnectView(rhId: Long?, showQRCodeScanner: MutableState, pastedLink: MutableState, close: () -> Unit, onboarding: Boolean = false) { DisposableEffect(Unit) { onDispose { connectProgressManager.cancelConnectProgress() } } + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isInDarkTheme()) { + if (onboarding) MR.images.connect_via_link_light else MR.images.connect_via_link_small_light + } else { + if (onboarding) MR.images.connect_via_link else MR.images.connect_via_link_small + }), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.fillMaxWidth() + ) + } + SectionView(stringResource(MR.strings.paste_the_link_you_received).uppercase(), headerBottomPadding = 5.dp) { PasteLinkView(rhId, pastedLink, showQRCodeScanner, close) } @@ -625,7 +684,7 @@ private fun PasteLinkView(rhId: Long?, pastedLink: MutableState, showQRC } }) { Box(Modifier.weight(1f)) { - Text(stringResource(MR.strings.tap_to_paste_link)) + Text(stringResource(MR.strings.tap_to_paste_link), color = MaterialTheme.colors.primary) } if (connectProgressManager.showConnectProgress != null) { CIFileViewScope.progressIndicator(sizeMultiplier = 0.6f) @@ -681,6 +740,13 @@ fun LinkTextView(link: String, share: Boolean) { // So using BasicTextField + manual ... Text("…", fontSize = 16.sp) if (share) { + Spacer(Modifier.width(DEFAULT_PADDING)) + IconButton({ + chatModel.markShowingInvitationUsed() + clipboard.setText(AnnotatedString(link)) + }, Modifier.size(20.dp)) { + Icon(painterResource(MR.images.ic_content_copy), null, tint = MaterialTheme.colors.primary) + } Spacer(Modifier.width(DEFAULT_PADDING)) IconButton({ chatModel.markShowingInvitationUsed() diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/OnboardingCards.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/OnboardingCards.kt new file mode 100644 index 0000000000..98954eb74f --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/newchat/OnboardingCards.kt @@ -0,0 +1,422 @@ +package chat.simplex.common.views.newchat + +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.layout.layout +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp +import dev.icerock.moko.resources.compose.painterResource +import dev.icerock.moko.resources.compose.stringResource +import chat.simplex.common.BuildConfigCommon +import chat.simplex.common.model.* +import chat.simplex.common.model.ChatController.appPrefs +import chat.simplex.common.platform.* +import chat.simplex.common.ui.theme.* +import chat.simplex.common.views.helpers.* +import chat.simplex.common.views.usersettings.UserAddressView +import chat.simplex.res.MR +import kotlinx.coroutines.launch +import kotlin.math.cos +import kotlin.math.sin + +private const val CARD_HEIGHT_RATIO = 0.75f +private const val GRADIENT_ANGLE_RAD = 80.0 * Math.PI / 180.0 + +@Composable +fun shouldShowOnboarding(): Boolean { + val addressCreationCardShown = remember { appPrefs.addressCreationCardShown.state } + val chats = chatModel.chats.value + return !addressCreationCardShown.value && chats.isNotEmpty() && !hasConversations(chats) +} + +fun hasConversations(chats: List): Boolean = + chats.any { chat -> + when (val c = chat.chatInfo) { + is ChatInfo.Local -> false + is ChatInfo.Direct -> !c.contact.chatDeleted && !c.contact.isContactCard + is ChatInfo.Group -> true + is ChatInfo.ContactRequest -> false + is ChatInfo.ContactConnection -> false + is ChatInfo.InvalidJSON -> false + } + } + +internal data class GradientEndpoints(val startX: Float, val startY: Float, val endX: Float, val endY: Float) + +internal fun gradientPoints(aspectRatio: Float, scale: Float): GradientEndpoints { + val r = aspectRatio.toDouble() + val s = scale.toDouble() + val dx = cos(GRADIENT_ANGLE_RAD) + val dy = -sin(GRADIENT_ANGLE_RAD) / r + val dLenSq = dx * dx + dy * dy + val projections = doubleArrayOf( + -0.5 * dx + (-0.5) * dy, + 0.5 * dx + (-0.5) * dy, + -0.5 * dx + 0.5 * dy, + 0.5 * dx + 0.5 * dy + ) + val tMin = projections.min() + val tMax = projections.max() + val startX = 0.5 + tMin * dx / dLenSq + val startY = 0.5 + tMin * dy / dLenSq + val endX = 0.5 + tMax * dx / dLenSq + val endY = 0.5 + tMax * dy / dLenSq + return GradientEndpoints( + startX = (0.5 + (startX - 0.5) * s).toFloat(), + startY = (0.5 + (startY - 0.5) * s).toFloat(), + endX = (0.5 + (endX - 0.5) * s).toFloat(), + endY = (0.5 + (endY - 0.5) * s).toFloat() + ) +} + +internal val lightStops = arrayOf( + 0.0f to Color(0xFFd2e8ff), + 0.5f to Color(0xFFcce9ff), + 0.9f to Color(0xFFdfffff), + 1.0f to Color(0xFFfffcea) +) + +internal val darkStops = arrayOf( + 0.4f to Color(0xFF040a24), + 0.72f to Color(0xFF3854ab), + 0.9f to Color(0xFFa8edf3), + 1.0f to Color(0xFFfff6e0) +) + +private fun Modifier.maxHeightByWidthRatio(ratio: Float) = layout { measurable, constraints -> + val maxH = (constraints.maxWidth * ratio).toInt().coerceAtMost(constraints.maxHeight) + val placeable = measurable.measure(constraints.copy(minHeight = 0, maxHeight = maxH)) + layout(placeable.width, placeable.height) { placeable.placeRelative(0, 0) } +} + +@Composable +fun OnboardingCardView( + imageName: dev.icerock.moko.resources.ImageResource, + imageNameLight: dev.icerock.moko.resources.ImageResource, + icon: dev.icerock.moko.resources.ImageResource, + title: String, + subtitle: String? = null, + labelHeightRatio: Float, + onClick: () -> Unit +) { + var imageAreaSize by remember { mutableStateOf(IntSize.Zero) } + val isDark = isInDarkTheme() + val stops = if (isDark) darkStops else lightStops + val scale = if (isDark) 1.5f else 1.2f + + val brush = remember(imageAreaSize, isDark) { + if (imageAreaSize.width > 0 && imageAreaSize.height > 0) { + val aspect = imageAreaSize.height.toFloat() / imageAreaSize.width.toFloat() + val gp = gradientPoints(aspect, scale) + Brush.linearGradient( + colorStops = stops, + start = Offset(gp.startX * imageAreaSize.width, gp.startY * imageAreaSize.height), + end = Offset(gp.endX * imageAreaSize.width, gp.endY * imageAreaSize.height) + ) + } else { + Brush.linearGradient(colorStops = stops) + } + } + + val labelBg = MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.97f) + .copy(alpha = appPrefs.inAppBarsAlpha.get()) + + Box( + Modifier + .fillMaxSize() + .clip(RoundedCornerShape(24.dp)) + .clickable(onClick = onClick) + ) { + Column(Modifier.fillMaxSize()) { + Box( + Modifier + .fillMaxWidth() + .weight(1f) + .background(brush) + .onSizeChanged { imageAreaSize = it } + ) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Image( + painterResource(if (isDark) imageNameLight else imageName), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.fillMaxSize() + ) + } else { + Icon( + painterResource(icon), + contentDescription = null, + modifier = Modifier.size(64.dp).align(Alignment.Center), + tint = MaterialTheme.colors.primary + ) + } + } + Box( + Modifier + .fillMaxWidth() + .aspectRatio(1f / labelHeightRatio) + .background(labelBg), + contentAlignment = Alignment.Center + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + if (BuildConfigCommon.SIMPLEX_ASSETS) { + Icon( + painterResource(icon), + contentDescription = null, + modifier = Modifier.size(24.dp), + tint = MaterialTheme.colors.primary + ) + } + Text( + title, + style = (if (appPlatform.isDesktop) MaterialTheme.typography.h3 else MaterialTheme.typography.h4).copy(fontWeight = FontWeight.Medium), + color = MaterialTheme.colors.onBackground, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + if (subtitle != null) { + Text( + subtitle, + style = if (appPlatform.isDesktop) MaterialTheme.typography.body1 else MaterialTheme.typography.body2, + color = MaterialTheme.colors.onBackground.copy(alpha = 0.7f) + ) + } + } + } + } + } +} + +@Composable +private fun PageHeader(title: String, isLandscape: Boolean, onBack: (() -> Unit)? = null) { + val color = if (onBack != null) MaterialTheme.colors.primary else Color.Transparent + val baseStyle = MaterialTheme.typography.h1 + val titleView = @Composable { + var fontScale by remember(title) { mutableStateOf(1f) } + Text( + title, + style = baseStyle.copy(fontSize = baseStyle.fontSize * fontScale), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth(), + onTextLayout = { result -> + if (result.hasVisualOverflow && fontScale > 0.5f) { + fontScale -= 0.05f + } + } + ) + } + if (isLandscape) { + Box(Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING)) { + BackButton(Modifier.align(Alignment.CenterStart), color, onBack) + titleView() + } + } else { + Column(Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING)) { + Box(Modifier.align(Alignment.Start)) { + BackButton(color = color, onClick = onBack) + } + titleView() + } + } +} + +@Composable +private fun BackButton(modifier: Modifier = Modifier, color: Color = MaterialTheme.colors.primary, onClick: (() -> Unit)? = null) { + Row( + modifier + .clip(RoundedCornerShape(20.dp)) + .clickable(enabled = onClick != null, onClick = onClick ?: {}) + .padding(end = 12.dp, top = 10.dp, bottom = 10.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + Icon( + painterResource(MR.images.ic_arrow_back_ios_new), + contentDescription = stringResource(MR.strings.back), + tint = color, + modifier = Modifier.height(24.dp) + ) + Text(stringResource(MR.strings.back), color = color) + } +} + +@Composable +private fun CardPair( + isLandscape: Boolean, + heightRatio: Float, + card1: @Composable () -> Unit, + card2: @Composable () -> Unit +) { + if (isLandscape) { + Row( + Modifier.fillMaxSize().padding(horizontal = DEFAULT_PADDING), + horizontalArrangement = Arrangement.spacedBy(DEFAULT_PADDING), + verticalAlignment = Alignment.CenterVertically + ) { + Box(Modifier.weight(1f).maxHeightByWidthRatio(heightRatio)) { card1() } + Box(Modifier.weight(1f).maxHeightByWidthRatio(heightRatio)) { card2() } + } + } else { + Column( + Modifier.fillMaxSize().padding(horizontal = DEFAULT_PADDING), + verticalArrangement = Arrangement.spacedBy(DEFAULT_PADDING, Alignment.CenterVertically) + ) { + Box(Modifier.fillMaxWidth().weight(1f, fill = false).maxHeightByWidthRatio(heightRatio)) { card1() } + Box(Modifier.fillMaxWidth().weight(1f, fill = false).maxHeightByWidthRatio(heightRatio)) { card2() } + } + } +} + +@Composable +private fun OnboardingPageLayout( + title: String, + onBack: (() -> Unit)? = null, + cards: @Composable (isLandscape: Boolean) -> Unit +) { + val isLandscape = appPlatform.isDesktop || windowOrientation() == WindowOrientation.LANDSCAPE + Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) { + PageHeader(title = title, isLandscape = isLandscape, onBack = onBack) + Box(Modifier.weight(1f).fillMaxWidth().padding(vertical = DEFAULT_PADDING)) { + cards(isLandscape) + } + } +} + +@Composable +fun ConnectOnboardingView() { + val pagerState = rememberPagerState(initialPage = 0) { 2 } + val scope = rememberCoroutineScope() + + val startModalsOpen = appPlatform.isDesktop && ModalManager.start.hasModalsOpen + val cardAlpha by animateFloatAsState(if (startModalsOpen) 0.3f else 1f) + + val cardClickOverride: (() -> Unit)? = if (startModalsOpen) { + { ModalManager.start.closeModals() } + } else null + + fun goToPage(target: Int) { + if (appPlatform.isDesktop) { + scope.launch { pagerState.scrollToPage(target) } + } else { + scope.launch { pagerState.animateScrollToPage(target, animationSpec = tween(350)) } + } + } + + val pager = @Composable { + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxWidth(), + userScrollEnabled = !appPlatform.isDesktop + ) { page -> + when (page) { + 0 -> OnboardingPageLayout(title = stringResource(MR.strings.talk_to_someone)) { isLandscape -> + CardPair(isLandscape, CARD_HEIGHT_RATIO, + card1 = { + OnboardingCardView( + imageName = MR.images.card_let_someone_connect_to_you_alpha, + imageNameLight = MR.images.card_let_someone_connect_to_you_alpha_light, + icon = MR.images.ic_add_link, + title = stringResource(MR.strings.let_someone_connect_to_you), + labelHeightRatio = 0.132f, + onClick = cardClickOverride ?: { goToPage(1) } + ) + }, + card2 = { + OnboardingCardView( + imageName = MR.images.card_connect_via_link_alpha, + imageNameLight = MR.images.card_connect_via_link_alpha_light, + icon = MR.images.ic_qr_code_scanner, + title = stringResource(MR.strings.connect_via_link_or_qr_code), + labelHeightRatio = 0.132f, + onClick = cardClickOverride ?: { + ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, onboarding = true, close = close) + } + } + ) + } + ) + } + 1 -> OnboardingPageLayout( + title = stringResource(MR.strings.connect_with_someone), + onBack = cardClickOverride ?: { goToPage(0) } + ) { isLandscape -> + CardPair(isLandscape, CARD_HEIGHT_RATIO, + card1 = { + OnboardingCardView( + imageName = MR.images.card_invite_someone_privately_alpha, + imageNameLight = MR.images.card_invite_someone_privately_alpha_light, + icon = MR.images.ic_add_link, + title = stringResource(MR.strings.invite_someone_privately), + subtitle = stringResource(MR.strings.a_link_for_one_person), + labelHeightRatio = 0.195f, + onClick = cardClickOverride ?: { + ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, onboarding = true, close = close) + } + } + ) + }, + card2 = { + OnboardingCardView( + imageName = MR.images.card_create_your_public_address_alpha, + imageNameLight = MR.images.card_create_your_public_address_alpha_light, + icon = MR.images.ic_qr_code, + title = stringResource(if (chatModel.userAddress.value != null) MR.strings.your_public_address else MR.strings.create_your_public_address), + subtitle = stringResource(MR.strings.for_anyone_to_reach_you), + labelHeightRatio = 0.195f, + onClick = cardClickOverride ?: { + ModalManager.start.showModalCloseable { close -> + UserAddressView(chatModel = chatModel, shareViaProfile = false, autoCreateAddress = true, onboarding = true, close = close) + } + } + ) + } + ) + } + } + } + } + + if (appPlatform.isDesktop) { + val maxContentWidth = DEFAULT_WINDOW_WIDTH - DEFAULT_START_MODAL_WIDTH * fontSizeSqrtMultiplier + Box( + Modifier.fillMaxSize().background(MaterialTheme.colors.background).padding(vertical = DEFAULT_PADDING).graphicsLayer { alpha = cardAlpha }, + contentAlignment = Alignment.Center + ) { + Box(Modifier.widthIn(max = maxContentWidth).fillMaxHeight()) { + pager() + } + } + } else { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + pager() + } + } +} diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserAddressView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserAddressView.kt index 3b6cf34b7c..e5c731f3b2 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserAddressView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/usersettings/UserAddressView.kt @@ -7,7 +7,9 @@ import SectionTextFooter import SectionView import SectionViewWithButton import androidx.compose.desktop.ui.tooling.preview.Preview +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* +import androidx.compose.ui.layout.ContentScale import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.* import androidx.compose.runtime.* @@ -28,6 +30,7 @@ import chat.simplex.common.model.MsgContent import chat.simplex.common.platform.* import chat.simplex.common.views.chat.* import chat.simplex.common.views.newchat.* +import chat.simplex.common.BuildConfigCommon import chat.simplex.res.MR @Composable @@ -35,6 +38,7 @@ fun UserAddressView( chatModel: ChatModel, shareViaProfile: Boolean = false, autoCreateAddress: Boolean = false, + onboarding: Boolean = false, close: () -> Unit ) { // TODO close when remote host changes @@ -75,17 +79,31 @@ fun UserAddressView( addressSettings = AddressSettings(businessAddress = false, autoAccept = null, autoReply = null) ) - AlertManager.shared.showAlertDialog( - title = generalGetString(MR.strings.share_address_with_contacts_question), - text = generalGetString(MR.strings.add_address_to_your_profile), - confirmText = generalGetString(MR.strings.share_verb), - onConfirm = { - setProfileAddress(true) - shareViaProfile.value = true - } - ) + val hasRelevantContacts = chatModel.chats.value.any { chat -> + val ci = chat.chatInfo + ci is ChatInfo.Direct && + ci.contact.active && + !ci.contact.isContactCard && + !ci.contact.contactConnIncognito + } + if (hasRelevantContacts) { + AlertManager.shared.showAlertDialog( + title = generalGetString(MR.strings.share_address_with_contacts_question), + text = generalGetString(MR.strings.add_address_to_your_profile), + confirmText = generalGetString(MR.strings.share_verb), + onConfirm = { + setProfileAddress(true) + shareViaProfile.value = true + } + ) + progressIndicator.value = false + } else { + setProfileAddress(true) + shareViaProfile.value = true + } + } else { + progressIndicator.value = false } - progressIndicator.value = false } } @@ -103,6 +121,7 @@ fun UserAddressView( user = user.value, userAddress = userAddress.value, shareViaProfile, + onboarding = onboarding, createAddress = ::createAddress, showAddShortLinkAlert = { shareAddress: (() -> Unit)? -> showAddShortLinkAlert(progressIndicator = progressIndicator, share = ::share, shareAddress = shareAddress) @@ -249,6 +268,7 @@ private fun UserAddressLayout( user: User?, userAddress: UserContactLinkRec?, shareViaProfile: MutableState, + onboarding: Boolean = false, createAddress: () -> Unit, showAddShortLinkAlert: ((() -> Unit)?) -> Unit, learnMore: () -> Unit, @@ -259,68 +279,100 @@ private fun UserAddressLayout( saveAddressSettings: (AddressSettingsState, MutableState) -> Unit, ) { ColumnWithScrollBar { - AppBarTitle(stringResource(MR.strings.simplex_address), hostDevice(user?.remoteHostId)) + if (!onboarding) { + AppBarTitle(stringResource(MR.strings.simplex_address), hostDevice(user?.remoteHostId)) + } + if (BuildConfigCommon.SIMPLEX_ASSETS && userAddress != null) { + Image( + painterResource(if (isInDarkTheme()) { + if (onboarding) MR.images.simplex_address_light else MR.images.simplex_address_small_light + } else { + if (onboarding) MR.images.simplex_address else MR.images.simplex_address_small + }), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.fillMaxWidth() + ) + } Column( Modifier.fillMaxWidth().padding(bottom = DEFAULT_PADDING_HALF), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.SpaceEvenly ) { if (userAddress == null) { - SectionView(generalGetString(MR.strings.for_social_media).uppercase()) { - CreateAddressButton(createAddress) - } + if (!onboarding) { + SectionView(generalGetString(MR.strings.for_social_media).uppercase()) { + CreateAddressButton(createAddress) + } - SectionDividerSpaced() - SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) { - CreateOneTimeLinkButton() - } + SectionDividerSpaced() + SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) { + CreateOneTimeLinkButton() + } - SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) - SectionView { - LearnMoreButton(learnMore) + SectionDividerSpaced(maxTopPadding = true, maxBottomPadding = false) + SectionView { + LearnMoreButton(learnMore) + } } } else { - val addressSettingsState = remember { mutableStateOf(AddressSettingsState(settings = userAddress.addressSettings)) } - val savedAddressSettingsState = remember { mutableStateOf(addressSettingsState.value) } val showShortLink = remember { mutableStateOf(true) } - SectionViewWithButton( - stringResource(MR.strings.for_social_media).uppercase(), - titleButton = if (userAddress.connLinkContact.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null - ) { + if (onboarding) { + Text( + stringResource(MR.strings.onboarding_post_address), + Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), + style = MaterialTheme.typography.body1 + ) + LinkTextView(userAddress.connLinkContact.simplexChatUri(short = showShortLink.value), true) + Text( + stringResource(MR.strings.onboarding_or_use_qr_code), + Modifier.fillMaxWidth().padding(horizontal = DEFAULT_PADDING, vertical = DEFAULT_PADDING_HALF), + style = MaterialTheme.typography.body1 + ) SimpleXCreatedLinkQRCode(userAddress.connLinkContact, short = showShortLink.value) - if (userAddress.shouldBeUpgraded) { - AddShortLinkButton(text = stringResource(MR.strings.add_short_link)) { showAddShortLinkAlert(null) } - } - ShareAddressButton { + } else { + val addressSettingsState = remember { mutableStateOf(AddressSettingsState(settings = userAddress.addressSettings)) } + val savedAddressSettingsState = remember { mutableStateOf(addressSettingsState.value) } + + SectionViewWithButton( + stringResource(MR.strings.for_social_media).uppercase(), + titleButton = if (userAddress.connLinkContact.connShortLink != null) {{ ToggleShortLinkButton(showShortLink) }} else null + ) { + SimpleXCreatedLinkQRCode(userAddress.connLinkContact, short = showShortLink.value) if (userAddress.shouldBeUpgraded) { - showAddShortLinkAlert { share(userAddress.connLinkContact.simplexChatUri(short = showShortLink.value)) } - } else { - share(userAddress.connLinkContact.simplexChatUri(short = showShortLink.value)) + AddShortLinkButton(text = stringResource(MR.strings.add_short_link)) { showAddShortLinkAlert(null) } + } + ShareAddressButton { + if (userAddress.shouldBeUpgraded) { + showAddShortLinkAlert { share(userAddress.connLinkContact.simplexChatUri(short = showShortLink.value)) } + } else { + share(userAddress.connLinkContact.simplexChatUri(short = showShortLink.value)) + } + } + // ShareViaEmailButton { sendEmail(userAddress) } + BusinessAddressToggle(addressSettingsState) { saveAddressSettings(addressSettingsState.value, savedAddressSettingsState) } + AddressSettingsButton(user, userAddress, shareViaProfile, setProfileAddress, saveAddressSettings) + + if (addressSettingsState.value.businessAddress) { + SectionTextFooter(stringResource(MR.strings.add_your_team_members_to_conversations)) } } - // ShareViaEmailButton { sendEmail(userAddress) } - BusinessAddressToggle(addressSettingsState) { saveAddressSettings(addressSettingsState.value, savedAddressSettingsState) } - AddressSettingsButton(user, userAddress, shareViaProfile, setProfileAddress, saveAddressSettings) - if (addressSettingsState.value.businessAddress) { - SectionTextFooter(stringResource(MR.strings.add_your_team_members_to_conversations)) + SectionDividerSpaced(maxTopPadding = addressSettingsState.value.businessAddress) + SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) { + CreateOneTimeLinkButton() + } + SectionDividerSpaced(maxBottomPadding = false) + SectionView { + LearnMoreButton(learnMore) } - } - SectionDividerSpaced(maxTopPadding = addressSettingsState.value.businessAddress) - SectionView(generalGetString(MR.strings.or_to_share_privately).uppercase()) { - CreateOneTimeLinkButton() - } - SectionDividerSpaced(maxBottomPadding = false) - SectionView { - LearnMoreButton(learnMore) - } - - SectionDividerSpaced(maxBottomPadding = false) - SectionView { - DeleteAddressButton(deleteAddress) - SectionTextFooter(stringResource(MR.strings.your_contacts_will_remain_connected)) + SectionDividerSpaced(maxBottomPadding = false) + SectionView { + DeleteAddressButton(deleteAddress) + SectionTextFooter(stringResource(MR.strings.your_contacts_will_remain_connected)) + } } } } diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml index 1477e4f607..ea03fa8286 100644 --- a/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml +++ b/apps/multiplatform/common/src/commonMain/resources/MR/base/strings.xml @@ -465,6 +465,15 @@ Tap to start a new chat Chat with the developers You have no chats + Talk to someone + Let someone connect to you + Connect via link or QR code + Connect with someone + Invite someone privately + A link for one person to connect + Create your public address + Your public address + For anyone to reach you Loading chats… No filtered chats No chats in list %s. @@ -904,7 +913,7 @@ New chat New message Add contact - Scan / Paste link + Paste link / Scan Paste link One-time invitation link 1-time link @@ -1132,12 +1141,12 @@ All your contacts will remain connected. All your contacts will remain connected. Profile update will be sent to your contacts. Share link - Add address to your profile, so that your contacts can share it with other people. Profile update will be sent to your contacts. + Add address to your profile, so that your SimpleX contacts can share it with other people. Profile update will be sent to your SimpleX contacts. Create an address to let people connect with you. Create SimpleX address - Share with contacts - Share address with contacts? - Profile update will be sent to your contacts. + Share with SimpleX contacts + Share address with SimpleX contacts? + Profile update will be sent to your SimpleX contacts. Stop sharing address? Stop sharing Auto-accept @@ -1154,6 +1163,11 @@ Or to share privately SimpleX address or 1-time link? Create 1-time link + New 1-time link + Send the link via any messenger - it\'s secure. Ask to paste into SimpleX. + Or show QR in person or via video call. + Use this address in your social media profile, website, or email signature. + Or use this QR - print or show online. Address settings Business address Add your team members to the conversations. diff --git a/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_qr_code_scanner.svg b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_qr_code_scanner.svg new file mode 100644 index 0000000000..6d012c8956 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/MR/images/ic_qr_code_scanner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_create_link_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/banner_paste_link_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_connect_via_link_alpha_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_create_your_public_address_alpha_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_invite_someone_privately_alpha_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/card_let_someone_connect_to_you_alpha_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_light.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/connect_via_link_small_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group_light.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/create_group_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_light.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/one_time_link_small_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_light.svg new file mode 100644 index 0000000000..2325330d90 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small_light.svg b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small_light.svg new file mode 100644 index 0000000000..cd6f033c62 --- /dev/null +++ b/apps/multiplatform/common/src/commonMain/resources/assets/default/MR/images/simplex_address_small_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/StoreWindowState.kt b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/StoreWindowState.kt index 2a1a26df95..e4866c845d 100644 --- a/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/StoreWindowState.kt +++ b/apps/multiplatform/common/src/desktopMain/kotlin/chat/simplex/common/StoreWindowState.kt @@ -3,11 +3,12 @@ package chat.simplex.common import chat.simplex.common.model.json import chat.simplex.common.platform.appPreferences import chat.simplex.common.platform.desktopPlatform +import chat.simplex.common.ui.theme.DEFAULT_WINDOW_WIDTH import kotlinx.serialization.* @Serializable data class WindowPositionSize( - val width: Int = 1366, + val width: Int = DEFAULT_WINDOW_WIDTH.value.toInt(), val height: Int = 768, val x: Int = 0, val y: Int = 0, diff --git a/apps/multiplatform/local.properties.example b/apps/multiplatform/local.properties.example index 8fa9a47963..9aa560d839 100644 --- a/apps/multiplatform/local.properties.example +++ b/apps/multiplatform/local.properties.example @@ -3,6 +3,8 @@ enable_debuggable=true application_id.suffix=.debug app.name=SimpleX Debug +#simplex.assets.dir=path/to/assets + #desktop.mac.signing.identity=SimpleX Chat Ltd #desktop.mac.signing.keychain=/path/to/simplex.keychain #desktop.mac.notarization.apple_id=example@example.com diff --git a/plans/2026-04-06-onboarding-cards-compose.md b/plans/2026-04-06-onboarding-cards-compose.md new file mode 100644 index 0000000000..00df159eee --- /dev/null +++ b/plans/2026-04-06-onboarding-cards-compose.md @@ -0,0 +1,492 @@ +# Onboarding Cards — Compose (Android/Desktop) Implementation Plan + +References the layout specification in `plans/2026-04-06-onboarding-cards-ios.md`. + +## Scope + +Same as iOS: Screens 1 and 2 with paging transition. Modal sheets for deeper views. No banner, no standalone onboarding variants. + +## New file + +`common/src/commonMain/kotlin/chat/simplex/common/views/newchat/OnboardingCards.kt` + +## Assets + +8 card stub SVGs needed in `assets/default/MR/images/` (same names as the real PNGs, with `.svg` extension): +- `card_let_someone_connect_to_you_alpha.svg` / `_light.svg` +- `card_connect_via_link_alpha.svg` / `_light.svg` +- `card_invite_someone_privately_alpha.svg` / `_light.svg` +- `card_create_your_public_address_alpha.svg` / `_light.svg` + +Real PNGs already generated in art repo `multiplatform/resources/MR/images/`. + +## Onboarding condition (shared by Android and Desktop) + +Placed in `ConnectOnboardingView.kt` as top-level functions, accessible from both `ChatListView.kt` and `App.kt`: + +```kotlin +@Composable +fun shouldShowOnboarding(): Boolean { + val addressCreationCardShown = remember { appPrefs.addressCreationCardShown.state } + val chats = chatModel.chats.value + return !addressCreationCardShown.value && chats.isNotEmpty() && noConversationChatsYet(chats) +} + +fun noConversationChatsYet(chats: List): Boolean = + chats.all { chat -> + when (val c = chat.chatInfo) { + is ChatInfo.Local -> true + is ChatInfo.Direct -> c.contact.chatDeleted || c.contact.isContactCard + is ChatInfo.Group -> false + is ChatInfo.ContactRequest -> true + is ChatInfo.ContactConnection -> true + is ChatInfo.InvalidJSON -> true + } + } +``` + +`shouldShowOnboarding` is `@Composable` (reads reactive state) and public — called from both `ChatListView.kt` and `App.kt`. `noConversationChatsYet` is a pure function, also public (used by auto-dismiss LaunchedEffect). + +### Auto-dismiss + +```kotlin +LaunchedEffect(chatModel.chats.value.size) { + if (!noConversationChatsYet(chatModel.chats.value)) { + appPrefs.addressCreationCardShown.set(true) + } +} +``` + +Placed in `ChatListWithLoadingScreen`. + +## Android integration + +### In `ChatListView.kt` — `ChatListWithLoadingScreen` (line 291) + +Change from: +```kotlin +private fun BoxScope.ChatListWithLoadingScreen(searchText, listState) { + if (!chatModel.desktopNoUserNoRemote) { ChatList(...) } + if (chatModel.chats.value.isEmpty() && ...) { Text("Loading/empty") } +} +``` + +To: +```kotlin +private fun BoxScope.ChatListWithLoadingScreen(searchText, listState) { + val chats = chatModel.chats.value + when { + chats.isEmpty() && !chatModel.switchingUsersAndHosts.value + && !chatModel.desktopNoUserNoRemote && chatModel.chatRunning.value == null -> { + Text(stringResource(MR.strings.loading_chats), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) + } + shouldShowOnboarding() -> { + if (appPlatform.isAndroid) { + ConnectOnboardingView() + } + // Desktop: empty — overlay in DesktopScreen handles it + } + !chatModel.desktopNoUserNoRemote -> { + ChatList(searchText = searchText, listState) + } + } + // Auto-dismiss + LaunchedEffect(chats.size) { + if (chats.isNotEmpty() && !noConversationChatsYet(chats)) { + appPrefs.addressCreationCardShown.set(true) + } + } +} +``` + +Toolbar is a sibling in the parent `Box` (lines 150-174), stays visible. + +## Desktop integration + +### Architecture + +The overlay is the PRIMARY UI surface during onboarding. ALL interaction happens inside it — card taps, toolbar button modals, everything. `ModalManager.start` renders INTO the overlay instead of into the start panel. + +### Overlay structure in `DesktopScreen` (App.kt) + +Two visual layers in the overlay, both full-width: + +1. **Background layer:** covers center+end area only (padded left by start panel width). Opaque `MaterialTheme.colors.background`. Hides center panel content ("No selected chat") while leaving start panel fully visible underneath. + +2. **Content layer:** full window width, no background. Cards render here, centered in the full window. Clicks outside cards fall through to the start panel below. + +Both layers have top/bottom padding for toolbar height (`AppBarHeight * fontSizeSqrtMultiplier`). + +```kotlin +if (shouldShowOnboarding()) { + val oneHandUI = remember { appPrefs.oneHandUI.state } + val toolbarPadding = AppBarHeight * fontSizeSqrtMultiplier + val topPad = if (!oneHandUI.value) toolbarPadding else 0.dp + val bottomPad = if (oneHandUI.value) toolbarPadding else 0.dp + + // Background — center+end only + Box( + Modifier + .fillMaxSize() + .padding(start = DEFAULT_START_MODAL_WIDTH * fontSizeSqrtMultiplier, top = topPad, bottom = bottomPad) + .background(MaterialTheme.colors.background) + ) + + // Content — full width, cards centered + Box( + Modifier + .fillMaxSize() + .padding(top = topPad, bottom = bottomPad), + contentAlignment = Alignment.Center + ) { + ConnectOnboardingView() + } +} +``` + +Z-order: above panels and vertical divider, below `ModalManager.fullscreen`. + +### Start panel modal redirection + +During onboarding, `ModalManager.start.showInView()` renders INSIDE the overlay instead of in the start panel Box. + +In `DesktopScreen`: +```kotlin +// Start panel modals — normal location +Box(Modifier.widthIn(max = DEFAULT_START_MODAL_WIDTH * fontSizeSqrtMultiplier)) { + if (!shouldShowOnboarding()) { + ModalManager.start.showInView() + } + SwitchingUsersView() +} +``` + +Inside `ConnectOnboardingView`, on desktop: +- Watch `ModalManager.start.hasModalsOpen` +- When a start modal opens (from toolbar + button, avatar, or card tap): + 1. Cards shift RIGHT and fade to ~30% opacity (animated) + 2. `ModalManager.start.showInView()` renders on the LEFT side of the overlay with left-to-right slide animation + 3. This is the FIRST modal opening — it slides left-to-right + 4. Subsequent modals within the start modal stack open right-to-left as usual (standard `ModalManager` behavior inside the rendered area) +- When all start modals close: reverse animation — modal area slides left, cards restore position and opacity +- Clicking a faded card triggers `ModalManager.start.closeModals()` to dismiss and restore cards. This requires swapping card `onClick` handlers when `startModalsOpen` is true — each card's onClick becomes `{ ModalManager.start.closeModals() }` instead of its normal action. + +```kotlin +// Inside ConnectOnboardingView, desktop only: +val startModalsOpen = ModalManager.start.hasModalsOpen +val cardOffset by animateFloatAsState(if (startModalsOpen) 0.3f else 0f) +val cardAlpha by animateFloatAsState(if (startModalsOpen) 0.3f else 1f) +val modalSlide by animateFloatAsState(if (startModalsOpen) 0f else -1f) + +Box(Modifier.fillMaxSize()) { + // Modal area — slides from left + if (appPlatform.isDesktop) { + Box( + Modifier + .fillMaxHeight() + .widthIn(max = DEFAULT_START_MODAL_WIDTH * fontSizeSqrtMultiplier) + .graphicsLayer { translationX = modalSlide * size.width } + ) { + ModalManager.start.showInView() + } + } + + // Cards — shift right and fade when modal open + Box( + Modifier + .fillMaxSize() + .graphicsLayer { + if (appPlatform.isDesktop) { + translationX = cardOffset * size.width + alpha = cardAlpha + } + } + ) { + HorizontalPager(...) { /* pages */ } + } +} +``` + +Card taps use `ModalManager.start.showModalCloseable` on ALL platforms — same code. On Android, the modal renders in the normal start panel modal area. On desktop during onboarding, the modal renders inside the overlay via the redirected `showInView()`. + +### Card tap actions — same on all platforms + +```kotlin +val openConnectViaLink = { + ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, ..., close = close) + } +} +``` + +No platform branching needed. `ModalManager.start` handles the modal lifecycle. Only the rendering location changes. + +### Suppress "No selected chat" in `CenterPartOfScreen` (line 373) + +```kotlin +null -> { + if (!shouldShowOnboarding() && !rememberUpdatedState(ModalManager.center.hasModalsOpen()).value) { + Box(...) { Text(stringResource(...)) } + } else if (!shouldShowOnboarding()) { + ModalManager.center.showInView() + } +} +``` + +When onboarding active: center panel shows nothing (overlay covers it visually). + +### Desktop HorizontalPager: tap only + +`userScrollEnabled = !appPlatform.isDesktop` — disables mouse swipe on desktop. + +## Revision 2 — Bug fixes from initial implementation + +### Fix 1: `fillMaxSize()` overrides `widthIn(max:)` + +In both page composables, the Column has `Modifier.fillMaxSize().widthIn(max = 500.dp)`. `fillMaxSize()` sets width to maximum, overriding the `widthIn` constraint. + +Fix: `Modifier.fillMaxHeight().widthIn(max = 500.dp)` — only fill height, let widthIn cap the width. + +### Fix 2: Modifier order — background before padding + +In the overlay Box: `.fillMaxSize().background(color).padding(...)` paints background over toolbar area. + +Fix: `.fillMaxSize().padding(...).background(color)` — padding first, background only fills content area. + +Superseded by the two-layer approach above — background layer is separate from content layer. + +### Fix 3: "You have no chats" text dropped + +The `when` block in `ChatListWithLoadingScreen` replaced two independent `if` blocks with mutually exclusive branches, dropping the "You have no chats" case. + +Fix: revert to the original `if` block structure, adding onboarding as the first check: +```kotlin +private fun BoxScope.ChatListWithLoadingScreen(searchText, listState) { + if (shouldShowOnboarding()) { + if (appPlatform.isAndroid) { + ConnectOnboardingView() + } + } else { + if (!chatModel.desktopNoUserNoRemote) { + ChatList(searchText = searchText, listState) + } + if (chatModel.chats.value.isEmpty() && !chatModel.switchingUsersAndHosts.value && !chatModel.desktopNoUserNoRemote) { + Text(stringResource( + if (chatModel.chatRunning.value == null) MR.strings.loading_chats else MR.strings.you_have_no_chats + ), Modifier.align(Alignment.Center), color = MaterialTheme.colors.secondary) + } + } + // Auto-dismiss + LaunchedEffect(chatModel.chats.value.size) { ... } +} +``` + +This preserves the original loading/empty behavior exactly. The onboarding branch is checked first — when active, it replaces everything. When inactive, original code runs unchanged. + +## ConnectOnboardingView composable + +### Structure + +```kotlin +@Composable +fun ConnectOnboardingView() { + val pagerState = rememberPagerState(initialPage = 0) { 2 } + val scope = rememberCoroutineScope() + + HorizontalPager(state = pagerState, userScrollEnabled = true) { page -> + when (page) { + 0 -> TalkToSomeonePage( + onLetSomeoneConnect = { scope.launch { pagerState.animateScrollToPage(1) } }, + onConnectViaLink = { ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.CONNECT, showQRCodeScanner = appPlatform.isAndroid, close = close) + }} + ) + 1 -> ConnectWithSomeonePage( + onBack = { scope.launch { pagerState.animateScrollToPage(0) } }, + onInviteSomeone = { ModalManager.start.showModalCloseable { close -> + NewChatView(chatModel.currentRemoteHost.value, NewChatOption.INVITE, close = close) + }}, + onCreateAddress = { ModalManager.start.showModalCloseable { close -> + UserAddressView(chatModel = chatModel, shareViaProfile = false, autoCreateAddress = true, close = close) + }} + ) + } + } +} +``` + +### Page layout + +Each page uses `BoxWithConstraints` to compute card dimensions: + +```kotlin +@Composable +private fun TalkToSomeonePage(onLetSomeoneConnect: () -> Unit, onConnectViaLink: () -> Unit) { + BoxWithConstraints(Modifier.fillMaxSize()) { + val isLandscape = maxWidth > maxHeight + val padding = 16.dp + val spacing = 16.dp + val cardWidth = if (isLandscape) (maxWidth - padding * 2 - spacing) / 2 else maxWidth - padding * 2 + val maxCardHeight = cardWidth * 0.75f + + Column(Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) { + pageHeader("Talk to someone", showBack = false, isLandscape = isLandscape) + Spacer(Modifier.weight(1f).defaultMinSize(minHeight = 16.dp)) + cardPair(isLandscape, padding, spacing, maxCardHeight) { + // card1 and card2 + } + Spacer(Modifier.weight(1f).defaultMinSize(minHeight = 16.dp)) + } + } +} +``` + +### pageHeader composable + +Shared by both pages. No duplication: + +```kotlin +@Composable +private fun pageHeader(title: String, showBack: Boolean, isLandscape: Boolean, onBack: (() -> Unit)? = null) { + val titleView = @Composable { + Text( + stringResource(title), + style = MaterialTheme.typography.h1, // largeTitle equivalent + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Center, + modifier = Modifier.fillMaxWidth() + ) + } + if (isLandscape) { + Box(Modifier.fillMaxWidth().padding(horizontal = 16.dp)) { + if (showBack && onBack != null) { + backButton(onBack, Modifier.align(Alignment.CenterStart)) + } + titleView() + } + } else { + Column(Modifier.fillMaxWidth().padding(horizontal = 16.dp)) { + if (showBack && onBack != null) { + backButton(onBack, Modifier.align(Alignment.Start)) + } else { + Spacer(Modifier.height(AppBarHeight)) + } + titleView() + } + } +} +``` + +Back button spacer uses `AppBarHeight` (56.dp) to match the platform's back button area, not iOS's 44pt. + +### cardPair composable + +Shared layout helper, no card duplication: + +```kotlin +@Composable +private fun cardPair( + isLandscape: Boolean, + padding: Dp, + spacing: Dp, + maxCardHeight: Dp, + card1: @Composable () -> Unit, + card2: @Composable () -> Unit +) { + if (isLandscape) { + Row(Modifier.padding(horizontal = padding), horizontalArrangement = Arrangement.spacedBy(spacing)) { + Box(Modifier.weight(1f).heightIn(max = maxCardHeight)) { card1() } + Box(Modifier.weight(1f).heightIn(max = maxCardHeight)) { card2() } + } + } else { + Column(Modifier.padding(horizontal = padding), verticalArrangement = Arrangement.spacedBy(spacing)) { + Box(Modifier.fillMaxWidth().heightIn(max = maxCardHeight)) { card1() } + Box(Modifier.fillMaxWidth().heightIn(max = maxCardHeight)) { card2() } + } + } +} +``` + +### OnboardingCardView composable + +```kotlin +@Composable +fun OnboardingCardView( + imageName: ImageResource, + imageNameLight: ImageResource, + icon: ImageResource, + title: String, + subtitle: String? = null, + labelHeightRatio: Float, + onClick: () -> Unit +) +``` + +Key Compose details (from layout-compose.md checklist): +- **Image:** `contentScale = ContentScale.Fit`, `Modifier.fillMaxSize()` — scaled AND centered ✓ +- **Gradient:** `Brush.linearGradient(colorStops, start, end)` with pixel Offsets computed from image area measured size via `Modifier.onSizeChanged` or `BoxWithConstraints` +- **Gradient math:** identical to iOS — same function ported to Kotlin, same angle/scale/aspect-ratio correction +- **Corner radius:** `RoundedCornerShape(24.dp)` with `Modifier.clip()` +- **Dark/light:** `if (isInDarkTheme()) imageNameLight else imageName` for image, gradient stops selected by theme +- **Conditional assets:** `if (BuildConfigCommon.SIMPLEX_ASSETS) { Image(...) }` +- **Clickable:** `Modifier.clip(RoundedCornerShape(24.dp)).clickable(onClick = onClick)` — clip first so ripple is bounded + +#### Label stripe background + +Use the same pattern as the toolbar (from DefaultTopAppBar.kt line 43-65): +```kotlin +MaterialTheme.colors.background.mixWith(MaterialTheme.colors.onBackground, 0.97f) + .copy(alpha = appPrefs.inAppBarsAlpha.get()) +``` + +This exactly matches the toolbar appearance, including the user's bar transparency preference. + +#### Gradient in Compose + +```kotlin +// Compute inside BoxWithConstraints or onSizeChanged callback +val imageAreaSize = Size(width, imageHeight) +val (startUnit, endUnit) = gradientPoints( + aspectRatio = imageAreaSize.height / imageAreaSize.width, + scale = if (isInDarkTheme()) 1.5f else 1.2f +) +val brush = Brush.linearGradient( + colorStops = if (isInDarkTheme()) darkStops else lightStops, + start = Offset(startUnit.x * imageAreaSize.width, startUnit.y * imageAreaSize.height), + end = Offset(endUnit.x * imageAreaSize.width, endUnit.y * imageAreaSize.height) +) +``` + +### Card icons (Moko resource names) + +Screen 1: +- "Let someone connect to you" — `MR.images.ic_add_link` +- "Connect via link or QR code" — `MR.images.ic_qr_code` + +Screen 2: +- "Invite someone privately" — `MR.images.ic_add_link` +- "Create your public address" — `MR.images.ic_qr_code` + +### Strings + +8 new entries in `strings.xml` (`MR/base/strings.xml`): +```xml +Talk to someone +Let someone connect to you +Connect via link or QR code +Connect with someone +Invite someone privately +A link for one person to connect +Create your public address +For anyone to reach you +``` + +## Files changed + +- `ChatListView.kt` — add `shouldShowOnboarding`, `noConversationChatsYet`, modify `ChatListWithLoadingScreen`, add auto-dismiss `LaunchedEffect` +- `App.kt` — add desktop overlay in `DesktopScreen`, suppress "No selected chat" in `CenterPartOfScreen` +- `MR/base/strings.xml` — 8 new strings +- **New:** `OnboardingCards.kt` — `ConnectOnboardingView`, `OnboardingCardView`, `TalkToSomeonePage`, `ConnectWithSomeonePage`, `pageHeader`, `cardPair`, `shouldShowOnboarding`, `noConversationChatsYet`, gradient math +- **New:** 8 stub SVGs in `assets/default/MR/images/` diff --git a/plans/2026-04-06-onboarding-cards-ios.md b/plans/2026-04-06-onboarding-cards-ios.md new file mode 100644 index 0000000000..f20936ea05 --- /dev/null +++ b/plans/2026-04-06-onboarding-cards-ios.md @@ -0,0 +1,501 @@ +# Onboarding Cards — Layout Specification & iOS Implementation Plan + +## Layout Specification (cross-platform) + +This section is the authoritative reference for implementing on any platform. + +### Overall structure + +Two screens, each with a title and two tappable cards. Screens are connected by a horizontal paging transition (swipe or tap). Screen 1 has no back button; Screen 2 has a back button. Deeper views (1-time link, connect via link, SimpleX address) open as modal sheets from card taps, NOT as navigation pushes. + +The chat list toolbar (top or bottom depending on platform/settings) remains visible on both screens — the onboarding content occupies only the chat list content area. + +### Page header + +Each page has a header area containing: +- **Back button area:** fixed height 44pt. Screen 1: empty space. Screen 2: "< Back" button left-aligned. +- **Title:** centered, largeTitle font, bold, single line, shrinks to 75% minimum scale factor. +- Screen 1 title: "Talk to someone" +- Screen 2 title: "Connect with someone" + +**Portrait:** back button area and title are two separate rows (VStack). +**Landscape:** back button and title share one row (ZStack — back button leading, title centered). No separate back button row — saves vertical space. + +Padding: 16pt horizontal on the header container. Back button has no padding of its own. + +### Card layout + +**Portrait:** two cards stacked vertically (VStack, spacing 16pt). +**Landscape:** two cards side-by-side (HStack, spacing 16pt). + +Card horizontal padding: 16pt each side. + +Cards are vertically centered in the remaining space below the header. Equal space above and below the card group (Spacer with minLength 16pt on both sides). + +### Card max height + +Max total card height = card width × 0.75. + +In portrait: card width = screen width − 32pt (16pt padding each side). +In landscape: card width = (screen width − 32pt − 16pt spacing) / 2. + +Card height can be less than max on small screens. Height never exceeds max. + +### Card component + +Each card is a rounded rectangle (corner radius 24pt) containing: + +1. **Image area** (top) — gradient background + alpha-channel illustration overlay +2. **Label stripe** (bottom) — toolbar material background, fixed proportional height + +#### Image area + +- Gradient fills only the image area, NOT the label stripe +- Illustration: `.resizable().scaledToFit()`, fills available space, clipped to image area + +#### Gradient + +Stops (light mode): +- `#d2e8ff` (rgb 0.824, 0.910, 1.0) at 0% +- `#cce9ff` (rgb 0.800, 0.914, 1.0) at 50% +- `#dfffff` (rgb 0.875, 1.0, 1.0) at 90% +- `#fffcea` (rgb 1.0, 0.988, 0.918) at 100% + +Stops (dark mode): +- `#040a24` (rgb 0.016, 0.039, 0.141) at 40% +- `#3854ab` (rgb 0.220, 0.329, 0.671) at 72% +- `#a8edf3` (rgb 0.659, 0.929, 0.953) at 90% +- `#fff6e0` (rgb 1.0, 0.965, 0.878) at 100% + +Angle: 80° counter-clockwise from horizontal (almost vertical, slight rightward lean at top). + +Gradient scale (center-anchored): 1.2× in light mode, 1.5× in dark mode. This pushes start/end points further from center, reducing colored corner area. + +**Gradient endpoint calculation** (accounts for variable card aspect ratio): + +The gradient must maintain a constant 80° visual angle regardless of card proportions. Given the IMAGE AREA aspect ratio `r = imageHeight / width`: + +``` +θ = 80° (in radians: 80 × π / 180) +dx = cos(θ) +dy = −sin(θ) / r + +Project four corners (±0.5, ±0.5) onto direction (dx, dy): + projections = [−0.5·dx + (−0.5)·dy, 0.5·dx + (−0.5)·dy, −0.5·dx + 0.5·dy, 0.5·dx + 0.5·dy] + tMin = min(projections), tMax = max(projections) + dLenSq = dx² + dy² + +Base endpoints: + startX = 0.5 + tMin·dx/dLenSq, startY = 0.5 + tMin·dy/dLenSq + endX = 0.5 + tMax·dx/dLenSq, endY = 0.5 + tMax·dy/dLenSq + +Apply scale S (1.2 or 1.5) center-anchored: + finalStart = (0.5 + (startX−0.5)·S, 0.5 + (startY−0.5)·S) + finalEnd = (0.5 + (endX−0.5)·S, 0.5 + (endY−0.5)·S) +``` + +Important: aspect ratio uses IMAGE AREA height (card height minus label stripe), not total card height. + +#### Label stripe + +Height relative to card width: +- Single-line labels (Screen 1): 0.132 × card width +- Two-line labels (Screen 2): 0.195 × card width + +Background: platform toolbar material (matches the app toolbar appearance). On iOS: `Material` from `ToolbarMaterial` user setting. On Android: equivalent translucent material. + +Content layout: centered horizontally. +- Icon: 24pt, theme primary/accent color +- Title: body font (17pt), medium weight, theme foreground color, single line, shrinks to 75% +- Subtitle (Screen 2 only): footnote (13pt), theme foreground at 70% opacity + +Label stripe sits below the image area — gradient does NOT extend under it. + +### Card images + +8 alpha-channel PNGs (4 illustrations × light/dark variants). + +Screen 1: +- `card-let-someone-connect-to-you-alpha` / `-light` +- `card-connect-via-link-alpha` / `-light` + +Screen 2: +- `card-invite-someone-privately-alpha` / `-light` +- `card-create-your-public-address-alpha` / `-light` + +Light/dark selection: use base name on light backgrounds, `-light` suffix on dark backgrounds. + +Gated behind build flag (`#if SIMPLEX_ASSETS` on iOS, `BuildConfigCommon.SIMPLEX_ASSETS` on Android). Without assets: gradient-only cards with label stripe, still functional. + +### Card icons (SF Symbols / Material equivalents) + +Screen 1: +- "Let someone connect to you" — `link.badge.plus` +- "Connect via link or QR code" — `qrcode.viewfinder` + +Screen 2: +- "Invite someone privately" — `link.badge.plus` +- "Create your public address" — `qrcode` + +### Card actions + +Screen 1: +- Left card ("Let someone connect to you") → paging transition to Screen 2 +- Right card ("Connect via link or QR code") → modal sheet with ConnectView + +Screen 2: +- Left card ("Invite someone privately") → modal sheet with InviteView (1-time link) +- Right card ("Create your public address") → modal sheet with UserAddressView (auto-create) + +### Onboarding visibility + +Controlled by existing user default `addressCreationCardShown` (key: `"AddressCreationCardShown"`). + +Show onboarding when: +- `addressCreationCardShown == false` +- Chat list is not empty (chats have loaded) +- All chats are "ignorable" (note folders, deleted contacts, contact cards, pending connections/requests, invalid JSON) +- Any group = real conversation → onboarding hidden + +Auto-dismiss: when first real conversation appears, set `addressCreationCardShown = true` permanently. Observed via chat list count changes. + +### Strings (8) + +- "Talk to someone" +- "Let someone connect to you" +- "Connect via link or QR code" +- "Connect with someone" +- "Invite someone privately" +- "A link for one person to connect" +- "Create your public address" +- "For anyone to reach you" + +--- + +## Scope + +Screens 1 and 2 only — two card selection screens with slide navigation between them. No standalone onboarding variants of existing views. No banner. Those are separate future work. + +## New file + +`Shared/Views/NewChat/OnboardingCards.swift` — all new code in one file. + +## What it contains + +### `OnboardingCardView` — reusable card component + +```swift +struct OnboardingCardView: View { + @Environment(\.colorScheme) var colorScheme + let imageName: String // base asset name (without -light suffix) + let icon: String // SF Symbol name + let title: LocalizedStringKey + let subtitle: LocalizedStringKey? // nil for screen 1 cards + let action: () -> Void +} +``` + +Image selection follows the project convention: +- `colorScheme == .light` → `imageName` (base name, dark-colored image for light backgrounds) +- `colorScheme == .dark` → `"\(imageName)-light"` (light-colored image for dark backgrounds) + +Note: this only works when the base name does NOT already contain `-light`. The card image base names are like `card-let-someone-connect-to-you-alpha` — the `-alpha` suffix distinguishes them, and appending `-light` gives `card-let-someone-connect-to-you-alpha-light`. Correct. + +Structure (inside → out): +1. `Button(action:)` wrapping the entire card for tap handling, with `.buttonStyle(.plain)` to prevent default blue tint +2. Clipped to `RoundedRectangle(cornerRadius: 18)` +3. Inside, `ZStack(alignment: .bottom)`: + - `LinearGradient` filling the card shape + - `VStack(spacing: 0)`: + - `#if SIMPLEX_ASSETS` block: `Image` with `.resizable().scaledToFit().frame(maxWidth: .infinity, maxHeight: .infinity)` — takes all space above label. Image uses `.clipped()` to prevent overflow into label area. + - `#else` block: `Spacer()` — gradient-only card, label still functional. + - Label area with fixed height: `HStack(spacing: 8)` with `Image(systemName: icon)` (20pt) + `VStack(alignment: .leading, spacing: 2)` containing title + optional subtitle. Padded `(.horizontal, 16)` and `(.vertical, 12)`. + +Gradient stops (using `Color(red:green:blue:)` with values 0-1, no hex extension exists in the project): +- Light: + - `Color(red: 0.824, green: 0.910, blue: 1.0)` at 0.0 (#d2e8ff) + - `Color(red: 0.800, green: 0.914, blue: 1.0)` at 0.5 (#cce9ff) + - `Color(red: 0.875, green: 1.0, blue: 1.0)` at 0.9 (#dfffff) + - `Color(red: 1.0, green: 0.988, blue: 0.918)` at 1.0 (#fffcea) +- Dark: + - `Color(red: 0.016, green: 0.039, blue: 0.141)` at 0.4 (#040a24) + - `Color(red: 0.220, green: 0.329, blue: 0.671)` at 0.72 (#3854ab) + - `Color(red: 0.659, green: 0.929, blue: 0.953)` at 0.9 (#a8edf3) + - `Color(red: 1.0, green: 0.965, blue: 0.878)` at 1.0 (#fff6e0) +- Angle: 80° from vertical = 10° from horizontal. `LinearGradient(stops:..., startPoint: .init(x: 0.0, y: 0.6), endPoint: .init(x: 1.0, y: 0.4))`. Must verify visually — the exact start/end points for 80° depend on the view's aspect ratio. May need adjustment. + +Define the gradient stops as static properties on `OnboardingCardView` to avoid recomputing them on every recomposition. + +Label text styles: +- Title: `.body` weight `.semibold`, color `Color.white` in dark mode, `Color.primary` in light mode (from design: dark text on light gradient, light text on dark gradient). +- Subtitle: `.footnote`, color `.secondary` (adapts to theme). +- Icon: same color as title. + +### `TalkToSomeoneView` — Screen 1 + +```swift +struct TalkToSomeoneView: View { + @EnvironmentObject var theme: AppTheme + @State private var showConnectWithSomeone = false + @State private var showConnectViaLink = false +``` + +Body — NOT scrollable, fills available space: + +```swift +var body: some View { + VStack(spacing: 16) { + Text("Talk to someone") + .font(.largeTitle) + .fontWeight(.bold) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 16) + + OnboardingCardView( + imageName: "card-let-someone-connect-to-you-alpha", + icon: "link", + title: "Let someone connect to you", + subtitle: nil, + action: { showConnectWithSomeone = true } + ) + .frame(maxHeight: .infinity) + .padding(.horizontal, 16) + + OnboardingCardView( + imageName: "card-connect-via-link-alpha", + icon: "qrcode", + title: "Connect via link or QR code", + subtitle: nil, + action: { showConnectViaLink = true } + ) + .frame(maxHeight: .infinity) + .padding(.horizontal, 16) + } + .padding(.vertical, 16) + .background( + NavigationLink(isActive: $showConnectWithSomeone) { + ConnectWithSomeoneView() + } label: { EmptyView() } + ) + .background( + NavigationLink(isActive: $showConnectViaLink) { + NewChatView(selection: .connect, showQRCodeScanner: true) + .navigationBarTitleDisplayMode(.inline) + } label: { EmptyView() } + ) +} +``` + +Key layout decisions: +- `.frame(maxHeight: .infinity)` on each card makes them share remaining vertical space equally after the title takes its natural height. +- `.padding(.vertical, 16)` on the VStack adds 16pt above the title and 16pt below the second card (VStack `spacing` only applies between children, not before first or after last). +- Hidden `NavigationLink(isActive:)` in `.background()` — drives navigation without affecting layout. This is the deprecated iOS 15 API but it works on iOS 16+ inside `NavigationStack` and is used throughout the existing codebase (e.g., `NewChatMenuButton.swift` lines 100-110). + +**`oneHandUI` inversion handling:** `TalkToSomeoneView` replaces `chatList` content. `chatListView` applies `.scaleEffect(x: 1, y: oneHandUI ? -1 : 1)` to the root page. The onboarding view gets inverted. It must counter-invert with `.scaleEffect(x: 1, y: oneHandUI ? -1 : 1)`. This is applied in `ChatListView.chatList`, NOT inside `TalkToSomeoneView` — the caller is responsible. When NavigationLink pushes Screen 2 or further views, those are new navigation pages outside the root page's scale effect, so they render normally. + +### `ConnectWithSomeoneView` — Screen 2 + +```swift +struct ConnectWithSomeoneView: View { + @EnvironmentObject var theme: AppTheme + @State private var showInviteSomeone = false + @State private var showCreateAddress = false +``` + +Same VStack layout as Screen 1, with these differences: +- Title: "Connect with someone" +- Card 1: imageName `"card-invite-someone-privately-alpha"`, icon `"link"`, title "Invite someone privately", subtitle "A link for one person to connect" → sets `showInviteSomeone = true` +- Card 2: imageName `"card-create-your-public-address-alpha"`, icon `"qrcode"`, title "Create your public address", subtitle "For anyone to reach you" → sets `showCreateAddress = true` + +Navigation destinations (existing views, unmodified — onboarding variants are future work): +- `showInviteSomeone` → `NewChatView(selection: .invite)` — tabbed view, 1-time link tab pre-selected. Has tabs (not ideal) but functional. +- `showCreateAddress` → `UserAddressView(shareViaProfile: false, autoCreate: true)` — auto-creates address on appear. + +Both wrapped with `.navigationBarTitleDisplayMode(.inline)`. + +Navigation bar back button shows automatically (pushed via NavigationLink within the stack). + +## Integration into ChatListView + +### In `chatList` property (line 351 of ChatListView.swift) + +Current code: +```swift +private var chatList: some View { + let cs = filteredChats() + return ZStack { + ScrollViewReader { scrollProxy in + List { ... } + } + } +} +``` + +Changed to: +```swift +@ViewBuilder +private var chatList: some View { + if shouldShowOnboarding { + TalkToSomeoneView() + .scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center) + } else { + let cs = filteredChats() + ZStack { + ScrollViewReader { scrollProxy in + List { ... } + } + } + } +} +``` + +Requires `@ViewBuilder` because `if/else` returns different view types. + +**`oneHandUI` inversion:** The `.scaleEffect(y: -1)` is applied by `chatListView` to the root page of the navigation stack. `TalkToSomeoneView` counter-inverts at the call site. When `NavigationLink` pushes Screen 2 or further, those are new navigation pages NOT affected by the root page's `.scaleEffect`. Only the root content needs the flip. + +### `shouldShowOnboarding` and `noConversationChatsYet` + +```swift +private var shouldShowOnboarding: Bool { + !addressCreationCardShown && noConversationChatsYet +} + +private var noConversationChatsYet: Bool { + chatModel.chats.allSatisfy { chat in + switch chat.chatInfo { + case .local: return true + case let .direct(contact): return contact.chatDeleted || contact.isContactCard + case let .group(groupInfo, _): return groupInfo.chatDeleted + case let .contactRequest(req): return req.chatDeleted + case let .contactConnection(conn): return conn.chatDeleted + case .invalidJSON: return true + } + } +} +``` + +Both are computed properties on `ChatListView`. `noConversationChatsYet` reads `chatModel.chats` which is `@Published` on `ChatModel` (`@EnvironmentObject`). SwiftUI re-evaluates the body when it changes, so `shouldShowOnboarding` is reactive. + +Note: `chatModel.chats` may be empty during initial load (before `APIGetChats` completes). `allSatisfy` on an empty array returns `true`. Combined with `!addressCreationCardShown`, this means the onboarding flashes briefly on app launch for users who have conversations but `chats` hasn't loaded yet. Mitigation: also check `chatModel.chats.isEmpty` and show a loading indicator instead: + +```swift +private var shouldShowOnboarding: Bool { + !addressCreationCardShown && !chatModel.chats.isEmpty && noConversationChatsYet +} +``` + +When `chats` is empty (loading), neither onboarding nor chat list shows — the existing loading state (if any) handles it. + +### Auto-dismiss + +`addressCreationCardShown` must be set to `true` when the first real conversation appears, so the onboarding never returns. + +```swift +.onChange(of: chatModel.chats.count) { _ in + if !noConversationChatsYet && !addressCreationCardShown { + addressCreationCardShown = true + } +} +``` + +Placed on `chatList` view. Observes `.count` as a proxy for chat list changes. When count changes and `noConversationChatsYet` is false, the user default is set permanently. This covers: receiving a contact request, establishing a connection, creating a group, etc. + +Edge case: chat count can change without affecting `noConversationChatsYet` (e.g., adding a second note folder). The check `!noConversationChatsYet` prevents unnecessary writes — only sets the default when there's actually a real conversation. + +## User default + +Existing `@AppStorage(DEFAULT_ADDRESS_CREATION_CARD_SHOWN) private var addressCreationCardShown = false` at ChatListView line 165. Constant defined in `SettingsView.swift` line 55 as `let DEFAULT_ADDRESS_CREATION_CARD_SHOWN = "addressCreationCardShown"`. Also referenced in `AddressCreationCard.swift` line 17 and in `SettingsView.swift` defaults reset (line 114, 144). + +No new user default needed. + +## String localization + +8 new strings for `Localizable.strings` (en). Use `NSLocalizedString` or `LocalizedStringKey` inline — project uses both patterns. + +- "Talk to someone" +- "Let someone connect to you" +- "Connect via link or QR code" +- "Connect with someone" +- "Invite someone privately" +- "A link for one person to connect" +- "Create your public address" +- "For anyone to reach you" + +## Assets + +8 card images in art repo (4 base + 4 light variants). Run `resize.sh` then `copy-assets.sh` to populate `SimpleXAssets.xcassets`. Gated with `#if SIMPLEX_ASSETS`. Without assets: gradient-only cards with labels, still tappable and functional. + +Image base names for the `imageName` parameter: +- Screen 1: `"card-let-someone-connect-to-you-alpha"`, `"card-connect-via-link-alpha"` +- Screen 2: `"card-invite-someone-privately-alpha"`, `"card-create-your-public-address-alpha"` + +The `-light` suffix is appended automatically by `OnboardingCardView` when `colorScheme == .dark`. + +## Files changed + +- `Shared/Views/ChatList/ChatListView.swift` — add `shouldShowOnboarding`, `noConversationChatsYet`, add `@ViewBuilder` to `chatList`, branch to `TalkToSomeoneView`, add `.onChange` for auto-dismiss +- **New:** `Shared/Views/NewChat/OnboardingCards.swift` — `OnboardingCardView`, `TalkToSomeoneView`, `ConnectWithSomeoneView` + +No modifications to NewChatView, UserAddressView, or ConnectView in this phase. + +## Revision 1 — corrections from design review + +### Navigation scope (critical) +Both screens must keep the bottom/top toolbar visible. The onboarding NavigationView is SCOPED to just the card area — it does NOT replace the full chatListView. In `chatList`, wrap `TalkToSomeoneView()` in its own `NavigationView { }.navigationViewStyle(.stack)`. The toolbar from `chatListView.withToolbar()` stays outside and visible on both screens. + +Screen 1 → Screen 2: real NavigationLink push within the scoped NavigationView. +Screen 2 → deeper views: also NavigationLink pushes within same scoped NavigationView. + +### Screen 1 — reserve nav bar space +Screen 2 has a back button (navigation bar). Screen 1 must reserve the same height to prevent content shift on slide. Set `.navigationTitle("")` with `.navigationBarTitleDisplayMode(.inline)` on Screen 1's root — shows an empty inline nav bar matching Screen 2's bar height. + +### Gradient direction fix +Current gradient is nearly horizontal — wrong. Correct angle is 80° CCW from horizontal (almost vertical, slight rightward lean). + +Formula for full-coverage gradient at angle θ: +``` +startPoint = (0.5 - 0.5·cos(θ), 0.5 + 0.5·sin(θ)) +endPoint = (0.5 + 0.5·cos(θ), 0.5 - 0.5·sin(θ)) +``` + +For θ = 80°: `startPoint: .init(x: 0.413, y: 0.992), endPoint: .init(x: 0.587, y: 0.008)` + +### Corner radius +Change from 18 to 24. + +### Label stripe background +The label area has a distinct semi-transparent background strip at the bottom of the card. Add to `labelRow`: +- Light mode: `Color.white.opacity(0.5)` +- Dark mode: `Color.black.opacity(0.3)` +Exact opacity values need visual tuning. + +### Card max height ratio +Cards have a max total height/width ratio of 0.75. On tall screens, cards are capped at this ratio with extra space distributed equally above and below. On short screens, cards shrink — ratio goes below 0.75, label stripe stays fixed height, only image area shrinks. + +Implementation: use `GeometryReader` to get available width, compute `maxCardHeight = cardWidth * 0.75`, apply `.frame(maxHeight: maxCardHeight)` on each card. The VStack centers vertically in the GeometryReader — equal space above and below on tall screens. + +### Title alignment +Change from `.leading` to `.center` — design shows centered titles on both screens. + +### Subtitle color in dark mode +Change `.foregroundColor(.secondary)` to `.foregroundColor(colorScheme == .dark ? .white.opacity(0.7) : .secondary)` — standard `.secondary` is too gray on the dark gradient. + +### Label stripe height proportions +The label stripe has fixed proportional heights relative to card width: +- Screen 1 (single-line labels): 0.132 × card width +- Screen 2 (two-line labels): 0.195 × card width + +These are achieved via fixed padding on the label row. The image area is the remainder of the card height. When cards shrink on short screens, only the image area shrinks — the label stripe stays at its proportional height. + +### Spacing between title and cards, between cards, and below cards +The gaps above first card and below second card should be EQUAL and LARGER than the gap between the two cards. The inter-card gap is the VStack spacing (~16pt). The outer gaps are larger — achieved by the GeometryReader centering the VStack vertically, which distributes extra space equally above and below. + +### ThemedBackground on TalkToSomeoneView +`TalkToSomeoneView` needs `.modifier(ThemedBackground())` — it replaces `chatList` content and needs its own background. Currently missing. + +### `oneHandUI` inversion on Screen 2 +The scoped `NavigationView` sits inside `chatList` which is visually inverted by `chatListView`'s `.scaleEffect(y: -1)`. This inversion applies to the NavigationView's rendered frame — ALL pages inside it (both Screen 1 and Screen 2) are inverted. `TalkToSomeoneView` counter-inverts at the call site. `ConnectWithSomeoneView` (pushed within the NavigationView) also needs counter-inversion. Pass `oneHandUI` as a binding or read from `@AppStorage(GROUP_DEFAULT_ONE_HAND_UI)` directly inside `ConnectWithSomeoneView`, and apply `.scaleEffect(x: 1, y: oneHandUI ? -1 : 1)` on its root VStack. Same for any deeper pushed views — but those are existing views not modified in this phase, so their inversion behavior needs testing. + +### Plan cleanup note +The original sections above contain outdated code snippets (wrong gradient, wrong corner radius, wrong switch cases, wrong alignment). The Revision 1 sections are authoritative. When implementing, follow Revision 1 values; treat original sections as structural context only. + diff --git a/scripts/android/copy-assets.sh b/scripts/android/copy-assets.sh new file mode 100755 index 0000000000..c76383faae --- /dev/null +++ b/scripts/android/copy-assets.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -eu + +# Copies generated multiplatform assets into the SimpleX assets directory. +# Called by Gradle build when simplex.assets.dir property is set. +# +# Usage: copy-assets.sh + +SRC_DIR="$1/multiplatform/resources/MR/images" +DEST_DIR="$2/MR/images" + +if [ ! -d "$SRC_DIR" ]; then + echo "Error: source assets not found: $SRC_DIR (run resize.sh first)" >&2 + exit 1 +fi + +rm -rf "$DEST_DIR" +mkdir -p "$DEST_DIR" + +cp "$SRC_DIR"/* "$DEST_DIR/" +echo "Copied multiplatform assets to $DEST_DIR" diff --git a/scripts/ios/copy-assets.sh b/scripts/ios/copy-assets.sh new file mode 100755 index 0000000000..f29ebd2464 --- /dev/null +++ b/scripts/ios/copy-assets.sh @@ -0,0 +1,50 @@ +#!/bin/sh +set -eu + +# Copies generated iOS assets into SimpleXAssets.xcassets. +# Intended to run as an Xcode Run Script build phase. +# Skips silently if SIMPLEX_ASSETS is not in SWIFT_ACTIVE_COMPILATION_CONDITIONS +# or if the source directory is not found. +# +# The source path is resolved in order: +# 1. Command-line argument +# 2. SIMPLEX_ASSETS_DIR build setting (set in Local.xcconfig) +# 3. No default — skips if neither is set +# +# Manual usage: ./scripts/copy-assets.sh path/to/assets + +# Skip if SIMPLEX_ASSETS flag is not set (unless run manually outside Xcode) +if [ -n "${SWIFT_ACTIVE_COMPILATION_CONDITIONS:-}" ]; then + case " $SWIFT_ACTIVE_COMPILATION_CONDITIONS " in + *" SIMPLEX_ASSETS "*) ;; + *) exit 0 ;; + esac +fi + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +IOS_DIR="$SCRIPT_DIR/../../apps/ios/Shared/SimpleXAssets.xcassets" + +ASSETS_ROOT="${1:-${SIMPLEX_ASSETS_DIR:-}}" +if [ -z "$ASSETS_ROOT" ]; then + echo "warning: SIMPLEX_ASSETS_DIR not set and no path argument provided" >&2 + exit 0 +fi + +SRC_DIR="$ASSETS_ROOT/ios/Assets.xcassets" + +if [ ! -d "$SRC_DIR" ]; then + echo "warning: source assets not found: $SRC_DIR (run resize.sh first)" >&2 + exit 0 +fi + +# Remove old imagesets but keep root Contents.json +find "$IOS_DIR" -name "*.imageset" -type d -exec rm -rf {} + 2>/dev/null || true + +# Copy imagesets +for imageset in "$SRC_DIR"/*.imageset; do + [ -d "$imageset" ] || continue + cp -r "$imageset" "$IOS_DIR/" + echo "Copied $(basename "$imageset")" +done + +echo "Done. Assets copied to $IOS_DIR" From 35bb7edd2fbb1dde5f1f722d275d8f2bce3a6983 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Tue, 21 Apr 2026 19:02:33 +0100 Subject: [PATCH 050/152] blog: v6.5 announcement permalink (#6854) * blog: v6.5 channels etc. permalink * rename --- ...nsortium-crowdfunding-freedom-of-speech.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 blog/20260428-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.md diff --git a/blog/20260428-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.md b/blog/20260428-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.md new file mode 100644 index 0000000000..39616304dd --- /dev/null +++ b/blog/20260428-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.md @@ -0,0 +1,38 @@ +--- +layout: layouts/article.html +title: "SimpleX Channels, SimpleX Network Consortium and Community Crowdfunding - to Preserve Freedom of Speech" +date: 2026-04-28 +# previewBody: blog_previews/20260421.html +# image: images/20260421-channel.png +# imageBottom: true +draft: true +permalink: "/blog/20260428-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.html" +--- + +# SimpleX Channels, SimpleX Network Consortium and Community Crowdfunding - to Preserve Freedom of Speech + +**To be published:** Apr 28, 2026 + +This is a permalink for a blog post about: + +- SimpleX Channels - a new model for online publishing that preserves participation privacy, protecting both user and network operators. It is being released in v6.5 +- SimpleX Network Consortium - a cross-jurisdictional governance and licensing structure to ensure long term availability and sustainability of SimpleX Network. +- Testing the water for community crowdfunding under Reg CF. + +## SimpleX Channels - more public, more freedom, more private + +TODO + +## SimpleX Network Consortium - to govern SimpleX Network + +TODO + +## Community Crowdfunding + +TODO + +*Register your interest* to participate in crowdfunding here: https://simplexchat.typeform.com/crowdfunding + +Join the channel for updates here: https://smp4.simplex.im/g#g6pdBGlLoeOwqYmbmyvRye8EBiFd2inNUzKc87Pt3y4 + +_Disclaimer: SimpleX Chat is testing the waters for a possible Reg CF offering. We’re not asking for or accepting any money right now, and we won’t accept any if sent. We can’t accept any offers to buy securities or take any payments until the official filing is done and it’s live through a regulated platform. Our testing the waters and your possible indications of interest doesn’t create any obligation or commitment of any kind._ From 12e62aaba1abc205b8ec895a7430109094e60092 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 21 Apr 2026 18:05:11 +0000 Subject: [PATCH 051/152] desktop: fix select marked deleted when hidden (#6851) --- .../kotlin/chat/simplex/common/views/chat/ChatView.kt | 2 +- .../kotlin/chat/simplex/common/views/chat/TextSelection.kt | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt index 40a89dd8a6..114edeee3d 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ChatView.kt @@ -2339,7 +2339,7 @@ fun BoxScope.ChatItemsList( } val manager = LocalSelectionManager.current - val modifier = if (appPlatform.isDesktop && manager != null) SelectionHandler(manager, listState, mergedItems, linkMode) else Modifier + val modifier = if (appPlatform.isDesktop && manager != null) SelectionHandler(manager, listState, mergedItems, revealedItems, linkMode) else Modifier LazyColumnWithScrollBar( modifier.align(Alignment.BottomCenter), diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt index 626aea0806..dee39dde7c 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/TextSelection.kt @@ -196,12 +196,13 @@ class SelectionManager { } } - fun getSelectedCopiedText(items: List, linkMode: SimplexLinkMode): String { + fun getSelectedCopiedText(items: List, revealedItems: Set, linkMode: SimplexLinkMode): String { val r = range ?: return "" val lo = minOf(r.startIndex, r.endIndex) val hi = maxOf(r.startIndex, r.endIndex) return (lo..hi).mapNotNull { idx -> val ci = items.getOrNull(idx)?.newest()?.item ?: return@mapNotNull null + if (ci.meta.itemDeleted != null && (!revealedItems.contains(ci.id) || ci.isDeletedContent)) return@mapNotNull null val sel = selectedRange(range, idx) ?: return@mapNotNull null selectedItemCopiedText(ci, sel, linkMode) }.reversed().joinToString("\n") @@ -291,6 +292,7 @@ fun BoxScope.SelectionHandler( manager: SelectionManager, listState: State, mergedItems: State, + revealedItems: State>, linkMode: SimplexLinkMode ): Modifier { val touchSlop = LocalViewConfiguration.current.touchSlop @@ -311,7 +313,7 @@ fun BoxScope.SelectionHandler( manager.listState = listState manager.onCopySelection = { - clipboard.setText(AnnotatedString(manager.getSelectedCopiedText(mergedItems.value.items, linkMode))) + clipboard.setText(AnnotatedString(manager.getSelectedCopiedText(mergedItems.value.items, revealedItems.value, linkMode))) showToast(generalGetString(MR.strings.copied)) } From 607124079f5f88d59a4d5de1c0930159de681f18 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 21 Apr 2026 18:05:33 +0000 Subject: [PATCH 052/152] desktop: fix voice message recording not stopping on chat switch (#6849) --- .../kotlin/chat/simplex/common/views/chat/ComposeView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt index 62cfdcbe65..95f51bf284 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/views/chat/ComposeView.kt @@ -1304,6 +1304,8 @@ fun ComposeView( composeState.value = cs.copy(inProgress = false, progressByTimeout = false) } else if (!cs.empty) { if (cs.preview is ComposePreview.VoicePreview && !cs.preview.finished) { + recState.value = RecordingState.NotStarted + RecorderInterface.stopRecording?.invoke() composeState.value = cs.copy(preview = cs.preview.copy(finished = true)) } if (saveLastDraft) { From 0e1c3fac5c0df206e7746fd7e15bcd9d60a1ace0 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 21 Apr 2026 18:07:58 +0000 Subject: [PATCH 053/152] desktop: fix sending files with + in file name (#6836) * desktop: fix sending files with + in file name Use RFC 3986 URI encoding (File.toURI()) instead of application/x-www-form-urlencoded (URLEncoder/URLDecoder) for file path URIs. URLDecoder treated literal + as space, corrupting filenames containing + on desktop. * less breaking approach --- .../commonMain/kotlin/chat/simplex/common/platform/Files.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/Files.kt b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/Files.kt index 88d9fbb705..cdd4140e3f 100644 --- a/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/Files.kt +++ b/apps/multiplatform/common/src/commonMain/kotlin/chat/simplex/common/platform/Files.kt @@ -42,7 +42,9 @@ expect fun desktopOpenDir(dir: File) fun createURIFromPath(absolutePath: String): URI = URI.create(URLEncoder.encode(absolutePath, "UTF-8")) -fun URI.toFile(): File = File(URLDecoder.decode(rawPath, "UTF-8").removePrefix("file:")) +fun URI.toFile(): File = + if (scheme == "file") File(this) + else File(URLDecoder.decode(rawPath, "UTF-8").removePrefix("file:")) fun copyFileToFile(from: File, to: URI, finally: () -> Unit) { try { From e0b8b0dbe36b094bb1528b33ab6c671bcd53b660 Mon Sep 17 00:00:00 2001 From: Narasimha-sc <166327228+Narasimha-sc@users.noreply.github.com> Date: Tue, 21 Apr 2026 18:10:31 +0000 Subject: [PATCH 054/152] docs, website: fix typos and grammar errors (#6819) Fix spelling, grammar, and punctuation issues across documentation and website content including subject-verb agreement, missing articles, typos, and broken code snippets. --- docs/ANDROID.md | 2 +- docs/BUSINESS.md | 4 +-- docs/CONTRIBUTING.md | 4 +-- docs/DIRECTORY.md | 2 +- docs/DONATIONS.md | 2 +- docs/FAQ.md | 18 +++++------ docs/GLOSSARY.md | 6 ++-- docs/REPRODUCE.md | 8 ++--- docs/SECURITY.md | 2 +- docs/SERVER.md | 64 +++++++++++++++++++------------------- docs/SIMPLEX.md | 2 +- docs/TRANSLATIONS.md | 2 +- docs/WEBRTC.md | 8 ++--- docs/XFTP-SERVER.md | 26 ++++++++-------- website/langs/en.json | 14 ++++----- website/src/directory.html | 2 +- website/src/token.md | 12 +++---- 17 files changed, 89 insertions(+), 89 deletions(-) diff --git a/docs/ANDROID.md b/docs/ANDROID.md index 61f81d1a40..d0422e1abd 100644 --- a/docs/ANDROID.md +++ b/docs/ANDROID.md @@ -49,7 +49,7 @@ Please, note, that if you use a modern version of SimpleX, the databases will be In order to view database data you need to decrypt it first. Install `sqlcipher` using your favorite package manager and run the following commands in the directory with databases: ```bash sqlcipher files_chat.db -pragma key="youDecryptionPassphrase"; +pragma key="yourDecryptionPassphrase"; # Ensure it works fine select * from users; ``` diff --git a/docs/BUSINESS.md b/docs/BUSINESS.md index 8fd5df5c36..b72bf00257 100755 --- a/docs/BUSINESS.md +++ b/docs/BUSINESS.md @@ -9,7 +9,7 @@ SimpleX Chat (aka SimpleX) is a decentralized communication network that provide This document aims to help you make the best use of SimpleX Chat if you choose to engage with its users. -## Communcate with customers via business address +## Communicate with customers via business address In the same way you can connect to our "SimpleX Chat team" profile via the app, you can provide the address for your existing and prospective customers: - to buy your product and services via chat, @@ -85,7 +85,7 @@ To install SimpleX Chat CLI in the cloud, follow this: simplex-chat ``` -To deattach from running CLI simply press `Ctrl+B` and then `D`. +To detach from a running CLI, simply press `Ctrl+B` and then `D`. To reattach back to CLI, run: `tmux attach -t simplex-cli`. diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 6ae5418d0a..3ecfa17409 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -21,7 +21,7 @@ Please discuss the problem you want to solve and your detailed implementation pl ./contributing/CODE.md has details about general requirements common for `simplexmq` and `simplex-chat` repositories. -This files can be used with LLM prompts, e.g. if you use Claude Code you can create CLAUDE.md file in project root importing content from these files: +These files can be used with LLM prompts, e.g. if you use Claude Code you can create CLAUDE.md file in project root importing content from these files: ```markdown @README.md @@ -71,7 +71,7 @@ You will have to add `/opt/homebrew/opt/openssl@3.0/bin` to your PATH in order t 1. Make PRs to `master` branch _only_ for both simplex-chat and simplexmq repos. -2. To build core libraries for Android, iOS and windows: +2. To build core libraries for Android, iOS and Windows: - merge `master` branch to `master-android` branch. - push to GitHub. diff --git a/docs/DIRECTORY.md b/docs/DIRECTORY.md index 8659222280..50e7771a1a 100644 --- a/docs/DIRECTORY.md +++ b/docs/DIRECTORY.md @@ -96,7 +96,7 @@ Group owners are expected to moderate the content in the groups, if members post We reserve the right to not accept the group listing in the directory or cancel its listing, and there may be cases when we can't provide an explanation. We will certainly try to avoid it by communicating with the group owners first. -The combination of display name and full name has to be unique for the listed groups. If a group uses the name or logo of SimpleX, SimpleX network or SimpleX Chat it must be consistent with [Permitted Uses or SimpleX trademark](./TRADEMARK.md). +The combination of display name and full name has to be unique for the listed groups. If a group uses the name or logo of SimpleX, SimpleX network or SimpleX Chat it must be consistent with [Permitted Uses of SimpleX trademark](./TRADEMARK.md). Once the group is listed in the directory, the bot will invite you to join the group of the group owners, where you can send any ideas or suggestions for how the groups functionality should evolve, and help steer both the product and the policies. diff --git a/docs/DONATIONS.md b/docs/DONATIONS.md index 50eb62a401..b3046ee90b 100644 --- a/docs/DONATIONS.md +++ b/docs/DONATIONS.md @@ -7,7 +7,7 @@ permalink: /donate/index.html Huge thank you to everybody who donated to SimpleX Chat! -We are prioritizing users privacy and security - it would be impossible without your support. +We are prioritizing users' privacy and security - it would be impossible without your support. Our pledge to our users is that SimpleX protocols are and will remain open, and in public domain, - so anybody can build the future implementations of the clients and the servers. We are building SimpleX platform based on the same principles as email and web, but much more private and secure. diff --git a/docs/FAQ.md b/docs/FAQ.md index 401f025d9c..8c14168811 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -51,7 +51,7 @@ revision: 13.08.2025 ### How do I connect to people? -Tap "pencil" button in the right corner, then "Create 1-time link". Share the link with the person you want to connect to. Your contact has to paste the link to the app's search bar. The link will can also be opened via the browser, once the app is installed. +Tap "pencil" button in the right corner, then "Create 1-time link". Share the link with the person you want to connect to. Your contact has to paste the link to the app's search bar. The link can also be opened via the browser, once the app is installed. Alternatively, you can show the QR code when meeting in person or in a video call. @@ -103,7 +103,7 @@ Also see: [I do not see the second tick on the messages I sent](#i-do-not-see-th ### I want to see when my contacts read my messages -To know when your contact read your messages, your contact's app has to send you a confirmation message. And vice versa, for your contact to know when you read the message, your app has to send a confirmation message. +To know when your contact reads your messages, your contact's app has to send you a confirmation message. And vice versa, for your contact to know when you read the message, your app has to send a confirmation message. The important questions for this feature: - do you always want that your contacts can see when you read all their messages? Probably, even with your close friends, sometimes you would prefer to have time before you answer their message, and also have a plausible deniability that you have not seen the message. And this should be ok - in the end, this is your device, and it should be for you to decide whether this confirmation message is sent or not, and when it is sent. @@ -111,7 +111,7 @@ The important questions for this feature: Overall, it seems that this feature is more damaging to your communications with your contacts than it is helpful. It keeps senders longer in the app, nervously waiting for read receipts, exploiting addictive patterns - having you spend more time in the app is the reason why it is usually present in most messaging apps. It also creates a pressure on the recipients to reply sooner, and if read receipts are opt-in, it creates a pressure to enable it, that can be particularly damaging in any relationships with power imbalance. -We think that delivery receipts are important and equally benefit both sides as the conversation, as they confirm that communication network functions properly. But we strongly believe that read receipts is an anti-feature that only benefits the app developers, and hurts the relations between the app users. So we are not planning to add it even as opt-in. In case you want your contact to know you've read the message put a reaction to it. And if you don't want them to know it - it is also ok, what your device sends should be under your control. +We think that delivery receipts are important and equally benefit both sides as the conversation, as they confirm that communication network functions properly. But we strongly believe that read receipts are an anti-feature that only benefits the app developers, and hurts the relations between the app users. So we are not planning to add it even as opt-in. In case you want your contact to know you've read the message put a reaction to it. And if you don't want them to know it - it is also ok, what your device sends should be under your control. ### Can I use the same profile on desktop? Do messages sync cross-platform? @@ -130,7 +130,7 @@ We believe that allowing deleting information from your device to your contacts 2) it may be a business communication, and either your organization policy or a compliance requirement is that every message you receive must be preserved for some time. 3) the message can contain a legally binding promise, effectively a contract between you and your contact, in which case you both need to keep it. 4) the messages may contain threat or abuse and you may want to keep them as a proof. -5) you may have paid for the the message (e.g., it can be a design project or consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation. +5) you may have paid for the message (e.g., it can be a design project or consulting report), and you don't want it to suddenly disappear before you had a chance to store it outside of the conversation. It is also important to remember, that even if your contact enabled "Delete for everyone", you cannot really see it as a strong guarantee that the message will be deleted. Your contact's app can have a very simple modification (a one-line code change), that would prevent this deletion from happening when you request it. So you cannot see it as something that guarantees your security from your contacts. @@ -232,7 +232,7 @@ You may not have the second tick on your sent messages for these reasons: ### I see image preview but cannot open the image It can be for these reasons: -- your contact did not finish uploading the image file, possibly closing the app too quickly. When the image file is fully uploaded there will be a tick in the _top right corner_ or the image +- your contact did not finish uploading the image file, possibly closing the app too quickly. When the image file is fully uploaded there will be a tick in the _top right corner_ of the image. - your device fails to receive it. Please check server connectivity and run server tests, and also try increasing network timeouts in Advanced network settings. File reception was substantially improved in v5.7 - please make sure you are using the latest version. - file expired and can no longer be received. Files can be received only for 2 days after they were sent, after that they won't be available and will show X in the top right corner. @@ -298,7 +298,7 @@ You can resolve it by deleting the app's database: (WARNING: this results in del ### My mobile app does not connect to desktop app 1. Check that both devices are connected to the same network (e.g., it won't work if mobile is connected to mobile Internet and desktop to WiFi). -2. If you use VPN on mobile, allow connections to local network in you VPN settings, or disable VPN. +2. If you use VPN on mobile, allow connections to local network in your VPN settings, or disable VPN. 3. Allow SimpleX Chat on desktop to accept network connections in system firewall settings. You may choose a specific port in desktop app to accept connections, by default it uses a random port every time. 4. Check that your WiFi router allows connections between devices (e.g., it may have an option for "device isolation", or similar). 5. If you see an error "certificate expired", please check that your device clocks are synchronized within a few seconds. @@ -312,7 +312,7 @@ If none of the suggestions work for you, you can create a separate profile on ea ### Does SimpleX support post quantum cryptography? -Yes! Please read more about quantum resistant encryption is added to SimpleX Chat and about various properties of end-to-end encryption in [this post](../blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md). +Yes! Please read more about how quantum-resistant encryption is added to SimpleX Chat and about various properties of end-to-end encryption in [this post](../blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md). ### Why can't I use the same profile on different devices? @@ -355,7 +355,7 @@ If the servers didn't upgrade, the messages would temporarily fail to deliver. Y With private routing enabled, instead of connecting to your contact's server directly, your client would "instruct" one of the known servers to forward the message, preventing the destination server from observing your IP address. -Your messages are additionally end-to-end encrypted between your client and the destination server, so that the forwarding server cannot observe the destination addresses and server responses – similarly to how onion routing work. Private message routing is, effectively, a two-hop onion packet routing. +Your messages are additionally end-to-end encrypted between your client and the destination server, so that the forwarding server cannot observe the destination addresses and server responses – similarly to how onion routing works. Private message routing is, effectively, a two-hop onion packet routing. Also, this connection is protected from man-in-the-middle attack by the forwarding server, as your client will validate destination server certificate using its fingerprint in the server address. @@ -375,7 +375,7 @@ Private message routing routes packets (each message is one 16kb packet), not so As each message uses its own random encryption key and random (non-sequential) identifier, the destination server cannot link multiple message queue addresses to the same client. At the same time, the forwarding server cannot observe which (and how many) addresses on the destination server your client sends messages to, thanks to e2e encryption between the client and destination server. In that regard, this design is similar to onion routing, but with per-packet anonymity, not per-circuit. -This design is similar to mixnets (e.g. [Nym network](https://nymtech.net)), and it is tailored to the needs of message routing, providing better transport anonymity that general purpose networks, like Tor or VPN. You still can use Tor or VPN to connect to known servers, to protect your IP address from them. +This design is similar to mixnets (e.g. [Nym network](https://nymtech.net)), and it is tailored to the needs of message routing, providing better transport anonymity than general-purpose networks, like Tor or VPN. You still can use Tor or VPN to connect to known servers, to protect your IP address from them. ### Why don't you embed Tor in SimpleX Chat app? diff --git a/docs/GLOSSARY.md b/docs/GLOSSARY.md index fe0bd107ed..c8fdd56bdd 100644 --- a/docs/GLOSSARY.md +++ b/docs/GLOSSARY.md @@ -147,7 +147,7 @@ SimpleX Clients also form a network using SMP relays and IP or some other overla [Wikipedia](https://en.wikipedia.org/wiki/Overlay_network) -# Non-repudiation +## Non-repudiation The property of the cryptographic or communication system that allows the recipient of the message to prove to any third party that the sender identified by some cryptographic key sent the message. It is the opposite to [repudiation](#repudiation). While in some context non-repudiation may be desirable (e.g., for contractually binding messages), in the context of private communications it may be undesirable. @@ -157,7 +157,7 @@ The property of the cryptographic or communication system that allows the recipi Generalizing [the definition](https://csrc.nist.gov/glossary/term/pairwise_pseudonymous_identifier) from NIST Digital Identity Guidelines, it is an opaque unguessable identifier generated by a service used to access a resource by only one party. -In the context of SimpleX network, these are the identifiers generated by SMP relays to access anonymous messaging queues, with a separate identifier (and access credential) for each accessing party: recipient, sender and and optional notifications subscriber. The same approach is used by XFTP relays to access file chunks, with separate identifiers (and access credentials) for sender and each recipient. +In the context of SimpleX network, these are the identifiers generated by SMP relays to access anonymous messaging queues, with a separate identifier (and access credential) for each accessing party: recipient, sender and an optional notifications subscriber. The same approach is used by XFTP relays to access file chunks, with separate identifiers (and access credentials) for sender and each recipient. ## Peer-to-peer @@ -177,7 +177,7 @@ The quality of the end-to-end encryption scheme allowing to recover security aga ## Post-quantum cryptography -Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is *proven* to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorigthms. +Any of the proposed cryptographic systems or algorithms that are thought to be secure against an attack by a quantum computer. It appears that as of 2025 there is no system or algorithm that is *proven* to be secure against such attacks, or even to be secure against attacks by massively parallel conventional computers, so a general recommendation is to use post-quantum hybrid cryptography - combining post-quantum and traditional algorithms. [Wikipedia](https://en.wikipedia.org/wiki/Post-quantum_cryptography) diff --git a/docs/REPRODUCE.md b/docs/REPRODUCE.md index 03fb6b4336..50c0b99280 100644 --- a/docs/REPRODUCE.md +++ b/docs/REPRODUCE.md @@ -46,7 +46,7 @@ echo -e "trust\n5\ny\nquit" | gpg --command-fd 0 --edit-key build@simplex.chat ## Verify release signature -**Linux dekstop apps and CLI**: +**Linux desktop apps and CLI**: Download the file with executable hashes and the signature. For example, to verify the `v6.5.0-beta.3` release: @@ -149,13 +149,13 @@ To reproduce the build you must have: The script executes these steps (please review the script to confirm): - 1) builds all Linux CLI and Dekstop binaries for the release in docker container. + 1) builds all Linux CLI and Desktop binaries for the release in docker container. 2) downloads binaries from the same GitHub release and compares them with the built binaries. 3) if they all match, generates _sha256sums file with their checksums. This will take a while. -4. After compilation, you should see the folder named as the tag and reprository name (e.g., `v6.4.8-simplex-chat`) with two subfolders: +4. After compilation, you should see the folder named as the tag and repository name (e.g., `v6.4.8-simplex-chat`) with two subfolders: ```sh ls v6.4.8-simplex-chat @@ -169,7 +169,7 @@ To reproduce the build you must have: ### Android apps -In addition to basic requirments, Android build will: +In addition to basic requirements, Android build will: - Take ~150gb of disc space - Take ~20h to build all the architectures (depends on core count) diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 72db650c35..b9218fbebc 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -54,7 +54,7 @@ We will determine the risk of each issue, taking into account our experience dea **Issue severity levels** -- **CRITICAL severity**. Such issues should affect common configurations and be exploitable with low or medium difficulty. For example: significant disclosure of the encrypted users messages or files either via relays or via communication channels, vulnerabilities which can be easily exploited remotely to compromise clients or servers private keys. These issues will be kept private and will trigger a new release of all supported versions. +- **CRITICAL severity**. Such issues should affect common configurations and be exploitable with low or medium difficulty. For example: significant disclosure of the encrypted users' messages or files either via relays or via communication channels, vulnerabilities which can be easily exploited remotely to compromise clients or servers private keys. These issues will be kept private and will trigger a new release of all supported versions. - **HIGH severity**. This includes issues that are of a lower risk than critical, possibly due to affecting less common configurations, or have high difficulty to be exploited. These issues will be kept private and will trigger a new release of all supported versions. - **MEDIUM severity**. This includes issues like crashes in client applications caused by the received messages or files, flaws in protocols that are less commonly used, and local flaws. These will in general be kept private until the next release, and that release will be scheduled so that it can roll up several such flaws at one time. - **LOW severity**. This includes issues such as those that only affect the SimpleX CLI app, or unlikely configurations, or issues that would be classified as medium but are very difficult to exploit. These will in general be fixed immediately in latest development versions, and may be back-ported to older versions that are still getting updates. These issues may be kept private or be included in commit messages. diff --git a/docs/SERVER.md b/docs/SERVER.md index f45403be8a..a35ede5cd0 100644 --- a/docs/SERVER.md +++ b/docs/SERVER.md @@ -59,7 +59,7 @@ To create SMP server as a systemd service, you'll need: - Your server domain, with A and AAAA records specifying server IPv4 and IPv6 addresses (`smp1.example.com`) - A basic Linux knowledge. -*Please note*: while you can run an SMP server without a domain name, in the near future client applications will start using server domain name in the invitation links (instead of `simplex.chat` domain they use now). In case a server does not have domain name and server pages (see below), the clients will be generaing the links with `simplex:` scheme that cannot be opened in the browsers. +*Please note*: while you can run an SMP server without a domain name, in the near future client applications will start using server domain name in the invitation links (instead of `simplex.chat` domain they use now). In case a server does not have domain name and server pages (see below), the clients will be generating the links with `simplex:` scheme that cannot be opened in the browsers. 1. Install server with [Installation script](https://github.com/simplex-chat/simplexmq#using-installation-script). @@ -82,7 +82,7 @@ To create SMP server as a systemd service, you'll need: --control-port \ --socks-proxy \ --source-code \ - --fqdn=smp1.example.com + --fqdn=smp1.example.com' ``` 4. Install tor: @@ -114,7 +114,7 @@ To create SMP server as a systemd service, you'll need: ```sh # Enable log (otherwise, tor doesn't seem to deploy onion address) Log notice file /var/log/tor/notices.log - # Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonimity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, keep standard configuration. + # Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonymity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, keep standard configuration. SOCKSPort 0 HiddenServiceNonAnonymousMode 1 HiddenServiceSingleHopMode 1 @@ -194,12 +194,12 @@ To create SMP server as a systemd service, you'll need: key_name='web.key' cert_name='web.crt' - # Copy certifiacte from Caddy directory to smp-server directory + # Copy certificate from Caddy directory to smp-server directory cp "${folder_in}/${domain}.crt" "${folder_out}/${cert_name}" # Assign correct permissions chown "$user":"$group" "${folder_out}/${cert_name}" - # Copy certifiacte key from Caddy directory to smp-server directory + # Copy certificate key from Caddy directory to smp-server directory cp "${folder_in}/${domain}.key" "${folder_out}/${key_name}" # Assign correct permissions chown "$user":"$group" "${folder_out}/${key_name}" @@ -535,7 +535,7 @@ To verify server binaries after you downloaded them: > Good signature from "SimpleX Chat " -5. Compute the hashes of the binaries you plan to use with `shu256sum ` or with `openssl sha256 ` and compare them with the hashes in the file `_sha256sums` - they must be the same. +5. Compute the hashes of the binaries you plan to use with `sha256sum ` or with `openssl sha256 ` and compare them with the hashes in the file `_sha256sums` - they must be the same. That is it - you now verified authenticity of our GitHub server binaries. @@ -634,7 +634,7 @@ to initialize your `smp-server` configuration with: --- -After that, your installation is complete and you should see in your teminal output something like this: +After that, your installation is complete and you should see in your terminal output something like this: ```sh Certificate request self-signature ok @@ -742,7 +742,7 @@ websockets: off [PROXY] # Network configuration for SMP proxy client. # `host_mode` can be 'public' (default) or 'onion'. -# It defines prefferred hostname for destination servers with multiple hostnames. +# It defines preferred hostname for destination servers with multiple hostnames. # host_mode: public # required_host_mode: off @@ -757,7 +757,7 @@ websockets: off # or 'always' to be used for all destination hosts (can be used if it is an .onion server). # socks_mode: onion -# Limit number of threads a client can spawn to process proxy commands in parrallel. +# Limit number of threads a client can spawn to process proxy commands in parallel. # client_concurrency: 32 [INACTIVE_CLIENTS] @@ -823,7 +823,7 @@ Follow the steps to secure your CA keys: /etc/opt/simplex/ca.key ``` -3. Delete the CA key from the server. **Please make sure you've saved you CA key somewhere safe. Otherwise, you would lose the ability to [rotate the online certificate](#online-certificate-rotation)**: +3. Delete the CA key from the server. **Please make sure you've saved your CA key somewhere safe. Otherwise, you would lose the ability to [rotate the online certificate](#online-certificate-rotation)**: ```sh rm /etc/opt/simplex/ca.key @@ -913,9 +913,9 @@ SMP-server can also be deployed to be available via [Tor](https://www.torproject 1. Install tor: - We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to [offical tor documentation](https://community.torproject.org/onion-services/setup/install/) or your distribution guide. + We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to [official tor documentation](https://community.torproject.org/onion-services/setup/install/) or your distribution guide. - - Configure offical Tor PPA repository: + - Configure official Tor PPA repository: ```sh CODENAME="$(lsb_release -c | awk '{print $2}')" @@ -951,12 +951,12 @@ SMP-server can also be deployed to be available via [Tor](https://www.torproject vim /etc/tor/torrc ``` - And insert the following lines to the bottom of configuration. Please note lines starting with `#`: this is comments about each individual options. + And insert the following lines to the bottom of configuration. Please note lines starting with `#`: these are comments about each individual option. ```sh # Enable log (otherwise, tor doesn't seem to deploy onion address) Log notice file /var/log/tor/notices.log - # Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonimity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, you may want to keep standard configuration instead. + # Enable single hop routing (2 options below are dependencies of the third) - It will reduce the latency at the cost of lower anonymity of the server - as SMP-server onion address is used in the clients together with public address, this is ok. If you deploy SMP-server with onion-only address, you may want to keep standard configuration instead. SOCKSPort 0 HiddenServiceNonAnonymousMode 1 HiddenServiceSingleHopMode 1 @@ -974,7 +974,7 @@ SMP-server can also be deployed to be available via [Tor](https://www.torproject 3. Start tor: - Enable `systemd` service and start tor. Offical `tor` is a bit flaky on the first start and may not create onion host address, so we're restarting it just in case. + Enable `systemd` service and start tor. Official `tor` is a bit flaky on the first start and may not create onion host address, so we're restarting it just in case. ```sh systemctl enable --now tor && systemctl restart tor @@ -994,7 +994,7 @@ SMP-server versions starting from `v5.8.0-beta.0` can be configured to PROXY smp 1. Install tor as described in the [previous section](#installation-for-onion-address). -2. Execute the following command to creatae a new Tor daemon instance: +2. Execute the following command to create a new Tor daemon instance: ```sh tor-instance-create tor2 @@ -1101,7 +1101,7 @@ _Please note:_ this configuration is supported since `v6.1.0-beta.2`. hosting_country: ``` -2. Install the webserver. For easy deployment we'll describe the installtion process of [Caddy](https://caddyserver.com) webserver on Ubuntu server: +2. Install the webserver. For easy deployment we'll describe the installation process of [Caddy](https://caddyserver.com) webserver on Ubuntu server: 1. Install the packages: @@ -1127,7 +1127,7 @@ _Please note:_ this configuration is supported since `v6.1.0-beta.2`. sudo apt update && sudo apt install caddy ``` - [Full Caddy instllation instructions](https://caddyserver.com/docs/install) + [Full Caddy installation instructions](https://caddyserver.com/docs/install) 3. Replace Caddy configuration with the following: @@ -1176,12 +1176,12 @@ _Please note:_ this configuration is supported since `v6.1.0-beta.2`. key_name='web.key' cert_name='web.crt' - # Copy certifiacte from Caddy directory to smp-server directory + # Copy certificate from Caddy directory to smp-server directory cp "${folder_in}/${domain}.crt" "${folder_out}/${cert_name}" # Assign correct permissions chown "$user":"$group" "${folder_out}/${cert_name}" - # Copy certifiacte key from Caddy directory to smp-server directory + # Copy certificate key from Caddy directory to smp-server directory cp "${folder_in}/${domain}.key" "${folder_out}/${key_name}" # Assign correct permissions chown "$user":"$group" "${folder_out}/${key_name}" @@ -1237,7 +1237,7 @@ smp://[:]@[,] - **optional** `` - Your configured password of `smp-server`. You can check your configured pasword in `/etc/opt/simplex/smp-server.ini`, under `[AUTH]` section in `create_password:` field. + Your configured password of `smp-server`. You can check your configured password in `/etc/opt/simplex/smp-server.ini`, under `[AUTH]` section in `create_password:` field. - ``, **optional** `` @@ -1368,9 +1368,9 @@ Here's the full list of commands, their descriptions and who can access them. | `stats-rts` | GHC/Haskell statistics. Can be enabled with `+RTS -T -RTS` option | - | | `clients` | Clients information. Useful for debugging. | yes | | `sockets` | General sockets information. | - | -| `socket-threads` | Thread infomation per socket. Useful for debugging. | yes | +| `socket-threads` | Thread information per socket. Useful for debugging. | yes | | `threads` | Threads information. Useful for debugging. | yes | -| `server-info` | Aggregated server infomation. | - | +| `server-info` | Aggregated server information. | - | | `delete` | Delete known queue. Useful for content moderation. | - | | `save` | Save queues/messages from memory. | yes | | `help` | Help menu. | - | @@ -1417,31 +1417,31 @@ fromTime,qCreated,qSecured,qDeleted,msgSent,msgRecv,dayMsgQueues,weekMsgQueues,m | 20 | `pRelays_pRequests` | - requests | | 21 | `pRelays_pSuccesses` | - successes | | 22 | `pRelays_pErrorsConnect` | - connection errors | -| 23 | `pRelays_pErrorsCompat` | - compatability errors | +| 23 | `pRelays_pErrorsCompat` | - compatibility errors | | 24 | `pRelays_pErrorsOther` | - other errors | | Requested sessions with own relays: | | 25 | `pRelaysOwn_pRequests` | - requests | | 26 | `pRelaysOwn_pSuccesses` | - successes | | 27 | `pRelaysOwn_pErrorsConnect` | - connection errors | -| 28 | `pRelaysOwn_pErrorsCompat` | - compatability errors | +| 28 | `pRelaysOwn_pErrorsCompat` | - compatibility errors | | 29 | `pRelaysOwn_pErrorsOther` | - other errors | | Message forwards to all relays: | | 30 | `pMsgFwds_pRequests` | - requests | | 31 | `pMsgFwds_pSuccesses` | - successes | | 32 | `pMsgFwds_pErrorsConnect` | - connection errors | -| 33 | `pMsgFwds_pErrorsCompat` | - compatability errors | +| 33 | `pMsgFwds_pErrorsCompat` | - compatibility errors | | 34 | `pMsgFwds_pErrorsOther` | - other errors | | Message forward to own relays: | | 35 | `pMsgFwdsOwn_pRequests` | - requests | | 36 | `pMsgFwdsOwn_pSuccesses` | - successes | | 37 | `pMsgFwdsOwn_pErrorsConnect` | - connection errors | -| 38 | `pMsgFwdsOwn_pErrorsCompat` | - compatability errors | +| 38 | `pMsgFwdsOwn_pErrorsCompat` | - compatibility errors | | 39 | `pMsgFwdsOwn_pErrorsOther` | - other errors | | Received message forwards: | | 40 | `pMsgFwdsRecv` | | -| Message queue subscribtion errors: | +| Message queue subscription errors: | | 41 | `qSub` | All | -| 42 | `qSubAuth` | Authentication erorrs | +| 42 | `qSubAuth` | Authentication errors | | 43 | `qSubDuplicate` | Duplicate SUB errors | | 44 | `qSubProhibited` | Prohibited SUB errors | | Message errors: | @@ -1526,9 +1526,9 @@ To update your smp-server to latest version, choose your installation method and sudo systemctl start smp-server ``` - - [Offical installation script](https://github.com/simplex-chat/simplexmq#using-installation-script) + - [Official installation script](https://github.com/simplex-chat/simplexmq#using-installation-script) - 1. Execute the followin command: + 1. Execute the following command: ```sh sudo simplex-servers-update @@ -1640,7 +1640,7 @@ To reproduce the build you must have: ## Configuring the app to use the server -To configure the app to use your messaging server copy it's full address, including password, and add it to the app. You have an option to use your server together with preset servers or without them - you can remove or disable them. +To configure the app to use your messaging server copy its full address, including password, and add it to the app. You have an option to use your server together with preset servers or without them - you can remove or disable them. It is also possible to share the address of your server with your friends by letting them scan QR code from server settings - it will include server password, so they will be able to receive messages via your server as well. diff --git a/docs/SIMPLEX.md b/docs/SIMPLEX.md index ec25afaf88..e24275d656 100644 --- a/docs/SIMPLEX.md +++ b/docs/SIMPLEX.md @@ -89,7 +89,7 @@ There are several P2P chat/messaging protocols and implementations that aim to s 5. All known P2P networks are likely to be vulnerable to [Sybil attack][12], because each node is discoverable, and the network operates as a whole. Known measures to reduce the probability of the Sybil attack either require a centralized component or expensive [proof of work][13]. The proposed design, on the opposite, has no server discoverability - servers are not connected, not known to each other and to all clients. The SimpleX network is fragmented and operates as multiple isolated connections. It makes network-wide attacks on SimpleX network impossible - even if some servers are compromised, other parts of the network can operate normally, and affected clients can switch to using other servers without losing contacts or messages. -6. P2P networks are likely to be [vulnerable][14] to [DRDoS attack][15]. In the proposed design clients only relay traffic from known trusted connection and cannot be used to reflect and amplify the traffic in the whole network. +6. P2P networks are likely to be [vulnerable][14] to [DRDoS attack][15]. In the proposed design clients only relay traffic from known trusted connections and cannot be used to reflect and amplify the traffic in the whole network. [1]: https://en.wikipedia.org/wiki/End-to-end_encryption [2]: https://en.wikipedia.org/wiki/Man-in-the-middle_attack diff --git a/docs/TRANSLATIONS.md b/docs/TRANSLATIONS.md index 2b1febb6f2..a0250b6ab2 100644 --- a/docs/TRANSLATIONS.md +++ b/docs/TRANSLATIONS.md @@ -35,7 +35,7 @@ The steps are: ### Translating Android app -1. Please start from [Android app](https://hosted.weblate.org/projects/simplex-chat/android/), both when you do the most time-consuming initial translation, and add any strings later. Firstly, iOS strings can be a bit delayed from appearing in Weblate, as it requires a manual step from us before they are visible. Secondary, Android app is set up as a glossary for iOS app, and 2/3 of all strings require just to clicks to transfer them from Android to iOS (it still takes some time, Weblate doesn't automate it, unfortunately). +1. Please start from [Android app](https://hosted.weblate.org/projects/simplex-chat/android/), both when you do the most time-consuming initial translation, and add any strings later. Firstly, iOS strings can be a bit delayed from appearing in Weblate, as it requires a manual step from us before they are visible. Secondly, Android app is set up as a glossary for iOS app, and 2/3 of all strings require just two clicks to transfer them from Android to iOS (it still takes some time, Weblate doesn't automate it, unfortunately). 2. Some of the strings do not need translations, but they still need to be copied over - there is a button in weblate UI for that: diff --git a/docs/WEBRTC.md b/docs/WEBRTC.md index a48cd12b00..b4862e0d5b 100644 --- a/docs/WEBRTC.md +++ b/docs/WEBRTC.md @@ -18,7 +18,7 @@ For this guide, we'll be using the most featureful and battle-tested STUN/TURN s 1. Install `coturn` package from the main repository. ```sh -apt update && apt install coturn` +apt update && apt install coturn ``` 2. Uncomment `TURNSERVER_ENABLED=1` from `/etc/default/coturn`: @@ -44,7 +44,7 @@ user=$YOUR_LOGIN:$YOUR_PASSWORD server-name=$YOUR_DOMAIN # The default realm to be used for the users when no explicit origin/realm relationship was found realm=$YOUR_DOMAIN -# Path to your certificates. Make sure they're readable by cotun process user/group +# Path to your certificates. Make sure they're readable by coturn process user/group cert=/var/lib/turn/cert.pem pkey=/var/lib/turn/key.pem # Use 2066 bits predefined DH TLS key @@ -97,7 +97,7 @@ To configure your mobile app to use your server: 1. Open `Settings / Network & Servers / WebRTC ICE servers` and switch toggle `Configure ICE servers`. -2. Enter all server addresses in the field, one per line, for example if you servers are on the port 5349: +2. Enter all server addresses in the field, one per line, for example if your servers are on the port 5349: ``` stun:stun.example.com:5349 @@ -116,7 +116,7 @@ This is it - you now can make audio and video calls via your own server, without ping ``` - If packets being transmitted, server is up! + If packets are being transmitted, the server is up! - **Determine if ports are open**: diff --git a/docs/XFTP-SERVER.md b/docs/XFTP-SERVER.md index ba4770644e..43edbdda7f 100644 --- a/docs/XFTP-SERVER.md +++ b/docs/XFTP-SERVER.md @@ -9,7 +9,7 @@ revision: 31.07.2023 - [Overview](#overview) - [Installation options](#installation-options) - [systemd service](#systemd-service) with [installation script](#installation-script) or [manually](#manual-deployment) - - [docker container](#docker-сontainer) + - [docker container](#docker-container) - [Linode marketplace](#linode-marketplace) - [Tor installation](#tor-installation) - [Configuration](#configuration) @@ -72,7 +72,7 @@ Manual installation is the most advanced deployment that provides the most flexi 1. Install binary: - - Using offical binaries: + - Using official binaries: ```sh curl -L https://github.com/simplex-chat/simplexmq/releases/latest/download/xftp-server-ubuntu-20_04-x86-64 -o /usr/local/bin/xftp-server && chmod +x /usr/local/bin/xftp-server @@ -129,9 +129,9 @@ Manual installation is the most advanced deployment that provides the most flexi And execute `sudo systemctl daemon-reload`. -### Docker сontainer +### Docker container -You can deploy smp-server using Docker Compose. This is second recommended option due to its popularity and relatively easy deployment. +You can deploy xftp-server using Docker Compose. This is the second recommended option due to its popularity and relatively easy deployment. This deployment provides two Docker Compose files: the **automatic** one and **manual**. If you're not sure, choose **automatic**. @@ -197,9 +197,9 @@ xftp-server can also be deployed to serve from [tor](https://www.torproject.org) 1. Install tor: - We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to [offical tor documentation](https://community.torproject.org/onion-services/setup/install/) or your distribution guide. + We're assuming you're using Ubuntu/Debian based distributions. If not, please refer to [official tor documentation](https://community.torproject.org/onion-services/setup/install/) or your distribution guide. - - Configure offical Tor PPA repository: + - Configure official Tor PPA repository: ```sh CODENAME="$(lsb_release -c | awk '{print $2}')" @@ -235,10 +235,10 @@ xftp-server can also be deployed to serve from [tor](https://www.torproject.org) vim /etc/tor/torrc ``` - And insert the following lines to the bottom of configuration. Please note lines starting with `#`: this is comments about each individual options. + And insert the following lines to the bottom of configuration. Please note lines starting with `#`: these are comments about each individual option. ```sh - # Enable log (otherwise, tor doesn't seemd to deploy onion address) + # Enable log (otherwise, tor doesn't seem to deploy onion address) Log notice file /var/log/tor/notices.log # Enable single hop routing (2 options below are dependencies of third). Will reduce latency in exchange of anonimity (since tor runs alongside xftp-server and onion address will be displayed in clients, this is totally fine) SOCKSPort 0 @@ -257,7 +257,7 @@ xftp-server can also be deployed to serve from [tor](https://www.torproject.org) 3. Start tor: - Enable `systemd` service and start tor. Offical `tor` is a bit flunky on the first start and may not create onion host address, so we're restarting it just in case. + Enable `systemd` service and start tor. Official `tor` is a bit flaky on the first start and may not create onion host address, so we're restarting it just in case. ```sh systemctl enable tor && systemctl start tor && systemctl restart tor @@ -356,7 +356,7 @@ To password-protect your `xftp-server`, change it in the configuration: ``` --- -After that, your installation is complete and you should see in your teminal output something like this: +After that, your installation is complete and you should see in your terminal output something like this: ```sh Certificate request self-signature ok @@ -398,7 +398,7 @@ xftp://[:]@[,] - **optional** `` - Your configured password of `xftp-server`. You can check your configured pasword in `/etc/opt/simplex-xftp/file-server.ini`, under `[AUTH]` section in `create_password:` field. + Your configured password of `xftp-server`. You can check your configured password in `/etc/opt/simplex-xftp/file-server.ini`, under `[AUTH]` section in `create_password:` field. - ``, **optional** `` @@ -609,8 +609,8 @@ To update your XFTP server to latest version, choose your installation method an sudo systemctl start xftp-server ``` - - [Offical installation script](https://github.com/simplex-chat/simplexmq#using-installation-script) - 1. Execute the followin command: + - [Official installation script](https://github.com/simplex-chat/simplexmq#using-installation-script) + 1. Execute the following command: ```sh sudo simplex-servers-update ``` diff --git a/website/langs/en.json b/website/langs/en.json index 51b5b3d547..25e5f128ed 100644 --- a/website/langs/en.json +++ b/website/langs/en.json @@ -18,7 +18,7 @@ "simplex-explained-tab-2-p-1": "For each connection you use two separate messaging queues to send and receive messages via different servers.", "simplex-explained-tab-2-p-2": "Servers only pass messages one way, without having the full picture of user's conversations or connections.", "simplex-explained-tab-3-p-1": "The servers have separate anonymous credentials for each queue, and do not know which users they belong to.", - "simplex-explained-tab-3-p-2": "Users can further improve metadata privacy by using Tor to access servers, preventing corellation by IP address.", + "simplex-explained-tab-3-p-2": "Users can further improve metadata privacy by using Tor to access servers, preventing correlation by IP address.", "chat-bot-example": "Chat bot example", "smp-protocol": "SMP protocol", "chat-protocol": "Chat protocol", @@ -76,7 +76,7 @@ "simplex-private-card-9-point-1": "Each message queue passes messages in one direction, with the different send and receive addresses.", "simplex-private-card-9-point-2": "It reduces the attack vectors, compared with traditional message brokers, and available meta-data.", "simplex-private-card-10-point-1": "SimpleX uses temporary anonymous pairwise addresses and credentials for each user contact or group member.", - "simplex-private-card-10-point-2": "It allows to deliver messages without user profile identifiers, providing better meta-data privacy than alternatives.", + "simplex-private-card-10-point-2": "It allows messages to be delivered without user profile identifiers, providing better meta-data privacy than alternatives.", "privacy-matters-1-title": "Advertising and price discrimination", "privacy-matters-1-overlay-1-title": "Privacy saves you money", "privacy-matters-1-overlay-1-linkText": "Privacy saves you money", @@ -113,13 +113,13 @@ "simplex-network-overlay-card-1-li-3": "P2P does not solve MITM attack problem, and most existing implementations do not use out-of-band messages for the initial key exchange. SimpleX uses out-of-band messages or, in some cases, pre-existing secure and trusted connections for the initial key exchange.", "simplex-network-overlay-card-1-li-4": "P2P implementations can be blocked by some Internet providers (like BitTorrent). SimpleX is transport agnostic — it can work over standard web protocols, e.g. WebSockets.", "simplex-network-overlay-card-1-li-5": "All known P2P networks may be vulnerable to Sybil attack, because each node is discoverable, and the network operates as a whole. Known measures to mitigate it require either a centralized component or expensive proof of work. SimpleX network has no server discoverability, it is fragmented and operates as multiple isolated sub-networks, making network-wide attacks impossible.", - "simplex-network-overlay-card-1-li-6": "P2P networks may be vulnerable to DRDoS attack, when the clients can rebroadcast and amplify traffic, resulting in network-wide denial of service. SimpleX clients only relay traffic from known connection and cannot be used by an attacker to amplify the traffic in the whole network.", + "simplex-network-overlay-card-1-li-6": "P2P networks may be vulnerable to DRDoS attack, when the clients can rebroadcast and amplify traffic, resulting in network-wide denial of service. SimpleX clients only relay traffic from known connections and cannot be used by an attacker to amplify the traffic in the whole network.", "privacy-matters-overlay-card-1-p-1": "Many large companies use information about who you are connected with to estimate your income, sell you the products you don't really need, and to determine the prices.", "privacy-matters-overlay-card-1-p-2": "Online retailers know that people with lower incomes are more likely to make urgent purchases, so they may charge higher prices or remove discounts.", "privacy-matters-overlay-card-1-p-3": "Some financial and insurance companies use social graphs to determine interest rates and premiums. It often makes people with lower incomes pay more — it is known as \"poverty premium\".", - "privacy-matters-overlay-card-1-p-4": "SimpleX network protects the privacy of your connections better than any alternative, fully preventing your social graph becoming available to any companies or organizations. Even when people use servers preconfigured in SimpleX Chat apps, server operators do not know the number of users or their connections.", + "privacy-matters-overlay-card-1-p-4": "SimpleX network protects the privacy of your connections better than any alternative, fully preventing your social graph from becoming available to any companies or organizations. Even when people use servers preconfigured in SimpleX Chat apps, server operators do not know the number of users or their connections.", "privacy-matters-overlay-card-2-p-1": "Not so long ago we observed the major elections being manipulated by a reputable consulting company that used our social graphs to distort our view of the real world and manipulate our votes.", - "privacy-matters-overlay-card-2-p-2": "To be objective and to make independent decisions you need to be in control of your information space. It is only possible if you use private communication network that does not have access to your social graph.", + "privacy-matters-overlay-card-2-p-2": "To be objective and to make independent decisions you need to be in control of your information space. It is only possible if you use a private communication network that does not have access to your social graph.", "privacy-matters-overlay-card-2-p-3": "SimpleX is the first network that doesn't have any user identifiers by design, in this way protecting your connections graph better than any known alternative.", "privacy-matters-overlay-card-3-p-1": "Everyone should care about privacy and security of their communications — harmless conversations can put you in danger, even if you have nothing to hide.", "privacy-matters-overlay-card-3-p-2": "One of the most shocking stories is the experience of Mohamedou Ould Salahi described in his memoir and shown in The Mauritanian movie. He was put into Guantanamo camp, without trial, and was tortured there for 15 years after a phone call to his relative in Afghanistan, under suspicion of being involved in 9/11 attacks, even though he lived in Germany for the previous 10 years.", @@ -135,7 +135,7 @@ "simplex-unique-overlay-card-3-p-3": "Unlike federated networks servers (email, XMPP or Matrix), SimpleX servers don't store user accounts, they only relay messages, protecting the privacy of both parties.", "simplex-unique-overlay-card-3-p-4": "There are no identifiers or ciphertext in common between sent and received server traffic — if anybody is observing it, they cannot easily determine who communicates with whom, even if TLS is compromised.", "simplex-unique-overlay-card-4-p-1": "You can use SimpleX with your own servers and still communicate with people who use the servers preconfigured in the apps.", - "simplex-unique-overlay-card-4-p-2": "SimpleX network uses an open protocol and provides SDK to create chat bots, allowing implementation of services that users can interact with via SimpleX Chat apps — we're really looking forward to see what SimpleX services you will build.", + "simplex-unique-overlay-card-4-p-2": "SimpleX network uses an open protocol and provides SDK to create chat bots, allowing implementation of services that users can interact with via SimpleX Chat apps — we're really looking forward to seeing what SimpleX services you will build.", "simplex-unique-overlay-card-4-p-3": "If you are considering developing for the SimpleX network, for example, the chat bot for SimpleX app users, or the integration of the SimpleX Chat library into your mobile apps, please get in touch for any advice and support.", "simplex-unique-card-1-p-1": "SimpleX protects the privacy of your profile, contacts and metadata, hiding it from SimpleX network servers and any observers.", "simplex-unique-card-1-p-2": "Unlike any other existing messaging network, SimpleX has no identifiers assigned to the users — not even random numbers.", @@ -166,7 +166,7 @@ "to-make-a-connection": "To make a connection:", "install-simplex-app": "Install SimpleX app", "connect-in-app": "Connect in app", - "open-simplex-app": "Open Simplex app", + "open-simplex-app": "Open SimpleX app", "tap-the-connect-button-in-the-app": "Tap the \"connect\" button in the app", "scan-the-qr-code-with-the-simplex-chat-app": "Scan the QR code with the SimpleX Chat app", "scan-the-qr-code-with-the-simplex-chat-app-description": "The public keys and message queue address in this link are NOT sent over the network when you view this page —
    they are contained in the hash fragment of the link URL.", diff --git a/website/src/directory.html b/website/src/directory.html index b20e279d82..4ea42f0c3b 100644 --- a/website/src/directory.html +++ b/website/src/directory.html @@ -268,7 +268,7 @@ active_directory: true