master
release-1.18.4
dev
revert-1328-fix-unknown-push-json
1.18.2
1.16.9
1.16.8
v5.2.3
v5.2.2
v5.2.1
v5.2.0
v5.1.9
v5.1.8
v5.1.7
v5.0.10
v5.1.6
v5.1.5
v5.1.4
v5.1.3
v5.1.2
v5.0.9
v5.1.1
v5.1.0
v5.0.8
v5.0.7
v5.0.6
v5.0.5
v5.0.4
v5.0.3
v5.0.2
v5.0.1
v5.0.0
v4.79.3
v4.79.2
v4.79.1
v4.79.0
v4.78.5
v4.78.4
v4.78.3
v4.78.2
v4.78.1
v4.78.0
v4.77.3
v4.77.2
v4.77.1
v4.77.0
v4.76.3
v4.76.2
v4.76.1
v4.76.0
v4.75.8
v4.75.7
v4.75.6
v4.75.5
v4.75.4
v4.75.3
v4.75.2
v4.75.1
v4.75.0
v4.74.3
v4.74.2
v4.74.1
v4.74.0
v4.73.4
v4.73.3
v4.73.2
v4.73.1
v4.73.0
v4.72.6
v4.72.5
v4.72.4
v4.72.3
v4.72.2
v4.72.1
v4.72.0
v4.71.5
v4.71.4
v4.71.3
v4.71.2
v4.71.1
v4.71.0
v4.70.5
v4.70.4
v4.70.3
v4.70.2
v4.70.1
v4.70.0
v4.69.6
v4.69.5
v4.69.4
v4.69.3
v4.69.2
v4.69.1
v4.69.0
v4.68.8
v4.68.7
v4.68.6
v4.68.5
v4.68.4
v4.68.3
v4.68.2
v4.68.1
v4.68.0
v4.67.3
v4.67.2
v4.67.1
v4.67.0
v4.66.8
v4.66.7
v4.66.6
v4.66.5
v4.66.3
v4.66.2
v4.66.1
v4.66.0
v4.65.2
v4.65.1
v4.65.0
v4.64.7
v4.64.6
v4.64.5
v4.64.4
v4.64.3
v4.64.2
v4.64.1
v4.64.0
v4.63.3
v4.63.2
v4.63.1
v4.63.0
v4.62.4
v4.62.3
v4.62.2
v4.62.1
v4.62.0
v4.61.6
v4.61.5
v4.61.4
v4.61.3
v4.61.2
v4.61.1
v4.61.0
v4.60.9
v4.60.8
v4.60.7
v4.60.6
v4.60.5
v4.59.11
v4.60.4
v4.60.3
v4.60.2
v4.60.1
v4.60.0
v4.59.10
v4.59.9
v4.59.8
v4.59.7
v4.59.6
v4.59.5
v4.59.4
v4.59.3
v4.59.2
v4.59.1
v4.59.0
v4.58.5
v4.58.4
v4.58.3
v4.58.2
v4.58.1
v4.58.0
v4.57.2
v4.57.1
v4.57.0
v4.56.4
v4.56.3
v4.56.2
v4.56.1
v4.56.0
v4.55.8
v4.55.7
v4.55.6
v4.55.5
v4.55.4
v4.55.3
v4.55.2
v4.55.1
v4.55.0
v4.54.3
v4.54.2
v4.54.1
v4.54.0
v4.53.7
v4.53.6
v4.53.5
v4.53.4
v4.53.3
v4.53.2
v4.53.1
v4.53.0
v4.52.4
v4.52.3
v4.52.2
v4.52.1
v4.52.0
v4.51.6
v4.51.5
v4.51.4
v4.51.3
v4.51.2-corrected
v4.51.1
v4.51.2
v4.51.0
v4.50.6
v4.50.5
v4.50.4
v4.50.3
v4.50.1
v4.50.2
v.4.50.1
v4.50.0
v4.49.18
v4.49.17
v4.49.16
v4.49.15
v4.49.14
v4.49.13
v4.49.12
v4.49.11
v4.49.10
v4.49.9
v4.49.8
v4.49.7
v4.49.6
v4.49.5
v4.49.4
v4.49.3
v4.49.2
v4.49.1
v4.49.0
v4.48.17
v4.48.16
v4.48.15
v4.48.14
v4.48.13
v4.48.12
v4.48.11
v4.48.10
v4.48.9
v4.48.8
v4.48.7
v4.47.7
v4.48.6
v4.48.5
v4.48.4
v4.48.3
v4.48.2
v4.48.1
v4.48.0
v4.47.6
v4.47.5
v4.47.4
v4.47.3
v4.47.2
v4.47.1
v4.47.0
v4.46.2
v4.46.1
v4.46.0
v4.45.2
v4.45.1
v4.45.0
v4.44.7
v4.44.6
v4.44.5
v4.44.4
v4.44.3
v4.44.2
v4.44.1
v4.44.0
v4.43.8
v4.43.7
v4.43.6
v4.43.5
v4.43.4
v4.43.3
v4.43.2
v4.43.1
v4.43.0
v4.42.3
v4.42.2
v4.42.1
v4.42.0
v4.41.6
v4.41.5
v4.41.4
v4.41.3
v4.41.2
v4.41.1
v4.41.0
v4.40.4
v4.40.3
v4.40.2
v4.40.1
v4.40.0
v4.39.4
v4.39.3
v4.39.2
v4.39.1
v4.39.0
v4.38.3
v4.38.2
v4.38.1
v4.38.0
v4.37.2
v4.37.1
v4.37.0
v4.36.2
v4.36.1
v4.36.0
v4.35.3
v4.35.2
v4.35.1
v4.35.0
v4.34.8
v4.34.7
v4.34.6
v4.34.5
v4.34.4
v4.34.3
v4.34.2
v4.34.1
v4.34.0
v4.33.5
v4.33.4
v4.33.3
v4.33.2
v4.33.1
v4.33.0
v4.32.8
v4.32.7
v4.32.6
v4.32.5
v4.32.4
v4.32.3
v4.32.2
v4.32.1
v4.32.0
v4.31.8
v4.31.7
v4.31.6
v4.31.5
v4.31.4
v4.31.3
v4.31.2
v4.31.1
v4.30.8
v4.31.0
v4.30.7
v4.30.6
v4.30.5
v4.30.4
v4.30.3
v4.30.2
v4.30.1
v4.30.0
v4.29.7
v4.29.6
v4.29.5
v4.29.4
v4.29.3
v4.29.2
v4.29.1
v4.29.0
v4.28.1
v4.28.0
v4.27.3
v4.27.2
v4.27.1
v4.27.0
v4.26.2
v4.26.1
v4.26.0
v4.25.10
v4.25.9
v4.25.8
v4.25.7
v4.25.6
v4.25.5
v4.25.4
v4.25.3
v4.25.2
v4.25.1
v4.25.0
v4.24.8
v4.24.7
v4.24.6
v4.24.5
v4.24.4
v4.24.3
v4.24.2
v4.24.1
v4.24.0
v4.23.4
v4.23.3
v4.23.2
v4.23.1
v4.23.0
v4.22.4
v4.22.3
v4.22.2
v4.22.1
v4.22.0
v4.21.6
v4.21.5
v4.21.4
v4.21.3
v4.21.2
v4.21.1
v4.21.0
v4.20.9
v4.20.8
v4.20.7
v4.20.6
v4.20.5
v4.20.4
v4.20.3
v4.20.2
v4.19.3
v4.19.2
v4.19.1
v4.18.3
v4.18.2
v4.18.1
v4.18.0
v4.17.5
v4.17.4
v4.17.3
v4.17.2
v4.17.1
v4.17.0
v4.16.9
v4.16.7
v4.16.6
v4.16.4
v4.16.3
v4.15.5
v4.15.3
v4.15.2
v4.15.1
v4.15.0
v4.14.10
v4.14.9
v4.14.8
v4.14.7
v4.14.6
v4.14.5
v4.14.4
v4.13.3
v4.14.2
v4.14.1
v4.14.0
v4.13.7
v4.13.6
v4.13.5
v4.13.4
v4.13.2
v4.13.1
v4.13.0
v4.12.3
v4.12.1
v4.11.5
v4.12.0
v4.11.3
v4.11.2
v4.11.1
v4.10.12
v4.10.11
v4.10.10
v4.10.9
v4.10.8
v4.10.7
v4.10.6
v4.10.5
v4.10.2
v4.10.1
v4.9.9
v4.9.8
v4.9.6
v4.9.5
v4.9.4
v4.9.3
v4.9.2
v4.9.1
v4.9.0
v4.8.1
v4.8.0
v4.7.4
v4.7.3
v4.7.2
v4.7.1
v4.7.0
v4.6.0
v4.5.3
v4.5.2
v4.5.0
v4.4.0
v4.3.2
v4.3.1
v4.3.0
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.0
v4.0.1
v4.0.0
v3.31.4
v3.31.2
v3.31.1
v3.31.0
v3.30.4
v3.30.3
v3.30.2
v3.30.1
v3.30.0
v3.29.6
v3.29.5
v3.29.4
v3.29.2
v3.28.4
v3.28.3
v3.28.2
v3.28.1
v3.28.0
v3.27.1
v3.27.0
v3.26.2
v3.26.1
v3.26.0
v3.25.4
v3.25.3
v3.25.2
v3.25.1
v3.25.0
v3.24.1
v3.24.0
v3.23.0
v3.22.2
v3.22.1
v3.22.0
v3.21.3
v3.21.2
v3.21.1
v3.21.0
v3.20.4
v3.20.3
v3.20.2
v3.20.1
v3.19.0
v3.18.3
v3.18.2
v3.18.1
v3.18.0
v3.17.0
v3.16.1
v3.16.0
v3.15.2
v3.15.1
v3.15.0
v3.14.2
v3.14.1
v3.14.0
v3.13.1
v3.13.0
v3.12.0
v1.8.6
v3.11.1
v3.11.0
v1.8.4
v3.10.0
v3.9.1
v3.9.0
v3.8.0
v3.7.2
v3.7.1
v3.7.0
v3.6.1
v3.6.0
v3.5.2
v3.5.1
v3.5.0
v3.4.2
v3.4.0
v3.3.3
v3.3.2
v1.8.2
v3.3.1
v3.3.0
v3.1.1
v3.1.0
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v1.8.1
v2.28.1
v2.28.0
v2.27.2
v2.27.1
v1.8.0
v1.7.2
v2.27.0
v2.26.5
v2.26.3
v2.26.2
v2.26.0
v2.25.3
v2.25.1
v2.25.0
v2.24.1
v1.6.2
v2.24.0
v2.23.3
v2.23.2
v2.32.2
v2.23.1
v2.23.0
v2.22.2
v2.22.1
v2.22.0
v2.21.0
v1.6.1
v2.19.1
v2.19.0
v2.18.2
v2.18.1
v2.18.0
v2.17.0
v2.16.4
v2.16.3
v1.5.0
v2.16.2
v2.16.1
v2.16.0
v1.4.0
v2.14.5
v2.14.4
v2.14.3
v2.14.2
v2.14.1
v2.14.0
v2.13.0
v2.12.0
v1.3.0
v2.11.1
v2.11.0
v2.10.2
v1.2.5
v2.10.1
v2.10.0
v2.9.3
v2.9.2
v2.9.1
v.1.2.4
v2.8.0
v1.2.3
v2.7.0-B1
v2.6.4
v1.2.2
v2.6.3
v2.6.2
v2.6.0
v1.2.0
v1.1.0
v1.0.0
v2.5.3
v2.5.2
v2.5.1
v2.4.2
v2.4.1
v2.4.0
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.0
v2.1.10
v2.1.9
v2.1.8
v2.1.7
v2.1.6
v2.1.4
v2.1.2
v2.1.1
v2.1.0
v2.0.8
v2.0.7
v2.0.6
v2.0.5
2.0.4
v2.0.3
v2.0.2
v2.0
v2.0.1
v1.0.6
v1.0.5
v1.0.4
v1.0.3
v1.0.2
v1.0.1
v1.0
v0.9.9.9
v0.9.9.8
v0.9.9.7
v0.9.9.6
v0.9.9.5
v0.9.9.4
v0.9.9.3
v0.9.9.2
v0.9.9.1
v0.9.8
v0.9.7
v0.9.6
v0.9.5
v0.9.4
v0.9.3
v0.9.2
v0.9.1
v0.9
v0.8.6
v0.8.5
v0.8.4
v0.8.3
v0.8.2
v0.8.1
v0.8
v0.7.4
v0.7.3
v0.7.2
v0.7
v0.6.2
v0.6.1
v0.6
cg-c1
audit-2
audit
1.9.1
1.9.0
1.8.1
1.8.0
1.7.4
1.7.3
1.7.1
1.7.0
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.12
1.6.11
1.6.10
1.6.1
1.6.0
1.5.4
1.5.3
1.5.2-beta
1.5.2
1.5.1-beta
1.5.0-beta
1.5.0
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1-beta
1.4.1
1.4.0-beta
1.4.0
1.3.2
1.3.1
1.3.0-alpha.1
1.3.0
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0-alpha.2
1.2.0-alpha-1
1.2.0
1.18.4
1.18.3
1.18.1
1.17.6
1.17.5
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.7
1.16.5
1.16.4
1.16.3
1.16.1
1.16.0
1.15.4
1.15.3
1.15.2
1.15.1
1.14.1
1.14.0
1.13.7
1.13.6
1.13.5
1.13.4
1.13.1
1.13.0
1.12.5
1.12.4
1.12.3
1.12.2
1.12.15
1.12.1
1.12.0
1.11.9
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.20
1.11.2
1.11.19
1.11.17
1.11.16
1.11.15
1.11.14
1.11.13
1.11.12
1.11.11
1.11.10
1.11.1
1.11.0
1.10.9
1.10.8
1.10.7
1.10.6
1.10.5
1.10.4
1.10.3
1.10.2
1.10.13
1.10.12
1.10.11
1.10.10
1.10.1
1.10.0
1.1.0-alpha.3
1.1.0-alpha.2
1.1.0-alpha.1
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.11
1.0.10
1.0.1
1.0.0-alpha.5
1.0.0-alpha.4
1.0.0-alpha.3
1.0.0-alpha.2
1.0.0-alpha.1
1.0.0
${ noResults }
22 Commits (ac18f1cbfe5df335234def8a8c35235513044089)
Author | SHA1 | Message | Date |
---|---|---|---|
0x330a |
ac18f1cbfe
|
Integrate shared libsession-util library (#1096)
* feat: add some config db basics and DI for it, make the user profile optional, start looking at integrate building from initial dump * update: get latest util library submodule update * refactor: fix compile for refactored API * refactor: naming consistent with library * feat: add in config storage and injection to common places, managing lifecycle of native instances * refactor: config database changes, new protos, adding in support for config base namespace queries * refactor: config query and store use the same format as other platforms * feat: add batch snode calls and try to poll from all the config namespaces * fix: add optional namespace in signature and params * feat: add raw requests for modifying expiry and getting expiries * feat: add some base config migration logic, start implementing wrappers for conversation and expiry types * chore: update libsession base * feat: start integrating conversation wrapper functions * feat: add basic conversation info volatile types and implementations, start working on tests * feat: more common library wrapper implementation and test * fix: tests and compile issues * fix: fix tests, don't use iterables * feat: add all iterators and tests * feat: add in more config factory for volatile * feat: update request responses and their appropriate processing * feat: add storage with hashes and some basic profile update logic in config factory probably move that somewhere else * feat: adding config sync functionality, refactoring jobs to execute in suspend context to do some nice coroutine execution * refactor: moving some properties around so we have access in libsession * feat: expand on the config sync job, finish basic implementation to test against * feat: add forced config sync * feat: syncs the user profile stuff for now, and errors back to placeholder instead of unknown recipient * feat: add basic message read logic for synchronizing last reads, need to modify the query to use the last seen instead of the unread count in a subquery possibly for thread display record * feat: add broken unreads everywhere * fix: unreads work now for incoming messages, need to sync conv volatile properly still * feat: batching poll responses properly and handling groups properly * fix: replace the mark read receiver (from notifications) to use the new set last seen mark read logic * feat: update to the group list branch * fix: compile errors from updating library to use latest branch, now requires cmake 3.22.1 * fix: fix the contact tests * fix: getters weren't getters properly in the config factory, fixed new onboarding from configs * feat: add the last seen * feat: start adding user groups wrapper objects * refactor: add more else branches for unimplemented types * feat: buffer the last read when in conversation * feat: add basic contact logic for setting local contact state. Need to implement handling properly * refactor: trying to just include blocked status for now in updating contacts * fix: add some more contact syncing: nicknames, approved statuses, blocked statuses * feat: start implementing hashes in shared lib and refactoring * feat: start to implement group list info classes and wrappers and refactor to use library based hashes * feat: incorporate hashes from library, more wrapper for user groups and serialization from c++ * feat: adding more serialization changes for community base info and user groups LGC * feat: adding more serialize deserialize to legacy closed groups * feat: finish serial/deserial helper * feat: just implement deserialize community info * refactor: refactor tests and wrappers to use less pointers, finish implementing user groups API * feat: finish latest wrappers fix tests and continue building default generation functions. refactor defaults to be used if no stored data blob in DB * feat: more usergroup functionality, storage functionality for checking pinned status, adding pinned status for NTS/contacts, move community info parse full url to base community, add StorageProtocol logic for group info * feat: adding user groups to the list of user configs, refactorign some of the config factory to fetch the user configs easier. Add handling for polling user group namespace * feat: implement the default user config list * feat: add user group config handling * chore: extra missed existing group * refactor: use existing lookup for objects in wrappers so they don't overwrite missing values * feat: add contacts expiry serialization/deserialization, more LGC, timestamps to add closed group encryption info (for latest tracking) * refactor: change how expiration timer works for contacts, set the expiration timer for those conversations in handling contact configs * feat: add expiration updates via config for contacts as well * feat: add almost all group editing cases, need to hook into the thread deletion for groups in the user groups * feat: open group joining should work now * feat: add groups to configs for push * fix: handling user group updates bug fix for closed groups instead of all groups * fix: open group sync persistence * feat: add in activity finish if recipient no longer exists (deleted thread) from sync * feat: support avatar removal from shared library * feat: support thread deletion and refactoring a lot of getOrCreateThread references to go via storage or assume they are correctly set to hook into the contact and volatile creation during thread creation * fix: database update not deleting in certain circumstances, storage persisting and removing the volatile convo info for thread deletion / creation, NTS hidden getter values in shared library * refactor: make update listener visibility package * refactor: update kotlin * feat: update dependencies and support outdated config messages, refactor config factory to return null configs if new configs not supported * feat: update shared library to use priority only, fix compile errors, fix group member sync problem * fix: compile error * fix: profile avatar fixes for local user now that we aren't setting local user profile key * Revert "fix: profile avatar fixes for local user now that we aren't setting local user profile key" This reverts commit |
11 months ago |
ryanzhao | fa71ea1850 | make RetrieveProfileAvatarJob work | 1 year ago |
Ryan Zhao | b494088c3d | WIP: further refactor on old jobs | 1 year ago |
Ryan Zhao | 2ceb9e2bf4 | clean up old job manager | 1 year ago |
ryanzhao | 375815c719 | WIP: refactor on jobs using old job table | 1 year ago |
Harris |
6ddefb7a2e
|
Performance improvements and bug fixes (#869)
* refactor: fail on testSnode instead of recursively using up snode list. add call timeout on http client * refactor: refactoring batch message receives and pollers * refactor: reduce thread utils pool count to a 2 thread fixed pool. Do a check against pubkey instead of room names for oxenHostedOpenGroup * refactor: caching lib with potential loader fixes and no-cache for giphy * refactor: remove store and instead use ConcurrentHashMap with a backing update coroutine * refactor: queue trim thread jobs instead of add every message processed * fix: wrapping auth token and initial sync for open groups in a threadutils queued runnable, getting initial sync times down * fix: fixing the user contacts cache in ConversationAdapter.kt * refactor: improve polling and initial sync, move group joins from config messages into a background job fetching image. * refactor: improving the job queuing for open groups, replacing placeholder avatar generation with a custom glide loader and archiving initial sync of open groups * feat: add OpenGroupDeleteJob.kt * feat: add open group delete job to process deletions after batch adding * feat: add vacuum and fix job queue re-adding jobs forever, only try to set message hash values in DB if they have changed * refactor: remove redundant inflation for profile image views throughout app * refactor(wip): reducing layout inflation and starting to refactor the open group deletion issues taking a long time * refactor(wip): refactoring group deletion to not iterate through and delete messages individually * refactor(wip): refactoring group deletion to not iterate through and delete messages individually * fix: group deletion optimisation * build: bump build number * build: bump build number and fix batch message receive retry logic * fix: clear out open group deletes * fix: update visible ConversationAdapter.kt binding for initial contact fetching and better traces for debugging background jobs * fix: add in check for / force sync latest encryption key pair from linked devices if we already have that closed group * Rename .java to .kt * refactor: change MmsDatabase to kotlin to make list operations easier * fix: nullable type * fix: compilation issues and constants in .kt instead of .java * fix: bug fix expiration timer on closed group recipient * feat: use the job queue properly across executors * feat: start on open group dispatcher-specific logic, probably a queue factory based on openGroupId if that is the same across new message and deletion jobs to ensure consistent entry and removal * refactor: removing redundant code and fixing jobqueue per opengroup * fix: allow attachments in note to self * fix: make the minWidth in quote view bind max of text / title and body, wrapped ? * fix: fixing up layouts and code view layouts * fix: remove TODO, remove timestamp binding * feat: fix view logic, avatars and padding, downloading attachments lazily (on bind), fixing potential crash, add WindowDebouncer.kt * fix: NPE on viewModel recipient from removed thread while tearing down the Recipient observer in ConversationActivityV2.kt * refactor: replace conversation notification debouncer handler with handlerthread, same as conversation list debouncer * refactor: UI for groups and poller improvements * fix: revert some changes in poller * feat: add header back in for message requests * refactor: remove Trace calls, add more conditions to the HomeDiffUtil for updating more efficiently * feat: try update the home adapter if we get a profile picture modified event * feat: bump build numbers * fix: try to start with list in homeViewModel if we don't have already, render quotes to be width of attachment slide view instead of fixed * fix: set channel to be conflated instead of no buffer * fix: set unreads based off last local user message vs incrementing unreads to be all amount * feat: add profile update flag, update build number * fix: link preview thumbnails download on bind * fix: centercrop placeholder in glide request * feat: recycle the contact selection list and profile image in unbind * fix: try to prevent user KP crash at weird times * fix: remove additional log, improve attachment download success rate, fix share logs dialog issue |
2 years ago |
Harris | 0516526923 | refactor: use hilt to provide DB instead of our own factory, inject it in some places where possible | 3 years ago |
Niels Andriesse | dfd3ccc5d2 | Clean | 3 years ago |
Niels Andriesse | c0f894e1b2 | Clean | 3 years ago |
Niels Andriesse | e0c1456af4 | Merge branch 'dev' into nicknames | 3 years ago |
Niels Andriesse | 49c3ffd9ca | Remove redundant code | 3 years ago |
Ryan ZHAO | 38ed5c2187 | Merge branch 'dev' of https://github.com/oxen-io/session-android into client-side-nickname | 3 years ago |
Niels Andriesse | 4078a9c4b5 | Move files | 3 years ago |
Ryan ZHAO | 267a94b8ef | minor fix | 3 years ago |
ryanzhao | 4c63b724ee | make editting nickname work | 3 years ago |
Ryan ZHAO | b43000bdd0 | WIP: enable contact with UI | 3 years ago |
Ryan ZHAO | 2cac49b965 | update profile picture url | 3 years ago |
Ryan ZHAO | a16e67d1fd | add new contact database api | 3 years ago |
Ryan ZHAO | e64ac14b77 | fix crash & empty nickname bug | 3 years ago |
Ryan ZHAO | b94597a1f6 | make it possible to set a client-side nickname | 3 years ago |
Ryan ZHAO | d78dc83307 | minor refactor on storing display names | 3 years ago |
Ryan ZHAO | 74a9754f48 | implement interfaces | 3 years ago |