Browse Source

1. 弹窗大小调整
2. 任务列表补充当前任务状态
3. 任务列表当前任务改为我的任务
4. 首页、设置、用户头像设置非1:1头像时,显示没有铺满的问题
5. 根据用户角色类型控制底部作业Tab是否显示

bjb 3 months ago
parent
commit
9fbb9dd984

+ 1 - 1
app/build.gradle.kts

@@ -19,7 +19,7 @@ android {
         minSdk = 24
         targetSdk = 36
         versionCode = 1
-        versionName = "0.0.20260126_1"
+        versionName = "0.0.20260126_2"
 
         testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
     }

+ 24 - 1
app/src/main/java/com/iscs/bozzys/api/ApiBean.kt

@@ -673,7 +673,30 @@ data class Task(
     val currentNodeId: String?,
     val currentNodeName: String?,
     val approvalStatus: String
-) : java.io.Serializable
+) : java.io.Serializable {
+    /**
+     * 获取等级名称和背景色
+     */
+    fun getLevelNameAndColor(): Pair<String, Color> {
+        return when (urgencyLevel) {
+            "1" -> "紧急" to Color(0xFFFF9800)
+            "2" -> "非常紧急" to Color(0xFFFF4500)
+            else -> "正常" to Color(0xFF1E90FF)
+        }
+    }
+
+    /**
+     * 获取任务状态名称
+     */
+    fun getTaskStatusName(): String {
+        return when (approvalStatus) {
+            "approved" -> "已完成"
+            "running" -> "进行中"
+            "pending" -> "待处理"
+            else -> approvalStatus
+        }
+    }
+}
 
 /**
  * 消息结构体

+ 3 - 1
app/src/main/java/com/iscs/bozzys/ui/dialog/InputDialog.kt

@@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.offset
 import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.text.BasicTextField
 import androidx.compose.foundation.text.KeyboardOptions
@@ -98,7 +99,7 @@ fun InputDialog(
                 topRadius = 16.dp,
                 bottomRadius = 16.dp,
                 modifier = Modifier
-                    .fillMaxWidth(0.65f)
+                    .width(320.dp)
                     // 防止点击穿透
                     .clickable(
                         indication = null,
@@ -117,6 +118,7 @@ fun InputDialog(
                         Text(
                             title,
                             fontSize = 16.sp,
+                            lineHeight = 48.sp,
                             fontWeight = FontWeight.Bold,
                             color = Text,
                             modifier = Modifier.weight(1f),

+ 81 - 42
app/src/main/java/com/iscs/bozzys/ui/dialog/TipsDialog.kt

@@ -1,11 +1,14 @@
 package com.iscs.bozzys.ui.dialog
 
+import android.view.WindowManager
 import androidx.compose.foundation.background
 import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.MutableInteractionSource
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
 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
@@ -14,15 +17,21 @@ import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.remember
 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.platform.LocalContext
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.style.TextAlign
 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 com.iscs.bozzys.ui.common.PageBase
 import com.iscs.bozzys.ui.theme.Text
 
 /**
@@ -38,54 +47,84 @@ fun TipsDialog(
     confirmText: String = "确认",
     onConfirm: () -> Unit = {}
 ) {
-    if (show) {
-        Dialog(onDismissRequest = {}) {
+    val ctx = LocalContext.current
+    if (show && ctx is PageBase) {
+        Dialog(onDismissRequest = {}, properties = DialogProperties(decorFitsSystemWindows = false)) {
+            val activityWindow = ctx.window
+            val dialogWindow = ctx.getDialogWindow()
+            SideEffect {
+                if (activityWindow != null && dialogWindow != null) {
+                    val attributes = WindowManager.LayoutParams()
+                    // 复制Activity窗口属性
+                    attributes.copyFrom(activityWindow.attributes)
+                    // 这个一定要设置
+                    attributes.type = dialogWindow.attributes.type
+                    // 更新窗口属性
+                    dialogWindow.attributes = attributes
+                    // 设置窗口的宽度和高度,这段代码Dialog源码中就有哦,可以自己去查看
+                    dialogWindow.setLayout(
+                        activityWindow.decorView.width,
+                        activityWindow.decorView.height
+                    )
+                }
+            }
             Box(
                 modifier = Modifier
-                    .clip(RoundedCornerShape(12.dp))
-                    .background(Color.White)
+                    .fillMaxSize()
+                    .background(Color.Black.copy(alpha = 0.5f))
+                    .clickable(
+                        indication = null,
+                        interactionSource = remember { MutableInteractionSource() }
+                    ) {},
+                contentAlignment = Alignment.Center
             ) {
-                Column(modifier = Modifier.width(240.dp), horizontalAlignment = Alignment.CenterHorizontally) {
-                    Text(title, fontSize = 16.sp, lineHeight = 36.sp, fontWeight = FontWeight.Bold, color = Text)
-                    Spacer(
-                        Modifier
-                            .fillMaxWidth()
-                            .height(1.dp)
-                            .background(Color(0xFFEEEEEE))
-                    )
-                    Text(
-                        content,
-                        fontSize = 15.sp,
-                        color = Text.copy(alpha = 0.8f),
-                        modifier = Modifier.padding(horizontal = 16.dp, vertical = 10.dp)
-                    )
-                    Row(Modifier.padding(horizontal = 5.dp, vertical = 10.dp)) {
-                        Text(
-                            cancelText, color = Color.White, modifier = Modifier
-                                .padding(horizontal = 5.dp)
-                                .weight(1f)
-                                .clip(RoundedCornerShape(6.dp))
-                                .background(Color.Gray.copy(alpha = 0.6f))
-                                .clickable(onClick = { onCancel() })
-                                .padding(vertical = 5.dp),
-                            textAlign = TextAlign.Center,
-                            fontSize = 16.sp,
-                            fontWeight = FontWeight.Bold
+                Box(
+                    modifier = Modifier
+                        .clip(RoundedCornerShape(12.dp))
+                        .background(Color.White)
+                ) {
+                    Column(modifier = Modifier.width(320.dp), horizontalAlignment = Alignment.CenterHorizontally) {
+                        Text(title, fontSize = 16.sp, lineHeight = 48.sp, fontWeight = FontWeight.Bold, color = Text)
+                        Spacer(
+                            Modifier
+                                .fillMaxWidth()
+                                .height(1.dp)
+                                .background(Color(0xFFEEEEEE))
                         )
                         Text(
-                            confirmText,
-                            color = Color.White,
-                            modifier = Modifier
-                                .padding(horizontal = 5.dp)
-                                .weight(1f)
-                                .clip(RoundedCornerShape(6.dp))
-                                .background(MaterialTheme.colorScheme.primary)
-                                .clickable(onClick = { onConfirm() })
-                                .padding(vertical = 5.dp),
-                            textAlign = TextAlign.Center,
-                            fontSize = 16.sp,
-                            fontWeight = FontWeight.Bold
+                            content,
+                            fontSize = 15.sp,
+                            color = Text.copy(alpha = 0.8f),
+                            modifier = Modifier.padding(horizontal = 16.dp, vertical = 20.dp)
                         )
+                        Row(Modifier.padding(horizontal = 5.dp, vertical = 10.dp)) {
+                            Text(
+                                cancelText, color = Color.White, modifier = Modifier
+                                    .padding(horizontal = 5.dp)
+                                    .weight(1f)
+                                    .clip(RoundedCornerShape(6.dp))
+                                    .background(Color.Gray.copy(alpha = 0.6f))
+                                    .clickable(onClick = { onCancel() })
+                                    .padding(vertical = 5.dp),
+                                textAlign = TextAlign.Center,
+                                fontSize = 16.sp,
+                                fontWeight = FontWeight.Bold
+                            )
+                            Text(
+                                confirmText,
+                                color = Color.White,
+                                modifier = Modifier
+                                    .padding(horizontal = 5.dp)
+                                    .weight(1f)
+                                    .clip(RoundedCornerShape(6.dp))
+                                    .background(MaterialTheme.colorScheme.primary)
+                                    .clickable(onClick = { onConfirm() })
+                                    .padding(vertical = 5.dp),
+                                textAlign = TextAlign.Center,
+                                fontSize = 16.sp,
+                                fontWeight = FontWeight.Bold
+                            )
+                        }
                     }
                 }
             }

+ 1 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/compose/JobListItem.kt

@@ -99,7 +99,7 @@ fun JobListItem(job: Job) {
                             .size(13.dp),
                         tint = Color(0xFF666666)
                     )
-                    Text("负责人:${job.initiatorName}", fontSize = 13.sp, color = Color(0xFF666666))
+                    Text("发起人:${job.initiatorName}", fontSize = 13.sp, color = Color(0xFF666666))
                 }
                 // 岗位区间,暂时没有字段匹配,先隐藏
                 if (false) Row(Modifier.padding(end = 12.dp), verticalAlignment = Alignment.CenterVertically) {

+ 12 - 25
app/src/main/java/com/iscs/bozzys/ui/pages/compose/TaskListItem.kt

@@ -38,7 +38,7 @@ import com.iscs.bozzys.utils.DateUtil.getShowDateOrTime
 fun TaskListItem(task: Task) {
     val ctx = LocalContext.current
     // 获取等级名称和颜色
-    val levelInfo = getLevelNameAndColor(task.urgencyLevel)
+    val levelInfo = task.getLevelNameAndColor()
     CardContainer(
         modifier = Modifier
             .padding(vertical = 5.dp)
@@ -103,6 +103,16 @@ fun TaskListItem(task: Task) {
                 }
                 // Text("作业内容:${task.currentNodeName ?: "--"}", fontSize = 13.sp, color = Color(0xFF666666))
             }
+            // 任务状态
+            Row(Modifier.padding(end = 12.dp), verticalAlignment = Alignment.CenterVertically) {
+                Icon(
+                    painterResource(R.drawable.job_todo), contentDescription = null, modifier = Modifier
+                        .padding(end = 5.dp)
+                        .size(13.dp),
+                    tint = Color(0xFF666666)
+                )
+                Text(task.getTaskStatusName(), fontSize = 13.sp, color = Color(0xFF666666))
+            }
             Row(
                 Modifier
                     .padding(top = 5.dp)
@@ -110,7 +120,7 @@ fun TaskListItem(task: Task) {
                     .height(20.dp),
                 verticalAlignment = Alignment.CenterVertically
             ) {
-                Text("当前任务:", fontSize = 13.sp, lineHeight = 13.sp, color = Text)
+                Text("我的任务:", fontSize = 13.sp, lineHeight = 13.sp, color = Text)
                 Text(
                     task.currentNodeName ?: "--",
                     modifier = Modifier
@@ -132,26 +142,3 @@ fun TaskListItem(task: Task) {
     }
 }
 
-/**
- * 获取等级名称和背景色
- */
-private fun getLevelNameAndColor(level: String): Pair<String, Color> {
-    return when (level) {
-        "1" -> "紧急" to Color(0xFFFF9800)
-        "2" -> "非常紧急" to Color(0xFFFF4500)
-        else -> "正常" to Color(0xFF1E90FF)
-    }
-}
-
-/**
- * 获取任务状态名称
- */
-fun getTaskStatusName(approvalStatus: String): String {
-    return when (approvalStatus) {
-        "approved" -> "已审核"
-        "running" -> "未审核"
-        "pending" -> "待处理"
-        else -> approvalStatus
-    }
-}
-

