diff --git a/.gitignore b/.gitignore
index 56cc6425e..255852890 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,20 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
+
+
# Built application files
*.apk
*.aar
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..26d33521a
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 000000000..fb7f4a8a4
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 000000000..ed76bea38
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 000000000..360e6d41e
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amethyst.png b/amethyst.png
new file mode 100644
index 000000000..b869584e3
Binary files /dev/null and b/amethyst.png differ
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 000000000..abe2b1dc3
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,101 @@
+plugins {
+ id 'com.android.application'
+ id 'org.jetbrains.kotlin.android'
+}
+
+android {
+ namespace 'com.vitorpamplona.amethyst'
+ compileSdk 33
+
+ defaultConfig {
+ applicationId "com.vitorpamplona.amethyst"
+ minSdk 26
+ targetSdk 33
+ versionCode 1
+ versionName "0.1"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ vectorDrawables {
+ useSupportLibrary true
+ }
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = '11'
+ }
+ buildFeatures {
+ compose true
+ }
+ composeOptions {
+ kotlinCompilerExtensionVersion '1.3.2'
+ }
+ packagingOptions {
+ resources {
+ excludes += '/META-INF/{AL2.0,LGPL2.1}'
+ }
+ }
+}
+
+dependencies {
+ implementation 'androidx.core:core-ktx:1.9.0'
+ implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
+ implementation 'androidx.activity:activity-compose:1.6.1'
+ implementation "androidx.compose.ui:ui:$compose_ui_version"
+ implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version"
+ implementation 'androidx.compose.material:material:1.3.1'
+
+ // Navigation
+ implementation("androidx.navigation:navigation-compose:$nav_version")
+ implementation 'androidx.lifecycle:lifecycle-runtime-compose:2.6.0-alpha03'
+ implementation 'androidx.compose.runtime:runtime-livedata:1.4.0-alpha03'
+
+ // Input
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1'
+
+ // Swipe Refresh
+ implementation 'com.google.accompanist:accompanist-swiperefresh:0.24.13-rc'
+
+ // Load images from the web.
+ implementation "io.coil-kt:coil-compose:2.2.2"
+
+ // Bitcoin secp256k1 bindings to Android
+ implementation 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0'
+
+ // Nostr Base Protocol
+ implementation('com.github.vitorpamplona.NostrPostr:nostrpostrlib:master-SNAPSHOT') {
+ exclude group:'fr.acinq.secp256k1'
+ exclude module: 'guava'
+ exclude module: 'guava-testlib'
+ }
+
+ implementation 'com.squareup.retrofit2:converter-gson:2.8.1'
+ // Websockets API
+ implementation 'com.squareup.okhttp3:okhttp:4.10.0'
+
+ // Json Serialization
+ implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.14.1'
+
+ // Rendering clickable text
+ implementation "com.google.accompanist:accompanist-flowlayout:0.28.0"
+
+ // link preview
+ implementation 'tw.com.oneup.www:Baha-UrlPreview:1.0.1'
+ implementation 'androidx.security:security-crypto-ktx:1.1.0-alpha03'
+
+ testImplementation 'junit:junit:4.13.2'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.5'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
+ androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version"
+ debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version"
+ debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version"
+}
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt
new file mode 100644
index 000000000..937e47517
--- /dev/null
+++ b/app/src/androidTest/java/com/vitorpamplona/amethyst/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.vitorpamplona.amethyst
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.vitorpamplona.amethyst", appContext.packageName)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..d01064bdc
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt b/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt
new file mode 100644
index 000000000..612ce1335
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/KeyStorage.kt
@@ -0,0 +1,22 @@
+package com.vitorpamplona.amethyst
+
+import android.content.Context
+import androidx.security.crypto.EncryptedSharedPreferences
+import androidx.security.crypto.MasterKeys
+
+class KeyStorage {
+
+ fun encryptedPreferences(context: Context): EncryptedSharedPreferences {
+ val secretKey: String = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
+ val preferencesName = "secret_keeper"
+
+ return EncryptedSharedPreferences.create(
+ preferencesName,
+ secretKey,
+ context,
+ EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
+ EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
+ ) as EncryptedSharedPreferences
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
new file mode 100644
index 000000000..308e65c25
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
@@ -0,0 +1,92 @@
+package com.vitorpamplona.amethyst.model
+
+import androidx.lifecycle.LiveData
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import com.vitorpamplona.amethyst.service.relays.Client
+import nostr.postr.Persona
+import nostr.postr.events.TextNoteEvent
+import nostr.postr.toHex
+
+class Account(val loggedIn: Persona) {
+ var seeReplies: Boolean = true
+
+ fun userProfile(): User {
+ return LocalCache.getOrCreateUser(loggedIn.pubKey)
+ }
+
+ fun isWriteable(): Boolean {
+ return loggedIn.privKey != null
+ }
+
+ fun reactTo(note: Note) {
+ if (!isWriteable()) return
+
+ note.event?.let {
+ val event = ReactionEvent.create(it, loggedIn.privKey!!)
+ Client.send(event)
+ LocalCache.consume(event)
+ }
+ }
+
+ fun boost(note: Note) {
+ if (!isWriteable()) return
+
+ note.event?.let {
+ val event = RepostEvent.create(it, loggedIn.privKey!!)
+ Client.send(event)
+ LocalCache.consume(event)
+ }
+ }
+
+ fun sendPost(message: String, replyingTo: Note?) {
+ if (!isWriteable()) return
+
+ val replyToEvent = replyingTo?.event
+ if (replyToEvent is TextNoteEvent) {
+ val repliesTo = replyToEvent.replyTos.plus(replyToEvent.id.toHex())
+ val mentions = replyToEvent.mentions.plus(replyToEvent.pubKey.toHex())
+
+ val signedEvent = TextNoteEvent.create(
+ msg = message,
+ replyTos = repliesTo,
+ mentions = mentions,
+ privateKey = loggedIn.privKey!!
+ )
+ Client.send(signedEvent)
+ LocalCache.consume(signedEvent)
+ } else {
+ val signedEvent = TextNoteEvent.create(
+ msg = message,
+ replyTos = null,
+ mentions = null,
+ privateKey = loggedIn.privKey!!
+ )
+ Client.send(signedEvent)
+ LocalCache.consume(signedEvent)
+ }
+ }
+
+ // Observers line up here.
+ val live: AccountLiveData = AccountLiveData(this)
+
+ private fun refreshObservers() {
+ live.refresh()
+ }
+}
+
+class AccountLiveData(private val account: Account): LiveData(AccountState(account)) {
+ fun refresh() {
+ postValue(AccountState(account))
+ }
+
+ override fun onActive() {
+ super.onActive()
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ }
+}
+
+class AccountState(val account: Account)
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt
new file mode 100644
index 000000000..49eed2d80
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Hex.kt
@@ -0,0 +1,36 @@
+package com.vitorpamplona.amethyst.model
+
+import com.vitorpamplona.amethyst.ui.note.toDisplayHex
+import fr.acinq.secp256k1.Hex
+import java.util.regex.Pattern
+import nostr.postr.Persona
+import nostr.postr.bechToBytes
+import nostr.postr.toHex
+
+/** Makes the distinction between String and Hex **/
+typealias HexKey = String
+
+fun ByteArray.toHexKey(): HexKey {
+ return toHex()
+}
+
+fun HexKey.toByteArray(): ByteArray {
+ return Hex.decode(this)
+}
+
+fun HexKey.toDisplayHexKey(): String {
+ return this.toDisplayHex()
+}
+
+fun decodePublicKey(key: String): ByteArray {
+ val pattern = Pattern.compile(".+@.+\\.[a-z]+")
+
+ return if (key.startsWith("nsec")) {
+ Persona(privKey = key.bechToBytes()).pubKey
+ } else if (key.startsWith("npub")) {
+ key.bechToBytes()
+ } else { //if (pattern.matcher(key).matches()) {
+ //} else {
+ Hex.decode(key)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt
new file mode 100644
index 000000000..6b079d313
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt
@@ -0,0 +1,224 @@
+package com.vitorpamplona.amethyst.model
+
+import android.util.Log
+import androidx.lifecycle.LiveData
+import com.fasterxml.jackson.databind.DeserializationFeature
+import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import java.io.ByteArrayInputStream
+import java.time.Instant
+import java.time.ZoneId
+import java.time.format.DateTimeFormatter
+import java.util.Collections
+import java.util.concurrent.ConcurrentHashMap
+import nostr.postr.events.ContactListEvent
+import nostr.postr.events.DeletionEvent
+import nostr.postr.events.MetadataEvent
+import nostr.postr.events.PrivateDmEvent
+import nostr.postr.events.RecommendRelayEvent
+import nostr.postr.events.TextNoteEvent
+import nostr.postr.toHex
+
+
+object LocalCache {
+ val metadataParser = jacksonObjectMapper()
+ .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
+ .readerFor(UserMetadata::class.java)
+
+ val users = ConcurrentHashMap()
+ val notes = ConcurrentHashMap()
+
+ @Synchronized
+ fun getOrCreateUser(pubkey: ByteArray): User {
+ val key = pubkey.toHexKey()
+ return users[key] ?: run {
+ val answer = User(pubkey)
+ users.put(key, answer)
+ answer
+ }
+ }
+
+ @Synchronized
+ fun getOrCreateNote(idHex: String): Note {
+ return notes[idHex] ?: run {
+ val answer = Note(idHex)
+ notes.put(idHex, answer)
+ answer
+ }
+ }
+
+ fun consume(event: MetadataEvent) {
+ //Log.d("MT", "New User ${users.size} ${event.contactMetaData.name}")
+
+ // new event
+ val oldUser = getOrCreateUser(event.pubKey)
+ if (event.createdAt > oldUser.updatedMetadataAt) {
+ val newUser = try {
+ metadataParser.readValue(ByteArrayInputStream(event.content.toByteArray(Charsets.UTF_8)), UserMetadata::class.java)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ Log.w("MT", "Content Parse Error ${e.localizedMessage} ${event.content}")
+ return
+ }
+
+ oldUser.updateUserInfo(newUser, event.createdAt)
+ } else {
+ //Log.d("MT","Relay sent a previous Metadata Event ${oldUser.toBestDisplayName()} ${formattedDateTime(event.createdAt)} > ${formattedDateTime(oldUser.updatedAt)}")
+ }
+ }
+
+ fun formattedDateTime(timestamp: Long): String {
+ return Instant.ofEpochSecond(timestamp).atZone(ZoneId.systemDefault())
+ .format(DateTimeFormatter.ofPattern("uuuu MMM d hh:mm a"))
+ }
+
+ fun consume(event: TextNoteEvent) {
+ val note = getOrCreateNote(event.id.toHex())
+
+ // Already processed this event.
+ if (note.event != null) return
+
+ val author = getOrCreateUser(event.pubKey)
+ val mentions = Collections.synchronizedList(event.mentions.map { getOrCreateUser(decodePublicKey(it)) })
+ val replyTo = Collections.synchronizedList(event.replyTos.map { getOrCreateNote(it) }.toMutableList())
+
+ note.loadEvent(event, author, mentions, replyTo)
+
+ //Log.d("TN", "New Note (${notes.size},${users.size}) ${note.author?.toBestDisplayName()} ${note.event?.content} ${formattedDateTime(event.createdAt)}")
+
+ // Prepares user's profile view.
+ author.notes.add(note)
+
+ // Adds notifications to users.
+ mentions.forEach {
+ it.taggedPosts.add(note)
+ }
+ replyTo.forEach {
+ it.author?.taggedPosts?.add(note)
+ }
+
+ // Counts the replies
+ replyTo.forEach {
+ it.addReply(note)
+ }
+
+ refreshObservers()
+ }
+
+ fun consume(event: RecommendRelayEvent) {
+ //Log.d("RR", event.toJson())
+ }
+
+ fun consume(event: ContactListEvent) {
+ val user = getOrCreateUser(event.pubKey)
+ //Log.d("CL", "${user.toBestDisplayName()} ${event.follows}")
+
+ if (event.createdAt > user.updatedFollowsAt) {
+ user.updateFollows(
+ event.follows.map {
+ try {
+ val pubKey = decodePublicKey(it.pubKeyHex)
+ getOrCreateUser(pubKey)
+ } catch (e: Exception) {
+ println("Could not parse Hex key: ${it.pubKeyHex}")
+ println(event.toJson())
+ e.printStackTrace()
+ null
+ }
+ }.filterNotNull(),
+ event.createdAt
+ )
+ }
+
+ refreshObservers()
+ }
+
+ fun consume(event: PrivateDmEvent) {
+ //Log.d("PM", event.toJson())
+ }
+
+ fun consume(event: DeletionEvent) {
+ //Log.d("DEL", event.toJson())
+ }
+
+ fun consume(event: RepostEvent) {
+ val note = getOrCreateNote(event.id.toHex())
+
+ // Already processed this event.
+ if (note.event != null) return
+
+ //Log.d("TN", "New Boost (${notes.size},${users.size}) ${note.author.toBestDisplayName()} ${formattedDateTime(event.createdAt)}")
+
+ val author = getOrCreateUser(event.pubKey)
+ val mentions = event.originalAuthor.map { getOrCreateUser(decodePublicKey(it)) }.toList()
+ val repliesTo = event.boostedPost.map { getOrCreateNote(it) }.toMutableList()
+
+ note.loadEvent(event, author, mentions, repliesTo)
+
+ // Prepares user's profile view.
+ author.notes.add(note)
+
+ // Adds notifications to users.
+ mentions.forEach {
+ it.taggedPosts.add(note)
+ }
+ repliesTo.forEach {
+ it.author?.taggedPosts?.add(note)
+ }
+
+ // Counts the replies
+ repliesTo.forEach {
+ it.addBoost(note)
+ }
+
+ refreshObservers()
+ }
+
+ fun consume(event: ReactionEvent) {
+ val note = getOrCreateNote(event.id.toHex())
+
+ // Already processed this event.
+ if (note.event != null) return
+
+ val author = getOrCreateUser(event.pubKey)
+ val mentions = event.originalAuthor.map { getOrCreateUser(decodePublicKey(it)) }
+ val repliesTo = event.originalPost.map { getOrCreateNote(it) }.toMutableList()
+
+ note.loadEvent(event, author, mentions, repliesTo)
+
+ //Log.d("RE", "New Reaction ${event.content} (${notes.size},${users.size}) ${note.author?.toBestDisplayName()} ${formattedDateTime(event.createdAt)}")
+
+ // Adds notifications to users.
+ mentions.forEach {
+ it.taggedPosts.add(note)
+ }
+ repliesTo.forEach {
+ it.author?.taggedPosts?.add(note)
+ }
+
+ if (event.content == "" || event.content == "+" || event.content == "\uD83E\uDD19") {
+ // Counts the replies
+ repliesTo.forEach {
+ it.addReaction(note)
+ }
+ }
+ }
+
+ // Observers line up here.
+ val live: LocalCacheLiveData = LocalCacheLiveData(this)
+
+ private fun refreshObservers() {
+ live.refresh()
+ }
+}
+
+class LocalCacheLiveData(val cache: LocalCache): LiveData(LocalCacheState(cache)) {
+ fun refresh() {
+ postValue(LocalCacheState(cache))
+ }
+}
+
+class LocalCacheState(val cache: LocalCache) {
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt
new file mode 100644
index 000000000..0ac85eeff
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Note.kt
@@ -0,0 +1,79 @@
+package com.vitorpamplona.amethyst.model
+
+import androidx.lifecycle.LiveData
+import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource
+import com.vitorpamplona.amethyst.ui.note.toDisplayHex
+import fr.acinq.secp256k1.Hex
+import java.util.Collections
+import nostr.postr.events.Event
+
+class Note(val idHex: String) {
+ val id = Hex.decode(idHex)
+ val idDisplayHex = id.toDisplayHex()
+
+ var event: Event? = null
+ var author: User? = null
+ var mentions: List? = null
+ var replyTo: MutableList? = null
+
+ val replies = Collections.synchronizedSet(mutableSetOf())
+ val reactions = Collections.synchronizedSet(mutableSetOf())
+ val boosts = Collections.synchronizedSet(mutableSetOf())
+
+ fun loadEvent(event: Event, author: User, mentions: List, replyTo: MutableList) {
+ this.event = event
+ this.author = author
+ this.mentions = mentions
+ this.replyTo = replyTo
+
+ refreshObservers()
+ }
+
+ fun addReply(note: Note) {
+ if (replies.add(note))
+ refreshObservers()
+ }
+
+ fun addBoost(note: Note) {
+ if (boosts.add(note))
+ refreshObservers()
+ }
+
+ fun addReaction(note: Note) {
+ if (reactions.add(note))
+ refreshObservers()
+ }
+
+ fun isReactedBy(user: User): Boolean {
+ return reactions.any { it.author == user }
+ }
+
+ fun isBoostedBy(user: User): Boolean {
+ return boosts.any { it.author == user }
+ }
+
+ // Observers line up here.
+ val live: NoteLiveData = NoteLiveData(this)
+
+ private fun refreshObservers() {
+ live.refresh()
+ }
+}
+
+class NoteLiveData(val note: Note): LiveData(NoteState(note)) {
+ fun refresh() {
+ postValue(NoteState(note))
+ }
+
+ override fun onActive() {
+ super.onActive()
+ NostrSingleEventDataSource.add(note.idHex)
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ NostrSingleEventDataSource.remove(note.idHex)
+ }
+}
+
+class NoteState(val note: Note)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt
new file mode 100644
index 000000000..d5bd240ce
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt
@@ -0,0 +1,98 @@
+package com.vitorpamplona.amethyst.model
+
+import androidx.lifecycle.LiveData
+import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource
+import com.vitorpamplona.amethyst.ui.note.toDisplayHex
+import java.util.Collections
+
+class User(val pubkey: ByteArray) {
+ val pubkeyHex = pubkey.toHexKey()
+ val pubkeyDisplayHex = pubkey.toDisplayHex()
+
+ var info = UserMetadata()
+
+ var updatedMetadataAt: Long = 0;
+ var updatedFollowsAt: Long = 0;
+
+ val notes = Collections.synchronizedSet(mutableSetOf())
+ val follows = Collections.synchronizedSet(mutableSetOf())
+ val taggedPosts = Collections.synchronizedSet(mutableSetOf())
+
+ var follower: Number? = null
+
+ fun toBestDisplayName(): String {
+ return bestDisplayName() ?: bestUsername() ?: pubkeyDisplayHex
+ }
+
+ fun bestUsername(): String? {
+ return info.name?.ifBlank { null } ?: info.username?.ifBlank { null }
+ }
+
+ fun bestDisplayName(): String? {
+ return info.displayName?.ifBlank { null } ?: info.display_name?.ifBlank { null }
+ }
+
+ fun profilePicture(): String {
+ if (info.picture.isNullOrBlank()) info.picture = null
+ return info.picture ?: "https://robohash.org/${pubkeyHex}.png"
+ }
+
+ fun updateFollows(newFollows: List, updateAt: Long) {
+ follows.clear()
+ follows.addAll(newFollows)
+ updatedFollowsAt = updateAt
+
+ live.refresh()
+ }
+
+ fun updateUserInfo(newUserInfo: UserMetadata, updateAt: Long) {
+ info = newUserInfo
+ updatedMetadataAt = updateAt
+
+ live.refresh()
+ }
+
+ // Observers line up here.
+ val live: UserLiveData = UserLiveData(this)
+
+ private fun refreshObservers() {
+ live.refresh()
+ }
+}
+
+class UserMetadata {
+ var name: String? = null
+ var username: String? = null
+ var display_name: String? = null
+ var displayName: String? = null
+ var picture: String? = null
+ var website: String? = null
+ var about: String? = null
+ var nip05: String? = null
+ var domain: String? = null
+ var lud06: String? = null
+ var lud16: String? = null
+
+ var publish: String? = null
+ var iris: String? = null
+ var main_relay: String? = null
+ var twitter: String? = null
+}
+
+class UserLiveData(val user: User): LiveData(UserState(user)) {
+ fun refresh() {
+ postValue(UserState(user))
+ }
+
+ override fun onActive() {
+ super.onActive()
+ NostrSingleUserDataSource.add(user.pubkeyHex)
+ }
+
+ override fun onInactive() {
+ super.onInactive()
+ NostrSingleUserDataSource.remove(user.pubkeyHex)
+ }
+}
+
+class UserState(val user: User)
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt
new file mode 100644
index 000000000..f2bdeada8
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Channel.kt
@@ -0,0 +1,10 @@
+package com.vitorpamplona.amethyst.service
+
+import java.util.UUID
+import nostr.postr.JsonFilter
+
+data class Channel (
+ val id: String = UUID.randomUUID().toString().substring(0,4)
+) {
+ var filter: JsonFilter? = null // Inactive when null
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt
new file mode 100644
index 000000000..a4ef69d71
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Constants.kt
@@ -0,0 +1,24 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.service.relays.Relay
+
+object Constants {
+ val defaultRelays = arrayOf(
+ Relay("wss://nostr.bitcoiner.social", read = true, write = true),
+ Relay("wss://relay.nostr.bg", read = true, write = true),
+ //Relay("wss://brb.io", read = true, write = true),
+ Relay("wss://nostr.v0l.io", read = true, write = true),
+ Relay("wss://nostr.rocks", read = true, write = true),
+ Relay("wss://relay.damus.io", read = true, write = true),
+ Relay("wss://nostr.fmt.wiz.biz", read = true, write = true),
+ Relay("wss://nostr.oxtr.dev", read = true, write = true),
+ Relay("wss://nostr-relay.wlvs.space", read = true, write = true),
+ //Relay("wss://nostr-2.zebedee.cloud", read = true, write = true),
+ Relay("wss://nostr-pub.wellorder.net", read = true, write = true),
+ Relay("wss://nostr.mom", read = true, write = true),
+ Relay("wss://nostr.orangepill.dev", read = true, write = true),
+ //Relay("wss://nostr-pub.semisol.dev", read = true, write = true),
+ Relay("wss://nostr.onsats.org", read = true, write = true),
+ Relay("wss://nostr.sandwich.farm", read = true, write = true)
+ )
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt
new file mode 100644
index 000000000..b07b8d313
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrAccountDataSource.kt
@@ -0,0 +1,74 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.model.UserState
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import nostr.postr.JsonFilter
+import nostr.postr.events.TextNoteEvent
+import nostr.postr.toHex
+
+object NostrAccountDataSource: NostrDataSource("AccountData") {
+ lateinit var account: Account
+
+ private val cacheListener: (UserState) -> Unit = {
+ resetFilters()
+ }
+
+ override fun start() {
+ if (this::account.isInitialized)
+ account.userProfile().live.observeForever(cacheListener)
+ super.start()
+ }
+
+ override fun stop() {
+ super.stop()
+ if (this::account.isInitialized)
+ account.userProfile().live.removeObserver(cacheListener)
+ }
+
+ fun createAccountFilter(): JsonFilter {
+ return JsonFilter(
+ authors = listOf(account.userProfile().pubkeyHex),
+ since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 4), // 4 days
+ )
+ }
+
+ val accountChannel = requestNewChannel()
+
+ fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return list1.size == list2.size && list1.toSet() == list2.toSet()
+ }
+
+ fun equalAuthors(list1:JsonFilter?, list2:JsonFilter?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return equalsIgnoreOrder(list1.authors, list2.authors)
+ }
+
+ override fun feed(): List {
+ val user = account.userProfile()
+ val follows = user.follows.map { it.pubkeyHex }.plus(user.pubkeyHex).toSet()
+
+ return LocalCache.notes.values
+ .filter { (it.event is TextNoteEvent || it.event is RepostEvent) && it.author?.pubkeyHex in follows }
+ .sortedBy { it.event!!.createdAt }
+ .reversed()
+ }
+
+ override fun updateChannelFilters() {
+ // gets everthing about the user logged in
+ val newAccountFilter = createAccountFilter()
+
+ if (!equalAuthors(newAccountFilter, accountChannel.filter)) {
+ accountChannel.filter = newAccountFilter
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt
new file mode 100644
index 000000000..090e29dca
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrDataSource.kt
@@ -0,0 +1,135 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import com.vitorpamplona.amethyst.service.relays.Client
+import com.vitorpamplona.amethyst.service.relays.Relay
+import java.util.Collections
+import nostr.postr.events.ContactListEvent
+import nostr.postr.events.DeletionEvent
+import nostr.postr.events.Event
+import nostr.postr.events.MetadataEvent
+import nostr.postr.events.PrivateDmEvent
+import nostr.postr.events.RecommendRelayEvent
+import nostr.postr.events.TextNoteEvent
+
+abstract class NostrDataSource(val debugName: String) {
+ private val channels = Collections.synchronizedSet(mutableSetOf())
+ private val channelIds = Collections.synchronizedSet(mutableSetOf())
+
+ private val clientListener = object : Client.Listener() {
+ override fun onEvent(event: Event, subscriptionId: String, relay: Relay) {
+ if (subscriptionId in channelIds) {
+ when (event) {
+ is MetadataEvent -> LocalCache.consume(event)
+ is TextNoteEvent -> LocalCache.consume(event)
+ is RecommendRelayEvent -> LocalCache.consume(event)
+ is ContactListEvent -> LocalCache.consume(event)
+ is PrivateDmEvent -> LocalCache.consume(event)
+ is DeletionEvent -> LocalCache.consume(event)
+ is RepostEvent -> LocalCache.consume(event)
+ is ReactionEvent -> LocalCache.consume(event)
+ else -> when (event.kind) {
+ RepostEvent.kind -> LocalCache.consume(RepostEvent(event.id, event.pubKey, event.createdAt, event.tags, event.content, event.sig))
+ ReactionEvent.kind -> LocalCache.consume(ReactionEvent(event.id, event.pubKey, event.createdAt, event.tags, event.content, event.sig))
+ }
+ }
+ }
+ }
+
+ override fun onError(error: Error, subscriptionId: String, relay: Relay) {
+ //Log.e("ERROR", "Relay ${relay.url}: ${error.message}")
+ }
+
+ override fun onRelayStateChange(type: Relay.Type, relay: Relay) {
+ //Log.d("RELAY", "Relay ${relay.url} ${when (type) {
+ // Relay.Type.CONNECT -> "connected."
+ // Relay.Type.DISCONNECT -> "disconnected."
+ // Relay.Type.DISCONNECTING -> "disconnecting."
+ // Relay.Type.EOSE -> "sent all events it had stored."
+ //}}")
+
+ /*
+ if (type == Relay.Type.EOSE) {
+ // One everything is loaded, if new users are found, update filters
+ resetFilters()
+ }*/
+ }
+ }
+
+ init {
+ Client.subscribe(clientListener)
+ }
+
+ open fun start() {
+ resetFilters()
+ }
+
+ open fun stop() {
+ channels.forEach { channel ->
+ if (channel.filter != null) // if it is active, close
+ Client.close(channel.id)
+ }
+ }
+
+ fun loadTop(): List {
+ return feed().take(100)
+ }
+
+ fun requestNewChannel(): Channel {
+ val newChannel = Channel()
+ channels.add(newChannel)
+ channelIds.add(newChannel.id)
+ return newChannel
+ }
+
+ fun dismissChannel(channel: Channel) {
+ Client.close(channel.id)
+ channels.remove(channel)
+ channelIds.remove(channel.id)
+ }
+
+ fun resetFilters() {
+ // saves the channels that are currently active
+ val activeChannels = channels.filter { it.filter != null }
+ // saves the current content to only update if it changes
+ val currentFilter = activeChannels.associate { it.id to it.filter!!.toJson() }
+
+ updateChannelFilters()
+
+ // Makes sure to only send an updated filter when it actually changes.
+ channels.forEach { channel ->
+ val channelsNewFilter = channel.filter
+
+ if (channel in activeChannels) {
+ if (channelsNewFilter == null) {
+ // was active and is not active anymore, just close.
+ Client.close(channel.id)
+ } else {
+ // was active and is still active, check if it has changed.
+ if (channelsNewFilter.toJson() != currentFilter[channel.id]) {
+ Client.close(channel.id)
+ Client.sendFilter(channel.id, mutableListOf(channelsNewFilter))
+ } else {
+ // hasn't changed, does nothing.
+ Client.sendFilterOnlyIfDisconnected(channel.id, mutableListOf(channelsNewFilter))
+ }
+ }
+ } else {
+ if (channelsNewFilter == null) {
+ // was not active and is still not active, does nothing
+ } else {
+ // was not active and becomes active, sends the filter.
+ if (channelsNewFilter.toJson() != currentFilter[channel.id]) {
+ Client.sendFilter(channel.id, mutableListOf(channelsNewFilter))
+ }
+ }
+ }
+ }
+ }
+
+ abstract fun updateChannelFilters()
+ abstract fun feed(): List
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt
new file mode 100644
index 000000000..d9aa365ee
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrGlobalDataSource.kt
@@ -0,0 +1,47 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.LocalCache
+import nostr.postr.JsonFilter
+import nostr.postr.events.TextNoteEvent
+
+object NostrGlobalDataSource: NostrDataSource("GlobalFeed") {
+ val fifteenMinutes = (60*15) // 15 mins
+
+ fun createGlobalFilter() = JsonFilter(
+ kinds = listOf(TextNoteEvent.kind),
+ since = System.currentTimeMillis() / 1000 - fifteenMinutes
+ )
+
+ val globalFeedChannel = requestNewChannel()
+
+ fun equalTime(list1:Long?, list2:Long?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return Math.abs(list1 - list2) < (4*fifteenMinutes)
+ }
+
+ fun equalFilters(list1:JsonFilter?, list2:JsonFilter?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return equalTime(list1.since, list2.since)
+ }
+
+ override fun feed() = LocalCache.notes.values
+ .filter {
+ it.event is TextNoteEvent && (it.event as TextNoteEvent).replyTos.isEmpty()
+ }
+ .sortedBy { it.event!!.createdAt }
+ .reversed()
+
+ override fun updateChannelFilters() {
+ val newFilter = createGlobalFilter()
+
+ if (!equalFilters(newFilter, globalFeedChannel.filter)) {
+ globalFeedChannel.filter = newFilter
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt
new file mode 100644
index 000000000..7e9e241ce
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrHomeDataSource.kt
@@ -0,0 +1,80 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.model.UserState
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import nostr.postr.JsonFilter
+import nostr.postr.events.TextNoteEvent
+import nostr.postr.toHex
+
+object NostrHomeDataSource: NostrDataSource("HomeFeed") {
+ lateinit var account: Account
+
+ private val cacheListener: (UserState) -> Unit = {
+ resetFilters()
+ }
+
+ override fun start() {
+ if (this::account.isInitialized)
+ account.userProfile().live.observeForever(cacheListener)
+ super.start()
+ }
+
+ override fun stop() {
+ super.stop()
+ if (this::account.isInitialized)
+ account.userProfile().live.removeObserver(cacheListener)
+ }
+
+ fun createFollowAccountsFilter(): JsonFilter? {
+ val follows = account.userProfile().follows?.map {
+ it.pubkey.toHex().substring(0, 6)
+ }
+
+ if (follows == null || follows.isEmpty()) return null
+
+ return JsonFilter(
+ kinds = listOf(TextNoteEvent.kind, RepostEvent.kind),
+ authors = follows,
+ since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 1), // 24 hours
+ )
+ }
+
+ val followAccountChannel = requestNewChannel()
+
+ fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return list1.size == list2.size && list1.toSet() == list2.toSet()
+ }
+
+ fun equalAuthors(list1:JsonFilter?, list2:JsonFilter?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return equalsIgnoreOrder(list1.authors, list2.authors)
+ }
+
+ override fun feed(): List {
+ val user = account.userProfile()
+ val follows = user.follows.map { it.pubkeyHex }.plus(user.pubkeyHex).toSet()
+
+ return LocalCache.notes.values
+ .filter { (it.event is TextNoteEvent || it.event is RepostEvent) && it.author?.pubkeyHex in follows }
+ .sortedBy { it.event!!.createdAt }
+ .reversed()
+ }
+
+ override fun updateChannelFilters() {
+ val newFollowAccountsFilter = createFollowAccountsFilter()
+
+ if (!equalAuthors(newFollowAccountsFilter, followAccountChannel.filter)) {
+ followAccountChannel.filter = newFollowAccountsFilter
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt
new file mode 100644
index 000000000..b8066eca7
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrNotificationDataSource.kt
@@ -0,0 +1,48 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.Note
+import nostr.postr.JsonFilter
+
+object NostrNotificationDataSource: NostrDataSource("GlobalFeed") {
+ lateinit var account: Account
+
+ fun createGlobalFilter() = JsonFilter(
+ since = System.currentTimeMillis() / 1000 - (60 * 60 * 24 * 7), // 2 days
+ tags = mapOf("p" to listOf(account.userProfile().pubkeyHex).filterNotNull())
+ )
+
+ val notificationChannel = requestNewChannel()
+
+ fun equalsIgnoreOrder(list1:List?, list2:List?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return list1.size == list2.size && list1.toSet() == list2.toSet()
+ }
+
+ fun equalFilters(list1:JsonFilter?, list2:JsonFilter?): Boolean {
+ if (list1 == null && list2 == null) return true
+ if (list1 == null) return false
+ if (list2 == null) return false
+
+ return equalsIgnoreOrder(list1.tags?.get("p"), list2.tags?.get("p"))
+ && equalsIgnoreOrder(list1.tags?.get("e"), list2.tags?.get("e"))
+ }
+
+ override fun feed(): List {
+ return account.userProfile().taggedPosts
+ .filter { it.event != null }
+ .sortedBy { it.event!!.createdAt }
+ .reversed()
+ }
+
+ override fun updateChannelFilters() {
+ val newFilter = createGlobalFilter()
+
+ if (!equalFilters(newFilter, notificationChannel.filter)) {
+ notificationChannel.filter = newFilter
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt
new file mode 100644
index 000000000..5faeeef53
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleEventDataSource.kt
@@ -0,0 +1,62 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.Note
+import java.util.Collections
+import nostr.postr.JsonFilter
+
+object NostrSingleEventDataSource: NostrDataSource("SingleEventFeed") {
+ val eventsToWatch = Collections.synchronizedList(mutableListOf())
+
+ fun createRepliesAndReactionsFilter(): JsonFilter? {
+ val reactionsToWatch = eventsToWatch.map { it.substring(0, 8) }
+
+ if (reactionsToWatch.isEmpty()) {
+ return null
+ }
+
+ return JsonFilter(
+ tags = mapOf("e" to reactionsToWatch)
+ )
+ }
+
+ fun createLoadEventsIfNotLoadedFilter(): JsonFilter? {
+ val eventsToLoad = eventsToWatch
+ .map { LocalCache.notes[it] }
+ .filterNotNull()
+ .filter { it.event == null }
+ .map { it.idHex.substring(0, 8) }
+
+ if (eventsToLoad.isEmpty()) {
+ return null
+ }
+
+ return JsonFilter(
+ ids = eventsToLoad
+ )
+ }
+
+ val repliesAndReactionsChannel = requestNewChannel()
+ val loadEventsChannel = requestNewChannel()
+
+ override fun feed(): List {
+ return eventsToWatch.map {
+ LocalCache.notes[it]
+ }.filterNotNull()
+ }
+
+ override fun updateChannelFilters() {
+ repliesAndReactionsChannel.filter = createRepliesAndReactionsFilter()
+ loadEventsChannel.filter = createLoadEventsIfNotLoadedFilter()
+ }
+
+ fun add(eventId: String) {
+ eventsToWatch.add(eventId)
+ resetFilters()
+ }
+
+ fun remove(eventId: String) {
+ eventsToWatch.remove(eventId)
+ resetFilters()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt
new file mode 100644
index 000000000..8cef84032
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/NostrSingleUserDataSource.kt
@@ -0,0 +1,42 @@
+package com.vitorpamplona.amethyst.service
+
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.Note
+import java.util.Collections
+import nostr.postr.JsonFilter
+import nostr.postr.events.MetadataEvent
+
+object NostrSingleUserDataSource: NostrDataSource("SingleUserFeed") {
+ val usersToWatch = Collections.synchronizedList(mutableListOf())
+
+ fun createUserFilter(): JsonFilter? {
+ if (usersToWatch.isEmpty()) return null
+
+ return JsonFilter(
+ kinds = listOf(MetadataEvent.kind),
+ authors = usersToWatch.map { it.substring(0, 8) }
+ )
+ }
+
+ val userChannel = requestNewChannel()
+
+ override fun feed(): List {
+ return usersToWatch.map {
+ LocalCache.notes[it]
+ }.filterNotNull()
+ }
+
+ override fun updateChannelFilters() {
+ userChannel.filter = createUserFilter()
+ }
+
+ fun add(userId: String) {
+ usersToWatch.add(userId)
+ resetFilters()
+ }
+
+ fun remove(userId: String) {
+ usersToWatch.remove(userId)
+ resetFilters()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt
new file mode 100644
index 000000000..85b26bfaf
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/ReactionEvent.kt
@@ -0,0 +1,37 @@
+package com.vitorpamplona.amethyst.service.model
+
+import java.util.Date
+import nostr.postr.Utils
+import nostr.postr.events.Event
+import nostr.postr.toHex
+
+class ReactionEvent (
+ id: ByteArray,
+ pubKey: ByteArray,
+ createdAt: Long,
+ tags: List>,
+ content: String,
+ sig: ByteArray
+): Event(id, pubKey, createdAt, kind, tags, content, sig) {
+
+ @Transient val originalPost: List
+ @Transient val originalAuthor: List
+
+ init {
+ originalPost = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) }
+ originalAuthor = tags.filter { it.firstOrNull() == "p" }.mapNotNull { it.getOrNull(1) }
+ }
+
+ companion object {
+ const val kind = 7
+
+ fun create(originalNote: Event, privateKey: ByteArray, createdAt: Long = Date().time / 1000): ReactionEvent {
+ val content = "+"
+ val pubKey = Utils.pubkeyCreate(privateKey)
+ val tags = listOf( listOf("e", originalNote.id.toHex()), listOf("p", originalNote.pubKey.toHex()))
+ val id = generateId(pubKey, createdAt, kind, tags, content)
+ val sig = Utils.sign(id, privateKey)
+ return ReactionEvent(id, pubKey, createdAt, tags, content, sig)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt
new file mode 100644
index 000000000..caf31c340
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/RepostEvent.kt
@@ -0,0 +1,41 @@
+package com.vitorpamplona.amethyst.service.model
+
+import java.util.Date
+import nostr.postr.Utils
+import nostr.postr.events.Event
+import nostr.postr.toHex
+
+class RepostEvent (
+ id: ByteArray,
+ pubKey: ByteArray,
+ createdAt: Long,
+ tags: List>,
+ content: String,
+ sig: ByteArray
+): Event(id, pubKey, createdAt, kind, tags, content, sig) {
+
+ @Transient val boostedPost: List
+ @Transient val originalAuthor: List
+
+ init {
+ boostedPost = tags.filter { it.firstOrNull() == "e" }.mapNotNull { it.getOrNull(1) }
+ originalAuthor = tags.filter { it.firstOrNull() == "p" }.mapNotNull { it.getOrNull(1) }
+ }
+
+ companion object {
+ const val kind = 6
+
+ fun create(boostedPost: Event, privateKey: ByteArray, createdAt: Long = Date().time / 1000): RepostEvent {
+ val content = ""
+
+ val replyToPost = listOf("e", boostedPost.id.toHex())
+ val replyToAuthor = listOf("p", boostedPost.pubKey.toHex())
+
+ val pubKey = Utils.pubkeyCreate(privateKey)
+ val tags:List> = boostedPost.tags.plus(listOf(replyToPost, replyToAuthor))
+ val id = generateId(pubKey, createdAt, kind, tags, content)
+ val sig = Utils.sign(id, privateKey)
+ return RepostEvent(id, pubKey, createdAt, tags, content, sig)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt
new file mode 100644
index 000000000..5396db171
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Client.kt
@@ -0,0 +1,113 @@
+package com.vitorpamplona.amethyst.service.relays
+
+import com.vitorpamplona.amethyst.service.Constants
+import java.util.Collections
+import java.util.UUID
+import java.util.concurrent.ConcurrentHashMap
+import nostr.postr.JsonFilter
+import nostr.postr.events.Event
+
+/**
+ * The Nostr Client manages multiple personae the user may switch between. Events are received and
+ * published through multiple relays.
+ * Events are stored with their respective persona.
+ */
+object Client: RelayPool.Listener {
+ /**
+ * Lenient mode:
+ *
+ * true: For maximum compatibility. If you want to play ball with sloppy counterparts, use
+ * this.
+ * false: For developers who want to make protocol compliant counterparts. If your software
+ * produces events that fail to deserialize in strict mode, you should probably fix
+ * something.
+ **/
+ var lenient: Boolean = false
+ private val listeners = Collections.synchronizedSet(HashSet())
+ internal var relays = Constants.defaultRelays
+ internal val subscriptions = ConcurrentHashMap>()
+
+ fun connect(
+ relays: Array = Constants.defaultRelays
+ ) {
+ RelayPool.register(this)
+ RelayPool.loadRelays(relays.toList())
+ this.relays = relays
+ }
+
+ fun requestAndWatch(
+ subscriptionId: String = UUID.randomUUID().toString().substring(0..10),
+ filters: MutableList = mutableListOf(JsonFilter())
+ ) {
+ subscriptions[subscriptionId] = filters
+ RelayPool.requestAndWatch()
+ }
+
+ fun sendFilter(
+ subscriptionId: String = UUID.randomUUID().toString().substring(0..10),
+ filters: MutableList = mutableListOf(JsonFilter())
+ ) {
+ subscriptions[subscriptionId] = filters
+ RelayPool.sendFilter(subscriptionId)
+ }
+
+ fun sendFilterOnlyIfDisconnected(
+ subscriptionId: String = UUID.randomUUID().toString().substring(0..10),
+ filters: MutableList = mutableListOf(JsonFilter())
+ ) {
+ subscriptions[subscriptionId] = filters
+ RelayPool.sendFilterOnlyIfDisconnected(subscriptionId)
+ }
+
+ fun send(signedEvent: Event) {
+ RelayPool.send(signedEvent)
+ }
+
+ fun close(subscriptionId: String){
+ RelayPool.close(subscriptionId)
+ }
+
+ fun disconnect() {
+ RelayPool.unregister(this)
+ RelayPool.disconnect()
+ RelayPool.unloadRelays()
+ }
+
+ override fun onEvent(event: Event, subscriptionId: String, relay: Relay) {
+ listeners.forEach { it.onEvent(event, subscriptionId, relay) }
+ }
+
+ override fun onError(error: Error, subscriptionId: String, relay: Relay) {
+ listeners.forEach { it.onError(error, subscriptionId, relay) }
+ }
+
+ override fun onRelayStateChange(type: Relay.Type, relay: Relay) {
+ listeners.forEach { it.onRelayStateChange(type, relay) }
+ }
+
+ fun subscribe(listener: Listener) {
+ listeners.add(listener)
+ }
+
+ fun unsubscribe(listener: Listener): Boolean {
+ return listeners.remove(listener)
+ }
+
+
+ abstract class Listener {
+ /**
+ * A new message was received
+ */
+ open fun onEvent(event: Event, subscriptionId: String, relay: Relay) = Unit
+
+ /**
+ * A new or repeat message was received
+ */
+ open fun onError(error: Error, subscriptionId: String, relay: Relay) = Unit
+
+ /**
+ * Connected to or disconnected from a relay
+ */
+ open fun onRelayStateChange(type: Relay.Type, relay: Relay) = Unit
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
new file mode 100644
index 000000000..b5770cbe7
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt
@@ -0,0 +1,165 @@
+package com.vitorpamplona.amethyst.service.relays
+
+import com.google.gson.JsonElement
+import java.util.Collections
+import nostr.postr.JsonFilter
+import nostr.postr.events.Event
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+import okhttp3.WebSocket
+import okhttp3.WebSocketListener
+
+class Relay(
+ val url: String,
+ var read: Boolean = true,
+ var write: Boolean = true
+) {
+ private val httpClient = OkHttpClient()
+ private val listeners = Collections.synchronizedSet(HashSet())
+ private var socket: WebSocket? = null
+
+ fun register(listener: Listener) {
+ listeners.add(listener)
+ }
+
+ fun isConnected(): Boolean {
+ return socket != null
+ }
+
+ fun unregister(listener: Listener) = listeners.remove(listener)
+
+ fun requestAndWatch(reconnectTs: Long? = null) {
+ val request = Request.Builder().url(url).build()
+ val listener = object : WebSocketListener() {
+
+ override fun onOpen(webSocket: WebSocket, response: Response) {
+ // Sends everything.
+ Client.subscriptions.forEach {
+ sendFilter(requestId = it.key, reconnectTs = reconnectTs)
+ }
+ listeners.forEach { it.onRelayStateChange(this@Relay, Type.CONNECT) }
+ }
+
+ override fun onMessage(webSocket: WebSocket, text: String) {
+ try {
+ val msg = Event.gson.fromJson(text, JsonElement::class.java).asJsonArray
+ val type = msg[0].asString
+ val channel = msg[1].asString
+ when (type) {
+ "EVENT" -> {
+ val event = Event.fromJson(msg[2], Client.lenient)
+ listeners.forEach { it.onEvent(this@Relay, channel, event) }
+ }
+ "EOSE" -> listeners.forEach {
+ it.onRelayStateChange(this@Relay, Type.EOSE)
+ }
+ "NOTICE" -> listeners.forEach {
+ // "channel" being the second string in the string array ...
+ it.onError(this@Relay, channel, Error("Relay sent notice: $channel"))
+ }
+ "OK" -> listeners.forEach {
+ // "channel" being the second string in the string array ...
+ // Event was saved correctly?
+ }
+ else -> listeners.forEach {
+ it.onError(
+ this@Relay,
+ channel,
+ Error("Unknown type $type on channel $channel. Msg was $text")
+ )
+ }
+ }
+ } catch (t: Throwable) {
+ t.printStackTrace()
+ text.chunked(2000) { chunked ->
+ listeners.forEach { it.onError(this@Relay, "", Error("Problem with $chunked")) }
+ }
+ }
+ }
+
+ override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
+ listeners.forEach { it.onRelayStateChange(this@Relay, Type.DISCONNECTING) }
+ }
+
+ override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
+ socket = null
+ listeners.forEach { it.onRelayStateChange(this@Relay, Type.DISCONNECT) }
+ }
+
+ override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
+ t.printStackTrace()
+ listeners.forEach {
+ it.onError(this@Relay, "", Error("WebSocket Failure. Response: ${response}. Exception: ${t.message}", t))
+ }
+ }
+ }
+ socket = httpClient.newWebSocket(request, listener)
+ }
+
+ fun disconnect() {
+ //httpClient.dispatcher.executorService.shutdown()
+ socket?.close(1000, "Normal close")
+ }
+
+ fun sendFilter(requestId: String, reconnectTs: Long? = null) {
+ if (socket == null) {
+ requestAndWatch(reconnectTs)
+ } else {
+ val filters = if (reconnectTs != null) {
+ Client.subscriptions[requestId]?.let {
+ it.map { filter ->
+ JsonFilter(filter.ids, filter.authors, filter.kinds, filter.tags, since = reconnectTs)
+ }
+ } ?: error("No filter(s) found.")
+ } else {
+ Client.subscriptions[requestId] ?: error("No filter(s) found.")
+ }
+ val request = """["REQ","$requestId",${filters.joinToString(",") { it.toJson() }}]"""
+ //println("FILTERSSENT " + """["REQ","$requestId",${filters.joinToString(",") { it.toJson() }}]""")
+ socket!!.send(request)
+ }
+ }
+
+ fun sendFilterOnlyIfDisconnected(requestId: String, reconnectTs: Long? = null) {
+ if (socket == null) {
+ requestAndWatch(reconnectTs)
+ }
+ }
+
+ fun send(signedEvent: Event) {
+ if (write)
+ socket?.send("""["EVENT",${signedEvent.toJson()}]""")
+ }
+
+ fun close(subscriptionId: String){
+ socket?.send("""["CLOSE","$subscriptionId"]""")
+ }
+
+ enum class Type {
+ // Websocket connected
+ CONNECT,
+ // Websocket disconnecting
+ DISCONNECTING,
+ // Websocket disconnected
+ DISCONNECT,
+ // End Of Stored Events
+ EOSE
+ }
+
+ interface Listener {
+ /**
+ * A new message was received
+ */
+ fun onEvent(relay: Relay, subscriptionId: String, event: Event)
+
+ fun onError(relay: Relay, subscriptionId: String, error: Error)
+
+ /**
+ * Connected to or disconnected from a relay
+ *
+ * @param type is 0 for disconnect and 1 for connect
+ */
+ fun onRelayStateChange(relay: Relay, type: Type)
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt
new file mode 100644
index 000000000..7172ab76b
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/RelayPool.kt
@@ -0,0 +1,113 @@
+package com.vitorpamplona.amethyst.service.relays
+
+import androidx.lifecycle.LiveData
+import com.vitorpamplona.amethyst.service.Constants
+import java.util.Collections
+import nostr.postr.events.Event
+
+/**
+ * RelayPool manages the connection to multiple Relays and lets consumers deal with simple events.
+ */
+object RelayPool: Relay.Listener {
+ private val relays = Collections.synchronizedList(ArrayList())
+ private val listeners = Collections.synchronizedSet(HashSet())
+
+ fun report(): String {
+ val connected = relays.filter { it.isConnected() }
+ return "${connected.size}/${relays.size}"
+ }
+
+ fun loadRelays(relayList: List? = null){
+ if (!relayList.isNullOrEmpty()){
+ relayList.forEach { addRelay(it) }
+ } else {
+ Constants.defaultRelays.forEach { addRelay(it) }
+ }
+ }
+
+ fun unloadRelays() {
+ relays.toList().forEach { removeRelay(it) }
+ }
+
+ fun requestAndWatch() {
+ relays.forEach { it.requestAndWatch() }
+ }
+
+ fun sendFilter(subscriptionId: String) {
+ relays.forEach { it.sendFilter(subscriptionId) }
+ }
+
+ fun sendFilterOnlyIfDisconnected(subscriptionId: String) {
+ relays.forEach { it.sendFilterOnlyIfDisconnected(subscriptionId) }
+ }
+
+ fun send(signedEvent: Event) {
+ relays.forEach { it.send(signedEvent) }
+ }
+
+ fun close(subscriptionId: String){
+ relays.forEach { it.close(subscriptionId) }
+ }
+
+ fun disconnect() {
+ relays.forEach { it.disconnect() }
+ }
+
+ fun addRelay(relay: Relay) {
+ relay.register(this)
+ relays += relay
+ }
+
+ fun removeRelay(relay: Relay): Boolean {
+ relay.unregister(this)
+ return relays.remove(relay)
+ }
+
+ fun getRelays(): List = relays
+
+ fun register(listener: Listener) {
+ listeners.add(listener)
+ }
+
+ fun unregister(listener: Listener): Boolean {
+ return listeners.remove(listener)
+ }
+
+ interface Listener {
+ fun onEvent(event: Event, subscriptionId: String, relay: Relay)
+
+ fun onError(error: Error, subscriptionId: String, relay: Relay)
+
+ fun onRelayStateChange(type: Relay.Type, relay: Relay)
+ }
+
+ @Synchronized
+ override fun onEvent(relay: Relay, subscriptionId: String, event: Event) {
+ listeners.forEach { it.onEvent(event, subscriptionId, relay) }
+ }
+
+ override fun onError(relay: Relay, subscriptionId: String, error: Error) {
+ listeners.forEach { it.onError(error, subscriptionId, relay) }
+ refreshObservers()
+ }
+
+ override fun onRelayStateChange(relay: Relay, type: Relay.Type) {
+ listeners.forEach { it.onRelayStateChange(type, relay) }
+ refreshObservers()
+ }
+
+ // Observers line up here.
+ val live: RelayPoolLiveData = RelayPoolLiveData(this)
+
+ private fun refreshObservers() {
+ live.refresh()
+ }
+}
+
+class RelayPoolLiveData(val relays: RelayPool): LiveData(RelayPoolState(relays)) {
+ fun refresh() {
+ postValue(RelayPoolState(relays))
+ }
+}
+
+class RelayPoolState(val relays: RelayPool)
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
new file mode 100644
index 000000000..c873ec925
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/MainActivity.kt
@@ -0,0 +1,60 @@
+package com.vitorpamplona.amethyst.ui
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Surface
+import androidx.compose.ui.Modifier
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.KeyStorage
+import com.vitorpamplona.amethyst.service.NostrAccountDataSource
+import com.vitorpamplona.amethyst.service.NostrGlobalDataSource
+import com.vitorpamplona.amethyst.service.NostrHomeDataSource
+import com.vitorpamplona.amethyst.service.NostrNotificationDataSource
+import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource
+import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource
+import com.vitorpamplona.amethyst.service.relays.Client
+import com.vitorpamplona.amethyst.ui.screen.AccountScreen
+import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
+import com.vitorpamplona.amethyst.ui.theme.AmethystTheme
+
+class MainActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ AmethystTheme {
+ // A surface container using the 'background' color from the theme
+ Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
+
+ val accountViewModel: AccountStateViewModel = viewModel {
+ AccountStateViewModel(KeyStorage().encryptedPreferences(applicationContext))
+ }
+
+ AccountScreen(accountViewModel)
+ }
+ }
+ }
+
+ Client.lenient = true
+ }
+
+ override fun onResume() {
+ super.onResume()
+ Client.connect()
+ }
+
+ override fun onPause() {
+ NostrAccountDataSource.stop()
+ NostrHomeDataSource.stop()
+
+ NostrGlobalDataSource.stop()
+ NostrNotificationDataSource.stop()
+ NostrSingleEventDataSource.stop()
+ NostrSingleUserDataSource.stop()
+ Client.disconnect()
+ super.onPause()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt
new file mode 100644
index 000000000..42fa5f570
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostView.kt
@@ -0,0 +1,157 @@
+package com.vitorpamplona.amethyst.ui.actions
+
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.OutlinedTextField
+import androidx.compose.material.Surface
+import androidx.compose.material.Text
+import androidx.compose.material.TextFieldDefaults
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.input.KeyboardCapitalization
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.window.Dialog
+import androidx.compose.ui.window.DialogProperties
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.Note
+import nostr.postr.events.TextNoteEvent
+
+class PostViewModel: ViewModel() {
+ var account: Account? = null
+ var message by mutableStateOf("")
+ var replyingTo: Note? = null
+
+ fun sendPost() {
+ account?.sendPost(message, replyingTo)
+ }
+}
+
+@Composable
+fun NewPostView(onClose: () -> Unit, replyingTo: Note? = null, account: Account) {
+ val postViewModel: PostViewModel = viewModel().apply {
+ this.replyingTo = replyingTo
+ this.account = account
+ }
+
+ val dialogProperties = DialogProperties()
+ Dialog(
+ onDismissRequest = { onClose() }, properties = dialogProperties
+ ) {
+ Surface(
+ modifier = Modifier
+ .fillMaxWidth()
+ .fillMaxHeight(0.5f)
+ ) {
+ Column(
+ modifier = Modifier.padding(10.dp)
+ ) {
+ Row(
+ modifier = Modifier
+ .fillMaxWidth(),
+ horizontalArrangement = Arrangement.SpaceBetween,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ CloseButton(onCancel = onClose)
+
+ PostButton(
+ onPost = {
+ postViewModel.sendPost()
+ onClose()
+ }
+ )
+ }
+
+ if (replyingTo != null && replyingTo.event is TextNoteEvent) {
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ ) {
+ val replyList = replyingTo.replyTo!!.plus(replyingTo).joinToString(", ", "", "", 2) { it.idDisplayHex }
+ val withList = replyingTo.mentions!!.plus(replyingTo.author!!).joinToString(", ", "", "", 2) { it.toBestDisplayName() }
+
+ Text(
+ "in reply to ${replyList} with ${withList}",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ }
+
+ OutlinedTextField(
+ value = postViewModel.message,
+ onValueChange = { postViewModel.message = it },
+ keyboardOptions = KeyboardOptions.Default.copy(
+ capitalization = KeyboardCapitalization.Sentences
+ ),
+ modifier = Modifier.fillMaxWidth().fillMaxHeight()
+ .border(
+ width = 1.dp,
+ color = MaterialTheme.colors.surface,
+ shape = RoundedCornerShape(8.dp)
+ ),
+ placeholder = {
+ Text(
+ text = "What's on your mind?",
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ },
+ colors = TextFieldDefaults
+ .outlinedTextFieldColors(
+ unfocusedBorderColor = Color.Transparent,
+ focusedBorderColor = Color.Transparent
+ )
+
+ )
+ }
+ }
+ }
+}
+
+@Composable
+private fun CloseButton(onCancel: () -> Unit) {
+ Button(
+ onClick = {
+ onCancel()
+ },
+ shape = RoundedCornerShape(20.dp),
+ colors = ButtonDefaults
+ .buttonColors(
+ backgroundColor = Color.Gray
+ )
+ ) {
+ Text(text = "Cancel", color = Color.White)
+ }
+}
+
+@Composable
+private fun PostButton(onPost: () -> Unit = {}) {
+ Button(
+ onClick = {
+ onPost()
+ },
+ shape = RoundedCornerShape(20.dp),
+ colors = ButtonDefaults
+ .buttonColors(
+ backgroundColor = MaterialTheme.colors.primary
+ )
+ ) {
+ Text(text = "Post", color = Color.White)
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt
new file mode 100644
index 000000000..78e251a15
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/buttons/NewNoteButton.kt
@@ -0,0 +1,46 @@
+package com.vitorpamplona.amethyst.buttons
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.OutlinedButton
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.ui.actions.NewPostView
+
+@Composable
+fun NewNoteButton(account: Account) {
+ var wantsToPost by remember {
+ mutableStateOf(false)
+ }
+
+ if (wantsToPost)
+ NewPostView({ wantsToPost = false }, account = account)
+
+ OutlinedButton(
+ onClick = { wantsToPost = true },
+ modifier = Modifier.size(55.dp),
+ shape = CircleShape,
+ colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.primary),
+ contentPadding = PaddingValues(0.dp),
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_compose),
+ null,
+ modifier = Modifier.size(26.dp),
+ tint = Color.White
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt
new file mode 100644
index 000000000..512581449
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt
@@ -0,0 +1,115 @@
+package com.vitorpamplona.amethyst.ui.components
+
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import com.google.accompanist.flowlayout.FlowRow
+import com.vitorpamplona.amethyst.model.LocalCache
+import java.net.MalformedURLException
+import java.net.URISyntaxException
+import java.net.URL
+import java.util.regex.Pattern
+
+val imageExtension = Pattern.compile("(.*/)*.+\\.(png|jpg|gif|bmp|jpeg|webp)$")
+val noProtocolUrlValidator = Pattern.compile("^[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$")
+val tagIndex = Pattern.compile("\\#\\[([0-9]*)\\]")
+
+fun isValidURL(url: String?): Boolean {
+ return try {
+ URL(url).toURI()
+ true
+ } catch (e: MalformedURLException) {
+ false
+ } catch (e: URISyntaxException) {
+ false
+ }
+}
+
+@Composable
+fun RichTextViewer(content: String, tags: List>?) {
+ Column(modifier = Modifier.padding(top = 5.dp)) {
+ // FlowRow doesn't work well with paragraphs. So we need to split them
+ content.split('\n').forEach { paragraph ->
+
+ FlowRow() {
+ paragraph.split(' ').forEach { word: String ->
+ // Explicit URL
+ if (isValidURL(word)) {
+ val removedParamsFromUrl = word.split("?")[0].toLowerCase()
+ if (imageExtension.matcher(removedParamsFromUrl).matches()) {
+ AsyncImage(
+ model = word,
+ contentDescription = word,
+ contentScale = ContentScale.FillWidth,
+ modifier = Modifier
+ .padding(top = 4.dp)
+ .fillMaxWidth()
+ .clip(shape = RoundedCornerShape(15.dp))
+ .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp))
+ )
+ } else {
+ UrlPreview(word, word)
+ }
+ } else if (noProtocolUrlValidator.matcher(word).matches()) {
+ UrlPreview("https://$word", word)
+ } else if (tagIndex.matcher(word).matches() && tags != null) {
+ TagLink(word, tags)
+ } else {
+ Text(text = "$word ")
+ }
+ }
+ }
+
+ }
+ }
+}
+
+@Composable
+fun TagLink(word: String, tags: List>) {
+ val matcher = tagIndex.matcher(word)
+
+ val index = try {
+ matcher.find()
+ matcher.group(1).toInt()
+ } catch (e: Exception) {
+ println("Couldn't link tag ${word}")
+ null
+ }
+
+ if (index == null) {
+ return Text(text = "$word ")
+ }
+
+ if (index > 0 && index < tags.size) {
+ if (tags[index][0] == "p") {
+ val user = LocalCache.users[tags[index][1]]
+ if (user != null) {
+ val innerUserState by user.live.observeAsState()
+ Text(
+ "${innerUserState?.user?.toBestDisplayName()}"
+ )
+ }
+ } else if (tags[index][0] == "e") {
+ val note = LocalCache.notes[tags[index][1]]
+ if (note != null) {
+ val innerNoteState by note.live.observeAsState()
+ Text(
+ "${innerNoteState?.note?.idDisplayHex}"
+ )
+ }
+ } else
+ Text(text = "$word ")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt
new file mode 100644
index 000000000..3b92ea1b8
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreview.kt
@@ -0,0 +1,109 @@
+package com.vitorpamplona.amethyst.ui.components
+
+import androidx.compose.animation.Crossfade
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.ClickableText
+import androidx.compose.material.LocalTextStyle
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalUriHandler
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import com.baha.url.preview.BahaUrlPreview
+import com.baha.url.preview.IUrlPreviewCallback
+import com.baha.url.preview.UrlInfoItem
+
+
+@Composable
+fun UrlPreview(url: String, urlText: String) {
+ var urlPreviewState by remember { mutableStateOf(UrlPreviewState.Loading) }
+
+ // Doesn't use a viewModel because of viewModel reusing issues (too many UrlPreview are created).
+ LaunchedEffect(urlPreviewState) {
+ if (urlPreviewState == UrlPreviewState.Loading) {
+ val urlPreview = BahaUrlPreview(url, object : IUrlPreviewCallback {
+ override fun onComplete(urlInfo: UrlInfoItem) {
+ if (urlInfo.allFetchComplete() && urlInfo.url == url)
+ urlPreviewState = UrlPreviewState.Loaded(urlInfo)
+ else
+ urlPreviewState = UrlPreviewState.Empty
+ }
+
+ override fun onFailed(throwable: Throwable) {
+ urlPreviewState = UrlPreviewState.Error("Error parsing preview for ${url}: ${throwable.message}")
+ }
+ })
+
+ urlPreview.fetchUrlPreview()
+ }
+ }
+
+ val uri = LocalUriHandler.current
+
+ Crossfade(targetState = urlPreviewState) { state ->
+ when (state) {
+ is UrlPreviewState.Loaded -> {
+ Row(
+ modifier = Modifier.clickable { runCatching { uri.openUri(url) } }
+ .clip(shape = RoundedCornerShape(15.dp))
+ .border(1.dp, MaterialTheme.colors.onSurface.copy(alpha = 0.12f), RoundedCornerShape(15.dp))
+ ) {
+ Column {
+ AsyncImage(
+ model = state.previewInfo.image,
+ contentDescription = "Profile Image",
+ contentScale = ContentScale.FillWidth,
+ modifier = Modifier.fillMaxWidth()
+ )
+
+ Text(
+ text = state.previewInfo.title,
+ style = MaterialTheme.typography.body2,
+ modifier = Modifier.fillMaxWidth().padding(start = 10.dp, end = 10.dp, top= 10.dp),
+ maxLines = 1,
+ overflow = TextOverflow.Ellipsis
+ )
+
+ Text(
+ text = state.previewInfo.description,
+ style = MaterialTheme.typography.caption,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(start = 10.dp, end = 10.dp, bottom = 10.dp),
+ color = Color.Gray,
+ maxLines = 3,
+ overflow = TextOverflow.Ellipsis
+ )
+ }
+ }
+ }
+ else -> {
+ ClickableText(
+ text = AnnotatedString("$urlText "),
+ onClick = { runCatching { uri.openUri(url) } },
+ style = LocalTextStyle.current.copy(color = MaterialTheme.colors.primary),
+ )
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt
new file mode 100644
index 000000000..1a99d16c6
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/UrlPreviewState.kt
@@ -0,0 +1,10 @@
+package com.vitorpamplona.amethyst.ui.components
+
+import com.baha.url.preview.UrlInfoItem
+
+sealed class UrlPreviewState {
+ object Loading: UrlPreviewState()
+ class Loaded(val previewInfo: UrlInfoItem): UrlPreviewState()
+ object Empty: UrlPreviewState()
+ class Error(val errorMessage: String): UrlPreviewState()
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt
new file mode 100644
index 000000000..c1a7470e1
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppBottomBar.kt
@@ -0,0 +1,60 @@
+package com.vitorpamplona.amethyst.ui.navigation
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.BottomNavigation
+import androidx.compose.material.BottomNavigationItem
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.navigation.NavHostController
+
+val bottomNavigationItems = listOf(
+ Route.Home,
+ Route.Message,
+ Route.Search,
+ Route.Notification
+)
+
+@Composable
+fun AppBottomBar(navController: NavHostController) {
+ val currentRoute = currentRoute(navController)
+
+ Column() {
+ Divider(
+ thickness = 0.25.dp
+ )
+ BottomNavigation(
+ modifier = Modifier,
+ elevation = 0.dp,
+ backgroundColor = MaterialTheme.colors.background
+ ) {
+ bottomNavigationItems.forEach { item ->
+ BottomNavigationItem(
+ icon = {
+ Icon(
+ painter = painterResource(id = item.icon),
+ null,
+ modifier = Modifier.size(if ("Home" == item.route) 24.dp else 20.dp),
+ tint = if (currentRoute == item.route) MaterialTheme.colors.primary else Color.Unspecified
+ )
+ },
+ selected = currentRoute == item.route,
+ onClick = {
+ if (currentRoute != item.route) {
+ navController.navigate(item.route)
+ } else {
+ // TODO: Make it scrool to the top
+ navController.navigate(item.route)
+ }
+ }
+ )
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt
new file mode 100644
index 000000000..1728df7e6
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt
@@ -0,0 +1,19 @@
+package com.vitorpamplona.amethyst.ui.navigation
+
+import androidx.compose.runtime.Composable
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.NavHost
+import androidx.navigation.compose.composable
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@Composable
+fun AppNavigation(
+ navController: NavHostController,
+ accountViewModel: AccountViewModel
+) {
+ NavHost(navController, startDestination = Route.Home.route) {
+ Routes.forEach {
+ composable(it.route, content = it.buildScreen(accountViewModel))
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt
new file mode 100644
index 000000000..290f880b4
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppTopBar.kt
@@ -0,0 +1,154 @@
+package com.vitorpamplona.amethyst.ui.navigation
+
+import android.util.Log
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.ScaffoldState
+import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowBack
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.viewmodel.compose.viewModel
+import androidx.navigation.NavHostController
+import coil.compose.AsyncImage
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.service.relays.Client
+import com.vitorpamplona.amethyst.ui.screen.RelayPoolViewModel
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import kotlinx.coroutines.launch
+
+@Composable
+fun AppTopBar(navController: NavHostController, scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) {
+ when (currentRoute(navController)) {
+ Route.Profile.route,
+ Route.Lists.route,
+ Route.Topics.route,
+ Route.Bookmarks.route,
+ Route.Moments.route -> TopBarWithBackButton(navController)
+ else -> MainTopBar(scaffoldState, accountViewModel)
+ }
+}
+
+@Composable
+fun MainTopBar(scaffoldState: ScaffoldState, accountViewModel: AccountViewModel) {
+ val accountUserState by accountViewModel.userLiveData.observeAsState()
+ val accountUser = accountUserState?.user
+
+ val relayViewModel: RelayPoolViewModel = viewModel { RelayPoolViewModel() }
+ val relayPoolLiveData by relayViewModel.relayPoolLiveData.observeAsState()
+
+ val coroutineScope = rememberCoroutineScope()
+
+ Column() {
+ TopAppBar(
+ elevation = 0.dp,
+ backgroundColor = Color(0xFFFFFF),
+ title = {
+ Column(
+ modifier = Modifier
+ .padding(start = 22.dp, end = 0.dp)
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ IconButton(
+ onClick = {
+ Client.subscriptions.map { "${it.key} ${it.value.joinToString { it.toJson() }}" }.forEach {
+ Log.d("CURRENT FILTERS", it)
+ }
+ }
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_amethyst),
+ null,
+ modifier = Modifier.size(32.dp),
+ tint = MaterialTheme.colors.primary
+ )
+ }
+ }
+
+ },
+ navigationIcon = {
+ IconButton(
+ onClick = {
+ coroutineScope.launch {
+ scaffoldState.drawerState.open()
+ }
+ },
+ modifier = Modifier
+ ) {
+ AsyncImage(
+ model = accountUser?.profilePicture() ?: "https://robohash.org/ohno.png",
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(34.dp)
+ .clip(shape = CircleShape),
+ )
+ }
+ },
+ actions = {
+ Text(
+ relayPoolLiveData ?: "--/--",
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+
+ IconButton(
+ onClick = {}, modifier = Modifier
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_trends),
+ null,
+ modifier = Modifier.size(24.dp),
+ tint = Color.Unspecified
+ )
+ }
+ }
+ )
+ Divider(thickness = 0.25.dp)
+ }
+}
+
+@Composable
+fun TopBarWithBackButton(navController: NavHostController) {
+ Column() {
+ TopAppBar(
+ elevation = 0.dp,
+ backgroundColor = Color(0xFFFFFF),
+ title = {},
+ navigationIcon = {
+ IconButton(
+ onClick = {
+ navController.popBackStack()
+ },
+ modifier = Modifier
+ ) {
+ Icon(
+ imageVector = Icons.Filled.ArrowBack,
+ null,
+ modifier = Modifier.size(28.dp),
+ tint = MaterialTheme.colors.primary
+ )
+ }
+ },
+ actions = {}
+ )
+ Divider(thickness = 0.25.dp)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt
new file mode 100644
index 000000000..a7cb86972
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt
@@ -0,0 +1,201 @@
+package com.vitorpamplona.amethyst.ui.navigation
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.ScaffoldState
+import androidx.compose.material.Surface
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.font.FontWeight.Companion.W500
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.navigation.NavHostController
+import coil.compose.AsyncImage
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.model.User
+import com.vitorpamplona.amethyst.ui.screen.AccountStateViewModel
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import kotlinx.coroutines.launch
+
+val bottomNavigations = listOf(
+ Route.Profile,
+ Route.Lists,
+ //Route.Topics,
+ Route.Bookmarks,
+ //Route.Moments
+)
+
+@Composable
+fun DrawerContent(navController: NavHostController,
+ scaffoldState: ScaffoldState,
+ accountViewModel: AccountViewModel,
+ accountStateViewModel: AccountStateViewModel) {
+
+ val accountUserState by accountViewModel.userLiveData.observeAsState()
+ val accountUser = accountUserState?.user
+
+ Surface(
+ modifier = Modifier.fillMaxWidth(),
+ color = MaterialTheme.colors.background
+ ) {
+ Column() {
+ Box {
+ Image(
+ painter = painterResource(R.drawable.profile_banner),
+ contentDescription = "Profile Banner",
+ contentScale = ContentScale.FillWidth,
+ modifier = Modifier.fillMaxWidth()
+ )
+
+ ProfileContent(
+ accountUser,
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(horizontal = 25.dp)
+ .padding(top = 125.dp)
+ )
+ }
+ Divider(
+ thickness = 0.25.dp,
+ modifier = Modifier.padding(top = 20.dp)
+ )
+ ListContent(
+ navController,
+ scaffoldState,
+ modifier = Modifier
+ .fillMaxWidth()
+ .weight(1F),
+ accountStateViewModel
+ )
+ }
+ }
+}
+
+@Composable
+fun ProfileContent(accountUser: User?, modifier: Modifier = Modifier) {
+ Column(modifier = modifier) {
+ AsyncImage(
+ model = accountUser?.profilePicture() ?: "https://robohash.org/ohno.png",
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(100.dp)
+ .clip(shape = CircleShape)
+ .border(3.dp, MaterialTheme.colors.background, CircleShape)
+ .background(MaterialTheme.colors.background)
+ )
+ Text(
+ accountUser?.bestDisplayName() ?: "",
+ modifier = Modifier.padding(top = 7.dp),
+ fontWeight = FontWeight.Bold,
+ fontSize = 18.sp
+ )
+ Text(" @${accountUser?.bestUsername()}", color = Color.LightGray)
+ Row(modifier = Modifier.padding(top = 15.dp)) {
+ Row() {
+ Text("${accountUser?.follows?.size}", fontWeight = FontWeight.Bold)
+ Text(" Following")
+ }
+ Row(modifier = Modifier.padding(start = 10.dp)) {
+ Text("${accountUser?.follower ?: "--"}", fontWeight = FontWeight.Bold)
+ Text(" Followers")
+ }
+ }
+ }
+}
+
+@Composable
+fun ListContent(
+ navController: NavHostController,
+ scaffoldState: ScaffoldState,
+ modifier: Modifier,
+ accountViewModel: AccountStateViewModel
+) {
+ Column(
+ modifier = modifier
+ ) {
+ LazyColumn() {
+ items(items = bottomNavigations) {
+ NavigationRow(navController, scaffoldState, it)
+ }
+ item {
+ Divider(
+ modifier = Modifier.padding(vertical = 15.dp),
+ thickness = 0.25.dp
+ )
+ Column(modifier = modifier.padding(horizontal = 25.dp)) {
+ Text(
+ text = "Settings",
+ fontSize = 18.sp,
+ fontWeight = W500
+ )
+ Row(
+ modifier = Modifier.clickable(onClick = { accountViewModel.logOff() }),
+ ) {
+ Text(
+ text = "Log out",
+ modifier = Modifier.padding(vertical = 15.dp),
+ fontSize = 18.sp,
+ fontWeight = W500
+ )
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun NavigationRow(navController: NavHostController, scaffoldState: ScaffoldState, route: Route) {
+ val coroutineScope = rememberCoroutineScope()
+ val currentRoute = currentRoute(navController)
+ Row(
+ modifier = Modifier
+ .padding(vertical = 15.dp, horizontal = 25.dp)
+ .clickable(onClick = {
+ if (currentRoute != route.route) {
+ navController.navigate(route.route)
+ }
+ coroutineScope.launch {
+ scaffoldState.drawerState.close()
+ }
+ }),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Icon(
+ painter = painterResource(route.icon), null,
+ modifier = Modifier.size(22.dp),
+ tint = MaterialTheme.colors.primary
+ )
+ Text(
+ modifier = Modifier.padding(start = 16.dp),
+ text = route.route,
+ fontSize = 18.sp,
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt
new file mode 100644
index 000000000..a347d2efb
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt
@@ -0,0 +1,52 @@
+package com.vitorpamplona.amethyst.ui.navigation
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.navigation.NavBackStackEntry
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.currentBackStackEntryAsState
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.ui.screen.HomeScreen
+import com.vitorpamplona.amethyst.ui.screen.MessageScreen
+import com.vitorpamplona.amethyst.ui.screen.NotificationScreen
+import com.vitorpamplona.amethyst.ui.screen.ProfileScreen
+import com.vitorpamplona.amethyst.ui.screen.SearchScreen
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+
+sealed class Route(
+ val route: String,
+ val icon: Int,
+ val buildScreen: (AccountViewModel) -> @Composable (NavBackStackEntry) -> Unit
+) {
+ object Home : Route("Home", R.drawable.ic_home, { acc -> { _ -> HomeScreen(acc) } })
+ object Search : Route("Search", R.drawable.ic_search, { acc -> { _ -> SearchScreen(acc) }})
+ object Notification : Route("Notification", R.drawable.ic_notifications, { acc -> { _ -> NotificationScreen(acc) }})
+ object Message : Route("Message", R.drawable.ic_dm, { acc -> { _ -> MessageScreen(acc) }})
+ object Profile : Route("Profile", R.drawable.ic_profile, { acc -> { _ -> ProfileScreen(acc) }})
+ object Lists : Route("Lists", R.drawable.ic_lists, { acc -> { _ -> ProfileScreen(acc) }})
+ object Topics : Route("Topics", R.drawable.ic_topics, { acc -> { _ -> ProfileScreen(acc) }})
+ object Bookmarks : Route("Bookmarks", R.drawable.ic_bookmarks, { acc -> { _ -> ProfileScreen(acc) }})
+ object Moments : Route("Moments", R.drawable.ic_moments, { acc -> { _ -> ProfileScreen(acc) }})
+}
+
+val Routes = listOf(
+ // bottom
+ Route.Home,
+ Route.Message,
+ Route.Search,
+ Route.Notification,
+
+ //drawer
+ Route.Profile,
+ Route.Lists,
+ Route.Topics,
+ Route.Bookmarks,
+ Route.Moments
+)
+
+@Composable
+public fun currentRoute(navController: NavHostController): String? {
+ val navBackStackEntry by navController.currentBackStackEntryAsState()
+ return navBackStackEntry?.destination?.route
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt
new file mode 100644
index 000000000..053ed1499
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BlankNote.kt
@@ -0,0 +1,42 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material.Divider
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun BlankNote(modifier: Modifier = Modifier, isQuote: Boolean) {
+ Column(modifier = modifier) {
+ Row(modifier = Modifier.padding(horizontal = if (!isQuote) 12.dp else 6.dp)) {
+ Column(modifier = Modifier.padding(start = if (!isQuote) 10.dp else 5.dp)) {
+ Row(
+ modifier = Modifier.padding(
+ start = 20.dp,
+ end = 20.dp,
+ bottom = 25.dp,
+ top = 15.dp
+ ),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = "Referenced event not found",
+ modifier = Modifier.padding(30.dp),
+ color = Color.Gray,
+ )
+ }
+
+ Divider(
+ modifier = Modifier.padding(vertical = 10.dp),
+ thickness = 0.25.dp
+ )
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt
new file mode 100644
index 000000000..dea521c0c
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/BoostSetCompose.kt
@@ -0,0 +1,92 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import android.text.format.DateUtils
+import android.text.format.DateUtils.getRelativeTimeSpanString
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import com.google.accompanist.flowlayout.FlowRow
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import com.vitorpamplona.amethyst.ui.components.RichTextViewer
+import com.vitorpamplona.amethyst.ui.screen.BoostSetCard
+import com.vitorpamplona.amethyst.ui.screen.LikeSetCard
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import nostr.postr.events.TextNoteEvent
+
+@Composable
+fun BoostSetCompose(likeSetCard: BoostSetCard, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) {
+ val noteState by likeSetCard.note.live.observeAsState()
+ val note = noteState?.note
+
+ if (note?.event == null) {
+ BlankNote(modifier, isInnerNote)
+ } else {
+ Column(modifier = modifier) {
+ Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) {
+
+ // Draws the like picture outside the boosted card.
+ if (!isInnerNote) {
+ Box(modifier = Modifier
+ .width(55.dp)
+ .padding(0.dp)) {
+ Icon(
+ painter = painterResource(R.drawable.ic_retweeted),
+ null,
+ modifier = Modifier.size(16.dp).align(Alignment.TopEnd),
+ tint = Color.Unspecified
+ )
+ }
+ }
+
+ Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) {
+ FlowRow() {
+ likeSetCard.boostEvents.forEach {
+ val cardNoteState by it.live.observeAsState()
+ val cardNote = cardNoteState?.note
+
+ if (cardNote?.author != null) {
+ val userState by cardNote.author!!.live.observeAsState()
+
+ AsyncImage(
+ model = userState?.user?.profilePicture(),
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(35.dp)
+ .height(35.dp)
+ .clip(shape = CircleShape)
+ )
+ }
+ }
+ }
+
+ NoteCompose(note, modifier = Modifier.padding(top = 5.dp), isInnerNote = true, accountViewModel = accountViewModel)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt
new file mode 100644
index 000000000..870821df5
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/LikeSetCompose.kt
@@ -0,0 +1,91 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import android.text.format.DateUtils
+import android.text.format.DateUtils.getRelativeTimeSpanString
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Divider
+import androidx.compose.material.Icon
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import com.google.accompanist.flowlayout.FlowRow
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import com.vitorpamplona.amethyst.ui.components.RichTextViewer
+import com.vitorpamplona.amethyst.ui.screen.LikeSetCard
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import nostr.postr.events.TextNoteEvent
+
+@Composable
+fun LikeSetCompose(likeSetCard: LikeSetCard, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) {
+ val noteState by likeSetCard.note.live.observeAsState()
+ val note = noteState?.note
+
+ if (note?.event == null) {
+ BlankNote(modifier, isInnerNote)
+ } else {
+ Column(modifier = modifier) {
+ Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) {
+
+ // Draws the like picture outside the boosted card.
+ if (!isInnerNote) {
+ Box(modifier = Modifier
+ .width(55.dp)
+ .padding(0.dp)) {
+ Icon(
+ painter = painterResource(R.drawable.ic_liked),
+ null,
+ modifier = Modifier.size(16.dp).align(Alignment.TopEnd),
+ tint = Color.Unspecified
+ )
+ }
+ }
+
+ Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) {
+ FlowRow() {
+ likeSetCard.likeEvents.forEach {
+ val cardNoteState by it.live.observeAsState()
+ val cardNote = cardNoteState?.note
+
+ if (cardNote?.author != null) {
+ val userState by cardNote.author!!.live.observeAsState()
+
+ AsyncImage(
+ model = userState?.user?.profilePicture(),
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(35.dp)
+ .height(35.dp)
+ .clip(shape = CircleShape)
+ )
+ }
+ }
+ }
+
+ NoteCompose(note, modifier = Modifier.padding(top = 5.dp), isInnerNote = true, accountViewModel = accountViewModel)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt
new file mode 100644
index 000000000..301b157a9
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Note.kt
@@ -0,0 +1,132 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import android.text.format.DateUtils
+import android.text.format.DateUtils.getRelativeTimeSpanString
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.material.Divider
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.dp
+import coil.compose.AsyncImage
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import com.vitorpamplona.amethyst.ui.components.RichTextViewer
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+import nostr.postr.events.TextNoteEvent
+
+@Composable
+fun NoteCompose(baseNote: Note, modifier: Modifier = Modifier, isInnerNote: Boolean = false, accountViewModel: AccountViewModel) {
+ val noteState by baseNote.live.observeAsState()
+ val note = noteState?.note
+
+ if (note?.event == null) {
+ BlankNote(modifier, isInnerNote)
+ } else {
+ val authorState by note.author!!.live.observeAsState()
+ val author = authorState?.user
+
+ Column(modifier = modifier) {
+ Row(modifier = Modifier.padding(horizontal = if (!isInnerNote) 12.dp else 0.dp)) {
+
+ // Draws the boosted picture outside the boosted card.
+ if (!isInnerNote) {
+ Box(modifier = Modifier.width(55.dp).padding(0.dp)) {
+ AsyncImage(
+ model = author?.profilePicture(),
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(55.dp)
+ .clip(shape = CircleShape)
+ )
+
+ // boosted picture
+ val boostedPosts = note.replyTo
+ if (note.event is RepostEvent && boostedPosts != null && boostedPosts.isNotEmpty()) {
+ AsyncImage(
+ model = boostedPosts[0].author?.profilePicture(),
+ contentDescription = "Profile Image",
+ modifier = Modifier
+ .width(35.dp)
+ .clip(shape = CircleShape)
+ .align(Alignment.BottomEnd)
+ .background(MaterialTheme.colors.background)
+ .border(2.dp, MaterialTheme.colors.primary, CircleShape)
+ )
+ }
+ }
+ }
+
+ Column(modifier = Modifier.padding(start = if (!isInnerNote) 10.dp else 0.dp)) {
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ if (author != null)
+ UserDisplay(author)
+
+ if (note.event !is RepostEvent) {
+ Text(
+ " " + timeAgo(note.event?.createdAt),
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ } else {
+ Text(
+ " boosted",
+ fontWeight = FontWeight.Bold,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ }
+
+ if (note.event is TextNoteEvent && (note.replyTo != null || note.mentions != null)) {
+ ReplyInformation(note.replyTo, note.mentions)
+ }
+
+ if (note.event is ReactionEvent || note.event is RepostEvent) {
+ note.replyTo?.mapIndexed { index, note ->
+ NoteCompose(
+ note,
+ modifier = Modifier.padding(top = 5.dp),
+ isInnerNote = true,
+ accountViewModel = accountViewModel
+ )
+ }
+
+ // Reposts have trash in their contents.
+ if (note.event is ReactionEvent) {
+ val refactorReactionText =
+ if (note.event?.content == "+") "❤" else note.event?.content ?: " "
+
+ Text(
+ text = refactorReactionText
+ )
+ }
+ } else {
+ val eventContent = note.event?.content
+ if (eventContent != null)
+ RichTextViewer(eventContent, note.event?.tags)
+
+ ReactionsRowState(note, accountViewModel)
+
+ Divider(
+ modifier = Modifier.padding(vertical = 10.dp),
+ thickness = 0.25.dp
+ )
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt
new file mode 100644
index 000000000..67a100bcd
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/PubKeyFormatter.kt
@@ -0,0 +1,12 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import nostr.postr.toHex
+
+fun ByteArray.toDisplayHex(): String {
+ return toHex().toDisplayHex()
+}
+
+fun String.toDisplayHex(): String {
+ return replaceRange(6, length-6, ":")
+}
+
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt
new file mode 100644
index 000000000..a77974532
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt
@@ -0,0 +1,141 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.ui.actions.NewPostView
+
+@Composable
+fun ReactionsRow(note: Note, account: Account, boost: (Note) -> Unit, reactTo: (Note) -> Unit) {
+ val grayTint = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+
+ var wantsToReplyTo by remember {
+ mutableStateOf(null)
+ }
+
+ if (wantsToReplyTo != null)
+ NewPostView({ wantsToReplyTo = null }, wantsToReplyTo, account)
+
+ Row(modifier = Modifier.padding(top = 8.dp)) {
+ Row(verticalAlignment = Alignment.CenterVertically) {
+ IconButton(
+ modifier = Modifier.then(Modifier.size(24.dp)),
+ onClick = { if (account.isWriteable()) wantsToReplyTo = note }
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_comment),
+ null,
+ modifier = Modifier.size(15.dp),
+ tint = grayTint,
+ )
+ }
+
+ Text(
+ " ${showCount(note.replies?.size)}",
+ fontSize = 14.sp,
+ color = grayTint
+ )
+ }
+ Row(
+ modifier = Modifier.padding(start = 40.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ IconButton(
+ modifier = Modifier.then(Modifier.size(24.dp)),
+ onClick = { if (account.isWriteable()) boost(note) }
+ ) {
+ if (note.isBoostedBy(account.userProfile())) {
+ Icon(
+ painter = painterResource(R.drawable.ic_retweeted),
+ null,
+ modifier = Modifier.size(20.dp),
+ tint = Color.Unspecified
+ )
+ } else {
+ Icon(
+ painter = painterResource(R.drawable.ic_retweet),
+ null,
+ modifier = Modifier.size(20.dp),
+ tint = grayTint
+ )
+ }
+ }
+
+ Text(
+ " ${showCount(note.boosts?.size)}",
+ fontSize = 14.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ Row(
+ modifier = Modifier.padding(start = 40.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ IconButton(
+ modifier = Modifier.then(Modifier.size(24.dp)),
+ onClick = { if (account.isWriteable()) reactTo(note) }
+ ) {
+ if (note.isReactedBy(account.userProfile())) {
+ Icon(
+ painter = painterResource(R.drawable.ic_liked),
+ null,
+ modifier = Modifier.size(16.dp),
+ tint = Color.Unspecified
+ )
+ } else {
+ Icon(
+ painter = painterResource(R.drawable.ic_like),
+ null,
+ modifier = Modifier.size(16.dp),
+ tint = grayTint
+ )
+ }
+ }
+
+ Text(
+ " ${showCount(note.reactions?.size)}",
+ fontSize = 14.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ Row(
+ modifier = Modifier.padding(start = 40.dp),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ IconButton(
+ modifier = Modifier.then(Modifier.size(24.dp)),
+ onClick = { }
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_share),
+ null,
+ modifier = Modifier.size(16.dp),
+ tint = grayTint
+ )
+ }
+ }
+ }
+}
+
+fun showCount(size: Int?): String {
+ if (size == null) return " "
+ return if (size == 0) return " " else "$size"
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt
new file mode 100644
index 000000000..1bcec3b38
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRowState.kt
@@ -0,0 +1,20 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@Composable
+fun ReactionsRowState(baseNote: Note, accountViewModel: AccountViewModel) {
+ val accountState by accountViewModel.accountLiveData.observeAsState()
+ val account = accountState?.account
+
+ val noteState by baseNote.live.observeAsState()
+ val note = noteState?.note
+
+ if (account == null || note == null) return
+
+ ReactionsRow(note, account, accountViewModel::boost, accountViewModel::reactTo)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt
new file mode 100644
index 000000000..273e46b5d
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/ReplyInformation.kt
@@ -0,0 +1,63 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.unit.sp
+import com.google.accompanist.flowlayout.FlowRow
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.model.User
+
+@Composable
+fun ReplyInformation(replyTo: MutableList?, mentions: List?) {
+ FlowRow() {
+ /*
+ if (replyTo != null && replyTo.isNotEmpty()) {
+ Text(
+ " in reply to ",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ replyTo.toSet().forEachIndexed { idx, note ->
+ val innerNoteState by note.live.observeAsState()
+ Text(
+ "${innerNoteState?.note?.idDisplayHex}${if (idx < replyTo.size - 1) ", " else ""}",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ }
+ */
+ if (mentions != null && mentions.isNotEmpty()) {
+ Text(
+ "replying to ",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ mentions.toSet().forEachIndexed { idx, user ->
+ val innerUserState by user.live.observeAsState()
+ Text(
+ "${innerUserState?.user?.toBestDisplayName()}",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+
+ if (idx < mentions.size - 2) {
+ Text(
+ ", ",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ } else if (idx < mentions.size - 1) {
+ Text(
+ " and ",
+ fontSize = 13.sp,
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt
new file mode 100644
index 000000000..ed641900b
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/TimeAgoFormatter.kt
@@ -0,0 +1,18 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import android.text.format.DateUtils
+
+fun timeAgo(mills: Long?): String {
+ if (mills == null) return " "
+
+ var humanReadable = DateUtils.getRelativeTimeSpanString(
+ mills * 1000,
+ System.currentTimeMillis(),
+ DateUtils.MINUTE_IN_MILLIS,
+ DateUtils.FORMAT_ABBREV_ALL
+ ).toString()
+ if (humanReadable.startsWith("In") || humanReadable.startsWith("0")) {
+ humanReadable = "now";
+ }
+ return humanReadable
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt
new file mode 100644
index 000000000..6cfc378b4
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/UserDisplay.kt
@@ -0,0 +1,26 @@
+package com.vitorpamplona.amethyst.ui.note
+
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.text.font.FontWeight
+import com.vitorpamplona.amethyst.model.User
+
+@Composable
+fun UserDisplay(user: User) {
+ if (user.bestUsername() != null || user.bestDisplayName() != null) {
+ Text(
+ user.bestDisplayName() ?: "",
+ fontWeight = FontWeight.Bold,
+ )
+ Text(
+ "@${(user.bestUsername() ?: "")}",
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f),
+ )
+ } else {
+ Text(
+ user.pubkeyDisplayHex,
+ fontWeight = FontWeight.Bold,
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt
new file mode 100644
index 000000000..71310415e
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountScreen.kt
@@ -0,0 +1,32 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.animation.Crossfade
+import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun AccountScreen(accountStateViewModel: AccountStateViewModel) {
+ val accountState by accountStateViewModel.accountContent.collectAsStateWithLifecycle()
+
+ Column() {
+ Crossfade(targetState = accountState) { state ->
+ when (state) {
+ is AccountState.LoggedOff -> {
+ LoginPage(accountStateViewModel)
+ }
+ is AccountState.LoggedIn -> {
+ MainScreen(AccountViewModel(state.account), accountStateViewModel)
+ }
+ is AccountState.LoggedInViewOnly -> {
+ MainScreen(AccountViewModel(state.account), accountStateViewModel)
+ }
+ }
+ }
+ }
+}
+
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt
new file mode 100644
index 000000000..df6488b03
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountState.kt
@@ -0,0 +1,9 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import com.vitorpamplona.amethyst.model.Account
+
+sealed class AccountState {
+ object LoggedOff: AccountState()
+ class LoggedInViewOnly(val account: Account): AccountState()
+ class LoggedIn(val account: Account): AccountState()
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt
new file mode 100644
index 000000000..e09385e02
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountStateViewModel.kt
@@ -0,0 +1,106 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.lifecycle.ViewModel
+import androidx.security.crypto.EncryptedSharedPreferences
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.toByteArray
+import com.vitorpamplona.amethyst.service.NostrAccountDataSource
+import com.vitorpamplona.amethyst.service.NostrGlobalDataSource
+import com.vitorpamplona.amethyst.service.NostrHomeDataSource
+import com.vitorpamplona.amethyst.service.NostrNotificationDataSource
+import com.vitorpamplona.amethyst.service.NostrSingleEventDataSource
+import com.vitorpamplona.amethyst.service.NostrSingleUserDataSource
+import fr.acinq.secp256k1.Hex
+import java.util.regex.Pattern
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import nostr.postr.Persona
+import nostr.postr.bechToBytes
+import nostr.postr.toHex
+
+class AccountStateViewModel(private val encryptedPreferences: EncryptedSharedPreferences): ViewModel() {
+ private val _accountContent = MutableStateFlow(AccountState.LoggedOff)
+ val accountContent = _accountContent.asStateFlow()
+
+ init {
+ // pulls account from storage.
+ loadFromEncryptedStorage()?.let { login(it) }
+ }
+
+ fun login(key: String) {
+ val pattern = Pattern.compile(".+@.+\\.[a-z]+")
+
+ login(
+ if (key.startsWith("nsec")) {
+ Persona(privKey = key.bechToBytes())
+ } else if (key.startsWith("npub")) {
+ Persona(pubKey = key.bechToBytes())
+ } else if (pattern.matcher(key).matches()) {
+ // Evaluate NIP-5
+ Persona()
+ } else {
+ Persona(Hex.decode(key))
+ }
+ )
+ }
+
+ fun login(person: Persona) {
+ val loggedIn = Account(person)
+
+ if (person.privKey != null)
+ _accountContent.update { AccountState.LoggedIn ( loggedIn ) }
+ else
+ _accountContent.update { AccountState.LoggedInViewOnly ( Account(person) ) }
+
+ saveToEncryptedStorage(person)
+
+ NostrAccountDataSource.account = loggedIn
+ NostrHomeDataSource.account = loggedIn
+ NostrNotificationDataSource.account = loggedIn
+
+ NostrAccountDataSource.start()
+ NostrGlobalDataSource.start()
+ NostrHomeDataSource.start()
+ NostrNotificationDataSource.start()
+ NostrSingleEventDataSource.start()
+ NostrSingleUserDataSource.start()
+ }
+
+ fun newKey() {
+ login(Persona())
+ }
+
+ fun logOff() {
+ _accountContent.update { AccountState.LoggedOff }
+
+ clearEncryptedStorage()
+ }
+
+ fun clearEncryptedStorage() {
+ encryptedPreferences.edit().apply {
+ remove("nostr_privkey")
+ remove("nostr_pubkey")
+ }.apply()
+ }
+
+ fun saveToEncryptedStorage(login: Persona) {
+ encryptedPreferences.edit().apply {
+ login.privKey?.let { putString("nostr_privkey", it.toHex()) }
+ login.pubKey.let { putString("nostr_pubkey", it.toHex()) }
+ }.apply()
+ }
+
+ fun loadFromEncryptedStorage(): Persona? {
+ encryptedPreferences.apply {
+ val privKey = getString("nostr_privkey", null)
+ val pubKey = getString("nostr_pubkey", null)
+
+ if (pubKey != null) {
+ return Persona(privKey = privKey?.toByteArray(), pubKey = pubKey.toByteArray())
+ } else {
+ return null
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt
new file mode 100644
index 000000000..665838e70
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedState.kt
@@ -0,0 +1,36 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import com.vitorpamplona.amethyst.model.Note
+
+abstract class Card() {
+ abstract fun createdAt(): Long
+}
+
+class NoteCard(val note: Note): Card() {
+ override fun createdAt(): Long {
+ return note.event?.createdAt ?: 0
+ }
+}
+
+class LikeSetCard(val note: Note, val likeEvents: List): Card() {
+ val createdAt = likeEvents.maxOf { it.event?.createdAt ?: 0 }
+
+ override fun createdAt(): Long {
+ return createdAt
+ }
+}
+
+class BoostSetCard(val note: Note, val boostEvents: List): Card() {
+ val createdAt = boostEvents.maxOf { it.event?.createdAt ?: 0 }
+
+ override fun createdAt(): Long {
+ return createdAt
+ }
+}
+
+sealed class CardFeedState {
+ object Loading: CardFeedState()
+ class Loaded(val feed: List): CardFeedState()
+ object Empty: CardFeedState()
+ class FeedError(val errorMessage: String): CardFeedState()
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt
new file mode 100644
index 000000000..b4d2eaa1b
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedView.kt
@@ -0,0 +1,93 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.animation.Crossfade
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.Button
+import androidx.compose.material.OutlinedButton
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.google.accompanist.swiperefresh.SwipeRefresh
+import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
+import com.vitorpamplona.amethyst.ui.note.BoostSetCompose
+import com.vitorpamplona.amethyst.ui.note.LikeSetCompose
+import com.vitorpamplona.amethyst.ui.note.NoteCompose
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun CardFeedView(viewModel: CardFeedViewModel, accountViewModel: AccountViewModel) {
+ val feedState by viewModel.feedContent.collectAsStateWithLifecycle()
+
+ var isRefreshing by remember { mutableStateOf(false) }
+ val swipeRefreshState = rememberSwipeRefreshState(isRefreshing)
+
+ val listState = rememberLazyListState()
+
+ LaunchedEffect(isRefreshing) {
+ if (isRefreshing) {
+ viewModel.refresh()
+ isRefreshing = false
+ }
+ }
+
+ SwipeRefresh(
+ state = swipeRefreshState,
+ onRefresh = {
+ isRefreshing = true
+ },
+ ) {
+ Column() {
+ Crossfade(targetState = feedState) { state ->
+ when (state) {
+ is CardFeedState.Empty -> {
+ FeedEmpty {
+ isRefreshing = true
+ }
+ }
+ is CardFeedState.FeedError -> {
+ FeedError(state.errorMessage) {
+ isRefreshing = true
+ }
+ }
+ is CardFeedState.Loaded -> {
+ LazyColumn(
+ contentPadding = PaddingValues(
+ top = 10.dp,
+ bottom = 10.dp
+ ),
+ state = listState
+ ) {
+ itemsIndexed(state.feed) { index, item ->
+ when (item) {
+ is NoteCard -> NoteCompose(item.note, isInnerNote = false, accountViewModel = accountViewModel)
+ is LikeSetCard -> LikeSetCompose(item, isInnerNote = false, accountViewModel = accountViewModel)
+ is BoostSetCard -> BoostSetCompose(item, isInnerNote = false, accountViewModel = accountViewModel)
+ }
+ }
+ }
+ }
+ CardFeedState.Loading -> {
+ LoadingFeed()
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt
new file mode 100644
index 000000000..1d52992f4
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/CardFeedViewModel.kt
@@ -0,0 +1,107 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.LocalCacheState
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.NostrDataSource
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import com.vitorpamplona.amethyst.service.model.RepostEvent
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+class CardFeedViewModel(val dataSource: NostrDataSource): ViewModel() {
+ private val _feedContent = MutableStateFlow(CardFeedState.Loading)
+ val feedContent = _feedContent.asStateFlow()
+
+ private var lastNotes: List? = null
+
+ fun refresh() {
+ // For some reason, view Model Scope doesn't call
+ viewModelScope.launch {
+ refreshSuspend()
+ }
+ }
+
+ fun refreshSuspend() {
+ val notes = dataSource.loadTop()
+
+ val lastNotesCopy = lastNotes
+
+ val oldNotesState = feedContent.value
+ if (lastNotesCopy != null && oldNotesState is CardFeedState.Loaded) {
+ val newCards = convertToCard(notes.minus(lastNotesCopy))
+ if (newCards.isNotEmpty()) {
+ lastNotes = notes
+ updateFeed((oldNotesState.feed + newCards).sortedBy { it.createdAt() }.reversed())
+ }
+ } else {
+ val cards = convertToCard(notes)
+ lastNotes = notes
+ updateFeed(cards)
+ }
+ }
+
+ private fun convertToCard(notes: List): List {
+ val reactionsPerEvent = mutableMapOf>()
+ notes
+ .filter { it.event is ReactionEvent }
+ .forEach {
+ val reactedPost = it.replyTo?.last()
+ if (reactedPost != null)
+ reactionsPerEvent.getOrPut(reactedPost, { mutableListOf() }).add(it)
+ }
+
+ val reactionCards = reactionsPerEvent.map { LikeSetCard(it.key, it.value) }
+
+ val boostsPerEvent = mutableMapOf>()
+ notes
+ .filter { it.event is RepostEvent }
+ .forEach {
+ val boostedPost = it.replyTo?.last()
+ if (boostedPost != null)
+ boostsPerEvent.getOrPut(boostedPost, { mutableListOf() }).add(it)
+ }
+
+ val boostCards = boostsPerEvent.map { BoostSetCard(it.key, it.value) }
+
+ val textNoteCards = notes.filter { it.event !is ReactionEvent && it.event !is RepostEvent }.map { NoteCard(it) }
+
+ return (reactionCards + boostCards + textNoteCards).sortedBy { it.createdAt() }.reversed()
+ }
+
+ fun updateFeed(notes: List) {
+ if (notes.isEmpty()) {
+ _feedContent.update { CardFeedState.Empty }
+ } else {
+ _feedContent.update { CardFeedState.Loaded(notes) }
+ }
+ }
+
+ fun refreshCurrentList() {
+ val state = feedContent.value
+ if (state is CardFeedState.Loaded) {
+ _feedContent.update { CardFeedState.Loaded(state.feed) }
+ }
+ }
+
+ private val cacheListener: (LocalCacheState) -> Unit = {
+ refresh()
+ }
+
+ init {
+ LocalCache.live.observeForever(cacheListener)
+ }
+
+ override fun onCleared() {
+ LocalCache.live.removeObserver(cacheListener)
+
+ dataSource.stop()
+ viewModelScope.cancel()
+ super.onCleared()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt
new file mode 100644
index 000000000..fe3361e79
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedState.kt
@@ -0,0 +1,11 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import com.vitorpamplona.amethyst.model.Note
+
+
+sealed class FeedState {
+ object Loading : FeedState()
+ class Loaded(val feed: List) : FeedState()
+ object Empty : FeedState()
+ class FeedError(val errorMessage: String) : FeedState()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt
new file mode 100644
index 000000000..87fdf99b7
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedView.kt
@@ -0,0 +1,188 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.animation.Crossfade
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.itemsIndexed
+import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.Button
+import androidx.compose.material.OutlinedButton
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.google.accompanist.swiperefresh.SwipeRefresh
+import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
+import com.vitorpamplona.amethyst.ui.note.NoteCompose
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun FeedView(viewModel: FeedViewModel, accountViewModel: AccountViewModel) {
+ val feedState by viewModel.feedContent.collectAsStateWithLifecycle()
+
+ var isRefreshing by remember { mutableStateOf(false) }
+ val swipeRefreshState = rememberSwipeRefreshState(isRefreshing)
+
+ val listState = rememberLazyListState()
+
+ LaunchedEffect(isRefreshing) {
+ if (isRefreshing) {
+ viewModel.refresh()
+ isRefreshing = false
+ }
+ }
+
+ SwipeRefresh(
+ state = swipeRefreshState,
+ onRefresh = {
+ isRefreshing = true
+ },
+ ) {
+ Column() {
+ Crossfade(targetState = feedState) { state ->
+ when (state) {
+ is FeedState.Empty -> {
+ FeedEmpty {
+ isRefreshing = true
+ }
+ }
+ is FeedState.FeedError -> {
+ FeedError(state.errorMessage) {
+ isRefreshing = true
+ }
+ }
+ is FeedState.Loaded -> {
+ LazyColumn(
+ contentPadding = PaddingValues(
+ top = 10.dp,
+ bottom = 10.dp
+ ),
+ state = listState
+ ) {
+ itemsIndexed(state.feed, key = { _, item -> item.idHex }) { index, item ->
+ NoteCompose(item, isInnerNote = false, accountViewModel = accountViewModel)
+ }
+ }
+ }
+ FeedState.Loading -> {
+ LoadingFeed()
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun LoadingFeed() {
+ Column(
+ Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text("Loading feed")
+ }
+}
+
+@Composable
+fun FeedError(errorMessage: String, onRefresh: () -> Unit) {
+ Column(
+ Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text("Error loading replies: $errorMessage")
+ Button(
+ modifier = Modifier.align(Alignment.CenterHorizontally),
+ onClick = onRefresh
+ ) {
+ Text(text = "Try again")
+ }
+ }
+}
+
+@Composable
+fun FeedEmpty(onRefresh: () -> Unit) {
+ Column(
+ Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text("Feed is empty.")
+ OutlinedButton(onClick = onRefresh) {
+ Text(text = "Refresh")
+ }
+ }
+}
+
+
+// Bosted code to be deleted:
+
+/*
+
+ Boosted By: removed because it was ugly
+
+ if (item.event is RepostEvent) {
+ Row(
+ modifier = Modifier.padding(
+ start = 12.dp,
+ end = 12.dp,
+ bottom = 8.dp
+ ),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Icon(
+ painter = painterResource(R.drawable.ic_retweet),
+ null,
+ modifier = Modifier.size(20.dp),
+ tint = Color.Gray
+ )
+ Text(
+ text = "Boosted by ${item.author.toBestDisplayName()}",
+ modifier = Modifier.padding(start = 10.dp),
+ fontWeight = FontWeight.Bold,
+ color = Color.Gray,
+ )
+ }
+ val refNote = item.replyTo.firstOrNull()
+ if (refNote != null) {
+ NoteCompose(index, refNote)
+ } else {
+ Row(
+ modifier = Modifier.padding(
+ start = 40.dp,
+ end = 40.dp,
+ bottom = 25.dp,
+ top = 15.dp
+ ),
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ Text(
+ text = "Could not find referenced event",
+ modifier = Modifier.padding(30.dp),
+ color = Color.Gray,
+ )
+ }
+ }
+ } else {
+ NoteCompose(index, item)
+ }*/
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt
new file mode 100644
index 000000000..db3cb174d
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/FeedViewModel.kt
@@ -0,0 +1,71 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.vitorpamplona.amethyst.model.LocalCache
+import com.vitorpamplona.amethyst.model.LocalCacheState
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.service.NostrDataSource
+import com.vitorpamplona.amethyst.service.model.ReactionEvent
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.update
+import kotlinx.coroutines.launch
+
+
+class FeedViewModel(val dataSource: NostrDataSource): ViewModel() {
+ private val _feedContent = MutableStateFlow(FeedState.Loading)
+ val feedContent = _feedContent.asStateFlow()
+
+ fun refresh() {
+ // For some reason, view Model Scope doesn't call
+ viewModelScope.launch {
+ refreshSuspend()
+ }
+ }
+
+ fun refreshSuspend() {
+ val notes = dataSource.loadTop()
+
+ val oldNotesState = feedContent.value
+ if (oldNotesState is FeedState.Loaded) {
+ if (notes != oldNotesState.feed) {
+ updateFeed(notes)
+ }
+ } else {
+ updateFeed(notes)
+ }
+ }
+
+ fun updateFeed(notes: List) {
+ if (notes.isEmpty()) {
+ _feedContent.update { FeedState.Empty }
+ } else {
+ _feedContent.update { FeedState.Loaded(notes) }
+ }
+ }
+
+ fun refreshCurrentList() {
+ val state = feedContent.value
+ if (state is FeedState.Loaded) {
+ _feedContent.update { FeedState.Loaded(state.feed) }
+ }
+ }
+
+ private val cacheListener: (LocalCacheState) -> Unit = {
+ refresh()
+ }
+
+ init {
+ LocalCache.live.observeForever(cacheListener)
+ }
+
+ override fun onCleared() {
+ LocalCache.live.removeObserver(cacheListener)
+
+ dataSource.stop()
+ viewModelScope.cancel()
+ super.onCleared()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt
new file mode 100644
index 000000000..26c861352
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/RelayPoolViewModel.kt
@@ -0,0 +1,12 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Transformations
+import androidx.lifecycle.ViewModel
+import com.vitorpamplona.amethyst.service.relays.RelayPool
+
+class RelayPoolViewModel: ViewModel() {
+ val relayPoolLiveData: LiveData = Transformations.map(RelayPool.live) {
+ it.relays.report()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
new file mode 100644
index 000000000..7fa0aa1e9
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt
@@ -0,0 +1,22 @@
+package com.vitorpamplona.amethyst.ui.screen.loggedIn
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Transformations
+import androidx.lifecycle.ViewModel
+import com.vitorpamplona.amethyst.model.Account
+import com.vitorpamplona.amethyst.model.AccountState
+import com.vitorpamplona.amethyst.model.Note
+import com.vitorpamplona.amethyst.model.UserState
+
+class AccountViewModel(private val account: Account): ViewModel() {
+ val accountLiveData: LiveData = Transformations.map(account.live) { it }
+ val userLiveData: LiveData = Transformations.map(account.userProfile().live) { it }
+
+ fun reactTo(note: Note) {
+ account.reactTo(note)
+ }
+
+ fun boost(note: Note) {
+ account.boost(note)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt
new file mode 100644
index 000000000..6f97b1a0e
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/HomeScreen.kt
@@ -0,0 +1,32 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.service.NostrHomeDataSource
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun HomeScreen(accountViewModel: AccountViewModel) {
+ val account by accountViewModel.accountLiveData.observeAsState()
+
+ if (account != null) {
+ val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrHomeDataSource ) }
+
+ Column(Modifier.fillMaxHeight()) {
+ Column(
+ modifier = Modifier.padding(vertical = 0.dp)
+ ) {
+ FeedView(feedViewModel, accountViewModel)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt
new file mode 100644
index 000000000..668432e74
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MainScreen.kt
@@ -0,0 +1,74 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.animation.Crossfade
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.statusBarsPadding
+import androidx.compose.material.*
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.Modifier
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import androidx.navigation.NavHostController
+import androidx.navigation.compose.rememberNavController
+import com.vitorpamplona.amethyst.buttons.NewNoteButton
+import com.vitorpamplona.amethyst.ui.navigation.AppBottomBar
+import com.vitorpamplona.amethyst.ui.navigation.AppNavigation
+import com.vitorpamplona.amethyst.ui.navigation.AppTopBar
+import com.vitorpamplona.amethyst.ui.navigation.DrawerContent
+import com.vitorpamplona.amethyst.ui.navigation.Route
+import com.vitorpamplona.amethyst.ui.navigation.currentRoute
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@Composable
+fun MainScreen(accountViewModel: AccountViewModel, accountStateViewModel: AccountStateViewModel) {
+ val navController = rememberNavController()
+ val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed))
+
+ Scaffold(
+ modifier = Modifier
+ .background(MaterialTheme.colors.primaryVariant)
+ .statusBarsPadding(),
+ bottomBar = {
+ AppBottomBar(navController)
+ },
+ topBar = {
+ AppTopBar(navController, scaffoldState, accountViewModel)
+ },
+ drawerContent = {
+ DrawerContent(navController, scaffoldState, accountViewModel, accountStateViewModel)
+ },
+ floatingActionButton = {
+ FloatingButton(navController, accountStateViewModel)
+ },
+ scaffoldState = scaffoldState
+ ) {
+ Column(modifier = Modifier.padding(bottom = it.calculateBottomPadding())) {
+ AppNavigation(navController, accountViewModel)
+ }
+ }
+}
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun FloatingButton(navController: NavHostController, accountViewModel: AccountStateViewModel) {
+ val accountState by accountViewModel.accountContent.collectAsStateWithLifecycle()
+
+ if (currentRoute(navController) == Route.Home.route) {
+ Crossfade(targetState = accountState) { state ->
+ when (state) {
+ is AccountState.LoggedInViewOnly -> {
+ // Does nothing.
+ }
+ is AccountState.LoggedOff -> {
+ // Does nothing.
+ }
+ is AccountState.LoggedIn -> {
+ NewNoteButton(state.account)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt
new file mode 100644
index 000000000..5b2dc24c6
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/MessageScreen.kt
@@ -0,0 +1,29 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.Text
+import androidx.compose.material.rememberScaffoldState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@Composable
+fun MessageScreen(accountViewModel: AccountViewModel) {
+ val state = rememberScaffoldState()
+ val scope = rememberCoroutineScope()
+
+ Column(
+ Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text("Message Screen")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt
new file mode 100644
index 000000000..61cd681f6
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/NotificationScreen.kt
@@ -0,0 +1,33 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.service.NostrNotificationDataSource
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun NotificationScreen(accountViewModel: AccountViewModel) {
+ val account by accountViewModel.accountLiveData.observeAsState()
+
+ if (account != null) {
+ val feedViewModel: CardFeedViewModel =
+ viewModel { CardFeedViewModel( NostrNotificationDataSource ) }
+
+ Column(Modifier.fillMaxHeight()) {
+ Column(
+ modifier = Modifier.padding(vertical = 0.dp)
+ ) {
+ CardFeedView(feedViewModel, accountViewModel = accountViewModel)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt
new file mode 100644
index 000000000..df3d4c9e7
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt
@@ -0,0 +1,29 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.material.Text
+import androidx.compose.material.rememberScaffoldState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@Composable
+fun ProfileScreen(accountViewModel: AccountViewModel) {
+ val state = rememberScaffoldState()
+ val scope = rememberCoroutineScope()
+
+ Column(
+ Modifier
+ .fillMaxHeight()
+ .fillMaxWidth(),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Text("Profile Screen")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt
new file mode 100644
index 000000000..c9cbc7ae4
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/SearchScreen.kt
@@ -0,0 +1,26 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
+import androidx.lifecycle.viewmodel.compose.viewModel
+import com.vitorpamplona.amethyst.service.NostrGlobalDataSource
+import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
+
+@OptIn(ExperimentalLifecycleComposeApi::class)
+@Composable
+fun SearchScreen(accountViewModel: AccountViewModel) {
+ val feedViewModel: FeedViewModel = viewModel { FeedViewModel( NostrGlobalDataSource ) }
+
+ Column(Modifier.fillMaxHeight()) {
+ Column(
+ modifier = Modifier.padding(vertical = 0.dp)
+ ) {
+ FeedView(feedViewModel, accountViewModel)
+ }
+ }
+}
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt
new file mode 100644
index 000000000..8bfc09ce3
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedOff/LoginScreen.kt
@@ -0,0 +1,104 @@
+package com.vitorpamplona.amethyst.ui.screen
+
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.text.ClickableText
+import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.Button
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.OutlinedTextField
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.vitorpamplona.amethyst.R
+import com.vitorpamplona.amethyst.ui.theme.Purple700
+
+@Composable
+fun LoginPage(accountViewModel: AccountStateViewModel) {
+ Box(modifier = Modifier.fillMaxSize()) {
+ ClickableText(
+ text = AnnotatedString("Generate a new key"),
+ modifier = Modifier
+ .align(Alignment.BottomCenter)
+ .padding(20.dp),
+ onClick = { accountViewModel.newKey() },
+ style = TextStyle(
+ fontSize = 14.sp,
+ textDecoration = TextDecoration.Underline,
+ color = Purple700
+ )
+ )
+ }
+ Column(
+ modifier = Modifier.padding(20.dp).fillMaxSize(),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally,
+ ) {
+
+ val key = remember { mutableStateOf(TextFieldValue("")) }
+
+ Image(
+ painterResource(id = R.drawable.amethyst_logo),
+ contentDescription = "App Logo",
+ modifier = Modifier.size(300.dp),
+ contentScale = ContentScale.Inside
+ )
+
+ Spacer(modifier = Modifier.height(20.dp))
+
+ //Text(text = "Insert your private or public key (view-only)")
+
+ OutlinedTextField(
+ value = key.value,
+ onValueChange = { key.value = it },
+ keyboardOptions = KeyboardOptions(
+ autoCorrect = false,
+ keyboardType = KeyboardType.Ascii,
+ imeAction = ImeAction.Next
+ ),
+ placeholder = {
+ Text(
+ text = "nsec / npub / hex private key",
+ color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f)
+ )
+ }
+ )
+
+ Spacer(modifier = Modifier.height(20.dp))
+
+ Box(modifier = Modifier.padding(40.dp, 0.dp, 40.dp, 0.dp)) {
+ Button(
+ onClick = { accountViewModel.login(key.value.text) },
+ shape = RoundedCornerShape(35.dp),
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ ) {
+ Text(text = "Login")
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt
new file mode 100644
index 000000000..74b3e6c49
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Color.kt
@@ -0,0 +1,8 @@
+package com.vitorpamplona.amethyst.ui.theme
+
+import androidx.compose.ui.graphics.Color
+
+val Purple200 = Color(0xFFBB86FC)
+val Purple500 = Color(0xFF6200EE)
+val Purple700 = Color(0xFF3700B3)
+val Teal200 = Color(0xFF03DAC5)
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt
new file mode 100644
index 000000000..809cbc6b9
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Shape.kt
@@ -0,0 +1,11 @@
+package com.vitorpamplona.amethyst.ui.theme
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Shapes
+import androidx.compose.ui.unit.dp
+
+val Shapes = Shapes(
+ small = RoundedCornerShape(4.dp),
+ medium = RoundedCornerShape(4.dp),
+ large = RoundedCornerShape(0.dp)
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt
new file mode 100644
index 000000000..b40bbbe3f
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Theme.kt
@@ -0,0 +1,56 @@
+package com.vitorpamplona.amethyst.ui.theme
+
+import android.app.Activity
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.darkColors
+import androidx.compose.material.lightColors
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.LocalView
+
+private val DarkColorPalette = darkColors(
+ primary = Purple200,
+ primaryVariant = Purple700,
+ secondary = Teal200,
+)
+
+private val LightColorPalette = lightColors(
+ primary = Purple500,
+ primaryVariant = Purple700,
+ secondary = Teal200,
+
+ /* Other default colors to override
+ background = Color.White,
+ surface = Color.White,
+ onPrimary = Color.White,
+ onSecondary = Color.Black,
+ onBackground = Color.Black,
+ onSurface = Color.Black,
+ */
+)
+
+@Composable
+fun AmethystTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) {
+ val colors = if (darkTheme) {
+ DarkColorPalette
+ } else {
+ LightColorPalette
+ }
+
+ MaterialTheme(
+ colors = colors,
+ typography = Typography,
+ shapes = Shapes,
+ content = content
+ )
+
+ val view = LocalView.current
+ if (!view.isInEditMode && darkTheme) {
+ SideEffect {
+ val window = (view.context as Activity).window
+ window.statusBarColor = colors.background.toArgb()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt
new file mode 100644
index 000000000..c5a8ccc94
--- /dev/null
+++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/theme/Type.kt
@@ -0,0 +1,28 @@
+package com.vitorpamplona.amethyst.ui.theme
+
+import androidx.compose.material.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+// Set of Material typography styles to start with
+val Typography = Typography(
+ body1 = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp
+ )
+ /* Other default text styles to override
+ button = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.W500,
+ fontSize = 14.sp
+ ),
+ caption = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 12.sp
+ )
+ */
+)
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/ic_amethyst.png b/app/src/main/res/drawable-hdpi/ic_amethyst.png
new file mode 100644
index 000000000..813f42f7f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_amethyst.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_bookmarks.png b/app/src/main/res/drawable-hdpi/ic_bookmarks.png
new file mode 100644
index 000000000..8a7cf8bea
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_bookmarks.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_comment.png b/app/src/main/res/drawable-hdpi/ic_comment.png
new file mode 100644
index 000000000..0ae259d47
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_comment.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_compose.png b/app/src/main/res/drawable-hdpi/ic_compose.png
new file mode 100644
index 000000000..047712d66
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_compose.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_dm.png b/app/src/main/res/drawable-hdpi/ic_dm.png
new file mode 100644
index 000000000..a611ebc78
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_dm.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png
new file mode 100644
index 000000000..f0b2cc7a0
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_like.png b/app/src/main/res/drawable-hdpi/ic_like.png
new file mode 100644
index 000000000..1ff6f5772
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_liked.png b/app/src/main/res/drawable-hdpi/ic_liked.png
new file mode 100644
index 000000000..b5247d64c
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_liked.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_lists.png b/app/src/main/res/drawable-hdpi/ic_lists.png
new file mode 100644
index 000000000..521f277fa
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_lists.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_moments.png b/app/src/main/res/drawable-hdpi/ic_moments.png
new file mode 100644
index 000000000..9f2113103
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_moments.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_notifications.png b/app/src/main/res/drawable-hdpi/ic_notifications.png
new file mode 100644
index 000000000..cd68c7add
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_notifications.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_profile.png b/app/src/main/res/drawable-hdpi/ic_profile.png
new file mode 100644
index 000000000..da70047c2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_qrcode.png b/app/src/main/res/drawable-hdpi/ic_qrcode.png
new file mode 100644
index 000000000..31b0439c9
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_qrcode.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_retweet.png b/app/src/main/res/drawable-hdpi/ic_retweet.png
new file mode 100644
index 000000000..89cb87ed6
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_retweet.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_retweeted.png b/app/src/main/res/drawable-hdpi/ic_retweeted.png
new file mode 100644
index 000000000..c7e2b0abf
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_retweeted.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_search.png b/app/src/main/res/drawable-hdpi/ic_search.png
new file mode 100644
index 000000000..353391caf
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_search.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_share.png b/app/src/main/res/drawable-hdpi/ic_share.png
new file mode 100644
index 000000000..cd4b166ea
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_share.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_theme.png b/app/src/main/res/drawable-hdpi/ic_theme.png
new file mode 100644
index 000000000..b2b5876a4
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_theme.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_topics.png b/app/src/main/res/drawable-hdpi/ic_topics.png
new file mode 100644
index 000000000..1b0973811
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_topics.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_trends.png b/app/src/main/res/drawable-hdpi/ic_trends.png
new file mode 100644
index 000000000..7fa5184a3
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_trends.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_verified.png b/app/src/main/res/drawable-hdpi/ic_verified.png
new file mode 100644
index 000000000..994fb02f3
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_verified.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_amethyst.png b/app/src/main/res/drawable-mdpi/ic_amethyst.png
new file mode 100644
index 000000000..32891ab13
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_amethyst.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_bookmarks.png b/app/src/main/res/drawable-mdpi/ic_bookmarks.png
new file mode 100644
index 000000000..ecb040b7a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_bookmarks.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_comment.png b/app/src/main/res/drawable-mdpi/ic_comment.png
new file mode 100644
index 000000000..893bb49f9
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_comment.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_compose.png b/app/src/main/res/drawable-mdpi/ic_compose.png
new file mode 100644
index 000000000..28f42a0c5
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_compose.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_dm.png b/app/src/main/res/drawable-mdpi/ic_dm.png
new file mode 100644
index 000000000..25bc3ac94
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_dm.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png
new file mode 100644
index 000000000..fd3a0655a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_like.png b/app/src/main/res/drawable-mdpi/ic_like.png
new file mode 100644
index 000000000..babf38b7b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_liked.png b/app/src/main/res/drawable-mdpi/ic_liked.png
new file mode 100644
index 000000000..194ff9f95
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_liked.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_lists.png b/app/src/main/res/drawable-mdpi/ic_lists.png
new file mode 100644
index 000000000..e5e10a555
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_lists.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_moments.png b/app/src/main/res/drawable-mdpi/ic_moments.png
new file mode 100644
index 000000000..a6e689fba
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_moments.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_notifications.png b/app/src/main/res/drawable-mdpi/ic_notifications.png
new file mode 100644
index 000000000..aa8fffa36
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_notifications.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_profile.png b/app/src/main/res/drawable-mdpi/ic_profile.png
new file mode 100644
index 000000000..8eec4f1e3
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_qrcode.png b/app/src/main/res/drawable-mdpi/ic_qrcode.png
new file mode 100644
index 000000000..ff1e89162
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_qrcode.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_retweet.png b/app/src/main/res/drawable-mdpi/ic_retweet.png
new file mode 100644
index 000000000..0e36ae06c
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_retweet.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_retweeted.png b/app/src/main/res/drawable-mdpi/ic_retweeted.png
new file mode 100644
index 000000000..39545e500
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_retweeted.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_search.png b/app/src/main/res/drawable-mdpi/ic_search.png
new file mode 100644
index 000000000..026723273
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_search.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_share.png b/app/src/main/res/drawable-mdpi/ic_share.png
new file mode 100644
index 000000000..f08ff4f53
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_share.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_theme.png b/app/src/main/res/drawable-mdpi/ic_theme.png
new file mode 100644
index 000000000..616707d87
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_theme.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_topics.png b/app/src/main/res/drawable-mdpi/ic_topics.png
new file mode 100644
index 000000000..aebed8f6b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_topics.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_trends.png b/app/src/main/res/drawable-mdpi/ic_trends.png
new file mode 100644
index 000000000..3275536af
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_trends.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_verified.png b/app/src/main/res/drawable-mdpi/ic_verified.png
new file mode 100644
index 000000000..8a70ec1d4
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_verified.png differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 000000000..2b068d114
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/ic_amethyst.png b/app/src/main/res/drawable-xhdpi/ic_amethyst.png
new file mode 100644
index 000000000..21f7a7d2e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_amethyst.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xhdpi/ic_bookmarks.png
new file mode 100644
index 000000000..5b04fca6c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_bookmarks.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_comment.png b/app/src/main/res/drawable-xhdpi/ic_comment.png
new file mode 100644
index 000000000..6687355e0
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_comment.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_compose.png b/app/src/main/res/drawable-xhdpi/ic_compose.png
new file mode 100644
index 000000000..323e9d504
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_compose.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_dm.png b/app/src/main/res/drawable-xhdpi/ic_dm.png
new file mode 100644
index 000000000..2c56264dc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_dm.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png
new file mode 100644
index 000000000..15a0e17dd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_like.png b/app/src/main/res/drawable-xhdpi/ic_like.png
new file mode 100644
index 000000000..89dc58fdc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_liked.png b/app/src/main/res/drawable-xhdpi/ic_liked.png
new file mode 100644
index 000000000..d6f1bb5c4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_liked.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_lists.png b/app/src/main/res/drawable-xhdpi/ic_lists.png
new file mode 100644
index 000000000..92f7f235c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_lists.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_moments.png b/app/src/main/res/drawable-xhdpi/ic_moments.png
new file mode 100644
index 000000000..cadbb7483
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_moments.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_notifications.png b/app/src/main/res/drawable-xhdpi/ic_notifications.png
new file mode 100644
index 000000000..4fe3bcbf6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_notifications.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_profile.png b/app/src/main/res/drawable-xhdpi/ic_profile.png
new file mode 100644
index 000000000..67c2513f6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_qrcode.png b/app/src/main/res/drawable-xhdpi/ic_qrcode.png
new file mode 100644
index 000000000..e6f4bb453
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_qrcode.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_retweet.png b/app/src/main/res/drawable-xhdpi/ic_retweet.png
new file mode 100644
index 000000000..dbcd7480e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_retweet.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_retweeted.png b/app/src/main/res/drawable-xhdpi/ic_retweeted.png
new file mode 100644
index 000000000..2b1222f98
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_retweeted.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_search.png b/app/src/main/res/drawable-xhdpi/ic_search.png
new file mode 100644
index 000000000..1da2ab0b4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_search.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_share.png b/app/src/main/res/drawable-xhdpi/ic_share.png
new file mode 100644
index 000000000..97c9b2e95
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_share.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_theme.png b/app/src/main/res/drawable-xhdpi/ic_theme.png
new file mode 100644
index 000000000..59b9eeee3
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_theme.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_topics.png b/app/src/main/res/drawable-xhdpi/ic_topics.png
new file mode 100644
index 000000000..f235e5d22
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_topics.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_trends.png b/app/src/main/res/drawable-xhdpi/ic_trends.png
new file mode 100644
index 000000000..fb979bb71
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_trends.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_verified.png b/app/src/main/res/drawable-xhdpi/ic_verified.png
new file mode 100644
index 000000000..27ee31f90
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_verified.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_amethyst.png b/app/src/main/res/drawable-xxhdpi/ic_amethyst.png
new file mode 100644
index 000000000..0fa65e03a
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_amethyst.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png
new file mode 100644
index 000000000..b810d48cf
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_bookmarks.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_comment.png b/app/src/main/res/drawable-xxhdpi/ic_comment.png
new file mode 100644
index 000000000..b73c0d880
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_comment.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_compose.png b/app/src/main/res/drawable-xxhdpi/ic_compose.png
new file mode 100644
index 000000000..de56c926d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_compose.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_dm.png b/app/src/main/res/drawable-xxhdpi/ic_dm.png
new file mode 100644
index 000000000..bfccc81e8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_dm.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png
new file mode 100644
index 000000000..95134129e
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_like.png b/app/src/main/res/drawable-xxhdpi/ic_like.png
new file mode 100644
index 000000000..0ad7f67cd
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_liked.png b/app/src/main/res/drawable-xxhdpi/ic_liked.png
new file mode 100644
index 000000000..ab0b6d881
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_liked.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_lists.png b/app/src/main/res/drawable-xxhdpi/ic_lists.png
new file mode 100644
index 000000000..a8ae988a8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_lists.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_moments.png b/app/src/main/res/drawable-xxhdpi/ic_moments.png
new file mode 100644
index 000000000..6d3b82339
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_moments.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications.png b/app/src/main/res/drawable-xxhdpi/ic_notifications.png
new file mode 100644
index 000000000..ef693ff9e
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_notifications.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile.png b/app/src/main/res/drawable-xxhdpi/ic_profile.png
new file mode 100644
index 000000000..118d4eb78
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_qrcode.png b/app/src/main/res/drawable-xxhdpi/ic_qrcode.png
new file mode 100644
index 000000000..c35c205d4
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_qrcode.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_retweet.png b/app/src/main/res/drawable-xxhdpi/ic_retweet.png
new file mode 100644
index 000000000..ec6941727
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_retweet.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_retweeted.png b/app/src/main/res/drawable-xxhdpi/ic_retweeted.png
new file mode 100644
index 000000000..5a3025a57
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_retweeted.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_search.png b/app/src/main/res/drawable-xxhdpi/ic_search.png
new file mode 100644
index 000000000..1b1018879
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_search.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_share.png b/app/src/main/res/drawable-xxhdpi/ic_share.png
new file mode 100644
index 000000000..63728b0ed
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_share.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_theme.png b/app/src/main/res/drawable-xxhdpi/ic_theme.png
new file mode 100644
index 000000000..d58f977f6
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_theme.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_topics.png b/app/src/main/res/drawable-xxhdpi/ic_topics.png
new file mode 100644
index 000000000..d65cc49b3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_topics.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_trends.png b/app/src/main/res/drawable-xxhdpi/ic_trends.png
new file mode 100644
index 000000000..858746bba
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_trends.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_verified.png b/app/src/main/res/drawable-xxhdpi/ic_verified.png
new file mode 100644
index 000000000..76f539089
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_verified.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png b/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png
new file mode 100644
index 000000000..b869584e3
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/amethyst_logo.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png b/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png
new file mode 100644
index 000000000..1842fce41
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_amethyst.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png b/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png
new file mode 100644
index 000000000..165366df4
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_bookmarks.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_comment.png b/app/src/main/res/drawable-xxxhdpi/ic_comment.png
new file mode 100644
index 000000000..924df6135
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_comment.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_compose.png b/app/src/main/res/drawable-xxxhdpi/ic_compose.png
new file mode 100644
index 000000000..f14f01ab7
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_compose.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dm.png b/app/src/main/res/drawable-xxxhdpi/ic_dm.png
new file mode 100644
index 000000000..9172d9717
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_dm.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home.png b/app/src/main/res/drawable-xxxhdpi/ic_home.png
new file mode 100644
index 000000000..4809c13c1
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like.png b/app/src/main/res/drawable-xxxhdpi/ic_like.png
new file mode 100644
index 000000000..2883a6428
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_liked.png b/app/src/main/res/drawable-xxxhdpi/ic_liked.png
new file mode 100644
index 000000000..526a70808
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_liked.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_lists.png b/app/src/main/res/drawable-xxxhdpi/ic_lists.png
new file mode 100644
index 000000000..e00363994
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_lists.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_moments.png b/app/src/main/res/drawable-xxxhdpi/ic_moments.png
new file mode 100644
index 000000000..cc2d64902
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_moments.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications.png
new file mode 100644
index 000000000..98130ffe4
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_notifications.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile.png b/app/src/main/res/drawable-xxxhdpi/ic_profile.png
new file mode 100644
index 000000000..ee8bcf94f
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png b/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png
new file mode 100644
index 000000000..bffe18dc1
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_qrcode.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_retweet.png b/app/src/main/res/drawable-xxxhdpi/ic_retweet.png
new file mode 100644
index 000000000..afe333eda
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_retweet.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png b/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png
new file mode 100644
index 000000000..4306931b2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_retweeted.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_search.png b/app/src/main/res/drawable-xxxhdpi/ic_search.png
new file mode 100644
index 000000000..9c50ac7b2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_search.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_share.png b/app/src/main/res/drawable-xxxhdpi/ic_share.png
new file mode 100644
index 000000000..1b556d7dd
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_share.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_theme.png b/app/src/main/res/drawable-xxxhdpi/ic_theme.png
new file mode 100644
index 000000000..432b8953f
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_theme.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_topics.png b/app/src/main/res/drawable-xxxhdpi/ic_topics.png
new file mode 100644
index 000000000..c40d9f9a4
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_topics.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_trends.png b/app/src/main/res/drawable-xxxhdpi/ic_trends.png
new file mode 100644
index 000000000..b7a948c49
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_trends.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_verified.png b/app/src/main/res/drawable-xxxhdpi/ic_verified.png
new file mode 100644
index 000000000..8213c188e
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_verified.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg b/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg
new file mode 100644
index 000000000..ee5baffef
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/profile_banner.jpeg differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 000000000..07d5da9cb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..eca70cfe5
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 000000000..c209e78ec
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..b2dfe3d1b
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 000000000..4f0f1d64e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..62b611da0
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 000000000..948a3070f
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..1b9a6956b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..28d4b77f9
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9287f5083
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..aa7d6427e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9126ae37c
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 000000000..0589574df
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 000000000..f8c6127d3
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 000000000..e296a5583
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Amethyst
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 000000000..e3dcd4fc4
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 000000000..fa0f996d2
--- /dev/null
+++ b/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 000000000..9ee9997b0
--- /dev/null
+++ b/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt b/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt
new file mode 100644
index 000000000..664fbe1dd
--- /dev/null
+++ b/app/src/test/java/com/vitorpamplona/amethyst/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.vitorpamplona.amethyst
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 000000000..c22aaf300
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,13 @@
+buildscript {
+ ext {
+ compose_ui_version = '1.3.2'
+ nav_version = "2.5.3"
+ room_version = "2.4.3"
+ }
+}// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '7.3.1' apply false
+ id 'com.android.library' version '7.3.1' apply false
+ id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
+ id 'org.jetbrains.kotlin.jvm' version '1.7.20' apply false
+}
\ No newline at end of file
diff --git a/deps.txt b/deps.txt
new file mode 100644
index 000000000..9cb0db715
--- /dev/null
+++ b/deps.txt
@@ -0,0 +1,4330 @@
+
+> Task :app:dependencies
+
+------------------------------------------------------------
+Project ':app'
+------------------------------------------------------------
+
+androidApis - Configuration providing various types of Android JAR file
+No dependencies
+
+androidJacocoAnt - The Jacoco agent to use to get coverage data.
+\--- org.jacoco:org.jacoco.ant:0.8.7
+ +--- org.jacoco:org.jacoco.core:0.8.7
+ | +--- org.ow2.asm:asm:9.1
+ | +--- org.ow2.asm:asm-commons:9.1
+ | | +--- org.ow2.asm:asm:9.1
+ | | +--- org.ow2.asm:asm-tree:9.1
+ | | | \--- org.ow2.asm:asm:9.1
+ | | \--- org.ow2.asm:asm-analysis:9.1
+ | | \--- org.ow2.asm:asm-tree:9.1 (*)
+ | \--- org.ow2.asm:asm-tree:9.1 (*)
+ +--- org.jacoco:org.jacoco.report:0.8.7
+ | \--- org.jacoco:org.jacoco.core:0.8.7 (*)
+ \--- org.jacoco:org.jacoco.agent:0.8.7
+
+androidJdkImage - Configuration providing JDK image for compiling Java 9+ sources
+No dependencies
+
+androidTestAnnotationProcessor - Classpath for the annotation processor for 'androidTest'. (n)
+No dependencies
+
+androidTestApi (n)
+No dependencies
+
+androidTestApiDependenciesMetadata
+No dependencies
+
+androidTestCompileOnly - Compile only dependencies for 'androidTest' sources. (n)
+No dependencies
+
+androidTestCompileOnlyDependenciesMetadata
+No dependencies
+
+androidTestDebugAnnotationProcessor - Classpath for the annotation processor for 'androidTestDebug'. (n)
+No dependencies
+
+androidTestDebugApi (n)
+No dependencies
+
+androidTestDebugApiDependenciesMetadata
+No dependencies
+
+androidTestDebugCompileOnly - Compile only dependencies for 'androidTestDebug' sources. (n)
+No dependencies
+
+androidTestDebugCompileOnlyDependenciesMetadata
+No dependencies
+
+androidTestDebugImplementation - Implementation only dependencies for 'androidTestDebug' sources. (n)
+No dependencies
+
+androidTestDebugImplementationDependenciesMetadata
+No dependencies
+
+androidTestDebugIntransitiveDependenciesMetadata
+No dependencies
+
+androidTestDebugRuntimeOnly - Runtime only dependencies for 'androidTestDebug' sources. (n)
+No dependencies
+
+androidTestDebugRuntimeOnlyDependenciesMetadata
+No dependencies
+
+androidTestDebugWearApp - Link to a wear app to embed for object 'androidTestDebug'. (n)
+No dependencies
+
+androidTestImplementation - Implementation only dependencies for 'androidTest' sources. (n)
++--- androidx.test.ext:junit:1.1.5 (n)
++--- androidx.test.espresso:espresso-core:3.5.1 (n)
+\--- androidx.compose.ui:ui-test-junit4:1.3.2 (n)
+
+androidTestImplementationDependenciesMetadata
++--- androidx.test.ext:junit:1.1.5
+| +--- junit:junit:4.13.2
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- androidx.test:core:1.5.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+| | | \--- org.jetbrains:annotations:13.0
+| | +--- androidx.test:monitor:1.6.0 -> 1.6.1
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:annotation:1.0.1
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.annotation:annotation-experimental:1.1.0
+| | | \--- androidx.tracing:tracing:1.0.0
+| | +--- androidx.test.services:storage:1.4.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*)
+| | | +--- com.google.code.findbugs:jsr305:2.0.2
+| | | \--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.3.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | +--- com.google.guava:listenablefuture:1.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+| | \--- androidx.concurrent:concurrent-futures:1.1.0
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- com.google.guava:listenablefuture:1.0
+| +--- androidx.test:monitor:1.6.1 (*)
+| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
++--- androidx.test.espresso:espresso-core:3.5.1
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.test:core:1.5.0 (*)
+| +--- androidx.test:runner:1.5.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.test:monitor:1.6.1 (*)
+| | +--- androidx.test.services:storage:1.4.2 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | \--- junit:junit:4.13.2 (*)
+| +--- androidx.test.espresso:espresso-idling-resource:3.5.1
+| +--- com.squareup:javawriter:2.1.1
+| +--- javax.inject:javax.inject:1
+| +--- org.hamcrest:hamcrest-library:1.3
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- org.hamcrest:hamcrest-integration:1.3
+| | \--- org.hamcrest:hamcrest-library:1.3 (*)
+| +--- com.google.code.findbugs:jsr305:2.0.2
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+| \--- androidx.test:annotation:1.0.1 (*)
+\--- androidx.compose.ui:ui-test-junit4:1.3.2
+ +--- androidx.activity:activity:1.2.0
+ | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | +--- androidx.core:core:1.1.0
+ | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.3.0
+ | | | +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*)
+ | | | +--- androidx.arch.core:core-common:2.1.0
+ | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.versionedparcelable:versionedparcelable:1.1.0
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.collection:collection:1.0.0
+ | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+ | | \--- androidx.collection:collection:1.0.0 (*)
+ | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 (*)
+ | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0
+ | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | +--- androidx.savedstate:savedstate:1.1.0
+ | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0
+ | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+ | +--- androidx.savedstate:savedstate:1.1.0 (*)
+ | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.0
+ | | \--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*)
+ | \--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 (*)
+ +--- androidx.compose.ui:ui-test:1.3.2
+ | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+ | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+ | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10
+ | | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10
+ | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+ | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+ | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+ | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c)
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*)
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*)
+ | +--- androidx.compose.ui:ui:1.3.2
+ | | +--- androidx.annotation:annotation:1.5.0 (*)
+ | | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+ | | +--- androidx.compose.ui:ui-geometry:1.3.2
+ | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.compose.ui:ui-graphics:1.3.2
+ | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.ui:ui-unit:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+ | | +--- androidx.compose.ui:ui-text:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+ | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-text:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+ | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4
+ | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10
+ | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 (*)
+ +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*)
+ +--- junit:junit:4.13.2 (*)
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+ \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+
+androidTestIntransitiveDependenciesMetadata
+No dependencies
+
+androidTestReleaseAnnotationProcessor - Classpath for the annotation processor for 'androidTestRelease'. (n)
+No dependencies
+
+androidTestReleaseApi (n)
+No dependencies
+
+androidTestReleaseApiDependenciesMetadata
+No dependencies
+
+androidTestReleaseCompileOnly - Compile only dependencies for 'androidTestRelease' sources. (n)
+No dependencies
+
+androidTestReleaseCompileOnlyDependenciesMetadata
+No dependencies
+
+androidTestReleaseImplementation - Implementation only dependencies for 'androidTestRelease' sources. (n)
+No dependencies
+
+androidTestReleaseImplementationDependenciesMetadata
+No dependencies
+
+androidTestReleaseIntransitiveDependenciesMetadata
+No dependencies
+
+androidTestReleaseRuntimeOnly - Runtime only dependencies for 'androidTestRelease' sources. (n)
+No dependencies
+
+androidTestReleaseRuntimeOnlyDependenciesMetadata
+No dependencies
+
+androidTestReleaseWearApp - Link to a wear app to embed for object 'androidTestRelease'. (n)
+No dependencies
+
+androidTestRuntimeOnly - Runtime only dependencies for 'androidTest' sources. (n)
+No dependencies
+
+androidTestRuntimeOnlyDependenciesMetadata
+No dependencies
+
+androidTestUtil - Additional APKs used during instrumentation testing.
+No dependencies
+
+androidTestWearApp - Link to a wear app to embed for object 'androidTest'. (n)
+No dependencies
+
+annotationProcessor - Classpath for the annotation processor for 'main'. (n)
+No dependencies
+
+api - API dependencies for 'main' sources. (n)
+No dependencies
+
+apiDependenciesMetadata
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+ | \--- org.jetbrains:annotations:13.0
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+
+archives - Configuration for archive artifacts. (n)
+No dependencies
+
+compileOnly - Compile only dependencies for 'main' sources. (n)
+No dependencies
+
+compileOnlyDependenciesMetadata
+No dependencies
+
+coreLibraryDesugaring - Configuration to desugar libraries
+No dependencies
+
+debugAabPublication - Bundle Publication for debug (n)
+No dependencies
+
+debugAndroidTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debugAndroidTest
+No dependencies
+
+debugAndroidTestApi - API dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n)
+No dependencies
+
+debugAndroidTestApiDependenciesMetadata
+No dependencies
+
+debugAndroidTestCompileClasspath - Compile classpath for compilation 'debugAndroidTest' (target (androidJvm)).
++--- androidx.test.ext:junit:1.1.5
+| +--- junit:junit:4.13.2
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- androidx.test:core:1.5.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | | \--- org.jetbrains:annotations:13.0
+| | +--- androidx.test:monitor:1.6.0 -> 1.6.1
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:annotation:1.0.1
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.tracing:tracing:1.0.0
+| | +--- androidx.test.services:storage:1.4.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*)
+| | | +--- com.google.code.findbugs:jsr305:2.0.2
+| | | \--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | +--- com.google.guava:listenablefuture:1.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- androidx.concurrent:concurrent-futures:1.1.0 -> 1.0.0
+| | +--- com.google.guava:listenablefuture:1.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.test:monitor:1.6.1 (*)
+| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
++--- androidx.test.espresso:espresso-core:3.5.1
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.test:core:1.5.0 (*)
+| +--- androidx.test:runner:1.5.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.test:monitor:1.6.1 (*)
+| | +--- androidx.test.services:storage:1.4.2 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | \--- junit:junit:4.13.2 (*)
+| +--- androidx.test.espresso:espresso-idling-resource:3.5.1
+| +--- com.squareup:javawriter:2.1.1
+| +--- javax.inject:javax.inject:1
+| +--- org.hamcrest:hamcrest-library:1.3
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- org.hamcrest:hamcrest-integration:1.3
+| | \--- org.hamcrest:hamcrest-library:1.3 (*)
+| +--- com.google.code.findbugs:jsr305:2.0.2
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| \--- androidx.test:annotation:1.0.1 (*)
++--- androidx.compose.ui:ui-test-junit4:1.3.2
+| +--- androidx.activity:activity:1.2.0 -> 1.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.core:core:1.8.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.annotation:annotation-experimental:1.3.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.arch.core:core-common:2.1.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.9.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 (c)
+| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui-test:1.3.2
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | +--- androidx.compose.ui:ui:1.3.2
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-text:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*)
+| +--- junit:junit:4.13.2 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20 (*)
++--- project :app (*)
++--- androidx.test.ext:junit:{strictly 1.1.5} -> 1.1.5 (c)
++--- androidx.test.espresso:espresso-core:{strictly 3.5.1} -> 3.5.1 (c)
++--- androidx.compose.ui:ui-test-junit4:{strictly 1.3.2} -> 1.3.2 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.3.2 (*)
+| \--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c)
++--- androidx.test:core:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.test:monitor:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.test:runner:{strictly 1.5.2} -> 1.5.2 (c)
++--- androidx.test.espresso:espresso-idling-resource:{strictly 3.5.1} -> 3.5.1 (c)
++--- com.squareup:javawriter:{strictly 2.1.1} -> 2.1.1 (c)
++--- javax.inject:javax.inject:{strictly 1} -> 1 (c)
++--- org.hamcrest:hamcrest-library:{strictly 1.3} -> 1.3 (c)
++--- org.hamcrest:hamcrest-integration:{strictly 1.3} -> 1.3 (c)
++--- com.google.code.findbugs:jsr305:{strictly 2.0.2} -> 2.0.2 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.test:annotation:{strictly 1.0.1} -> 1.0.1 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui-test:{strictly 1.3.2} -> 1.3.2 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c)
++--- androidx.test.services:storage:{strictly 1.4.2} -> 1.4.2 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.tracing:tracing:{strictly 1.0.0} -> 1.0.0 (c)
++--- com.google.guava:listenablefuture:{strictly 1.0} -> 1.0 (c)
++--- androidx.concurrent:concurrent-futures:{strictly 1.0.0} -> 1.0.0 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-test:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:{strictly 1.6.4} -> 1.6.4 (c)
+\--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
+
+debugAndroidTestCompileOnly - Compile only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n)
+No dependencies
+
+debugAndroidTestCompileOnlyDependenciesMetadata
+No dependencies
+
+debugAndroidTestImplementation - Implementation only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n)
+No dependencies
+
+debugAndroidTestImplementationDependenciesMetadata
++--- androidx.test.ext:junit:1.1.5
+| +--- junit:junit:4.13.2
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- androidx.test:core:1.5.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+| | | \--- org.jetbrains:annotations:13.0
+| | +--- androidx.test:monitor:1.6.0 -> 1.6.1
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:annotation:1.0.1
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.annotation:annotation-experimental:1.1.0
+| | | \--- androidx.tracing:tracing:1.0.0
+| | +--- androidx.test.services:storage:1.4.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*)
+| | | +--- com.google.code.findbugs:jsr305:2.0.2
+| | | \--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.3.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | +--- com.google.guava:listenablefuture:1.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+| | \--- androidx.concurrent:concurrent-futures:1.1.0
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- com.google.guava:listenablefuture:1.0
+| +--- androidx.test:monitor:1.6.1 (*)
+| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
++--- androidx.test.espresso:espresso-core:3.5.1
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.test:core:1.5.0 (*)
+| +--- androidx.test:runner:1.5.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.test:monitor:1.6.1 (*)
+| | +--- androidx.test.services:storage:1.4.2 (*)
+| | +--- androidx.tracing:tracing:1.0.0
+| | \--- junit:junit:4.13.2 (*)
+| +--- androidx.test.espresso:espresso-idling-resource:3.5.1
+| +--- com.squareup:javawriter:2.1.1
+| +--- javax.inject:javax.inject:1
+| +--- org.hamcrest:hamcrest-library:1.3
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- org.hamcrest:hamcrest-integration:1.3
+| | \--- org.hamcrest:hamcrest-library:1.3 (*)
+| +--- com.google.code.findbugs:jsr305:2.0.2
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+| \--- androidx.test:annotation:1.0.1 (*)
+\--- androidx.compose.ui:ui-test-junit4:1.3.2
+ +--- androidx.activity:activity:1.2.0
+ | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | +--- androidx.core:core:1.1.0
+ | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.lifecycle:lifecycle-runtime:2.0.0 -> 2.3.0
+ | | | +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*)
+ | | | +--- androidx.arch.core:core-common:2.1.0
+ | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.versionedparcelable:versionedparcelable:1.1.0
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.collection:collection:1.0.0
+ | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+ | | \--- androidx.collection:collection:1.0.0 (*)
+ | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 (*)
+ | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0
+ | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | +--- androidx.savedstate:savedstate:1.1.0
+ | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0
+ | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+ | +--- androidx.savedstate:savedstate:1.1.0 (*)
+ | +--- androidx.lifecycle:lifecycle-livedata-core:2.3.0
+ | | \--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.3.1 (*)
+ | \--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 (*)
+ +--- androidx.compose.ui:ui-test:1.3.2
+ | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+ | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+ | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+ | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10
+ | | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3
+ | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.10
+ | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+ | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+ | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+ | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c)
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21
+ | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*)
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21
+ | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.10 (*)
+ | +--- androidx.compose.ui:ui:1.3.2
+ | | +--- androidx.annotation:annotation:1.5.0 (*)
+ | | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+ | | +--- androidx.compose.ui:ui-geometry:1.3.2
+ | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | +--- androidx.compose.ui:ui-graphics:1.3.2
+ | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.ui:ui-unit:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+ | | +--- androidx.compose.ui:ui-text:1.3.2
+ | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+ | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+ | | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-text:1.3.2 (*)
+ | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+ | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+ | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4
+ | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.10
+ | \--- org.jetbrains.kotlinx:atomicfu:0.17.3 (*)
+ +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*)
+ +--- junit:junit:4.13.2 (*)
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 (*)
+ \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10
+
+debugAndroidTestIntransitiveDependenciesMetadata
+No dependencies
+
+debugAndroidTestRuntimeClasspath - Runtime classpath of compilation 'debugAndroidTest' (target (androidJvm)).
++--- androidx.test.ext:junit:1.1.5
+| +--- junit:junit:4.13.2
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- androidx.test:core:1.5.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | | \--- org.jetbrains:annotations:13.0
+| | +--- androidx.test:monitor:1.6.0 -> 1.6.1
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:annotation:1.0.1
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.tracing:tracing:1.0.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.test.services:storage:1.4.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.test:monitor:1.6.0 -> 1.6.1 (*)
+| | | +--- com.google.code.findbugs:jsr305:2.0.2
+| | | \--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.lifecycle:lifecycle-common:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c)
+| | +--- androidx.tracing:tracing:1.0.0 (*)
+| | +--- com.google.guava:listenablefuture:1.0
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- androidx.concurrent:concurrent-futures:1.1.0 -> 1.0.0
+| | +--- com.google.guava:listenablefuture:1.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.test:monitor:1.6.1 (*)
+| \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
++--- androidx.test.espresso:espresso-core:3.5.1
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.test:core:1.5.0 (*)
+| +--- androidx.test:runner:1.5.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.test:annotation:1.0.1 (*)
+| | +--- androidx.test:monitor:1.6.1 (*)
+| | +--- androidx.test.services:storage:1.4.2 (*)
+| | +--- androidx.tracing:tracing:1.0.0 (*)
+| | \--- junit:junit:4.13.2 (*)
+| +--- androidx.test.espresso:espresso-idling-resource:3.5.1
+| +--- com.squareup:javawriter:2.1.1
+| +--- javax.inject:javax.inject:1
+| +--- org.hamcrest:hamcrest-library:1.3
+| | \--- org.hamcrest:hamcrest-core:1.3
+| +--- org.hamcrest:hamcrest-integration:1.3
+| | \--- org.hamcrest:hamcrest-library:1.3 (*)
+| +--- com.google.code.findbugs:jsr305:2.0.2
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| \--- androidx.test:annotation:1.0.1 (*)
++--- androidx.compose.ui:ui-test-junit4:1.3.2
+| +--- androidx.activity:activity:1.2.0 -> 1.6.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.core:core:1.8.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.annotation:annotation-experimental:1.3.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.concurrent:concurrent-futures:1.0.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.arch.core:core-common:2.1.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | \--- androidx.core:core-ktx:1.9.0 (c)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- androidx.core:core:1.9.0 (c)
+| | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | +--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4 (c)
+| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (c)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | +--- androidx.tracing:tracing:1.0.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- androidx.activity:activity-ktx:1.6.1 (c)
+| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1
+| | +--- androidx.activity:activity-ktx:1.6.1
+| | | +--- androidx.activity:activity:1.6.1 (*)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.activity:activity:1.6.1 (c)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- androidx.compose.ui:ui-text:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.2.0
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.startup:startup-runtime:1.1.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.tracing:tracing:1.0.0 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui-test:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.test:monitor:1.5.0 -> 1.6.1 (*)
+| | +--- androidx.test.espresso:espresso-core:3.3.0 -> 3.5.1 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-test-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- androidx.lifecycle:lifecycle-common:2.3.0 -> 2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| +--- androidx.test:core:1.4.0 -> 1.5.0 (*)
+| +--- androidx.test:monitor:1.5.0 -> 1.6.1 (*)
+| +--- androidx.test.espresso:espresso-core:3.3.0 -> 3.5.1 (*)
+| +--- androidx.test.espresso:espresso-idling-resource:3.3.0 -> 3.5.1
+| +--- androidx.test.ext:junit:1.1.3 -> 1.1.5 (*)
+| +--- junit:junit:4.13.2 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4 (*)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.tracing:tracing:{strictly 1.0.0} -> 1.0.0 (c)
++--- androidx.concurrent:concurrent-futures:{strictly 1.0.0} -> 1.0.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-util:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- androidx.arch.core:core-runtime:{strictly 2.1.0} -> 2.1.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.autofill:autofill:{strictly 1.0.0} -> 1.0.0 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.customview:customview-poolingcontainer:{strictly 1.0.0} -> 1.0.0 (c)
++--- androidx.profileinstaller:profileinstaller:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.startup:startup-runtime:{strictly 1.1.1} -> 1.1.1 (c)
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
+
+debugAndroidTestRuntimeOnly - Runtime only dependencies for compilation 'debugAndroidTest' (target (androidJvm)). (n)
+No dependencies
+
+debugAndroidTestRuntimeOnlyDependenciesMetadata
+No dependencies
+
+debugAnnotationProcessor - Classpath for the annotation processor for 'debug'. (n)
+No dependencies
+
+debugAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debug
+No dependencies
+
+debugApi - API dependencies for compilation 'debug' (target (androidJvm)). (n)
+No dependencies
+
+debugApiDependenciesMetadata
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+ | \--- org.jetbrains:annotations:13.0
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+
+debugApiElements - API elements for debug (n)
+No dependencies
+
+debugApkPublication - APK publication for debug (n)
+No dependencies
+
+debugCompileClasspath - Compile classpath for compilation 'debug' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui:1.3.2
+| | +--- androidx.annotation:annotation:1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.3.2 (*)
+| \--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.core:core:1.8.0 -> 1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate:1.2.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| +--- androidx.savedstate:savedstate:1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
++--- androidx.compose.ui:ui-tooling:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-test-manifest:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-data:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.animation:animation-core:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.animation:animation:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c)
++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c)
++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c)
+\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c)
+
+debugCompileOnly - Compile only dependencies for compilation 'debug' (target (androidJvm)). (n)
+No dependencies
+
+debugCompileOnlyDependenciesMetadata
+No dependencies
+
+debugImplementation - Implementation only dependencies for compilation 'debug' (target (androidJvm)). (n)
++--- androidx.compose.ui:ui-tooling:1.3.2 (n)
+\--- androidx.compose.ui:ui-test-manifest:1.3.2 (n)
+
+debugImplementationDependenciesMetadata
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | | \--- org.jetbrains.kotlinx:atomicfu:0.17.3
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui:1.3.2
+| | +--- androidx.annotation:annotation:1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.3.2 (*)
+| \--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.core:core:1.8.0 -> 1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0
+| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate:1.2.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| +--- androidx.savedstate:savedstate:1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+
+debugIntransitiveDependenciesMetadata
+No dependencies
+
+debugReverseMetadataValues - Metadata Values dependencies for the base Split
+No dependencies
+
+debugRuntimeClasspath - Runtime classpath of compilation 'debug' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1
+| | +--- androidx.activity:activity-ktx:1.6.1
+| | | +--- androidx.activity:activity:1.6.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.8.0 -> 1.9.0
+| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0
+| | | | | | +--- com.google.guava:listenablefuture:1.0
+| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-common:2.1.0
+| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c)
+| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | | \--- androidx.core:core-ktx:1.9.0 (c)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.core:core:1.9.0 (*)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | | | \--- androidx.core:core:1.9.0 (c)
+| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*)
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | | +--- androidx.tracing:tracing:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- androidx.activity:activity-ktx:1.6.1 (c)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.activity:activity:1.6.1 (c)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- androidx.compose.ui:ui-text:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.2.0
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.startup:startup-runtime:1.1.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.tracing:tracing:1.0.0 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.animation:animation:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.material:material:1.0.0 -> 1.3.1
+| | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*)
+| | +--- androidx.compose.material:material-icons-core:1.3.1
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.material:material-ripple:1.3.1
+| | | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
++--- androidx.activity:activity-compose:1.6.1 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| | +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | | \--- androidx.navigation:navigation-common:2.5.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection-ktx:1.1.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- androidx.navigation:navigation-runtime:2.5.3
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.navigation:navigation-common:2.5.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- com.squareup.okio:okio:3.2.0 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.appcompat:appcompat-resources:1.4.2
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*)
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
+| | | | +--- androidx.interpolator:interpolator:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.collection:collection:1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | | \--- androidx.exifinterface:exifinterface:1.3.3
+| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 (*)
+| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+ +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*)
+ +--- com.squareup.retrofit2:retrofit:2.8.1
+ | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*)
+ +--- com.squareup.retrofit2:converter-gson:2.8.1
+ | +--- com.squareup.retrofit2:retrofit:2.8.1 (*)
+ | \--- com.google.code.gson:gson:2.8.5
+ +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*)
+ +--- com.madgag.spongycastle:core:1.51.0.0
+ +--- com.madgag.spongycastle:prov:1.51.0.0
+ | \--- com.madgag.spongycastle:core:1.51.0.0
+ \--- com.github.mgunlogson:cuckoofilter4j:1.0.1
+ \--- com.google.guava:guava:19.0
+
+debugRuntimeElements - Runtime elements for debug (n)
+No dependencies
+
+debugRuntimeOnly - Runtime only dependencies for compilation 'debug' (target (androidJvm)). (n)
+No dependencies
+
+debugRuntimeOnlyDependenciesMetadata
+No dependencies
+
+debugUnitTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: debugUnitTest
+No dependencies
+
+debugUnitTestApi - API dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+debugUnitTestApiDependenciesMetadata
+No dependencies
+
+debugUnitTestCompileClasspath - Compile classpath for compilation 'debugUnitTest' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui:1.3.2
+| | +--- androidx.annotation:annotation:1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.3.2 (*)
+| \--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.core:core:1.8.0 -> 1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate:1.2.0
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| +--- androidx.savedstate:savedstate:1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- project :app (*)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.compose.ui:ui-tooling:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-test-manifest:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
++--- junit:junit:4.13.2
+| \--- org.hamcrest:hamcrest-core:1.3
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c)
++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-data:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.animation:animation-core:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.animation:animation:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c)
++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c)
++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c)
++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c)
+\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c)
+
+debugUnitTestCompileOnly - Compile only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+debugUnitTestCompileOnlyDependenciesMetadata
+No dependencies
+
+debugUnitTestImplementation - Implementation only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+debugUnitTestImplementationDependenciesMetadata
+\--- junit:junit:4.13.2
+ \--- org.hamcrest:hamcrest-core:1.3
+
+debugUnitTestIntransitiveDependenciesMetadata
+No dependencies
+
+debugUnitTestRuntimeClasspath - Runtime classpath of compilation 'debugUnitTest' (target (androidJvm)).
++--- project :app (*)
++--- junit:junit:4.13.2
+| \--- org.hamcrest:hamcrest-core:1.3
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.compose.ui:ui-tooling:1.3.2
+| +--- androidx.activity:activity-compose:1.3.0 -> 1.6.1
+| | +--- androidx.activity:activity-ktx:1.6.1
+| | | +--- androidx.activity:activity:1.6.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.8.0 -> 1.9.0
+| | | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | | +--- androidx.concurrent:concurrent-futures:1.0.0
+| | | | | | +--- com.google.guava:listenablefuture:1.0
+| | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-common:2.1.0
+| | | | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c)
+| | | | | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | | \--- androidx.core:core-ktx:1.9.0 (c)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.core:core:1.9.0 (*)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | | | \--- androidx.core:core:1.9.0 (c)
+| | | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*)
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | | | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | | | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | | +--- androidx.tracing:tracing:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- androidx.activity:activity-ktx:1.6.1 (c)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.activity:activity:1.6.1 (c)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| | | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.autofill:autofill:1.0.0
+| | | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- androidx.compose.ui:ui-text:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | +--- androidx.core:core:1.5.0 -> 1.9.0 (*)
+| | | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | | +--- androidx.profileinstaller:profileinstaller:1.2.0
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | \--- androidx.startup:startup-runtime:1.1.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.tracing:tracing:1.0.0 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.animation:animation:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.material:material:1.0.0 -> 1.3.1
+| | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.animation:animation-core:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*)
+| | +--- androidx.compose.material:material-icons-core:1.3.1
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.material:material-ripple:1.3.1
+| | | +--- androidx.compose.animation:animation:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.3.2 (*)
+| +--- androidx.compose.ui:ui-tooling-data:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.ui:ui-test-manifest:1.3.2
+| \--- androidx.activity:activity:1.2.0 -> 1.6.1 (*)
++--- androidx.core:core-ktx:1.9.0 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
++--- androidx.activity:activity-compose:1.6.1 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (*)
++--- androidx.compose.material:material:1.3.1 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| | +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | | \--- androidx.navigation:navigation-common:2.5.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection-ktx:1.1.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- androidx.navigation:navigation-runtime:2.5.3
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.navigation:navigation-common:2.5.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- com.squareup.okio:okio:3.2.0 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.appcompat:appcompat-resources:1.4.2
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*)
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
+| | | | +--- androidx.interpolator:interpolator:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.collection:collection:1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | | \--- androidx.exifinterface:exifinterface:1.3.3
+| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 (*)
+| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+ +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*)
+ +--- com.squareup.retrofit2:retrofit:2.8.1
+ | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*)
+ +--- com.squareup.retrofit2:converter-gson:2.8.1
+ | +--- com.squareup.retrofit2:retrofit:2.8.1 (*)
+ | \--- com.google.code.gson:gson:2.8.5
+ +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*)
+ +--- com.madgag.spongycastle:core:1.51.0.0
+ +--- com.madgag.spongycastle:prov:1.51.0.0
+ | \--- com.madgag.spongycastle:core:1.51.0.0
+ \--- com.github.mgunlogson:cuckoofilter4j:1.0.1
+ \--- com.google.guava:guava:19.0
+
+debugUnitTestRuntimeOnly - Runtime only dependencies for compilation 'debugUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+debugUnitTestRuntimeOnlyDependenciesMetadata
+No dependencies
+
+debugWearApp - Link to a wear app to embed for object 'debug'. (n)
+No dependencies
+
+debugWearBundling - Resolved Configuration for wear app bundling for variant: debug
+No dependencies
+
+default - Configuration for default artifacts. (n)
+No dependencies
+
+implementation - Implementation only dependencies for 'main' sources. (n)
++--- androidx.core:core-ktx:1.9.0 (n)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (n)
++--- androidx.activity:activity-compose:1.6.1 (n)
++--- androidx.compose.ui:ui:1.3.2 (n)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2 (n)
++--- androidx.compose.material:material:1.3.1 (n)
++--- androidx.navigation:navigation-compose:2.5.3 (n)
++--- io.coil-kt:coil-compose:2.2.2 (n)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0 (n)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT (n)
+
+implementationDependenciesMetadata
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0
+| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlinx:atomicfu:0.17.3
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| +--- androidx.annotation:annotation:1.5.0 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| +--- androidx.compose.ui:ui-geometry:1.3.2
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.ui:ui-graphics:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| \--- androidx.compose.ui:ui-unit:1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+
+intransitiveDependenciesMetadata
+No dependencies
+
+kotlin-extension - Configuration for Compose related kotlin compiler extension
+\--- androidx.compose.compiler:compiler:1.3.2
+
+kotlinCompilerClasspath
+\--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+ | \--- org.jetbrains:annotations:13.0
+ +--- org.jetbrains.kotlin:kotlin-script-runtime:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-reflect:1.7.20
+ | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+ +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.20
+ +--- org.jetbrains.intellij.deps:trove4j:1.0.20200330
+ \--- net.java.dev.jna:jna:5.6.0
+
+kotlinCompilerPluginClasspath
+No dependencies
+
+kotlinCompilerPluginClasspathDebug - Kotlin compiler plugins for compilation 'debug' (target (androidJvm))
+No dependencies
+
+kotlinCompilerPluginClasspathDebugAndroidTest - Kotlin compiler plugins for compilation 'debugAndroidTest' (target (androidJvm))
+No dependencies
+
+kotlinCompilerPluginClasspathDebugUnitTest - Kotlin compiler plugins for compilation 'debugUnitTest' (target (androidJvm))
+No dependencies
+
+kotlinCompilerPluginClasspathRelease - Kotlin compiler plugins for compilation 'release' (target (androidJvm))
+No dependencies
+
+kotlinCompilerPluginClasspathReleaseUnitTest - Kotlin compiler plugins for compilation 'releaseUnitTest' (target (androidJvm))
+No dependencies
+
+kotlinKlibCommonizerClasspath
+\--- org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+ | \--- org.jetbrains:annotations:13.0
+ \--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+ +--- org.jetbrains.kotlin:kotlin-script-runtime:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-reflect:1.7.20
+ | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+ +--- org.jetbrains.kotlin:kotlin-daemon-embeddable:1.7.20
+ +--- org.jetbrains.intellij.deps:trove4j:1.0.20200330
+ \--- net.java.dev.jna:jna:5.6.0
+
+kotlinNativeCompilerPluginClasspath
+No dependencies
+
+lintChecks - Configuration to apply external lint check jar
+No dependencies
+
+lintPublish - Configuration to publish external lint check jar
+No dependencies
+
+releaseAabPublication - Bundle Publication for release (n)
+No dependencies
+
+releaseAnnotationProcessor - Classpath for the annotation processor for 'release'. (n)
+No dependencies
+
+releaseAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: release
+No dependencies
+
+releaseApi - API dependencies for compilation 'release' (target (androidJvm)). (n)
+No dependencies
+
+releaseApiDependenciesMetadata
+\--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+ +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+ | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+ | \--- org.jetbrains:annotations:13.0
+ \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+ \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
+
+releaseApiElements - API elements for release (n)
+No dependencies
+
+releaseApkPublication - APK publication for release (n)
+No dependencies
+
+releaseCompileClasspath - Compile classpath for compilation 'release' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| +--- androidx.annotation:annotation:1.5.0 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| +--- androidx.compose.ui:ui-geometry:1.3.2
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.ui:ui-graphics:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| \--- androidx.compose.ui:ui-unit:1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.animation:animation-core:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.animation:animation:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c)
++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c)
++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c)
++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c)
+\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c)
+
+releaseCompileOnly - Compile only dependencies for compilation 'release' (target (androidJvm)). (n)
+No dependencies
+
+releaseCompileOnlyDependenciesMetadata
+No dependencies
+
+releaseImplementation - Implementation only dependencies for compilation 'release' (target (androidJvm)). (n)
+No dependencies
+
+releaseImplementationDependenciesMetadata
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0
+| | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlinx:atomicfu:0.17.3
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| +--- androidx.annotation:annotation:1.5.0 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| +--- androidx.compose.ui:ui-geometry:1.3.2
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.ui:ui-graphics:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| \--- androidx.compose.ui:ui-unit:1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+
+releaseIntransitiveDependenciesMetadata
+No dependencies
+
+releaseReverseMetadataValues - Metadata Values dependencies for the base Split
+No dependencies
+
+releaseRuntimeClasspath - Runtime classpath of compilation 'release' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.concurrent:concurrent-futures:1.0.0
+| | | +--- com.google.guava:listenablefuture:1.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c)
+| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | \--- androidx.core:core-ktx:1.9.0 (c)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| \--- androidx.core:core:1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | +--- androidx.tracing:tracing:1.0.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.activity:activity-ktx:1.6.1 (c)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- androidx.activity:activity:1.6.1 (c)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation:1.5.0 (*)
+| | +--- androidx.autofill:autofill:1.0.0
+| | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- androidx.compose.ui:ui-text:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | +--- androidx.core:core:1.5.0 -> 1.9.0 (*)
+| | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.profileinstaller:profileinstaller:1.2.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | \--- androidx.startup:startup-runtime:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.tracing:tracing:1.0.0 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.7.20 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10 -> 1.7.20
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 (*)
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| | +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | | \--- androidx.navigation:navigation-common:2.5.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection-ktx:1.1.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- androidx.navigation:navigation-runtime:2.5.3
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.navigation:navigation-common:2.5.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- com.squareup.okio:okio:3.2.0 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.appcompat:appcompat-resources:1.4.2
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*)
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
+| | | | +--- androidx.interpolator:interpolator:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.collection:collection:1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | | \--- androidx.exifinterface:exifinterface:1.3.3
+| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 (*)
+| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+ +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*)
+ +--- com.squareup.retrofit2:retrofit:2.8.1
+ | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*)
+ +--- com.squareup.retrofit2:converter-gson:2.8.1
+ | +--- com.squareup.retrofit2:retrofit:2.8.1 (*)
+ | \--- com.google.code.gson:gson:2.8.5
+ +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*)
+ +--- com.madgag.spongycastle:core:1.51.0.0
+ +--- com.madgag.spongycastle:prov:1.51.0.0
+ | \--- com.madgag.spongycastle:core:1.51.0.0
+ \--- com.github.mgunlogson:cuckoofilter4j:1.0.1
+ \--- com.google.guava:guava:19.0
+
+releaseRuntimeElements - Runtime elements for release (n)
+No dependencies
+
+releaseRuntimeOnly - Runtime only dependencies for compilation 'release' (target (androidJvm)). (n)
+No dependencies
+
+releaseRuntimeOnlyDependenciesMetadata
+No dependencies
+
+releaseUnitTestAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: releaseUnitTest
+No dependencies
+
+releaseUnitTestApi - API dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+releaseUnitTestApiDependenciesMetadata
+No dependencies
+
+releaseUnitTestCompileClasspath - Compile classpath for compilation 'releaseUnitTest' (target (androidJvm)).
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.runtime:runtime:1.3.2 (*)
+| \--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| +--- androidx.annotation:annotation:1.5.0 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| +--- androidx.compose.ui:ui-geometry:1.3.2
+| | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| +--- androidx.compose.ui:ui-graphics:1.3.2
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | \--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| \--- androidx.compose.ui:ui-unit:1.3.2 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | | \--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | \--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | \--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | \--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| \--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| \--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | \--- androidx.navigation:navigation-common:2.5.3
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- androidx.navigation:navigation-runtime:2.5.3
+| +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| +--- androidx.navigation:navigation-common:2.5.3 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | \--- com.squareup.okio:okio:3.2.0 (*)
+| | \--- androidx.compose.foundation:foundation:1.2.1 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
++--- project :app (*)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.core:core-ktx:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.activity:activity-compose:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.ui:ui:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-tooling-preview:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.material:material:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.navigation:navigation-compose:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:{strictly 0.7.0} -> 0.7.0 (c)
++--- com.github.Giszmo.NostrPostr:nostrpostrlib:{strictly master-SNAPSHOT} -> master-SNAPSHOT (c)
++--- junit:junit:4.13.2
+| \--- org.hamcrest:hamcrest-core:1.3
++--- junit:junit:{strictly 4.13.2} -> 4.13.2 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:{strictly 1.7.20} -> 1.7.20 (c)
++--- androidx.annotation:annotation:{strictly 1.5.0} -> 1.5.0 (c)
++--- androidx.core:core:{strictly 1.9.0} -> 1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-android:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity-ktx:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.compose.runtime:runtime:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.runtime:runtime-saveable:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-geometry:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-graphics:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-text:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.ui:ui-unit:{strictly 1.3.2} -> 1.3.2 (c)
++--- androidx.compose.animation:animation-core:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.compose.foundation:foundation:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.compose.material:material-icons-core:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.material:material-ripple:{strictly 1.3.1} -> 1.3.1 (c)
++--- androidx.compose.animation:animation:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-compose:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-runtime-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-compose-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- io.coil-kt:coil:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:{strictly 0.7.0} -> 0.7.0 (c)
++--- org.hamcrest:hamcrest-core:{strictly 1.3} -> 1.3 (c)
++--- org.jetbrains.kotlin:kotlin-stdlib-common:{strictly 1.7.20} -> 1.7.20 (c)
++--- org.jetbrains:annotations:{strictly 13.0} -> 13.0 (c)
++--- androidx.annotation:annotation-experimental:{strictly 1.3.0} -> 1.3.0 (c)
++--- androidx.versionedparcelable:versionedparcelable:{strictly 1.1.1} -> 1.1.1 (c)
++--- androidx.arch.core:core-common:{strictly 2.1.0} -> 2.1.0 (c)
++--- androidx.lifecycle:lifecycle-common:{strictly 2.5.1} -> 2.5.1 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:{strictly 1.6.4} -> 1.6.4 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.activity:activity:{strictly 1.6.1} -> 1.6.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-ktx:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate-ktx:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.compose.foundation:foundation-layout:{strictly 1.2.1} -> 1.2.1 (c)
++--- androidx.lifecycle:lifecycle-common-java8:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.lifecycle:lifecycle-viewmodel-savedstate:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common-ktx:{strictly 2.5.3} -> 2.5.3 (c)
++--- androidx.navigation:navigation-runtime:{strictly 2.5.3} -> 2.5.3 (c)
++--- io.coil-kt:coil-base:{strictly 2.2.2} -> 2.2.2 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp:{strictly 0.7.0} -> 0.7.0 (c)
++--- androidx.collection:collection:{strictly 1.2.0} -> 1.2.0 (c)
++--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:{strictly 1.6.4} -> 1.6.4 (c)
++--- androidx.lifecycle:lifecycle-viewmodel:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.savedstate:savedstate:{strictly 1.2.0} -> 1.2.0 (c)
++--- androidx.lifecycle:lifecycle-livedata-core:{strictly 2.5.1} -> 2.5.1 (c)
++--- androidx.navigation:navigation-common:{strictly 2.5.3} -> 2.5.3 (c)
++--- com.squareup.okhttp3:okhttp:{strictly 4.10.0} -> 4.10.0 (c)
++--- com.squareup.okio:okio:{strictly 3.2.0} -> 3.2.0 (c)
++--- fr.acinq.secp256k1:secp256k1-kmp-jvm:{strictly 0.7.0} -> 0.7.0 (c)
+\--- com.squareup.okio:okio-jvm:{strictly 3.2.0} -> 3.2.0 (c)
+
+releaseUnitTestCompileOnly - Compile only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+releaseUnitTestCompileOnlyDependenciesMetadata
+No dependencies
+
+releaseUnitTestImplementation - Implementation only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+releaseUnitTestImplementationDependenciesMetadata
+\--- junit:junit:4.13.2
+ \--- org.hamcrest:hamcrest-core:1.3
+
+releaseUnitTestIntransitiveDependenciesMetadata
+No dependencies
+
+releaseUnitTestRuntimeClasspath - Runtime classpath of compilation 'releaseUnitTest' (target (androidJvm)).
++--- project :app (*)
++--- junit:junit:4.13.2
+| \--- org.hamcrest:hamcrest-core:1.3
++--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.20
+| | \--- org.jetbrains:annotations:13.0
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.20
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.20 (*)
++--- androidx.core:core-ktx:1.9.0
+| +--- androidx.annotation:annotation:1.1.0 -> 1.5.0
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.core:core:1.9.0
+| | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.annotation:annotation-experimental:1.3.0
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.concurrent:concurrent-futures:1.0.0
+| | | +--- com.google.guava:listenablefuture:1.0
+| | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.1 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-common:2.1.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.arch.core:core-runtime:2.1.0
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | \--- androidx.arch.core:core-common:2.1.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (c)
+| | +--- androidx.versionedparcelable:versionedparcelable:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | \--- androidx.core:core-ktx:1.9.0 (c)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| \--- androidx.core:core:1.9.0 (c)
++--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1
+| +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (c)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4 (c)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (c)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
++--- androidx.activity:activity-compose:1.6.1
+| +--- androidx.activity:activity-ktx:1.6.1
+| | +--- androidx.activity:activity:1.6.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core:1.8.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (c)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1
+| | | | +--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core-ktx:1.2.0 -> 1.9.0 (*)
+| | | | +--- androidx.lifecycle:lifecycle-livedata-core:2.5.1
+| | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | +--- androidx.arch.core:core-runtime:2.1.0 (*)
+| | | | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | | +--- androidx.savedstate:savedstate:1.2.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.arch.core:core-common:2.1.0 (*)
+| | | | | +--- androidx.lifecycle:lifecycle-common:2.4.0 -> 2.5.1 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | +--- androidx.tracing:tracing:1.0.0
+| | | | \--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- androidx.activity:activity-ktx:1.6.1 (c)
+| | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1
+| | | +--- androidx.lifecycle:lifecycle-viewmodel:2.5.1 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1 -> 1.6.4 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0
+| | | +--- androidx.savedstate:savedstate:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- androidx.activity:activity:1.6.1 (c)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation:1.5.0 (*)
+| | +--- androidx.autofill:autofill:1.0.0
+| | | \--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.3.2 (*)
+| | +--- androidx.compose.runtime:runtime-saveable:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.3.2
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2
+| | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-geometry:1.3.2 (*)
+| | | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- androidx.compose.ui:ui-text:1.3.2
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.runtime:runtime-saveable:1.2.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-graphics:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| | +--- androidx.compose.ui:ui-unit:1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.3.2 (*)
+| | +--- androidx.core:core:1.5.0 -> 1.9.0 (*)
+| | +--- androidx.customview:customview-poolingcontainer:1.0.0
+| | | +--- androidx.core:core-ktx:1.5.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.3.0 -> 2.5.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.lifecycle:lifecycle-common:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| | +--- androidx.profileinstaller:profileinstaller:1.2.0
+| | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | \--- androidx.startup:startup-runtime:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | \--- androidx.tracing:tracing:1.0.0 (*)
+| | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| | +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.ui:ui:1.3.2 (*)
++--- androidx.compose.ui:ui-tooling-preview:1.3.2
+| +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
++--- androidx.compose.material:material:1.3.1
+| +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation-core:1.1.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 -> 1.6.4 (*)
+| | | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.10 -> 1.7.20 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.0.0 -> 1.2.1
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.compose.animation:animation-core:1.1.1 (*)
+| | | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-unit:1.1.1 -> 1.3.2 (*)
+| | | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | | +--- androidx.core:core:1.7.0 -> 1.9.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-geometry:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10 -> 1.7.20
+| +--- androidx.compose.animation:animation-core:1.0.0 -> 1.1.1 (*)
+| +--- androidx.compose.foundation:foundation:1.2.0 -> 1.2.1
+| | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | +--- androidx.compose.animation:animation:1.1.1 (*)
+| | +--- androidx.compose.foundation:foundation-layout:1.2.1 (*)
+| | +--- androidx.compose.runtime:runtime:1.2.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-graphics:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-text:1.0.0 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| +--- androidx.compose.foundation:foundation-layout:1.1.1 -> 1.2.1 (*)
+| +--- androidx.compose.material:material-icons-core:1.3.1
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.7.20 (*)
+| +--- androidx.compose.material:material-ripple:1.3.1
+| | +--- androidx.compose.animation:animation:1.0.0 -> 1.1.1 (*)
+| | +--- androidx.compose.foundation:foundation:1.1.1 -> 1.2.1 (*)
+| | +--- androidx.compose.runtime:runtime:1.1.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
+| +--- androidx.compose.runtime:runtime:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui-text:1.2.0 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui-util:1.0.0 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-runtime:2.3.0 -> 2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel:2.3.0 -> 2.5.1 (*)
+| +--- androidx.savedstate:savedstate:1.1.0 -> 1.2.0 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.7.10 -> 1.7.20
++--- androidx.navigation:navigation-compose:2.5.3
+| +--- androidx.activity:activity-compose:1.5.1 -> 1.6.1 (*)
+| +--- androidx.compose.animation:animation:1.0.1 -> 1.1.1 (*)
+| +--- androidx.compose.foundation:foundation-layout:1.0.1 -> 1.2.1 (*)
+| +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.runtime:runtime-saveable:1.0.1 -> 1.3.2 (*)
+| +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| +--- androidx.lifecycle:lifecycle-viewmodel-compose:2.5.1
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.compose.runtime:runtime:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.compose.ui:ui:1.0.1 -> 1.3.2 (*)
+| | +--- androidx.lifecycle:lifecycle-common-java8:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| +--- androidx.navigation:navigation-runtime-ktx:2.5.3
+| | +--- androidx.navigation:navigation-common-ktx:2.5.3
+| | | \--- androidx.navigation:navigation-common:2.5.3
+| | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | +--- androidx.collection:collection-ktx:1.1.0
+| | | | +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.20 -> 1.7.20 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.1.0 -> 1.9.0 (*)
+| | | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | | +--- androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1 (*)
+| | | +--- androidx.savedstate:savedstate-ktx:1.2.0 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| | \--- androidx.navigation:navigation-runtime:2.5.3
+| | +--- androidx.activity:activity-ktx:1.5.1 -> 1.6.1 (*)
+| | +--- androidx.annotation:annotation-experimental:1.1.0 -> 1.3.0 (*)
+| | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | +--- androidx.lifecycle:lifecycle-runtime-ktx:2.5.1 (*)
+| | +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1 (*)
+| | +--- androidx.navigation:navigation-common:2.5.3 (*)
+| | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.21 -> 1.7.20 (*)
++--- io.coil-kt:coil-compose:2.2.2
+| +--- io.coil-kt:coil-compose-base:2.2.2
+| | +--- io.coil-kt:coil-base:2.2.2
+| | | +--- androidx.lifecycle:lifecycle-runtime:2.4.1 -> 2.5.1 (*)
+| | | +--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4 (*)
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10 -> 1.7.20 (*)
+| | | +--- com.squareup.okhttp3:okhttp:4.10.0
+| | | | +--- com.squareup.okio:okio:3.0.0 -> 3.2.0
+| | | | | \--- com.squareup.okio:okio-jvm:3.2.0
+| | | | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.20 -> 1.7.20 (*)
+| | | | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 -> 1.7.20
+| | | | \--- org.jetbrains.kotlin:kotlin-stdlib:1.6.20 -> 1.7.20 (*)
+| | | +--- com.squareup.okio:okio:3.2.0 (*)
+| | | +--- androidx.annotation:annotation:1.5.0 (*)
+| | | +--- androidx.appcompat:appcompat-resources:1.4.2
+| | | | +--- androidx.collection:collection:1.0.0 -> 1.2.0 (*)
+| | | | +--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | | | +--- androidx.core:core:1.0.1 -> 1.9.0 (*)
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0
+| | | | | +--- androidx.annotation:annotation:1.1.0 -> 1.5.0 (*)
+| | | | | +--- androidx.core:core:1.1.0 -> 1.9.0 (*)
+| | | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | | \--- androidx.vectordrawable:vectordrawable-animated:1.1.0
+| | | | +--- androidx.vectordrawable:vectordrawable:1.1.0 (*)
+| | | | +--- androidx.interpolator:interpolator:1.0.0
+| | | | | \--- androidx.annotation:annotation:1.0.0 -> 1.5.0 (*)
+| | | | \--- androidx.collection:collection:1.1.0 -> 1.2.0 (*)
+| | | +--- androidx.collection:collection:1.2.0 (*)
+| | | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | | \--- androidx.exifinterface:exifinterface:1.3.3
+| | | \--- androidx.annotation:annotation:1.2.0 -> 1.5.0 (*)
+| | +--- androidx.compose.foundation:foundation:1.2.1 (*)
+| | +--- androidx.core:core-ktx:1.8.0 -> 1.9.0 (*)
+| | \--- com.google.accompanist:accompanist-drawablepainter:0.25.1
+| | \--- androidx.compose.ui:ui:1.2.1 -> 1.3.2 (*)
+| \--- io.coil-kt:coil:2.2.2
+| \--- io.coil-kt:coil-base:2.2.2 (*)
++--- fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.7.0
+| +--- fr.acinq.secp256k1:secp256k1-kmp-jni-common:0.7.0
+| | +--- fr.acinq.secp256k1:secp256k1-kmp:0.7.0
+| | | \--- fr.acinq.secp256k1:secp256k1-kmp-jvm:0.7.0
+| | | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| | | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21 -> 1.7.20
+| | \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+| \--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21 -> 1.7.20 (*)
+\--- com.github.Giszmo.NostrPostr:nostrpostrlib:master-SNAPSHOT
+ +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.7.10 -> 1.7.20 (*)
+ +--- com.squareup.retrofit2:retrofit:2.8.1
+ | \--- com.squareup.okhttp3:okhttp:3.14.7 -> 4.10.0 (*)
+ +--- com.squareup.retrofit2:converter-gson:2.8.1
+ | +--- com.squareup.retrofit2:retrofit:2.8.1 (*)
+ | \--- com.google.code.gson:gson:2.8.5
+ +--- com.squareup.okhttp3:okhttp:4.9.3 -> 4.10.0 (*)
+ +--- com.madgag.spongycastle:core:1.51.0.0
+ +--- com.madgag.spongycastle:prov:1.51.0.0
+ | \--- com.madgag.spongycastle:core:1.51.0.0
+ \--- com.github.mgunlogson:cuckoofilter4j:1.0.1
+ \--- com.google.guava:guava:19.0
+
+releaseUnitTestRuntimeOnly - Runtime only dependencies for compilation 'releaseUnitTest' (target (androidJvm)). (n)
+No dependencies
+
+releaseUnitTestRuntimeOnlyDependenciesMetadata
+No dependencies
+
+releaseWearApp - Link to a wear app to embed for object 'release'. (n)
+No dependencies
+
+releaseWearBundling - Resolved Configuration for wear app bundling for variant: release
+No dependencies
+
+runtimeOnly - Runtime only dependencies for 'main' sources. (n)
+No dependencies
+
+runtimeOnlyDependenciesMetadata
+No dependencies
+
+testAnnotationProcessor - Classpath for the annotation processor for 'test'. (n)
+No dependencies
+
+testApi (n)
+No dependencies
+
+testApiDependenciesMetadata
+No dependencies
+
+testCompileOnly - Compile only dependencies for 'test' sources. (n)
+No dependencies
+
+testCompileOnlyDependenciesMetadata
+No dependencies
+
+testDebugAnnotationProcessor - Classpath for the annotation processor for 'testDebug'. (n)
+No dependencies
+
+testDebugApi (n)
+No dependencies
+
+testDebugApiDependenciesMetadata
+No dependencies
+
+testDebugCompileOnly - Compile only dependencies for 'testDebug' sources. (n)
+No dependencies
+
+testDebugCompileOnlyDependenciesMetadata
+No dependencies
+
+testDebugImplementation - Implementation only dependencies for 'testDebug' sources. (n)
+No dependencies
+
+testDebugImplementationDependenciesMetadata
+No dependencies
+
+testDebugIntransitiveDependenciesMetadata
+No dependencies
+
+testDebugRuntimeOnly - Runtime only dependencies for 'testDebug' sources. (n)
+No dependencies
+
+testDebugRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testDebugWearApp - Link to a wear app to embed for object 'testDebug'. (n)
+No dependencies
+
+testFixturesAnnotationProcessor - Classpath for the annotation processor for 'testFixtures'. (n)
+No dependencies
+
+testFixturesApi - API dependencies for 'testFixtures' sources. (n)
+No dependencies
+
+testFixturesApiDependenciesMetadata
+No dependencies
+
+testFixturesCompileOnly - Compile only dependencies for 'testFixtures' sources. (n)
+No dependencies
+
+testFixturesCompileOnlyDependenciesMetadata
+No dependencies
+
+testFixturesDebugAnnotationProcessor - Classpath for the annotation processor for 'testFixturesDebug'. (n)
+No dependencies
+
+testFixturesDebugApi - API dependencies for 'testFixturesDebug' sources. (n)
+No dependencies
+
+testFixturesDebugApiDependenciesMetadata
+No dependencies
+
+testFixturesDebugCompileOnly - Compile only dependencies for 'testFixturesDebug' sources. (n)
+No dependencies
+
+testFixturesDebugCompileOnlyDependenciesMetadata
+No dependencies
+
+testFixturesDebugImplementation - Implementation only dependencies for 'testFixturesDebug' sources. (n)
+No dependencies
+
+testFixturesDebugImplementationDependenciesMetadata
+No dependencies
+
+testFixturesDebugIntransitiveDependenciesMetadata
+No dependencies
+
+testFixturesDebugRuntimeOnly - Runtime only dependencies for 'testFixturesDebug' sources. (n)
+No dependencies
+
+testFixturesDebugRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testFixturesDebugWearApp - Link to a wear app to embed for object 'testFixturesDebug'. (n)
+No dependencies
+
+testFixturesImplementation - Implementation only dependencies for 'testFixtures' sources. (n)
+No dependencies
+
+testFixturesImplementationDependenciesMetadata
+No dependencies
+
+testFixturesIntransitiveDependenciesMetadata
+No dependencies
+
+testFixturesReleaseAnnotationProcessor - Classpath for the annotation processor for 'testFixturesRelease'. (n)
+No dependencies
+
+testFixturesReleaseApi - API dependencies for 'testFixturesRelease' sources. (n)
+No dependencies
+
+testFixturesReleaseApiDependenciesMetadata
+No dependencies
+
+testFixturesReleaseCompileOnly - Compile only dependencies for 'testFixturesRelease' sources. (n)
+No dependencies
+
+testFixturesReleaseCompileOnlyDependenciesMetadata
+No dependencies
+
+testFixturesReleaseImplementation - Implementation only dependencies for 'testFixturesRelease' sources. (n)
+No dependencies
+
+testFixturesReleaseImplementationDependenciesMetadata
+No dependencies
+
+testFixturesReleaseIntransitiveDependenciesMetadata
+No dependencies
+
+testFixturesReleaseRuntimeOnly - Runtime only dependencies for 'testFixturesRelease' sources. (n)
+No dependencies
+
+testFixturesReleaseRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testFixturesReleaseWearApp - Link to a wear app to embed for object 'testFixturesRelease'. (n)
+No dependencies
+
+testFixturesRuntimeOnly - Runtime only dependencies for 'testFixtures' sources. (n)
+No dependencies
+
+testFixturesRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testFixturesWearApp - Link to a wear app to embed for object 'testFixtures'. (n)
+No dependencies
+
+testImplementation - Implementation only dependencies for 'test' sources. (n)
+\--- junit:junit:4.13.2 (n)
+
+testImplementationDependenciesMetadata
+\--- junit:junit:4.13.2
+ \--- org.hamcrest:hamcrest-core:1.3
+
+testIntransitiveDependenciesMetadata
+No dependencies
+
+testReleaseAnnotationProcessor - Classpath for the annotation processor for 'testRelease'. (n)
+No dependencies
+
+testReleaseApi (n)
+No dependencies
+
+testReleaseApiDependenciesMetadata
+No dependencies
+
+testReleaseCompileOnly - Compile only dependencies for 'testRelease' sources. (n)
+No dependencies
+
+testReleaseCompileOnlyDependenciesMetadata
+No dependencies
+
+testReleaseImplementation - Implementation only dependencies for 'testRelease' sources. (n)
+No dependencies
+
+testReleaseImplementationDependenciesMetadata
+No dependencies
+
+testReleaseIntransitiveDependenciesMetadata
+No dependencies
+
+testReleaseRuntimeOnly - Runtime only dependencies for 'testRelease' sources. (n)
+No dependencies
+
+testReleaseRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testReleaseWearApp - Link to a wear app to embed for object 'testRelease'. (n)
+No dependencies
+
+testRuntimeOnly - Runtime only dependencies for 'test' sources. (n)
+No dependencies
+
+testRuntimeOnlyDependenciesMetadata
+No dependencies
+
+testWearApp - Link to a wear app to embed for object 'test'. (n)
+No dependencies
+
+wearApp - Link to a wear app to embed for object 'main'. (n)
+No dependencies
+
+(c) - dependency constraint
+(*) - dependencies omitted (listed previously)
+
+(n) - Not resolved (configuration is not meant to be resolved)
+
+A web-based, searchable dependency report is available by adding the --scan option.
+
+BUILD SUCCESSFUL in 2s
+1 actionable task: 1 executed
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 000000000..3c5031eb7
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,23 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 000000000..e708b1c02
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 000000000..898b49ae8
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Jan 04 09:23:50 EST 2023
+distributionBase=GRADLE_USER_HOME
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionPath=wrapper/dists
+zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
new file mode 100755
index 000000000..4f906e0c8
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 000000000..ac1b06f93
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 000000000..a62027f5d
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,18 @@
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ mavenCentral()
+ maven { url "https://jitpack.io" }
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ maven { url "https://jitpack.io" }
+ }
+}
+rootProject.name = "Amethyst"
+include ':app'