diff --git a/meal_mate/app/build.gradle.kts b/meal_mate/app/build.gradle.kts index 84a36a6..4ffb365 100644 --- a/meal_mate/app/build.gradle.kts +++ b/meal_mate/app/build.gradle.kts @@ -105,6 +105,18 @@ dependencies { // Data Store implementation(libs.androidx.datastore.preferences) + + // RoomDB + implementation(libs.androidx.room.runtime) + annotationProcessor(libs.androidx.room.compiler) + + // Compose runtime + implementation(libs.androidx.runtime.livedata) + // Kotlin Extensions and Coroutines support for Room + implementation(libs.androidx.room.ktx) + + // To use Kotlin annotation processing tool (kapt) + kapt(libs.androidx.room.compiler) } kapt { diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/MealUserDatabase.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/MealUserDatabase.kt new file mode 100644 index 0000000..1511e84 --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/MealUserDatabase.kt @@ -0,0 +1,9 @@ +package com.android.engineer.mealmate.data.local.roomdb + +import androidx.room.Database +import androidx.room.RoomDatabase + +@Database(entities = [User::class], version = 1) +abstract class MealUserDatabase : RoomDatabase() { + abstract fun userDao(): UserDao +} diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/User.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/User.kt new file mode 100644 index 0000000..e1df00a --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/User.kt @@ -0,0 +1,16 @@ +package com.android.engineer.mealmate.data.local.roomdb + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "users_table") +data class User( + @PrimaryKey(autoGenerate = true) val id: Int = 0, + val username: String, + val firstName: String, + val lastName: String, + val email: String, + val password: String, + val hash: String +) + diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/UserDao.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/UserDao.kt new file mode 100644 index 0000000..ae36e6f --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/local/roomdb/UserDao.kt @@ -0,0 +1,19 @@ +package com.android.engineer.mealmate.data.local.roomdb + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query + +@Dao +interface UserDao { + + @Insert + suspend fun insertUser(user: User): Long + + @Query("SELECT * FROM users_table WHERE username = :username AND password = :password") + suspend fun getUser(username: String, password: String): User? + + @Query("SELECT email FROM USERS_TABLE WHERE username = :username") + suspend fun getEmail(username: String): String? + +} diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/AuthRepositoryImpl.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/AuthRepositoryImpl.kt index 3652ca5..f01ea37 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/AuthRepositoryImpl.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/AuthRepositoryImpl.kt @@ -4,7 +4,7 @@ import com.android.engineer.mealmate.data.remote.model.request.RegisterRequest import com.android.engineer.mealmate.data.remote.model.response.RegisterResponse import com.android.engineer.mealmate.data.remote.MealAPI import com.android.engineer.mealmate.data.utils.API_KEY_VALUE -import com.android.engineer.mealmate.domain.repository.AuthRepository +import com.android.engineer.mealmate.repository.remote.AuthRepository import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/RecipeSearchRepositoryImpl.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/RecipeSearchRepositoryImpl.kt index fc1b58f..6ad8b7c 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/RecipeSearchRepositoryImpl.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/RecipeSearchRepositoryImpl.kt @@ -5,7 +5,7 @@ import com.android.engineer.mealmate.data.remote.model.response.IngredientsRespo import com.android.engineer.mealmate.data.remote.model.response.NutrientsResponseItem import com.android.engineer.mealmate.data.remote.model.response.RecipeInfoByIdResponse import com.android.engineer.mealmate.data.utils.API_KEY_VALUE -import com.android.engineer.mealmate.domain.repository.RecipeSearchRepository +import com.android.engineer.mealmate.repository.remote.RecipeSearchRepository import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/UserRepositoryImpl.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/UserRepositoryImpl.kt new file mode 100644 index 0000000..304b1ef --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/repository/UserRepositoryImpl.kt @@ -0,0 +1,18 @@ +package com.android.engineer.mealmate.data.repository + +import com.android.engineer.mealmate.data.local.roomdb.User +import com.android.engineer.mealmate.data.local.roomdb.UserDao +import com.android.engineer.mealmate.repository.local.UserRepository +import javax.inject.Inject + +class UserRepositoryImpl @Inject constructor(private val userDao: UserDao): UserRepository { + override suspend fun insertUser(user: User): Long { + return userDao.insertUser(user) + } + override suspend fun getUser(username: String, password: String): User? { + return userDao.getUser(username, password) + } + override suspend fun getEmail(username: String): String { + return userDao.getEmail(username) ?: "" + } +} diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/utils/MealConstants.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/utils/MealConstants.kt index 848f53d..98d103a 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/utils/MealConstants.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/data/utils/MealConstants.kt @@ -14,10 +14,7 @@ const val API_KEY_VALUE = "7a36c50e0e72420eb8515d694a2b2af4" // Currently placin const val DATASTORE_NAME = "meal_data_store" const val USERNAME = "username" -const val PASSWORD = "password" -const val HASH = "hash" const val IS_LOGGED_IN = "isLoggedIn" -const val EMAIL = "email" const val MIN_CARBS_KEY = "minCarbs" const val MAX_CARBS_KEY = "maxCarbs" @@ -28,4 +25,6 @@ const val INGREDIENTS_KEY = "ingredients" const val SEARCH_BY_NUTRIENTS = "recipes/findByNutrients" const val SEARCH_BY_INGREDIENTS = "recipes/findByIngredients" const val RECIPE_INFO_BY_ID = "recipes/{id}/information" -const val REGISTER_API = "users/connect" \ No newline at end of file +const val REGISTER_API = "users/connect" + +const val USER_DATABASE_NAME = "meal_user_database" \ No newline at end of file diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/DatabaseModule.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/DatabaseModule.kt new file mode 100644 index 0000000..09cdd76 --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/DatabaseModule.kt @@ -0,0 +1,32 @@ +package com.android.engineer.mealmate.di + +import android.content.Context +import androidx.room.Room +import com.android.engineer.mealmate.data.local.roomdb.MealUserDatabase +import com.android.engineer.mealmate.data.local.roomdb.UserDao +import com.android.engineer.mealmate.data.utils.USER_DATABASE_NAME +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@InstallIn(SingletonComponent::class) +@Module +object DatabaseModule { + @Provides + fun provideUserDao(mealUserDatabase: MealUserDatabase): UserDao { + return mealUserDatabase.userDao() + } + + @Singleton + @Provides + fun provideUserDatabase(@ApplicationContext context: Context): MealUserDatabase { + return Room.databaseBuilder( + context = context, + MealUserDatabase::class.java, + USER_DATABASE_NAME + ).fallbackToDestructiveMigration().build() + } +} \ No newline at end of file diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/MealAppModule.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/MealAppModule.kt index b9db579..8276c61 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/MealAppModule.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/di/MealAppModule.kt @@ -3,11 +3,14 @@ package com.android.engineer.mealmate.di import android.app.Application import com.android.engineer.mealmate.data.local.datastore.MealDataStore import com.android.engineer.mealmate.data.local.datastore.MealDataStoreImpl +import com.android.engineer.mealmate.data.local.roomdb.UserDao import com.android.engineer.mealmate.data.remote.MealAPI import com.android.engineer.mealmate.data.repository.AuthRepositoryImpl import com.android.engineer.mealmate.data.repository.RecipeSearchRepositoryImpl -import com.android.engineer.mealmate.domain.repository.AuthRepository -import com.android.engineer.mealmate.domain.repository.RecipeSearchRepository +import com.android.engineer.mealmate.data.repository.UserRepositoryImpl +import com.android.engineer.mealmate.repository.local.UserRepository +import com.android.engineer.mealmate.repository.remote.AuthRepository +import com.android.engineer.mealmate.repository.remote.RecipeSearchRepository import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -34,4 +37,10 @@ object MealAppModule { fun provideAuthRepository(api: MealAPI): AuthRepository { return AuthRepositoryImpl(api) } + + @Provides + @Singleton + fun provideUserRepository(userDao: UserDao): UserRepository { + return UserRepositoryImpl(userDao = userDao) + } } \ No newline at end of file diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/local/UserRepository.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/local/UserRepository.kt new file mode 100644 index 0000000..a2c4139 --- /dev/null +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/local/UserRepository.kt @@ -0,0 +1,12 @@ +package com.android.engineer.mealmate.repository.local + +import com.android.engineer.mealmate.data.local.roomdb.User + +interface UserRepository { + + suspend fun insertUser(user: User): Long + + suspend fun getUser(username: String, password: String): User? + + suspend fun getEmail(username: String): String +} diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/AuthRepository.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/AuthRepository.kt similarity index 84% rename from meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/AuthRepository.kt rename to meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/AuthRepository.kt index 5231825..0ceaea6 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/AuthRepository.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/AuthRepository.kt @@ -1,4 +1,4 @@ -package com.android.engineer.mealmate.domain.repository +package com.android.engineer.mealmate.repository.remote import com.android.engineer.mealmate.data.remote.model.request.RegisterRequest import com.android.engineer.mealmate.data.remote.model.response.RegisterResponse diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/RecipeSearchRepository.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/RecipeSearchRepository.kt similarity index 92% rename from meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/RecipeSearchRepository.kt rename to meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/RecipeSearchRepository.kt index 15ea2ee..f16358b 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/domain/repository/RecipeSearchRepository.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/repository/remote/RecipeSearchRepository.kt @@ -1,4 +1,4 @@ -package com.android.engineer.mealmate.domain.repository +package com.android.engineer.mealmate.repository.remote import com.android.engineer.mealmate.data.remote.model.response.IngredientsResponseItem import com.android.engineer.mealmate.data.remote.model.response.NutrientsResponseItem diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/AuthViewModel.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/AuthViewModel.kt index 6aae64a..304d552 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/AuthViewModel.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/AuthViewModel.kt @@ -5,12 +5,12 @@ import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.android.engineer.mealmate.data.local.datastore.MealDataStore +import com.android.engineer.mealmate.data.local.roomdb.User import com.android.engineer.mealmate.data.remote.model.request.RegisterRequest -import com.android.engineer.mealmate.data.utils.HASH import com.android.engineer.mealmate.data.utils.IS_LOGGED_IN -import com.android.engineer.mealmate.data.utils.PASSWORD import com.android.engineer.mealmate.data.utils.USERNAME -import com.android.engineer.mealmate.domain.repository.AuthRepository +import com.android.engineer.mealmate.repository.local.UserRepository +import com.android.engineer.mealmate.repository.remote.AuthRepository import com.android.engineer.mealmate.view.features.auth.state.VisitingRegisterUiState import com.android.engineer.mealmate.view.utils.UtilConst import dagger.hilt.android.lifecycle.HiltViewModel @@ -23,7 +23,8 @@ import javax.inject.Inject @HiltViewModel class AuthViewModel @Inject constructor( private val repository: AuthRepository, - private val dataStore: MealDataStore + private val dataStore: MealDataStore, + private val userRepository: UserRepository ): ViewModel() { val isLoggedIn = mutableStateOf(false) @@ -44,6 +45,9 @@ class AuthViewModel @Inject constructor( private val _email = MutableStateFlow("") val email = _email.asStateFlow() + private val _userPassword = MutableStateFlow("") + val userPassword = _userPassword.asStateFlow() + val userNameErrorMsg = mutableStateOf("") val userNameError = mutableStateOf(false) @@ -56,6 +60,9 @@ class AuthViewModel @Inject constructor( val emailErrorMsg = mutableStateOf("") val emailError = mutableStateOf(false) + val passwordErrorMsg = mutableStateOf("") + val passwordError = mutableStateOf(false) + val isScreenLoading = mutableStateOf(false) fun onSignUpClicked(onCallBack: (VisitingRegisterUiState) -> Unit) { @@ -97,12 +104,17 @@ class AuthViewModel @Inject constructor( val visitRegister = repository.registerAccount(registerRequest) visitRegister.collectLatest { registerResponse -> if (registerResponse.status == "success") { - dataStore.putString(USERNAME, registerResponse.username) - dataStore.putString(PASSWORD, registerResponse.spoonacularPassword) - dataStore.putString(HASH, registerResponse.hash) - dataStore.putBoolean(IS_LOGGED_IN, true) - isScreenLoading.value = false - onCallBack(VisitingRegisterUiState.Success()) + val user = User(username = registerResponse.username, firstName = _firstName.value, lastName = _lastName.value, email = _email.value, password = registerResponse.spoonacularPassword, hash = registerResponse.hash) + val result = userRepository.insertUser(user) + if(result > 0) { + isScreenLoading.value = false + onCallBack(VisitingRegisterUiState.Success()) + Log.d("testing", registerResponse.spoonacularPassword) + + } else { + isScreenLoading.value = false + onCallBack(VisitingRegisterUiState.Error("Error inserting into DB, Try again!")) + } } } } catch (e: Exception) { @@ -114,12 +126,56 @@ class AuthViewModel @Inject constructor( } } - fun onValueChanged(signUpEnum: UtilConst.SignUpEnum, newValue: String) { - when(signUpEnum) { - UtilConst.SignUpEnum.USERNAME -> { _userName.value = newValue } - UtilConst.SignUpEnum.FIRSTNAME -> { _firstName.value = newValue } - UtilConst.SignUpEnum.LASTNAME -> { _lastName.value = newValue } - UtilConst.SignUpEnum.EMAIL -> { _email.value = newValue } + fun onLoginClicked(onCallBack: (VisitingRegisterUiState) -> Unit) { + if(_userName.value.isEmpty()) { + userNameErrorMsg.value = "Enter the username" + userNameError.value = true + passwordError.value = false + } else if(_userPassword.value.isEmpty()) { + passwordErrorMsg.value = "Enter the password" + passwordError.value = true + userNameError.value = false + } else { + userNameError.value = false + passwordError.value = false + isScreenLoading.value = true + + viewModelScope.launch { + try { + val user = userRepository.getUser(_userName.value, _userPassword.value) + + if(user != null) { + dataStore.putString(USERNAME, user.username) + dataStore.putBoolean(IS_LOGGED_IN, true) + isScreenLoading.value = false + onCallBack(VisitingRegisterUiState.Success()) + } else { + isScreenLoading.value = false + onCallBack(VisitingRegisterUiState.Error("Invalid username or password")) + } + + } catch (e: Exception) { + Log.d("onLoginClicked", "There is an error") + isScreenLoading.value = false + e.printStackTrace() + onCallBack(VisitingRegisterUiState.Error("An error occurred, please try again")) + } + } + } } + + fun onValueChanged(authEnum: UtilConst.AuthEnum, newValue: String) { + when(authEnum) { + UtilConst.AuthEnum.USERNAME -> { _userName.value = newValue } + UtilConst.AuthEnum.FIRSTNAME -> { _firstName.value = newValue } + UtilConst.AuthEnum.LASTNAME -> { _lastName.value = newValue } + UtilConst.AuthEnum.EMAIL -> { _email.value = newValue } + UtilConst.AuthEnum.PASSWORD -> { _userPassword.value = newValue } + } + } + + + + } \ No newline at end of file diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/LoginScreen.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/LoginScreen.kt index 46f3a7a..ed39102 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/LoginScreen.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/LoginScreen.kt @@ -1,5 +1,6 @@ package com.android.engineer.mealmate.view.features.auth +import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -23,9 +24,11 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.KeyboardType @@ -34,18 +37,27 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import com.android.engineer.mealmate.view.utils.constants.nav.AuthScreen import com.android.engineer.mealmate.R import com.android.engineer.mealmate.ui.theme.OrangeOnPrimary +import com.android.engineer.mealmate.view.features.auth.state.VisitingRegisterUiState +import com.android.engineer.mealmate.view.utils.UtilConst import com.android.engineer.mealmate.view.utils.custom_views.MealFilledButton import com.android.engineer.mealmate.view.utils.custom_views.MealText import com.android.engineer.mealmate.view.utils.custom_views.MealTextField import com.android.engineer.mealmate.view.utils.constants.nav.graph.DASHBOARD +import com.android.engineer.mealmate.view.utils.custom_views.MealLottieAnimation @Composable fun LoginScreen(navHostController: NavHostController) { + val viewModel = hiltViewModel() + + val userName = viewModel.userName.collectAsState() + val password = viewModel.userPassword.collectAsState() + val context = LocalContext.current Scaffold( modifier = Modifier .fillMaxSize() @@ -58,84 +70,122 @@ fun LoginScreen(navHostController: NavHostController) { .background(OrangeOnPrimary), contentAlignment = Alignment.Center ) { - Card( - modifier = Modifier - .padding(16.dp) - .fillMaxWidth() - .wrapContentHeight(), - colors = CardDefaults.cardColors( - containerColor = Color.White - ), - elevation = CardDefaults.cardElevation(8.dp), - shape = RoundedCornerShape(25.dp) - ) { - Column( + if (viewModel.isScreenLoading.value) { + MealLottieAnimation(rawResId = R.raw.loading_animation, imageSize = 200.dp) + } else { + Card( modifier = Modifier + .padding(16.dp) .fillMaxWidth() - .padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + .wrapContentHeight(), + colors = CardDefaults.cardColors( + containerColor = Color.White + ), + elevation = CardDefaults.cardElevation(8.dp), + shape = RoundedCornerShape(25.dp) ) { - MealText( - text = stringResource(id = R.string.welcome_back), - modifier = Modifier, - fontSize = 28.sp, - textAlign = TextAlign.Center - ) - MealText( - text = stringResource(id = R.string.login_to_account), - modifier = Modifier, - fontSize = 12.sp, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(16.dp)) - MealTextField( - value = "", - onValueChange = {}, - label = stringResource(id = R.string.username), - icon = Icons.Filled.Person - ) - Spacer(modifier = Modifier.height(8.dp)) - MealTextField( - value = "", - onValueChange = {}, - label = stringResource(id = R.string.password), - icon = Icons.Filled.Lock, - visualTransformation = PasswordVisualTransformation(), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password) - ) - Spacer(modifier = Modifier.height(32.dp)) - // This will be uncommented when Forgot password feature is enabled -// Row( -// modifier = Modifier.fillMaxWidth(), -// horizontalArrangement = Arrangement.End -// ) { -// MealText( -// text = stringResource(id = R.string.forgot_password), -// fontSize = 12.sp, -// modifier = Modifier.clickable { } -// ) -// } -// Spacer(modifier = Modifier.height(26.dp)) - MealFilledButton( - onClick = { navHostController.navigate(route = DASHBOARD) }, - text = stringResource(id = R.string.login), - modifier = Modifier.fillMaxWidth(), - horizontalPadding = 8.dp - ) - Spacer(modifier = Modifier.height(16.dp)) - Row(modifier = Modifier.align(alignment = Alignment.CenterHorizontally)){ + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { MealText( - text = stringResource(id = R.string.do_not_have_account), - fontSize = 12.sp + text = stringResource(id = R.string.welcome_back), + modifier = Modifier, + fontSize = 28.sp, + textAlign = TextAlign.Center ) - Spacer(modifier = Modifier.width(8.dp)) MealText( - text = stringResource(id = R.string.sign_up_lower), + text = stringResource(id = R.string.login_to_account), + modifier = Modifier, fontSize = 12.sp, - fontWeight = FontWeight.Bold, - modifier = Modifier.clickable { navHostController.navigate(AuthScreen.Signup.route) } + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(16.dp)) + MealTextField( + value = userName.value, + onValueChange = { + viewModel.onValueChanged(UtilConst.AuthEnum.USERNAME, it) + }, + label = stringResource(id = R.string.username), + icon = Icons.Filled.Person, + isError = viewModel.userNameError.value, + errorMsg = viewModel.userNameErrorMsg.value + ) + Spacer(modifier = Modifier.height(8.dp)) + MealTextField( + value = password.value, + onValueChange = { + viewModel.onValueChanged(UtilConst.AuthEnum.PASSWORD, it) + }, + label = stringResource(id = R.string.password), + icon = Icons.Filled.Lock, + visualTransformation = PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + isError = viewModel.passwordError.value, + errorMsg = viewModel.passwordErrorMsg.value + ) + Spacer(modifier = Modifier.height(32.dp)) + // This will be uncommented when Forgot password feature is enabled + // Row( + // modifier = Modifier.fillMaxWidth(), + // horizontalArrangement = Arrangement.End + // ) { + // MealText( + // text = stringResource(id = R.string.forgot_password), + // fontSize = 12.sp, + // modifier = Modifier.clickable { } + // ) + // } + // Spacer(modifier = Modifier.height(26.dp)) + MealFilledButton( + onClick = { + viewModel.onLoginClicked( + onCallBack = { + when (it) { + is VisitingRegisterUiState.Error -> { + Toast.makeText( + context, + "", + Toast.LENGTH_SHORT + ).show() + } + + VisitingRegisterUiState.Loading -> { + + } + + is VisitingRegisterUiState.Success -> { + navHostController.navigate(route = DASHBOARD) + } + } + } + ) + }, + text = stringResource(id = R.string.login), + modifier = Modifier.fillMaxWidth(), + horizontalPadding = 8.dp ) + Spacer(modifier = Modifier.height(16.dp)) + Row(modifier = Modifier.align(alignment = Alignment.CenterHorizontally)) { + MealText( + text = stringResource(id = R.string.do_not_have_account), + fontSize = 12.sp + ) + Spacer(modifier = Modifier.width(8.dp)) + MealText( + text = stringResource(id = R.string.sign_up_lower), + fontSize = 12.sp, + fontWeight = FontWeight.Bold, + modifier = Modifier.clickable { + navHostController.navigate( + AuthScreen.Signup.route + ) + } + ) + } } } } diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/SignupScreen.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/SignupScreen.kt index 9a42922..60e73a5 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/SignupScreen.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/auth/SignupScreen.kt @@ -1,5 +1,6 @@ package com.android.engineer.mealmate.view.features.auth +import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -27,6 +28,7 @@ import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -40,7 +42,6 @@ import com.android.engineer.mealmate.ui.theme.OrangeOnPrimary import com.android.engineer.mealmate.view.features.auth.state.VisitingRegisterUiState import com.android.engineer.mealmate.view.utils.UtilConst import com.android.engineer.mealmate.view.utils.constants.nav.AuthScreen -import com.android.engineer.mealmate.view.utils.constants.nav.graph.DASHBOARD import com.android.engineer.mealmate.view.utils.custom_views.MealFilledButton import com.android.engineer.mealmate.view.utils.custom_views.MealLottieAnimation import com.android.engineer.mealmate.view.utils.custom_views.MealText @@ -54,6 +55,7 @@ fun SignupScreen(navHostController: NavHostController) { val firstName = viewModel.firstName.collectAsState() val lastName = viewModel.lastName.collectAsState() val email = viewModel.email.collectAsState() + val context = LocalContext.current Scaffold( modifier = Modifier @@ -68,7 +70,7 @@ fun SignupScreen(navHostController: NavHostController) { contentAlignment = Alignment.Center ) { if (viewModel.isScreenLoading.value) { - MealLottieAnimation(rawResId = R.raw.api_progress, imageSize = 200.dp) + MealLottieAnimation(rawResId = R.raw.loading_animation, imageSize = 200.dp) } else { Card( modifier = Modifier @@ -104,7 +106,7 @@ fun SignupScreen(navHostController: NavHostController) { MealTextField( value = userName.value, onValueChange = { - viewModel.onValueChanged(UtilConst.SignUpEnum.USERNAME, it) + viewModel.onValueChanged(UtilConst.AuthEnum.USERNAME, it) }, label = stringResource(id = R.string.username), icon = Icons.Filled.Person, @@ -115,7 +117,7 @@ fun SignupScreen(navHostController: NavHostController) { MealTextField( value = firstName.value, onValueChange = { - viewModel.onValueChanged(UtilConst.SignUpEnum.FIRSTNAME, it) + viewModel.onValueChanged(UtilConst.AuthEnum.FIRSTNAME, it) }, label = stringResource(id = R.string.first_name), icon = Icons.Filled.PersonOutline, @@ -126,7 +128,7 @@ fun SignupScreen(navHostController: NavHostController) { MealTextField( value = lastName.value, onValueChange = { - viewModel.onValueChanged(UtilConst.SignUpEnum.LASTNAME, it) + viewModel.onValueChanged(UtilConst.AuthEnum.LASTNAME, it) }, label = stringResource(id = R.string.last_name), icon = Icons.Filled.PersonOutline, @@ -137,7 +139,7 @@ fun SignupScreen(navHostController: NavHostController) { MealTextField( value = email.value, onValueChange = { - viewModel.onValueChanged(UtilConst.SignUpEnum.EMAIL, it) + viewModel.onValueChanged(UtilConst.AuthEnum.EMAIL, it) }, label = stringResource(id = R.string.email), icon = Icons.Filled.Email, @@ -151,7 +153,11 @@ fun SignupScreen(navHostController: NavHostController) { onCallBack = { when (it) { is VisitingRegisterUiState.Error -> { - + Toast.makeText( + context, + "", + Toast.LENGTH_SHORT + ).show() } VisitingRegisterUiState.Loading -> { @@ -159,7 +165,7 @@ fun SignupScreen(navHostController: NavHostController) { } is VisitingRegisterUiState.Success -> { - navHostController.navigate(route = DASHBOARD) + navHostController.navigate(AuthScreen.Login.route) } } } diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/HomeScreen.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/HomeScreen.kt index 1fb4965..75a3045 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/HomeScreen.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/HomeScreen.kt @@ -49,7 +49,7 @@ fun HomeScreen(navHostController: NavHostController, paddingValues: PaddingValue ) { if (viewModel.isScreenLoading.value) { - MealLottieAnimation(rawResId = R.raw.api_progress, imageSize = 200.dp) + MealLottieAnimation(rawResId = R.raw.loading_animation, imageSize = 200.dp) } else { ShowTopView(userName = loggedInUserName) Spacer(modifier = Modifier @@ -76,7 +76,7 @@ fun ShowTopView(userName: String) { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { - MealText(text = stringResource(id = R.string.hello).plus(", ").plus(userName), fontSize = 30.sp) + MealText(text = stringResource(id = R.string.hello).plus(" ").plus(userName).plus(","), fontSize = 30.sp) // This feature is disabled. /*MealIconButton( onClick = {}, diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeDetailsScreen.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeDetailsScreen.kt index 2004675..62260aa 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeDetailsScreen.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeDetailsScreen.kt @@ -43,7 +43,7 @@ fun RecipeDetailsScreen(recipeId: Int, navHostController: NavHostController) { .padding(16.dp), contentAlignment = Alignment.Center ) { - MealLottieAnimation(rawResId = R.raw.api_progress, imageSize = 200.dp) + MealLottieAnimation(rawResId = R.raw.loading_animation, imageSize = 200.dp) } } else { Scaffold( diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeInfoByIdViewModel.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeInfoByIdViewModel.kt index 2c15580..3184ee7 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeInfoByIdViewModel.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeInfoByIdViewModel.kt @@ -4,7 +4,7 @@ import android.util.Log import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.android.engineer.mealmate.domain.repository.RecipeSearchRepository +import com.android.engineer.mealmate.repository.remote.RecipeSearchRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeViewModel.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeViewModel.kt index fdabd16..b842507 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeViewModel.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/home/RecipeViewModel.kt @@ -16,7 +16,7 @@ import com.android.engineer.mealmate.data.utils.MIN_CARBS_KEY import com.android.engineer.mealmate.data.utils.NUMBER_KEY import com.android.engineer.mealmate.data.utils.NUMBER_KEY_VALUE import com.android.engineer.mealmate.data.utils.USERNAME -import com.android.engineer.mealmate.domain.repository.RecipeSearchRepository +import com.android.engineer.mealmate.repository.remote.RecipeSearchRepository import com.android.engineer.mealmate.view.features.home.model.MealChipList import com.android.engineer.mealmate.view.utils.constants.MinMaxRangeEnum import com.android.engineer.mealmate.view.utils.constants.NutrientsEnum diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/profile/ProfileViewModel.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/profile/ProfileViewModel.kt index 71791b2..87823bc 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/profile/ProfileViewModel.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/features/profile/ProfileViewModel.kt @@ -1,11 +1,10 @@ package com.android.engineer.mealmate.view.features.profile -import androidx.compose.runtime.mutableStateOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.android.engineer.mealmate.data.local.datastore.MealDataStore -import com.android.engineer.mealmate.data.utils.EMAIL import com.android.engineer.mealmate.data.utils.USERNAME +import com.android.engineer.mealmate.repository.local.UserRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -14,7 +13,8 @@ import javax.inject.Inject @HiltViewModel class ProfileViewModel @Inject constructor( - private val dataStore: MealDataStore + private val dataStore: MealDataStore, + private val userRepository: UserRepository ): ViewModel() { private var _userName = MutableStateFlow("") @@ -26,10 +26,20 @@ class ProfileViewModel @Inject constructor( init { viewModelScope.launch { _userName.value = dataStore.getString(USERNAME) ?: "" - _email.value = dataStore.getString(EMAIL) ?: "" + if(_userName.value.isNotEmpty()) { + _email.value = getEmailByUserName(_userName.value) + } } } + private fun getEmailByUserName(userName: String): String { + var email = "" + viewModelScope.launch { + email = userRepository.getEmail(userName) + } + return email + } + fun onLogoutClicked(onLogoutClicked: () -> Unit) { viewModelScope.launch { /*dataStore.clearPreference() diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/UtilConst.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/UtilConst.kt index 827ec75..99e14db 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/UtilConst.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/UtilConst.kt @@ -2,10 +2,12 @@ package com.android.engineer.mealmate.view.utils class UtilConst { - enum class SignUpEnum(signUpEnum: String) { - USERNAME(signUpEnum = "username"), - FIRSTNAME(signUpEnum = "firstname"), - LASTNAME(signUpEnum = "lastname"), - EMAIL(signUpEnum = "email"), + enum class AuthEnum(authEnum: String) { + USERNAME(authEnum = "username"), + FIRSTNAME(authEnum = "firstname"), + LASTNAME(authEnum = "lastname"), + EMAIL(authEnum = "email"), + PASSWORD(authEnum = "password") } + } \ No newline at end of file diff --git a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/custom_views/MealTextField.kt b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/custom_views/MealTextField.kt index fa57e29..a6cc997 100644 --- a/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/custom_views/MealTextField.kt +++ b/meal_mate/app/src/main/java/com/android/engineer/mealmate/view/utils/custom_views/MealTextField.kt @@ -73,6 +73,8 @@ fun MealTextFieldPreview() { value = usernameState.value, onValueChange = { usernameState.value = it }, label = "Username", - icon = Icons.Filled.Person + icon = Icons.Filled.Person, + isError = true, + errorMsg = "error!" ) } diff --git a/meal_mate/app/src/main/res/raw/api_progress.json b/meal_mate/app/src/main/res/raw/api_progress.json deleted file mode 100644 index bf9b3da..0000000 --- a/meal_mate/app/src/main/res/raw/api_progress.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.9.4","fr":30,"ip":0,"op":150,"w":512,"h":512,"nm":"API","ddd":0,"assets":[{"id":"comp_0","nm":"Dots","fr":30,"layers":[{"ddd":0,"ind":6,"ty":4,"nm":"Dot 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":20,"s":[261.75,430,0],"to":[0,0,0],"ti":[0,12.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":27.448,"s":[261.75,397.5,0],"to":[0,-11,0],"ti":[0,9,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31.316,"s":[242.5,377,0],"to":[0,-9,0],"ti":[0,0,0]},{"t":40,"s":[242.5,335.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[261.385,429.053,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.272,2.335],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.336,1.271],[0,4.142],[-2.846,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.854,429.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.385,429.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":20,"op":41,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Dot 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":15,"s":[231.25,416.75,0],"to":[0,0,0],"ti":[0,9,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21.563,"s":[231.25,394.75,0],"to":[0,-7.75,0],"ti":[0,5.75,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24.936,"s":[218.188,379.25,0],"to":[0,-5.75,0],"ti":[0,0,0]},{"t":35,"s":[218.188,335.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[231.218,416.793,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.336],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.847,0.002]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.687,417.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.217,416.793],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":36,"st":15,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Dot 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[128,428.5,0],"to":[0,0,0],"ti":[0,4.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":17.459,"s":[128,396.5,0],"to":[0,-7.125,0],"ti":[0,5.625,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21.252,"s":[147.5,376.75,0],"to":[0,-3.625,0],"ti":[0,0,0]},{"t":30,"s":[147.5,335.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[128.24,429.053,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.335],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.847,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.709,429.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.239,429.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":10,"op":31,"st":10,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Dot 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":5,"s":[158.75,416.25,0],"to":[0,0,0],"ti":[0,7.25,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":11.373,"s":[158.75,395.5,0],"to":[0,-8.75,0],"ti":[0,5.75,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14.884,"s":[171.25,378.75,0],"to":[0,-5.75,0],"ti":[0,0,0]},{"t":25,"s":[171.25,334.75,0]}],"ix":2,"l":2},"a":{"a":0,"k":[158.407,416.793,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.272,2.336],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.846,0.002]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.876,417.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.407,416.793],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":26,"st":5,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Dot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[194.75,403.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":20,"s":[194.75,335.5,0]}],"ix":2,"l":2},"a":{"a":0,"k":[194.728,402.771,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.334],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.846,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.197,403.239],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.728,402.771],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":21,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Setting","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":150,"s":[360]}],"ix":10},"p":{"a":0,"k":[337.046,295.716,0],"ix":2,"l":2},"a":{"a":0,"k":[337.046,295.716,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.198,6.938],[0,-8.583],[20.993,0],[6.361,4.799],[-12.408,0],[0,20.993]],"o":[[4.799,6.363],[0,20.991],[-8.583,0],[6.938,9.198],[20.991,0],[0,-12.408]],"v":[[19.04,-34.185],[26.685,-11.324],[-11.324,26.685],[-34.185,19.04],[-3.824,34.185],[34.185,-3.824]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[340.87,299.539],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[76.017,76.017],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[337.048,295.717],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[76.017,76.017],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,2.565],[0,0],[2.565,0],[0,0],[4.514,6.814],[0,0],[1.814,1.815],[0,0],[1.815,-1.814],[0,0],[8.289,1.683],[0,0],[2.565,0],[0,0],[0,-2.565],[0,0],[6.814,-4.513],[0,0],[1.815,-1.814],[0,0],[-1.814,-1.815],[0,0],[1.683,-8.289],[0,0],[0,-2.565],[0,0],[-2.565,0],[0,0],[-4.514,-6.815],[0,0],[-1.814,-1.815],[0,0],[-1.815,1.814],[0,0],[-8.289,-1.683],[0,0],[-2.565,0],[0,0],[0,2.565],[0,0],[-6.815,4.514],[0,0],[-1.815,1.814],[0,0],[1.814,1.815],[0,0],[-1.683,8.289],[0,0]],"o":[[0,0],[0,-2.565],[0,0],[-1.683,-8.289],[0,0],[1.814,-1.814],[0,0],[-1.814,-1.814],[0,0],[-6.815,-4.514],[0,0],[0,-2.565],[0,0],[-2.565,0],[0,0],[-8.289,1.683],[0,0],[-1.814,-1.814],[0,0],[-1.814,1.814],[0,0],[-4.514,6.814],[0,0],[-2.565,0],[0,0],[0,2.565],[0,0],[1.683,8.289],[0,0],[-1.814,1.814],[0,0],[1.814,1.814],[0,0],[6.814,4.514],[0,0],[0,2.565],[0,0],[2.565,0],[0,0],[8.289,-1.683],[0,0],[1.814,1.814],[0,0],[1.814,-1.814],[0,0],[4.514,-6.815],[0,0],[2.565,0]],"v":[[79.502,8.341],[79.502,-8.341],[74.857,-12.986],[63.631,-12.986],[54.166,-35.8],[62.114,-43.748],[62.114,-50.318],[50.318,-62.114],[43.748,-62.114],[35.8,-54.166],[12.986,-63.631],[12.986,-74.857],[8.341,-79.502],[-8.341,-79.502],[-12.986,-74.857],[-12.986,-63.631],[-35.8,-54.166],[-43.748,-62.114],[-50.318,-62.114],[-62.114,-50.318],[-62.114,-43.748],[-54.166,-35.8],[-63.631,-12.986],[-74.857,-12.986],[-79.502,-8.341],[-79.502,8.341],[-74.857,12.986],[-63.631,12.986],[-54.166,35.8],[-62.114,43.748],[-62.114,50.318],[-50.318,62.114],[-43.748,62.114],[-35.8,54.166],[-12.986,63.631],[-12.986,74.857],[-8.341,79.502],[8.341,79.502],[12.986,74.857],[12.986,63.631],[35.8,54.166],[43.748,62.114],[50.318,62.114],[62.114,50.318],[62.114,43.748],[54.166,35.8],[63.631,12.986],[74.857,12.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.537254929543,0.227450981736,0.866666674614,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[337.046,295.716],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"API","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[194.812,209.092,0],"ix":2,"l":2},"a":{"a":0,"k":[194.812,209.092,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.952,0],[0,0],[0,0],[0,0],[0,-5.951]],"o":[[0,0],[0,0],[0,0],[5.952,0],[0,5.951]],"v":[[5.517,-11.275],[-16.311,-11.275],[-16.311,-32.862],[5.517,-32.862],[16.311,-22.07]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[9.261,0],[0,0],[0,-1.656],[0,0],[-1.656,0],[0,1.656],[0,0],[0,0],[0,9.259]],"o":[[0,0],[-1.656,0],[0,0],[0,1.656],[1.656,0],[0,0],[0,0],[9.261,0],[0,-9.259]],"v":[[5.517,-38.862],[-19.311,-38.862],[-22.311,-35.862],[-22.311,35.862],[-19.311,38.862],[-16.311,35.862],[-16.311,-5.275],[5.517,-5.275],[22.311,-22.068]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[208.544,204.442],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.658,0],[0,0],[0,0],[0,0],[0,1.656],[1.656,0],[0,0],[0,-1.656],[-1.656,0],[0,0],[0,0],[0,0],[0,-1.656],[-1.656,0],[0,0],[0,1.656]],"o":[[0,0],[0,0],[0,0],[1.656,0],[0,-1.656],[0,0],[-1.656,0],[0,1.656],[0,0],[0,0],[0,0],[-1.656,0],[0,1.656],[0,0],[1.656,0],[0,-1.656]],"v":[[8.275,32.862],[2.998,32.862],[2.998,-32.862],[8.275,-32.862],[11.275,-35.862],[8.275,-38.862],[-8.275,-38.862],[-11.275,-35.862],[-8.275,-32.862],[-3,-32.862],[-3,32.862],[-8.275,32.862],[-11.275,35.862],[-8.275,38.862],[8.275,38.862],[11.275,35.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[247.287,204.442],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-7.967,5.277],[0.003,-24.321],[7.971,5.277]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[1.357,0],[0.354,-1.31],[0,0],[-1.6,-0.43],[-0.43,1.599],[0,0],[0,0],[0,0],[-1.325,0],[-0.261,0.07],[0.43,1.6]],"o":[[-0.353,-1.31],[-1.357,0],[0,0],[-0.43,1.599],[1.604,0.432],[0,0],[0,0],[0,0],[0.36,1.339],[0.258,0],[1.601,-0.431],[0,0]],"v":[[2.899,-36.642],[0.001,-38.862],[-2.896,-36.642],[-22.208,35.082],[-20.09,38.758],[-16.413,36.642],[-9.584,11.275],[9.583,11.275],[16.411,36.642],[19.308,38.862],[20.09,38.758],[22.208,35.082]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.372,204.442],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,8.285],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-8.286,0.001]],"v":[[-28.216,13.21],[-28.216,-28.21],[28.216,28.202],[-13.213,28.21]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.819607853889,0.827450990677,0.831372559071,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[265.956,103.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.285,0],[0,0],[1.883,0.851],[-6.085,0],[0,0],[0,8.285],[0,0]],"o":[[0,0],[0,0],[0,8.285],[0,0],[-2.199,0],[2.354,5.206],[0,0],[8.285,0],[0,0],[0,0]],"v":[[98.693,-105.439],[91.193,-105.438],[91.193,82.939],[76.193,97.939],[-92.527,97.939],[-98.693,96.605],[-85.027,105.439],[83.693,105.439],[98.693,90.439],[98.693,-105.439]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.819607853889,0.827450990677,0.831372559071,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.479,237.298],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[8.285,0],[0,0],[-8.285,0],[0,0],[0,8.285],[0,0]],"o":[[0,0],[0,0],[0,8.285],[0,0],[0,8.285],[0,0],[8.285,0],[0,0],[0,0]],"v":[[99.36,-105.439],[84.36,-105.437],[84.36,75.439],[69.36,90.439],[-99.36,90.439],[-84.36,105.439],[84.36,105.439],[99.36,90.439],[99.36,-105.439]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960790157,0.905882358551,0.909803926945,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.812,237.298],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.656,0],[0,1.656],[0,0],[-1.656,0],[0,-1.656],[0,0]],"o":[[-1.656,0],[0,0],[0,-1.656],[1.656,0],[0,0],[0,1.658]],"v":[[0,-50.137],[-3,-53.137],[-3,-53.363],[0,-56.363],[3,-53.363],[3,-53.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.656,0],[0,1.656],[0,0],[-1.656,0],[0,-1.656],[0,0]],"o":[[-1.656,0],[0,0],[0,-1.656],[1.656,0],[0,0],[0,1.658]],"v":[[0,56.363],[-3,53.363],[-3,-41.137],[0,-44.137],[3,-41.137],[3,53.363]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.452,151.079],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":3,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-8.285],[0,0],[-8.285,0],[0,0],[0,8.285],[0,0]],"o":[[0,0],[-8.285,0],[0,0],[0,8.285],[0,0],[8.285,0],[0,0],[0,0]],"v":[[42.929,-133.645],[-84.36,-133.645],[-99.36,-118.645],[-99.36,118.645],[-84.36,133.645],[84.36,133.645],[99.36,118.645],[99.36,-77.234]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.945098042488,0.949019610882,0.949019610882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.812,209.092],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Dots","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":512,"h":512,"ip":82,"op":164,"st":82,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Dots","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2,"l":2},"a":{"a":0,"k":[256,256,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":512,"h":512,"ip":0,"op":82,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Dot 10 :M","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[194.812,415.912,0],"ix":2,"l":2},"a":{"a":0,"k":[194.812,415.912,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.272,2.335],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.336,1.271],[0,4.142],[-2.846,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.854,429.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[261.385,429.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[261.385,429.053],"ix":2},"a":{"a":0,"k":[261.385,429.053],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Dot 110","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.336],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.847,0.002]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.687,417.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[231.217,416.793],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[231.218,416.793],"ix":2},"a":{"a":0,"k":[231.218,416.793],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Dot 9","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.335],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.847,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.709,429.522],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[128.239,429.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[128.24,429.053],"ix":2},"a":{"a":0,"k":[128.24,429.053],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Dot 8","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.272,2.336],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.846,0.002]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.876,417.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.407,416.793],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[158.407,416.793],"ix":2},"a":{"a":0,"k":[158.407,416.793],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Dot 7","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.271,2.334],[-1.298,0],[0,4.142],[0.579,1.065],[0,-2.846],[4.142,0]],"o":[[1.064,0.579],[4.142,0],[0,-1.296],[2.335,1.271],[0,4.142],[-2.846,0]],"v":[[-7.031,3.094],[-3.469,4.031],[4.031,-3.469],[3.094,-7.031],[7.031,-0.469],[-0.469,7.031]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.662745118141,0.101960785687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.197,403.239],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.78823530674,0.113725490868,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.728,402.771],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[194.728,402.771],"ix":2},"a":{"a":0,"k":[194.728,402.771],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Dot 6","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Lines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[194.813,382.462,0],"ix":2,"l":2},"a":{"a":0,"k":[194.813,382.462,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.07,0],[-0.919,-0.402],[0,0],[0,0],[0,0]],"o":[[1.068,0],[0,0],[0,0],[0,0],[0.919,-0.403]],"v":[[0,25.949],[3,26.582],[3,-26.584],[-3,-26.584],[-3,26.584]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.728,369.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.463],[0,0],[-1.068,0],[-0.92,-0.402],[0,0],[2.791,1.965],[0,0],[0,1.463],[0,0],[0,0],[0,0],[-2.792,-1.965],[0,0]],"o":[[0,0],[0.92,-0.402],[1.068,0],[0,0],[0,-3.411],[0,0],[-1.195,-0.842],[0,0],[0,0],[0,0],[0,3.412],[0,0],[1.194,0.843]],"v":[[6.489,14.824],[6.489,39.725],[9.489,39.092],[12.489,39.725],[12.489,14.824],[8.033,6.236],[-4.579,-2.638],[-6.489,-6.317],[-6.489,-39.725],[-12.489,-39.725],[-12.489,-6.317],[-8.031,2.27],[4.579,11.143]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[251.896,382.461],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.377],[0,0],[-1.068,0],[-0.919,-0.402],[0,0],[2.513,2.004],[0,0],[0,1.377],[0,0],[0,0],[0,0],[-2.513,-2.004],[0,0]],"o":[[0,0],[0.919,-0.402],[1.068,0],[0,0],[0,-3.213],[0,0],[-1.077,-0.858],[0,0],[0,0],[0,0],[0,3.213],[0,0],[1.076,0.858]],"v":[[3.49,19.061],[3.49,33.594],[6.49,32.961],[9.49,33.594],[9.49,19.061],[5.537,10.853],[-1.796,5.003],[-3.49,1.485],[-3.49,-33.594],[-9.49,-33.594],[-9.49,1.485],[-5.537,9.693],[1.796,15.543]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.729,376.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.195,-0.842],[0,0],[0,-3.413],[0,0],[-1.068,0],[-0.919,-0.402],[0,0],[-1.195,0.842],[0,0],[0,3.413],[0,0],[0,0]],"o":[[0,0],[0,1.463],[0,0],[-2.792,1.965],[0,0],[0.919,-0.402],[1.068,0],[0,0],[0,-1.463],[0,0],[2.792,-1.965],[0,0],[0,0],[0,0]],"v":[[6.489,-39.725],[6.489,-6.316],[4.578,-2.637],[-8.029,6.237],[-12.489,14.825],[-12.489,39.726],[-9.489,39.093],[-6.489,39.726],[-6.489,14.823],[-4.578,11.144],[8.029,2.27],[12.489,-6.318],[12.489,-39.726],[6.489,-39.726]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.73,382.462],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.077,-0.859],[0,0],[0,-3.21],[0,0],[-1.068,0],[-0.919,-0.402],[0,0],[-1.076,0.859],[0,0],[0,3.213],[0,0]],"o":[[0,0],[0,1.377],[0,0],[-2.511,2.004],[0,0],[0.919,-0.402],[1.068,0],[0,0],[0,-1.376],[0,0],[2.513,-2.003],[0,0],[0,0]],"v":[[3.49,-33.594],[3.49,1.485],[1.796,5.003],[-5.539,10.854],[-9.49,19.061],[-9.49,33.594],[-6.49,32.961],[-3.49,33.594],[-3.49,19.061],[-1.796,15.543],[5.537,9.693],[9.49,1.485],[9.49,-33.594]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.423529416323,0.168627455831,0.75686275959,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[164.895,376.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/meal_mate/app/src/main/res/raw/loading_animation.json b/meal_mate/app/src/main/res/raw/loading_animation.json new file mode 100644 index 0000000..441d03d --- /dev/null +++ b/meal_mate/app/src/main/res/raw/loading_animation.json @@ -0,0 +1 @@ +{"v":"5.5.6","fr":29.9700012207031,"ip":0,"op":34.0000013848484,"w":500,"h":500,"nm":"Loader 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":9,"s":[183]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[180]},{"i":{"x":[0.7],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":17,"s":[180]},{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26,"s":[363]},{"t":32.0000013033867,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":34.0000013848484,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Fork","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[250.094,252.965,0],"ix":1},"s":{"a":0,"k":[100,-100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[250.149,280.901],[250.149,321.072]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[250.149,218.987],"ix":2},"a":{"a":0,"k":[250.149,300.987],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[8.743,0],[0,8.742],[0,0]],"o":[[0,0],[0,8.742],[-8.742,0],[0,0],[0,0]],"v":[[15.829,-20.936],[15.829,5.107],[-0.001,20.937],[-15.83,5.107],[-15.83,-20.936]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.184000000358,0.208000004292,0.259000003338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[250.149,301.838],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[250.149,301.838],"ix":2},"a":{"a":0,"k":[250.149,301.838],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.252,-33.146],[-0.252,33.146]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.184000000358,0.208000004292,0.259000003338,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,355.921],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,355.921],"ix":2},"a":{"a":0,"k":[249.693,355.921],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[250.094,252.965],"ix":2},"a":{"a":0,"k":[250.149,334.984],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2 :M","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":22.0000008960784,"op":22.0000008960784,"st":0,"bm":0,"hidden":5.00000020365417},{"ddd":0,"ind":3,"ty":4,"nm":"Spoon 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[250.039,170.945,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.252,-37.929],[-0.252,37.929]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,193.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,193.029],"ix":2},"a":{"a":0,"k":[249.693,193.029],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.099,-14.753],[11.538,0.077],[-0.098,14.753],[-11.539,-0.077]],"o":[[-0.098,14.752],[-11.538,-0.077],[0.098,-14.753],[11.538,0.077]],"v":[[20.892,3.515],[-0.156,26.712],[-20.893,3.237],[0.201,-26.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[250.039,137.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[250.039,137.645],"ix":2},"a":{"a":0,"k":[250.039,137.645],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":22.0000008960784,"op":34.0000013848484,"st":22.0000008960784,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Spoon","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[250.039,170.945,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.252,-37.929],[-0.252,37.929]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,193.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[249.693,193.029],"ix":2},"a":{"a":0,"k":[249.693,193.029],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.099,-14.753],[11.538,0.077],[-0.098,14.753],[-11.539,-0.077]],"o":[[-0.098,14.752],[-11.538,-0.077],[0.098,-14.753],[11.538,0.077]],"v":[[20.892,3.515],[-0.156,26.712],[-20.893,3.237],[0.201,-26.712]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[250.039,137.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[250.039,137.645],"ix":2},"a":{"a":0,"k":[250.039,137.645],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":5.00000020365417,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Group 9","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.321,57.242,0],"ix":2},"a":{"a":0,"k":[291.321,184.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[18.905,-18.906]],"o":[[18.905,18.906],[0,0]],"v":[[-9.452,-34.232],[-9.452,34.232]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[293.684,184.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":24.334,"s":[0]},{"t":31.0000012626559,"s":[80]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":19,"s":[0]},{"t":24.333750991134,"s":[80]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"t":31.0000012626559,"s":[67.556]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":19.0000007738859,"op":32.0000013033867,"st":19.0000007738859,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Group 8","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8.679,57.242,0],"ix":2},"a":{"a":0,"k":[208.679,184.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18.905,18.906]],"o":[[-18.905,-18.906],[0,0]],"v":[[9.452,34.231],[9.452,-34.231]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[206.316,184.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":24.334,"s":[0]},{"t":31.0000012626559,"s":[80]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":19,"s":[0]},{"t":24.333750991134,"s":[80]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"t":31.0000012626559,"s":[67.556]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":19.0000007738859,"op":32.0000013033867,"st":19.0000007738859,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Group 6","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.321,57.242,0],"ix":2},"a":{"a":0,"k":[291.321,184.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[18.905,-18.906]],"o":[[18.905,18.906],[0,0]],"v":[[-9.452,-34.232],[-9.452,34.232]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[293.684,184.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":7.334,"s":[0]},{"t":14.0000005702317,"s":[80]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":2,"s":[0]},{"t":7.33375029870976,"s":[80]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":14.0000005702317,"s":[67.556]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":2.00000008146167,"op":15.0000006109625,"st":2.00000008146167,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Group 7","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8.679,57.242,0],"ix":2},"a":{"a":0,"k":[208.679,184.242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-18.905,18.906]],"o":[[-18.905,-18.906],[0,0]],"v":[[9.452,34.231],[9.452,-34.231]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9647058823529412,0.5764705882352941,0.11764705882352941,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10.909,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[206.316,184.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.5],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":7.334,"s":[0]},{"t":14.0000005702317,"s":[80]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":2,"s":[0]},{"t":7.33375029870976,"s":[80]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":2,"s":[0]},{"t":14.0000005702317,"s":[67.556]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":2.00000008146167,"op":15.0000006109625,"st":2.00000008146167,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/meal_mate/gradle/libs.versions.toml b/meal_mate/gradle/libs.versions.toml index f4113c5..9b18058 100644 --- a/meal_mate/gradle/libs.versions.toml +++ b/meal_mate/gradle/libs.versions.toml @@ -24,6 +24,8 @@ navigationCompose = "2.7.7" material3Android = "1.2.1" okhttp = "5.0.0-alpha.3" retrofit = "2.11.0" +roomRuntime = "2.6.1" +runtimeLivedata = "1.6.8" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -34,6 +36,10 @@ androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-com androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleRuntimeKtx" } androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended", version.ref = "materialIconsExtended" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomRuntime" } +androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "roomRuntime" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomRuntime" } +androidx-runtime-livedata = { module = "androidx.compose.runtime:runtime-livedata", version.ref = "runtimeLivedata" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coilCompose" } converter-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "converterMoshi" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" }