+ 1 - 2
app/src/main/java/com/iscs/bozzys/ui/pages/detail/task/PageDetailTask.kt

@@ -43,7 +43,6 @@ import com.iscs.bozzys.ui.common.PageBase
 import com.iscs.bozzys.ui.common.Title
 import com.iscs.bozzys.ui.pages.compose.CardContainer
 import com.iscs.bozzys.ui.pages.compose.FormContainer
-import com.iscs.bozzys.ui.pages.compose.getTaskStatusName
 import com.iscs.bozzys.ui.pages.vm.VMDetailTask
 import com.iscs.bozzys.ui.theme.Text
 
@@ -208,7 +207,7 @@ class PageDetailTask : PageBase() {
                                 .padding(end = 3.dp)
                                 .size(14.dp)
                         )
-                        Text(getTaskStatusName(task.approvalStatus), fontSize = 12.sp, color = Text)
+                        Text(task.getTaskStatusName(), fontSize = 12.sp, color = Text)
                     }
                     // 任务创建时间
                     if (false) Row(

+ 10 - 3
app/src/main/java/com/iscs/bozzys/ui/pages/home/HomeCompose.kt

@@ -37,6 +37,7 @@ import androidx.compose.ui.draw.clip
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.text.font.FontWeight
@@ -117,7 +118,7 @@ private fun TopToolBar(pv: PaddingValues, vm: VMHome) {
                     contentDescription = null,
                     tint = Color.White
                 )
-                AsyncImage(model = state.user.avatar, contentDescription = null, modifier = Modifier.fillMaxSize())
+                AsyncImage(model = state.user.avatar, contentDescription = null, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop)
             }
             Column(Modifier.padding(horizontal = 10.dp)) {
                 Text(state.user.nickname, fontSize = 16.sp, lineHeight = 16.sp, fontWeight = FontWeight.Medium, color = Color.White)
@@ -192,7 +193,10 @@ private fun TODO(vmHome: VMHome) {
                     .weight(1f)
                     .height(80.dp)
                     .clip(RoundedCornerShape(12.dp))
-                    .background(MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)),
+                    .background(MaterialTheme.colorScheme.primary.copy(alpha = 0.1f))
+                    .clickable {
+                        vmHome.onTaskProgressClick()
+                    },
                 horizontalAlignment = Alignment.CenterHorizontally,
                 verticalArrangement = Arrangement.Center
             ) {
@@ -224,7 +228,10 @@ private fun TODO(vmHome: VMHome) {
                     .weight(1f)
                     .height(80.dp)
                     .clip(RoundedCornerShape(12.dp))
-                    .background(MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)),
+                    .background(MaterialTheme.colorScheme.primary.copy(alpha = 0.1f))
+                    .clickable {
+                        vmHome.onTaskFinishClick()
+                    },
                 horizontalAlignment = Alignment.CenterHorizontally,
                 verticalArrangement = Arrangement.Center
             ) {

+ 1 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/home/SettingsCompose.kt

@@ -167,7 +167,7 @@ private fun TopToolBar(pv: PaddingValues, vm: VMHome) {
                     contentDescription = null,
                     tint = Color.White
                 )
-                AsyncImage(model = state.user.avatar, contentDescription = null, modifier = Modifier.fillMaxSize())
+                AsyncImage(model = state.user.avatar, contentDescription = null, modifier = Modifier.fillMaxSize(),contentScale = ContentScale.Crop)
             }
             Column(Modifier.padding(horizontal = 10.dp)) {
                 Text("设置", fontSize = 16.sp, lineHeight = 16.sp, fontWeight = FontWeight.Medium, color = Color.White)

+ 14 - 12
app/src/main/java/com/iscs/bozzys/ui/pages/login/PageLogin.kt

@@ -261,18 +261,20 @@ class PageLogin : PageBase() {
                 )
             }
             if (state.showTenantId) {
-                Text(
-                    "关联租户",
-                    fontSize = 14.sp,
-                    lineHeight = 18.sp,
-                    color = MaterialTheme.colorScheme.primary,
-                    modifier = Modifier
-                        .padding(top = 5.dp, end = 10.dp)
-                        .clip(RoundedCornerShape(50))
-                        .align(Alignment.End)
-                        .clickable { vm.showInputDialog() }
-                        .padding(horizontal = 5.dp, vertical = 3.dp)
-                )
+                Row(modifier = Modifier.width(335.dp)) {
+                    Spacer(Modifier.weight(1f))
+                    Text(
+                        "关联租户",
+                        fontSize = 14.sp,
+                        lineHeight = 18.sp,
+                        color = MaterialTheme.colorScheme.primary,
+                        modifier = Modifier
+                            .padding(top = 5.dp)
+                            .clip(RoundedCornerShape(50))
+                            .clickable { vm.showInputDialog() }
+                            .padding(horizontal = 5.dp, vertical = 3.dp)
+                    )
+                }
                 InputDialog(
                     show = state.showInputDialog,
                     value = state.tenantId,

+ 9 - 3
app/src/main/java/com/iscs/bozzys/ui/pages/profile/PageProfile.kt

@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.heightIn
 import androidx.compose.foundation.layout.offset
 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.foundation.shape.RoundedCornerShape
 import androidx.compose.foundation.text.BasicTextField
@@ -48,6 +49,7 @@ import androidx.compose.ui.geometry.Offset
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.text.font.FontWeight
@@ -161,9 +163,12 @@ class PageProfile : PageBase() {
                         ) {
                             Text("${state.user.nickname.ifEmpty { "P" }[0]}", color = Text, fontWeight = FontWeight.Bold)
                             AsyncImage(
-                                model = state.user.avatar, contentDescription = null, modifier = Modifier
+                                model = state.user.avatar,
+                                contentDescription = null,
+                                modifier = Modifier
                                     .size(52.dp)
-                                    .clip(CircleShape)
+                                    .clip(CircleShape),
+                                contentScale = ContentScale.Crop
                             )
                         }
                         Icon(
@@ -410,7 +415,7 @@ class PageProfile : PageBase() {
                     topRadius = 16.dp,
                     bottomRadius = 16.dp,
                     modifier = Modifier
-                        .fillMaxWidth(0.65f)
+                        .width(320.dp)
                         // 防止点击穿透
                         .clickable(
                             indication = null,
@@ -430,6 +435,7 @@ class PageProfile : PageBase() {
                             Text(
                                 title,
                                 fontSize = 16.sp,
+                                lineHeight = 48.sp,
                                 fontWeight = FontWeight.Bold,
                                 color = Text,
                                 modifier = Modifier.weight(1f),

+ 40 - 10
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMHome.kt

@@ -17,6 +17,7 @@ import com.iscs.bozzys.ui.common.VMBase
 import com.iscs.bozzys.ui.theme.Text
 import com.iscs.bozzys.utils.Storage
 import com.iscs.bozzys.utils.Storage.saveUserAvatar
+import com.iscs.bozzys.utils.isAdmin
 import kotlinx.coroutines.async
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
@@ -25,23 +26,31 @@ import kotlinx.coroutines.launch
 
 class VMHome : VMBase() {
 
+    // 内部调用
     private val _state = MutableStateFlow(StateHome())
+
+    // 对外暴露
     val state = _state.asStateFlow()
 
+    // 首页
+    private val TAB_HOME = NavBarItem(0, "首页", R.drawable.home)
+
+    // 作业
+    private val TAB_JOBS = NavBarItem(1, "作业", R.drawable.jobs)
+
+    // 任务
+    private val TAB_TASKS = NavBarItem(2, "任务", R.drawable.tasks)
+
+    // 用户
+    private val TAB_SETTINGS = NavBarItem(3, "设置", R.drawable.settings)
+
     /**
      * 页面初始化操作
      */
     fun init() {
         initEvent()
         viewModelScope.launch {
-            val navs = listOf(
-                NavBarItem(0, "首页", R.drawable.home),
-                NavBarItem(1, "作业", R.drawable.jobs),
-                NavBarItem(2, "任务", R.drawable.tasks),
-                NavBarItem(3, "设置", R.drawable.settings)
-            )
-            _state.value = _state.value.copy(navs = navs)
-            // 延时等待页面配置数据初步加载完成
+            _state.value = _state.value.copy(navs = listOf(TAB_HOME, TAB_TASKS, TAB_SETTINGS))
             delay(500)
             refreshHome(true)
         }
@@ -67,8 +76,23 @@ class VMHome : VMBase() {
      * 更新底部选择的导航
      */
     fun navigationToId(id: Int) {
-        val idx = _state.value.navs.indexOfFirst { it.id == id }
-        _state.value = _state.value.copy(navigationId = idx)
+        _state.value = _state.value.copy(navigationId = id)
+    }
+
+    /**
+     * 进行中的任务数被点击
+     */
+    fun onTaskProgressClick() {
+        navigationToId(2)
+        getTaskList(StatePage(type = "running", page = 1, keywords = "", isRefresh = true, noMore = false))
+    }
+
+    /**
+     * 已完成的任务数被点击
+     */
+    fun onTaskFinishClick() {
+        navigationToId(2)
+        getTaskList(StatePage(type = "approved", page = 1, keywords = "", isRefresh = true, noMore = false))
     }
 
     /**
@@ -107,6 +131,12 @@ class VMHome : VMBase() {
                 toast.emit("获取用户信息失败,请稍后重试")
                 return@launch
             }
+            // 获取到用户信息后即刷新导航栏数据
+            if (permissionRsp.data?.roles.isAdmin()) {
+                _state.value = _state.value.copy(navs = listOf(TAB_HOME, TAB_JOBS, TAB_TASKS, TAB_SETTINGS))
+            } else {
+                _state.value = _state.value.copy(navs = listOf(TAB_HOME, TAB_TASKS, TAB_SETTINGS))
+            }
             // 查询顶部的任务个数
             val statisticsRsp = ApiRequest.getTaskStatistics().getOrElse { it.getResponse() }
             if (!statisticsRsp.code.isCodeOk()) {

+ 5 - 1
app/src/main/java/com/iscs/bozzys/ui/pages/vm/VMLogin.kt

@@ -94,7 +94,11 @@ class VMLogin : VMBase() {
     }
 
     fun showInputDialog() {
-        state = state.copy(showInputDialog = true)
+        viewModelScope.launch {
+            // 增加视觉停留效果
+            delay(500)
+            state = state.copy(showInputDialog = true)
+        }
     }
 
     fun updateInputValue(value: String) {

+ 8 - 0
app/src/main/java/com/iscs/bozzys/utils/Exts.kt

@@ -15,4 +15,12 @@ fun List<String>.getRoleName(): String {
     } else {
         ""
     }
+}
+
+/**
+ * 是否管理员
+ */
+fun List<String>?.isAdmin(): Boolean {
+    if (this == null) return false
+    return this.contains("super_admin")
 }