Evgeny and Evgeny @ SimpleX Chat
5ffbe733a8
core: attach badge proofs to files over size limit ( #7455 )
...
* core: attach badge proofs to files over size limit
* types
* more types
* implement file badge proofs
* tests
* move file limits to config, add tests
* more tests, work correctly in "send as group" case
* fix races in tests
* group badge tests
* query plans
* add history support, fixes
* simplify
* refactor
* refactor
* type
* restructure schema for proofs
* rename, refactor
* refactor
* fix, refactor
* refactor
* ui
* comments
* alerts
* update nix, ios library
* updare sharing
* update simplexmq
* update text
* improve messages
* api types
* postgres schema
* fix
* test
* query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-12 14:33:52 +01:00
Evgeny and Evgeny @ SimpleX Chat
f99c474ca6
core: send badge ZK-proofs to XFTP servers, add file expiry time ( #7430 )
...
* core: send badge ZK-proofs to XFTP servers
* update simplexmq, use keys and header from simplexmq
* core: add file expiry time
* refactor
* remove posix module
* rename migrations
* bot api
* update UI
* import
* show item from loaded information
* ios: update core library
* text
* send entitlements in handshake
* simplexmq
* query plans
* update simplexmq
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-01 23:16:15 +01:00
Evgeny and Evgeny @ SimpleX Chat
17cdef1692
core: include channel link and name when forwarding messages ( #7409 )
...
* core: include channel link and name when forwarding messages
* wip
* simplify
* add member ID
* refactor
* refactor
* refactor
* update api types
* store forward source group type
* rename
* api types
* simpler layout
* layout, translations
* refactor ios
* public
* simpler
* refactor kotlin
* padding
* padding
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-08-24 21:36:57 +01:00
Narasimha-sc
9586c97439
ui: show XFTP servers used for a file in message info ( #7088 )
...
Surface the XFTP servers that hosted a file's chunks in the message info
screen (Android, desktop, iOS), so a user can see which servers they are
downloading from (or, for sent files, uploading to) whenever they want to know.
APIGetChatItemInfo now returns fileXftpServers, derived from the stored file
description (private snd descr for sent items, rcv descr for received items);
extraction is best-effort and never fails the call.
2026-07-22 08:28:54 +01:00
spaced4ndy
93831a0f24
core: signed history in channels, auto-sign based on preference ( #7257 )
2026-07-17 19:44:51 +00:00
spaced4ndy
e53508ecca
core, ui: make msgVerified optional ( #7247 )
2026-07-13 21:20:36 +00:00
spaced4ndy
51ad366e8b
core, ui: message signing ( #7115 )
2026-07-10 19:55:10 +00:00
Evgeny and Evgeny @ SimpleX Chat
63c278818e
core: support chats in channels, send as owner in support chats ( #6870 )
...
* core: test support chats in channels, CLI defaults to sending as member in support chat
* ui: enable support chats in channels
* use correct scope when sending from UI
* more readable
* remove test output
* show member support chat in channels
* preference for support chats
* ios: types for support preference
* mp: support preference types
* show support preference in UI
* fix ios
* make support preference optional in JSON parser
* update string
* change strings, pass parameters to prefs
* refactor kotlin
* take support preference into account
* refactor core
* do not show broadcast placeholder in support scope
* move role check, add pref check on update
* support preference test (failing)
* fix version
* fix tests
* warning alert when enabling chats with admins
* revert on dismiss
* update text and icons
* query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-04-26 14:37:16 +01:00
spaced4ndy and Evgeny Poberezkin
ac6f8b76ac
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 <evgeny@poberezkin.com >
2026-04-15 20:28:31 +01:00
Evgeny and Evgeny @ SimpleX Chat
674a545a33
core: signed messages status ( #6699 )
...
* XOcore: signed messages status
* remove empty lines
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* EOL
* only mark verified as verified
* update API types
* todos
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-03-24 20:05:09 +00:00
2db92ff6ed
core: group member/owner keys for signing important messages ( #6597 )
...
* rfc: member keys
* update plan
* new encoding for message batches
* send new batch encoding in relay-based groups
* mvp launch plan
* update plan
* core: verify group member keys (#6669 )
* core: verify group member keys
* refactor, process forwards
* refactor parsing
* refactor parsing 2
* refactor parser 3
* update rfc
* simplify
* simplify
* log tag
* refactor tag logging
* refactor withVerifiedSig
* simplify
* refactor more
* comment
* fix encoding
* fix sending as group for the new binary batch encoding
* unify types
* update api docs
* clean up
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
* core: signing messages with member keys (#6675 )
* core: signing messages with member keys (types)
* sign messages
* refactor batching
* better
* refactor
* remove unused Eq
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
* core: forward signed messages as unchanged binary strings (#6678 )
* core: forward signed messages as unchanged binary strings
* refactor
* consolidate types
* refactor VerifiedMsg
* refactor more
* undo rename
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* update schema and plans
* add signed status to chat items and events
* test signed chat items
* unify parser
* PostgreSQL fix, remove unused fields, option to send inline files in the tests
* change inline files config
* revert inline config change
* use different characters in batch encoding, to avoid conflict with inline files
* fix test, api docs, query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-03-16 10:46:35 +00:00
628b00eb08
core: channel messages ( #6604 )
...
* core: channel messages (WIP)
* do not include member ID when quoting channel messages
* query plans
* reduce duplication
* refactor
* refactor plan
* refactor 2
* all tests
* remove plan
* refactor 3
* refactor 4
* refactor 5
* refactor 6
* plans
* plans to imrove test coverage and fix bugs
* update plan
* update plan
* bug fixes (wip)
* new plan
* fixes wip
* more tests
* comment, fix lint
* restore comment
* restore comments
* rename param
* move type
* simplify
* comment
* fix stale state
* refactor
* less diff
* simplify
* less diff
* refactor
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2026-02-12 07:11:59 +00:00
Evgeny
5453d8875c
core: filter all messages with links in text when link content filter is used ( #6591 )
...
* core: change msg_content_tag stored as blob to text
* track if items have links and use has_link when searching for links (MCLink_ MsgContentTag is passed)
* fix test (broken in master)
* merge migrations, update api and schema
* minor fixes
* tests
* update plans
* update migrations
2026-01-23 12:31:42 +00:00
spaced4ndy and Evgeny Poberezkin
a65151ba6d
core, ui: replace map of network statuses with subscription status of current chat ( #6353 )
...
* core: subscription status wip
* update
* update
* update
* remove statuses core
* cleanup ios
* comment
* plans
* remove NetworkStatus
* ios wip
* contact sub status
* Revert "contact sub status"
This reverts commit 50cf94beed .
* sub status
* set on connected
* kotlin
* rename
* layout
* member status
* kotlin
* fix chat subscription status
* string
* core: update simplexmq
* client notices
* update simplexmq
* update alert
* update simplexmq
* android/desktop
* formatting
* fix tests
* update plans and API docs
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2025-10-18 22:53:47 +01:00
spaced4ndy
382241fe3e
core: rework synchronous group forwarding in receive loop into asynchronous delivery tasks ( #6178 )
2025-09-12 13:22:34 +00:00
Evgeny Poberezkin
b2f9ee4326
Merge branch 'stable'
2025-07-25 21:16:32 +01:00
Evgeny
7a3b30cca5
core: backward compatible JSON parser for remote controller/host ( #6105 )
...
* core: backward compatible JSON parser for remote controller/host
* forward compatible JSON parsers for chats and content
2025-07-25 21:15:46 +01:00
Evgeny and spaced4ndy
cf8bd7f6ac
docs: bots API ( #6091 )
...
* docs: bot API commands
* generate API commands doc
* generate commands docs with parameters and responses
* add API types
* more types
* document all types (with some deviations from JSON encodings)
* rename types
* interface objects
* separator
* command syntax
* more syntax
* API events
* event types
* fix all type definitions
* pre-process types outside of rendering
* pre-process event types
* overview
* pre-process commands
* param syntax WIP
* syntax for types in command parameters
* API error response and chat event
* remove unsupported/deprecated command parameters
* reorder
* syntax for choice
* show command errors
* event descriptions
* python syntax for commands and types (#6099 )
* python syntax for commands and types
* python snippets: convert numbers to string
* fixes
* update readme, enable all tests
* fix operators test
* update plans
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2025-07-24 13:12:53 +01:00
spaced4ndy and Evgeny Poberezkin
8094078bee
core: improve message forwarding to better manage support scopes ( #6056 )
...
* core: test forwarding in support scope
* wip
* test
* add to test
* comment
* rework forwarding
* fixes
* refactor tests
* narrow
* forwardMsgs
* support mem
* unfocus tests
* fix, tests
* plans
* add test
* comment
* add scope to reaction and deletion, refactor
* fix del
* refactor
* query plans
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2025-07-12 19:39:41 +01:00
Evgeny
9794829d74
core: show group as sender, add contact card to contact request chats, unify api type for prepared and contact request chats ( #6003 )
...
* core: option to show group as sender of chat item (for the initial items, e.g. welcome message)
* add chat item to contact request chats
* return AChat for prepared chats and contact requests
* update iOS api types, show prepared contact as blue, show preview info when content message is not available (previously was showing feature item)
* ios: remove ContactType
* ios: show group as sender, fix avatar not showing when member message sequence starts with merged items
* ios: update compose UI for all connection scenarios
* address settings
* ios: address settings UI
* fix tests
* fix tests 2
* ios: fix minor issues
2025-06-23 14:42:00 +01:00
spaced4ndy
e84016e1b9
core, ui: update group scope unread stats on item deletions; create reports as read (reports use a different attention mechanism) ( #5930 )
2025-05-20 16:18:23 +00:00
Evgeny
a2577c3df3
core: support observers send messages to admins, CLI commands ( #5921 )
...
* core: allow observers send messages to admins
* improve parser, CLI command to approve members
2025-05-19 11:14:43 +01:00
spaced4ndy
79991e84c9
core: member requires attention counter ( #5881 )
2025-05-09 15:36:06 +00:00
spaced4ndy
5262b8caca
core: support chat unread stats ( #5844 )
2025-04-23 14:15:17 +00:00
spaced4ndy and Evgeny Poberezkin
be1c4018cc
core: group knocking main functionality ( #5726 )
...
* docs: knocking rfc
* types, schema wip
* more comments
* rename
* more types
* change types
* wip compiles
* construct snd scope
* fix tests
* hide output
* sending
* fix member filtration
* plans
* conversations store/api model draft
* xgrpmemnew
* rework types wip
* wip
* wip
* remove tag
* wip (compiles)
* fix parsing
* fix query
* fixes, tests
* plans, comments
* fix member filtration
* wip
* protocol wip
* protocol wip
* fix
* fix tests
* fixes, test
* fix (remove NotInHistory)
* fix
* fix tests
* fix
* output
* fix tests
* tests
* gcsi in view
* fix tests
* plans
* refactor, make scopes Maybe
* remove groupChatFilter
* fix test
* change schema
* refactor
* rename
* rename
* rename
* refactor
* rename
* remove scope from item direction
* rework view
* change apis
* make api for cli
* change text
* refactor
* fixes
* comment
* rename
* refactor fmap/mapM
* refactor includeInHistory
* query plans
* knocking: patch scope (#5796 )
* knocking: patch scope wip
* more patches
* schema
* remove space
* plans
* fix test
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2025-04-02 07:57:18 +00:00
Evgeny
6556e09a33
core: update simplexmq to support PostgreSQL servers ( #5760 )
...
* core: update simplexmq to support postgres
* update simplexmq
* update ios
2025-03-19 07:16:31 +00:00
Evgeny and spaced4ndy
b2de37a9fb
core: member acceptance ( #5678 )
...
* core: member acceptance
* migration
* move hook
* core: support sending direct messages to members (#5680 )
* fix compilation, todos
* fix test
* predicates
* comment
* extend hook
* wip
* wip
* wip
* wip
* fix test
* mute output
* schema
* better query
* plans
* fix test
* directory
* captcha
* captcha works
* remove column, add UI types and group status icon
* fix test
* query plans
* exclude messages of pending members from history
* commands for filter settings
* core: separately delete pending approval members; other apis validation (#5699 )
* accepted status
* send captcha messages as replies
* fix blocked words
* simpler filter info
* info about /filter and /role after group registration
* update query plans
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2025-03-03 18:57:29 +00:00
Evgeny
3bc822a1e9
core: mentions in history, unread mentions in stats ( #5594 )
...
* core: mentions in history, unread mentions in stats
* fix
* update plans
2025-01-30 17:59:21 +00:00
Evgeny
2d719273a8
core: update message text when forwarding and quoting to reflect changes in mentioned member names ( #5586 )
...
* update message text when forwarding and quoting to reflect changes in mentioned member names
* fix, test
* forward mentions to the same chat, refactor
* comment
* tests
* test markdown conversion to text
* simplify
* unused
* comments
2025-01-30 10:06:26 +00:00
Evgeny
621b291da1
core: member mentions, types and rfc ( #5555 )
...
* core: member mentions, types and rfc
* update
* update rfc
* save/get mentions (WIP)
* markdown
* store received mentions and userMention flag
* sent mentions
* update message with mentions
* db queries
* CLI mentions, test passes
* use maps for mentions
* tests
* comment
* save mentions on sent messages
* postresql schema
* refactor
* M.empty
* include both displayName and localAlias into MentionedMemberInfo
* fix saving sent mentions
* include mentions in previews
* update plans
2025-01-29 13:04:48 +00:00
spaced4ndy and Evgeny Poberezkin
20fa30eacc
core: Mobile.hs postgres interface ( #5545 )
...
* core: Mobile.hs postgres interface
* sqlite
* fix
* errors
* postgres
* rename
* rename, refactor
* merge files
* rename
* update simplexmq
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2025-01-20 17:41:48 +04:00
Evgeny
eacae74fed
core, ui: errors for blocked files and contact addresses ( #5510 )
...
* core, ui: errors for blocked files and contact addresses
* android
* iOS: How it works, stub for blog post
* android: blocked errors WIP
* android: alert with button
* update
* fix encoding
* nix
* simplexmq
2025-01-12 21:25:25 +00:00
Evgeny
c8c6a832dd
core: fix report count when loading chat ( #5505 )
...
* core: fix report count when loading chat
* remove "deleted" parameter from api
2025-01-10 19:41:01 +00:00
spaced4ndy and Evgeny Poberezkin
e05a35e26e
core: support postgres backend ( #5403 )
...
* postgres: modules structure (#5401 )
* postgres: schema, field conversions (#5430 )
* postgres: rework chat list pagination query (#5441 )
* prepare cabal for merge
* restore cabal changes
* simplexmq
* postgres: implementation wip (tests don't pass) (#5481 )
* restore ios file
* postgres: implementation - tests pass (#5487 )
* refactor DB options
* refactor
* line
* style
* style
* refactor
* $
* update simplexmq
* constraintError
* handleDBErrors
* fix
* remove param
* Ok
* case
* case
* case
* comment
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2025-01-10 11:27:29 +00:00
Evgeny and spaced4ndy
569832c8de
core: rfc, protocol and types for user reports ( #5451 )
...
* core: rfc, protocol and types for user reports
* add comment
* rfc
* moderation rfc
* api, types
* update
* typos
* migration
* update
* report reason
* query
* deleted
* remove auto-accepting conditions for SimpleX Chat Ltd
* api, query
* make indices work
* index without filtering
* query for unread
* postgres: rework chat list pagination query (#5441 )
* fix query
* fix
* report counts to stats
* internalMark
* fix parser
* AND
* delete reports on event, fix counters
* test
* remove reports when message is moderated on sending side
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2025-01-08 09:42:26 +00:00
spaced4ndy
68be4b4ba5
core: return member records from apiGetReactionMembers ( #5270 )
2024-11-28 13:49:20 +04:00
spaced4ndy
41b7ad01f9
core: apiGetReactionMembers ( #5258 )
2024-11-27 15:51:35 +04:00
4d82209a3a
core: pagination API to load items around defined or the earliest unread item ( #5100 )
...
* core: auto increment chat item ids (#5088 )
* core: auto increment chat item ids
* file name
* down name
* update schema
* ignore down migration on schema dump test
* fix testDirectMessageDelete test
* fix testNotes test
* core: initial api support for items around a given item (#5092 )
* core: initial api support for items around a given item
* implementation and tests for local messages
* pass entities down
* unused
* getAllChatItems implementation and tests
* pagination for getting chat and tests
* remove unused import
* group implementation and tests
* refactor
* order by created at for local and direct chats
* core: initial landing api for chat and gaps (#5104 )
* initial work on initial param for loading chat
* support for initial
* controller parse
* fixed sqls
* refactor names
* fix ChatLandingSection serialized type
* total accuracy on landing section
* descriptive view message
* foldr
* refactor to make landingSection reusable
* refactor: use foldr everywhere
* propagate search
* Revert "propagate search"
This reverts commit 01611fd719 .
* throw when search is sent for initial
* gap size wip (needs testing)
* final
* remove order by
* remove index
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
* core: fix initial api latest chat items ordering (#5151 )
* core: fix one item missing from latest in initial and wrong check (#5153 )
* core: fix one item missing from latest in initial and wrong check
* final fixes and tests
* clearer tests
* core: remove gaps and make sure page size is always the same (#5163 )
* remove gaps
* consistent pagination size
* proper fix and around fix too
* optimize
* refactor
* core: simplify pagination
* core: first unread queries (#5174 )
* core: pagination nav info (#5175 )
* core: pagination nav info
* wip
* rework
* rework
* group, local
* fix
* rename
* fix tests
* just
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2024-11-14 08:34:25 +00:00
spaced4ndy
c6ab8ec6b3
core: cleanup empty file on error; check file status on forward ( #4878 )
2024-09-13 23:16:23 +04:00
Evgeny
f6f2044675
core: plan forwarding chat items, api types ( #4865 )
...
* core: plan forwarding chat items, api types
* remove empty content, refactor get items
* another refactor
* plan
* test
* more tests
* text
2024-09-12 15:21:29 +01:00
Evgeny Poberezkin
dfdb4af646
Revert "core: bulk forward missing files error handling ( #4860 )"
...
This reverts commit 46d774a822 .
2024-09-12 08:52:09 +01:00
46d774a822
core: bulk forward missing files error handling ( #4860 )
...
* add types
* wip dump
* collect errors
* Update src/Simplex/Chat/View.hs
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
* test with not received files
* remove ciFileLoaded
* undo refactoring
* test for skipping missing file with text
* add test for empty message
* remove fdescribes
* copy or cleanup files after collecting errors and forward reqs
* don't forward w/t content
* translate CIFSRcvAborted into FFENotAccepted
* refactor
* refactor
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2024-09-11 21:30:09 +01:00
spaced4ndy
bcd50019be
core: add more multi send api tests ( #4750 )
2024-08-23 21:05:37 +04:00
Evgeny Poberezkin and spaced4ndy
8bda64a5c1
core: api to delete multiple messages ( #4452 )
...
* core: api proposal (not implemeted) to delete multiple messages
* core: batch delete multiple messages; allow to moderate self (#4513 )
* allow to moderate self, remove saving item-message record on mark delete
* direct batched
* local batched
* group batched
* moderate batched
* refactor
* fix
* fix test
* remove unused event
* direct message batching wip
* direct test
* more tests
* trunk
* batch compressed
* remove unused function
* new agent api
* sendGroupMessages
* forward batched
* refactor
* remove comment
* rename, comment
* refactor
* many chat batches test (doesn't pass)
* refactor
* comment
* rename
* comment
* linearize
* fix
* fix
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
* core: check item deletable with margin (#4533 )
* simplexmq
* remove L.singleton (ghc 8.10.7)
* test delay
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2024-07-30 22:59:47 +01:00
spaced4ndy
a9d2535292
core: differentiate inactive and forwarded group snd statuses ( #4420 )
...
* core: GroupSndStatus
* rfc
* encoding, db apis
* pending, forwarded statuses
* encoding
2024-07-09 18:29:36 +01:00
spaced4ndy
490e8cead8
core: file errors ( #4261 )
2024-06-05 21:02:13 +04:00
Evgeny Poberezkin
5ac521f6d8
core: commands to debug subscribed SMP queues ( #4253 )
...
* core: commands to debug subscribed SMP queues
* getLastRcvMsgInfo
* DESC
* update
* update commands, ui compiles
* update
* ios: fix type
* swap
* simplexmq
* group member queue info
* copy button in the alert
2024-05-31 12:45:58 +01:00
spaced4ndy
2143eb2d7a
core: batch send pending group messages ( #4242 )
2024-05-28 18:32:29 +04:00
Evgeny Poberezkin
291df6e9d0
core: logging of chat events ( #4216 )
...
* core: update simplexmq (persist server errors)
* fix
* same config
* logging
* logging 2
* log
* log 2
* finally
* catch better
* more logs
* logs
* fix
* more logging, context from PROHIBITED
* warning
* more logs
* logs3
* logs4
* logs in simplexmq
* log locks from simplemq
* log queue size
* log sendMessagesB in simplexmq
* update simplexmq
* logs5
* logs6
* logs7
* logs8
* logs8
* logs9
* logs10
* log11
* log12
* fix test
* more logs
* logging
* clean up
* refactor
* simplify
* tags
* log level
* remove network errors from the log
* rename
2024-05-24 21:09:21 +01:00
spaced4ndy and Evgeny Poberezkin
d2d450d1d7
core: check known relays before file reception, support user approval of unknown relays ( #4043 )
...
* core: check known relays before file reception, support user approval of unknown relays
* comment
* reset on not approved agent error
* add privacyAskToApproveRelays to AppSettings
* filter distinct servers
* update simplexmq
* remember user_approved_relays
* refactor
* rename
* update simplexmq
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2024-05-20 17:23:29 +04:00