diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..36e51f1 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Genie \ No newline at end of file diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/appInsightsSettings.xml b/.idea/appInsightsSettings.xml new file mode 100644 index 0000000..5e5ed7b --- /dev/null +++ b/.idea/appInsightsSettings.xml @@ -0,0 +1,26 @@ + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..2652c7c --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,18 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/deviceManager.xml b/.idea/deviceManager.xml new file mode 100644 index 0000000..91f9558 --- /dev/null +++ b/.idea/deviceManager.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..41a36bb --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,12 @@ + + + + aksi + komunikasi + reaksi + tentang + tiet + tipe + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..02c4aa5 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b2c751a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..9839d05 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,151 @@ +import com.android.build.api.artifact.SingleArtifact +import com.android.build.api.variant.BuiltArtifactsLoader +import java.nio.file.Files +import java.nio.file.StandardCopyOption +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import javax.xml.parsers.DocumentBuilderFactory + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.google.gms.google.services) +} + +fun readStringResource(projectDir: File, resName: String): String { + val xml = File(projectDir, "src/main/res/values/strings.xml") + if (!xml.exists()) return "app" + + val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xml) + val nodes = doc.getElementsByTagName("string") + for (i in 0 until nodes.length) { + val n = nodes.item(i) + val nameAttr = n.attributes?.getNamedItem("name")?.nodeValue + if (nameAttr == resName) { + return n.textContent.trim() + } + } + return "app" +} + +android { + namespace = "com.amz.genie" + compileSdk = 36 + + defaultConfig { + applicationId = "com.amz.genie" + minSdk = 26 + targetSdk = 36 + versionCode = 57 + versionName = "0.5.7" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +/** + * Task: copy APK artifact -> output folder, rename with timestamp + */ +abstract class CopyRenameApkTask : DefaultTask() { + + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val inputApkFolder: DirectoryProperty + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @get:Internal + abstract val builtArtifactsLoader: Property + + @get:Input + abstract val appName: Property + + @TaskAction + fun run() { + val outDirFile = outputDir.get().asFile + outDirFile.deleteRecursively() + outDirFile.mkdirs() + + val builtArtifacts = builtArtifactsLoader.get().load(inputApkFolder.get()) + ?: error("Cannot load APK artifacts from ${inputApkFolder.get().asFile}") + + val ts = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss")) + val prefix = appName.get() + + builtArtifacts.elements.forEach { artifact -> + val src = File(artifact.outputFile) + + // Kalau ada splits, bisa lebih dari 1 apk. Kita bedakan pakai versionCode/variantName optional. + val name = buildString { + append(prefix).append("-").append(ts) + artifact.versionCode?.let { append("-").append(it) } + append(".apk") + } + + val dst = File(outDirFile, name) + Files.copy(src.toPath(), dst.toPath(), StandardCopyOption.REPLACE_EXISTING) + } + } +} + +androidComponents { + onVariants(selector().withBuildType("debug")) { variant -> + val t = tasks.register("copyRename${variant.name.replaceFirstChar { it.uppercase() }}Apk", CopyRenameApkTask::class.java) { + val label = readStringResource(project.projectDir, "app_name") + appName.set(label) + outputDir.set(layout.buildDirectory.dir(variant.name)) + builtArtifactsLoader.set(variant.artifacts.getBuiltArtifactsLoader()) + } + + // Listen ke artifact APK: task otomatis jalan saat APK dibuat (assembleDebug, dll) + variant.artifacts + .use(t) + .wiredWith { it.inputApkFolder } + .toListenTo(SingleArtifact.APK) + } +} + +dependencies { + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.activity) + implementation(libs.androidx.constraintlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + + implementation(libs.lottie) + implementation(libs.sdp.android) + implementation(libs.retrofit) + implementation(libs.converter.gson) + implementation(libs.okhttp) + implementation(libs.logging.interceptor) + implementation(libs.glide) + implementation(libs.androidx.swiperefreshlayout) + + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.analytics) + implementation(libs.firebase.messaging) + implementation(libs.firebase.auth) + + implementation(libs.androidx.emoji2) + implementation(libs.androidx.emoji2.views.helper) + implementation(libs.androidx.emoji2.emojipicker) + +} \ No newline at end of file diff --git a/app/debug/app-debug.apk b/app/debug/app-debug.apk new file mode 100644 index 0000000..534b191 Binary files /dev/null and b/app/debug/app-debug.apk differ diff --git a/app/debug/output-metadata.json b/app/debug/output-metadata.json new file mode 100644 index 0000000..9f89c79 --- /dev/null +++ b/app/debug/output-metadata.json @@ -0,0 +1,21 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.amz.genie", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 57, + "versionName": "0.5.7", + "outputFile": "app-debug.apk" + } + ], + "elementType": "File", + "minSdkVersionForDexing": 26 +} \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..5007df6 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "791153239007", + "project_id": "genie-11548", + "storage_bucket": "genie-11548.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:791153239007:android:a35521285c9d4102f05a6a", + "android_client_info": { + "package_name": "com.amz.genie" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyBN5-kXCfqw_7o5O1dzA-oWiA2SH4wqQAY" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/amz/genie/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/amz/genie/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..3a9af05 --- /dev/null +++ b/app/src/androidTest/java/com/amz/genie/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.amz.genie + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.amz.genie", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0607cba --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/lottie/loader_circle.json b/app/src/main/assets/lottie/loader_circle.json new file mode 100644 index 0000000..40911a0 --- /dev/null +++ b/app/src/main/assets/lottie/loader_circle.json @@ -0,0 +1 @@ +{"v":"5.7.1","fr":30,"ip":0,"op":90,"w":500,"h":500,"nm":"Loading3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[100]},{"t":60,"s":[0]}],"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":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[53.5,43.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[84,84],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.137254901961,0.666666666667,0.462745098039,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[53.5,43.5],"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":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":30,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":0,"s":[0]},{"t":60,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":61,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[100]},{"t":72,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":72,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[53.5,43.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[217,217],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.137254901961,0.666666666667,0.462745098039,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[53.5,43.5],"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":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[0]},{"t":42,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":12,"s":[0]},{"t":72,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":12,"op":73,"st":12,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":84,"s":[100]},{"t":89,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"t":89,"s":[360]}],"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[53.5,43.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[351,351],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.137254901961,0.666666666667,0.462745098039,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":48,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[53.5,43.5],"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":"Ellipse 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":29,"s":[0]},{"t":59,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":29,"s":[0]},{"t":89,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":29,"op":90,"st":29,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/lottie/loader_send.json b/app/src/main/assets/lottie/loader_send.json new file mode 100644 index 0000000..4b7973b --- /dev/null +++ b/app/src/main/assets/lottie/loader_send.json @@ -0,0 +1 @@ +{"v":"5.8.1","fr":30,"ip":0,"op":129,"w":300,"h":300,"nm":"final","ddd":0,"assets":[{"id":"comp_0","nm":"dash_main","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"dash3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[270.647,163.706,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,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":[[0,0],[-17.172,9.249]],"o":[[17.172,-9.249],[0,0]],"v":[[-25.758,13.873],[25.758,-13.873]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.906,"ix":5},"lc":2,"lj":2,"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":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"t":10,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[100]},{"t":20,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":210,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"dash1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[345.471,187.706,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,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":[[0,0],[-16.701,10.074]],"o":[[16.701,-10.074],[0,0]],"v":[[-25.052,15.11],[25.052,-15.11]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.906,"ix":5},"lc":2,"lj":2,"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":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":5,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"t":15,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":210,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"dash2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[190.529,237.824,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,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":[[0,0],[-16.701,10.074]],"o":[[16.701,-10.074],[0,0]],"v":[[-25.052,15.11],[25.052,-15.11]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.906,"ix":5},"lc":2,"lj":2,"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":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[100]},{"t":10,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[100]},{"t":20,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":210,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"dash","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[202.882,307.353,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,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":[[0,0],[-16.701,10.074]],"o":[[16.701,-10.074],[0,0]],"v":[[-25.052,15.11],[25.052,-15.11]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3.906,"ix":5},"lc":2,"lj":2,"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":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[100]},{"t":20,"s":[0]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[100]},{"t":30,"s":[0]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":210,"st":0,"bm":0}]},{"id":"comp_1","nm":"plane","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"OBJECTS 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[251.359,239.046,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[-0.066,-0.043],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[-0.066,0.144],[0,0],[0.385,-0.362],[0,0],[0,0],[-0.17,-0.09]],"v":[[-23.167,18.685],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-28.752,28.982]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-27.102,14.174],[37.386,-41.355],[36.857,-42.056],[-37.53,14.936],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-13.977,30.361],[41.636,-36.012],[41.607,-36.056],[-14.03,30.311],[-22.689,42.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-27.102,14.174],[37.386,-41.355],[36.857,-42.056],[-37.53,14.936],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-27.102,14.174],[37.386,-41.355],[36.857,-42.056],[-37.53,14.936],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-13.977,30.361],[41.636,-36.012],[41.607,-36.056],[-14.03,30.311],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-27.102,14.174],[37.386,-41.355],[36.857,-42.056],[-37.53,14.936],[-25.439,39.419]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]},{"t":122,"s":[{"i":[[-1.37,-0.258],[0,0],[0,0],[0.454,-0.271],[0,0],[0,0]],"o":[[1.112,0.209],[0,0],[0.385,-0.362],[0,0],[0,0],[0.486,1.487]],"v":[[-22.355,42.123],[-19.602,12.174],[37.386,-41.355],[36.857,-42.056],[-37.53,2.436],[-25.439,39.419]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8416,0.9184,0.9094,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":210,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"OBJECTS 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[319.44,164.16,0],"ix":2,"l":2},"a":{"a":0,"k":[73,-66,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[3.076,-1.216],[28.9,-11.856],[-3.929,-1.252],[0,0],[0,0],[-1.37,-0.258],[0,0],[-16.454,-12.15],[-0.306,1.575],[-4.19,21.594]],"o":[[-23.656,9.357],[-3.816,1.565],[0,0],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[2.763,2.04],[4.902,-25.261],[0.63,-3.247]],"v":[[62.963,-59.982],[-65.951,-7.48],[-65.608,0.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[36.458,58.934],[47.261,54.73],[68.607,-55.288]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[3.076,-1.216],[23.76,-19.93],[-12.082,5.029],[0,0],[0,0],[0.246,0.082],[0,0],[0.827,-20.437],[-2.876,6.623],[-10.047,23.316]],"o":[[-23.656,9.357],[-9.047,7.589],[8.195,-3.411],[0,0],[0.486,1.487],[0.496,-0.168],[0,0],[-0.648,16.031],[10.049,-23.14],[1.309,-3.038]],"v":[[64.963,-58.794],[-67.201,11.77],[-41.483,10.811],[-32.611,11.322],[-23.52,38.555],[-19.436,29.509],[-14.684,21.06],[12.458,44.059],[23.511,53.48],[67.482,-55.851]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[66.213,-57.544],[-45.201,25.77],[-35.358,23.561],[-26.486,21.572],[-20.52,48.305],[-17.436,51.008],[-22.184,23.06],[-18.042,34.559],[-11.989,55.48],[67.232,-56.226]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[0.472,-0.459],[1.76,-1.867],[5.851,-6.204],[0,0],[0,0],[-1.37,-0.258],[0,0],[2.164,-3.094],[-1.076,0.11],[-0.704,0.909]],"o":[[-20.684,28.353],[-8.306,8.809],[-3.27,3.466],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[-1.097,1.568],[11.924,-14.265],[0.515,-0.622]],"v":[[67.619,-56.013],[-3.138,35.457],[-11.733,45.561],[-15.861,49.072],[-17.145,50.117],[-17.436,51.008],[-13.809,47.372],[-10.479,43.747],[-16.489,50.48],[67.857,-56.257]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[66.213,-57.544],[-60.701,11.27],[-34.983,24.811],[-26.486,21.572],[-20.52,48.305],[-17.436,51.008],[-22.184,23.06],[-15.792,33.559],[9.011,49.98],[67.232,-56.226]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[{"i":[[3.076,-1.216],[23.76,-19.93],[-12.082,5.029],[0,0],[0,0],[-1.37,-0.258],[0,0],[0.827,-20.437],[-2.876,6.623],[-10.047,23.316]],"o":[[-23.656,9.357],[-9.047,7.589],[8.195,-3.411],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[-0.648,16.031],[10.049,-23.14],[1.309,-3.038]],"v":[[64.963,-58.794],[-63.201,18.27],[-41.483,10.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[12.458,44.059],[17.011,54.48],[67.482,-55.851]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[3.076,-1.216],[28.9,-11.856],[-3.929,-1.252],[0,0],[0,0],[-1.37,-0.258],[0,0],[-16.454,-12.15],[-0.306,1.575],[-4.19,21.594]],"o":[[-23.656,9.357],[-3.816,1.565],[0,0],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[2.763,2.04],[4.902,-25.261],[0.63,-3.247]],"v":[[62.963,-59.982],[-65.951,-7.48],[-65.608,0.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[36.458,58.934],[47.261,54.73],[68.607,-55.288]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[3.076,-1.216],[28.9,-11.856],[-3.929,-1.252],[0,0],[0,0],[-1.37,-0.258],[0,0],[-16.454,-12.15],[-0.306,1.575],[-4.19,21.594]],"o":[[-23.656,9.357],[-3.816,1.565],[0,0],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[2.763,2.04],[4.902,-25.261],[0.63,-3.247]],"v":[[62.963,-59.982],[-65.951,-7.48],[-65.608,0.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[36.458,58.934],[47.261,54.73],[68.607,-55.288]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92,"s":[{"i":[[3.076,-1.216],[23.76,-19.93],[-12.082,5.029],[0,0],[0,0],[-1.37,-0.258],[0,0],[0.827,-20.437],[-2.876,6.623],[-10.047,23.316]],"o":[[-23.656,9.357],[-9.047,7.589],[8.195,-3.411],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[-0.648,16.031],[10.049,-23.14],[1.309,-3.038]],"v":[[64.963,-58.794],[-67.201,11.77],[-41.483,10.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[12.458,44.059],[23.511,53.48],[67.482,-55.851]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[66.213,-57.544],[-45.201,25.77],[-35.358,23.561],[-26.486,21.572],[-20.52,48.305],[-17.436,51.008],[-22.184,23.06],[-18.042,34.559],[-11.989,55.48],[67.232,-56.226]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[0.472,-0.459],[1.76,-1.867],[5.851,-6.204],[0,0],[0,0],[-1.37,-0.258],[0,0],[2.164,-3.094],[-1.076,0.11],[-0.704,0.909]],"o":[[-20.684,28.353],[-8.306,8.809],[-3.27,3.466],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[-1.097,1.568],[11.924,-14.265],[0.515,-0.622]],"v":[[67.619,-56.013],[-3.138,35.457],[-11.733,45.561],[-15.861,49.072],[-17.145,50.117],[-17.436,51.008],[-13.809,47.372],[-10.479,43.747],[-16.489,50.48],[67.857,-56.257]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[66.213,-57.544],[-60.701,11.27],[-34.983,24.811],[-26.486,21.572],[-20.52,48.305],[-17.436,51.008],[-22.184,23.06],[-15.792,33.559],[9.011,49.98],[67.232,-56.226]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[3.076,-1.216],[23.76,-19.93],[-12.082,5.029],[0,0],[0,0],[-1.37,-0.258],[0,0],[0.827,-20.437],[-2.876,6.623],[-10.047,23.316]],"o":[[-23.656,9.357],[-9.047,7.589],[8.195,-3.411],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[-0.648,16.031],[10.049,-23.14],[1.309,-3.038]],"v":[[64.963,-58.794],[-63.201,18.27],[-41.483,10.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[12.458,44.059],[17.011,54.48],[67.482,-55.851]],"c":true}]},{"t":122,"s":[{"i":[[3.076,-1.216],[28.9,-11.856],[-3.929,-1.252],[0,0],[0,0],[-1.37,-0.258],[0,0],[-16.454,-12.15],[-0.306,1.575],[-4.19,21.594]],"o":[[-23.656,9.357],[-3.816,1.565],[0,0],[0,0],[0.486,1.487],[1.112,0.209],[0,0],[2.763,2.04],[4.902,-25.261],[0.63,-3.247]],"v":[[62.963,-59.982],[-65.951,-7.48],[-65.608,0.811],[-32.611,11.322],[-20.52,48.305],[-17.436,51.009],[-14.684,21.06],[36.458,58.934],[47.261,54.73],[68.607,-55.288]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","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}],"ip":0,"op":210,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"OBJECTS","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[241.129,258.78,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[0,0],[0,0],[-0.205,-0.145],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-19.171,8.052],[-19.924,-13.886],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-29.3,-6.298],[-15.171,19.802],[-8.924,21.614],[13.3,-17.789],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":18,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-8.3,14.577],[-13.046,20.427],[-10.299,20.864],[6.425,-0.789],[6.682,-0.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":24,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-29.3,-6.298],[-15.171,19.802],[-8.924,21.614],[13.3,-17.789],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":30,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":36,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":92,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-29.3,-6.298],[-15.171,19.802],[-8.924,21.614],[13.3,-17.789],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":104,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-8.3,14.577],[-13.046,20.427],[-10.299,20.864],[6.425,-0.789],[6.682,-0.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-29.3,-6.298],[-15.171,19.802],[-8.924,21.614],[13.3,-17.789],[-11.193,-22.485]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":116,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]},{"t":122,"s":[{"i":[[0,0],[0,0],[-2.139,1.766],[0,0],[0,-0.819]],"o":[[0,0],[0.862,2.637],[0,0],[0,0],[0,0.819]],"v":[[-27.3,-17.298],[-15.171,19.802],[-8.924,21.614],[27.3,-8.289],[-11.193,-22.485]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.0196,0.298,0.2667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.703,0.857,0.839,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":210,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"dash_main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":129,"op":129.30303030303,"st":129,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"dash_main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":86,"op":129,"st":86,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"dash_main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":43,"op":86,"st":43,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"dash_main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[150,150,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":43,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"plane","refId":"comp_1","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":[215,67,0],"to":[1.625,-0.229,0],"ti":[0.01,1.724,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":4,"s":[230,63,0],"to":[-0.018,-3.038,0],"ti":[3.188,-2.417,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":9,"s":[205,60,0],"to":[-2.062,1.563,0],"ti":[-4.167,-0.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[215,67,0],"to":[4.167,0.5,0],"ti":[1.667,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":32,"s":[230,63,0],"to":[-1.667,-1.167,0],"ti":[2.5,-0.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":37,"s":[205,60,0],"to":[-2.5,0.667,0],"ti":[-1.667,-1.167,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":43,"s":[215,67,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[215,67,0],"to":[2.5,-0.667,0],"ti":[1.667,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":53,"s":[230,63,0],"to":[-1.667,-1.167,0],"ti":[2.5,-0.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":58,"s":[205,60,0],"to":[-2.5,0.667,0],"ti":[-4.167,-0.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[215,67,0],"to":[4.167,0.5,0],"ti":[1.667,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":81,"s":[230,63,0],"to":[-1.667,-1.167,0],"ti":[2.5,-0.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":86,"s":[205,60,0],"to":[-2.5,0.667,0],"ti":[-1.667,-1.167,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":92,"s":[215,67,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":98,"s":[215,67,0],"to":[2.5,-0.667,0],"ti":[1.667,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":102,"s":[230,63,0],"to":[-1.667,-1.167,0],"ti":[2.5,-0.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[205,60,0],"to":[-2.5,0.667,0],"ti":[-4.167,-0.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":119,"s":[215,67,0],"to":[4.167,0.5,0],"ti":[1.667,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":130,"s":[230,63,0],"to":[-1.667,-1.167,0],"ti":[2.5,-0.667,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":135,"s":[205,60,0],"to":[-2.5,0.667,0],"ti":[-1.667,-1.167,0]},{"t":141,"s":[215,67,0]}],"ix":2,"l":2},"a":{"a":0,"k":[315,167,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":129,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/lottie/loading.json b/app/src/main/assets/lottie/loading.json new file mode 100644 index 0000000..d019fe0 --- /dev/null +++ b/app/src/main/assets/lottie/loading.json @@ -0,0 +1 @@ +{"v":"5.5.8","fr":60,"ip":20,"op":90,"w":250,"h":200,"nm":"loading","ddd":0,"assets":[],"fonts":{"list":[{"fName":"SegoeUIHistoric","fFamily":"Segoe UI Historic","fStyle":"Regular","ascent":78.0723145231605}]},"layers":[{"ddd":0,"ind":1,"ty":5,"nm":"g","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":1,"y":0},"o":{"x":0.009,"y":1},"t":19,"s":[218.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.083},"t":20,"s":[218.063,107.352,0],"to":[-2.108,0,0],"ti":[4.065,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":21,"s":[205.413,107.352,0],"to":[-4.065,0,0],"ti":[3.768,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":22,"s":[193.671,107.352,0],"to":[-3.768,0,0],"ti":[3.48,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":23,"s":[182.808,107.352,0],"to":[-3.48,0,0],"ti":[3.203,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":24,"s":[172.79,107.352,0],"to":[-3.203,0,0],"ti":[2.937,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":25,"s":[163.587,107.352,0],"to":[-2.937,0,0],"ti":[2.681,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":26,"s":[155.167,107.352,0],"to":[-2.681,0,0],"ti":[2.436,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":27,"s":[147.5,107.352,0],"to":[-2.436,0,0],"ti":[2.201,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":28,"s":[140.554,107.352,0],"to":[-2.201,0,0],"ti":[1.976,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":29,"s":[134.297,107.352,0],"to":[-1.976,0,0],"ti":[1.762,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":30,"s":[128.699,107.352,0],"to":[-1.762,0,0],"ti":[1.558,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":31,"s":[123.727,107.352,0],"to":[-1.558,0,0],"ti":[1.365,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":32,"s":[119.351,107.352,0],"to":[-1.365,0,0],"ti":[1.182,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":33,"s":[115.539,107.352,0],"to":[-1.182,0,0],"ti":[1.009,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.182},"t":34,"s":[112.261,107.352,0],"to":[-1.009,0,0],"ti":[0.847,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.184},"t":35,"s":[109.484,107.352,0],"to":[-0.847,0,0],"ti":[0.696,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.186},"t":36,"s":[107.177,107.352,0],"to":[-0.696,0,0],"ti":[0.555,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":37,"s":[105.31,107.352,0],"to":[-0.555,0,0],"ti":[0.424,0,0]},{"i":{"x":0.833,"y":0.86},"o":{"x":0.167,"y":0.196},"t":38,"s":[103.85,107.352,0],"to":[-0.424,0,0],"ti":[0.304,0,0]},{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.206},"t":39,"s":[102.767,107.352,0],"to":[-0.304,0,0],"ti":[0.194,0,0]},{"i":{"x":0.833,"y":0.889},"o":{"x":0.167,"y":0.228},"t":40,"s":[102.029,107.352,0],"to":[-0.194,0,0],"ti":[0.094,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.333},"t":41,"s":[101.605,107.352,0],"to":[-0.094,0,0],"ti":[0.005,0,0]},{"i":{"x":0.833,"y":0.668},"o":{"x":0.167,"y":0.191},"t":42,"s":[101.463,107.352,0],"to":[-0.005,0,0],"ti":[-0.073,0,0]},{"i":{"x":0.833,"y":0.786},"o":{"x":0.167,"y":0.111},"t":43,"s":[101.572,107.352,0],"to":[0.073,0,0],"ti":[-0.141,0,0]},{"i":{"x":0.833,"y":0.808},"o":{"x":0.167,"y":0.136},"t":44,"s":[101.901,107.352,0],"to":[0.141,0,0],"ti":[-0.199,0,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.147},"t":45,"s":[102.419,107.352,0],"to":[0.199,0,0],"ti":[-0.246,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.154},"t":46,"s":[103.094,107.352,0],"to":[0.246,0,0],"ti":[-0.283,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.158},"t":47,"s":[103.895,107.352,0],"to":[0.283,0,0],"ti":[-0.309,0,0]},{"i":{"x":0.833,"y":0.831},"o":{"x":0.167,"y":0.161},"t":48,"s":[104.791,107.352,0],"to":[0.309,0,0],"ti":[-0.325,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.164},"t":49,"s":[105.75,107.352,0],"to":[0.325,0,0],"ti":[-0.33,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.167},"t":50,"s":[106.741,107.352,0],"to":[0.33,0,0],"ti":[-0.325,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.169},"t":51,"s":[107.733,107.352,0],"to":[0.325,0,0],"ti":[-0.31,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.172},"t":52,"s":[108.694,107.352,0],"to":[0.31,0,0],"ti":[-0.284,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":53,"s":[109.593,107.352,0],"to":[0.284,0,0],"ti":[-0.248,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.182},"t":54,"s":[110.398,107.352,0],"to":[0.248,0,0],"ti":[-0.201,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":55,"s":[111.08,107.352,0],"to":[0.201,0,0],"ti":[-0.144,0,0]},{"i":{"x":0.833,"y":0.389},"o":{"x":0.167,"y":0.213},"t":56,"s":[111.605,107.352,0],"to":[0.144,0,0],"ti":[-0.076,0,0]},{"i":{"x":0.833,"y":0.336},"o":{"x":0.167,"y":0.096},"t":57,"s":[111.943,107.352,0],"to":[0.076,0,0],"ti":[-2.507,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":58,"s":[112.063,107.352,0],"to":[2.507,0,0],"ti":[-4.761,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":59,"s":[126.983,107.352,0],"to":[4.761,0,0],"ti":[-4.345,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":60,"s":[140.63,107.352,0],"to":[4.345,0,0],"ti":[-3.947,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":61,"s":[153.055,107.352,0],"to":[3.947,0,0],"ti":[-3.567,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":62,"s":[164.313,107.352,0],"to":[3.567,0,0],"ti":[-3.203,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":63,"s":[174.455,107.352,0],"to":[3.203,0,0],"ti":[-2.858,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":64,"s":[183.533,107.352,0],"to":[2.858,0,0],"ti":[-2.529,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":65,"s":[191.6,107.352,0],"to":[2.529,0,0],"ti":[-2.218,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":66,"s":[198.708,107.352,0],"to":[2.218,0,0],"ti":[-1.925,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":67,"s":[204.911,107.352,0],"to":[1.925,0,0],"ti":[-1.649,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":68,"s":[210.259,107.352,0],"to":[1.649,0,0],"ti":[-1.391,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.183},"t":69,"s":[214.807,107.352,0],"to":[1.391,0,0],"ti":[-1.15,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.185},"t":70,"s":[218.605,107.352,0],"to":[1.15,0,0],"ti":[-0.927,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":71,"s":[221.707,107.352,0],"to":[0.927,0,0],"ti":[-0.721,0,0]},{"i":{"x":0.833,"y":0.857},"o":{"x":0.167,"y":0.193},"t":72,"s":[224.165,107.352,0],"to":[0.721,0,0],"ti":[-0.532,0,0]},{"i":{"x":0.833,"y":0.864},"o":{"x":0.167,"y":0.201},"t":73,"s":[226.032,107.352,0],"to":[0.532,0,0],"ti":[-0.361,0,0]},{"i":{"x":0.833,"y":0.876},"o":{"x":0.167,"y":0.215},"t":74,"s":[227.359,107.352,0],"to":[0.361,0,0],"ti":[-0.208,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.256},"t":75,"s":[228.2,107.352,0],"to":[0.208,0,0],"ti":[-0.072,0,0]},{"i":{"x":0.833,"y":0.635},"o":{"x":0.167,"y":0.459},"t":76,"s":[228.606,107.352,0],"to":[0.072,0,0],"ti":[0.047,0,0]},{"i":{"x":0.833,"y":0.758},"o":{"x":0.167,"y":0.108},"t":77,"s":[228.631,107.352,0],"to":[-0.047,0,0],"ti":[0.148,0,0]},{"i":{"x":0.833,"y":0.801},"o":{"x":0.167,"y":0.127},"t":78,"s":[228.326,107.352,0],"to":[-0.148,0,0],"ti":[0.231,0,0]},{"i":{"x":0.833,"y":0.816},"o":{"x":0.167,"y":0.143},"t":79,"s":[227.744,107.352,0],"to":[-0.231,0,0],"ti":[0.297,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.152},"t":80,"s":[226.938,107.352,0],"to":[-0.297,0,0],"ti":[0.346,0,0]},{"i":{"x":0.833,"y":0.828},"o":{"x":0.167,"y":0.158},"t":81,"s":[225.959,107.352,0],"to":[-0.346,0,0],"ti":[0.377,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":82,"s":[224.861,107.352,0],"to":[-0.377,0,0],"ti":[0.391,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.166},"t":83,"s":[223.696,107.352,0],"to":[-0.391,0,0],"ti":[0.387,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.169},"t":84,"s":[222.516,107.352,0],"to":[-0.387,0,0],"ti":[0.366,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.174},"t":85,"s":[221.374,107.352,0],"to":[-0.366,0,0],"ti":[0.327,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.18},"t":86,"s":[220.322,107.352,0],"to":[-0.327,0,0],"ti":[0.271,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.189},"t":87,"s":[219.412,107.352,0],"to":[-0.271,0,0],"ti":[0.197,0,0]},{"i":{"x":0.833,"y":0.599},"o":{"x":0.167,"y":0.211},"t":88,"s":[218.698,107.352,0],"to":[-0.197,0,0],"ti":[0.106,0,0]},{"i":{"x":0.833,"y":0.324},"o":{"x":0.167,"y":0.105},"t":89,"s":[218.23,107.352,0],"to":[-0.106,0,0],"ti":[2.136,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.095},"t":90,"s":[218.063,107.352,0],"to":[-2.136,0,0],"ti":[4.065,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":91,"s":[205.413,107.352,0],"to":[-4.065,0,0],"ti":[3.768,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":92,"s":[193.671,107.352,0],"to":[-3.768,0,0],"ti":[3.48,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":93,"s":[182.808,107.352,0],"to":[-3.48,0,0],"ti":[3.203,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":94,"s":[172.79,107.352,0],"to":[-3.203,0,0],"ti":[2.937,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":95,"s":[163.587,107.352,0],"to":[-2.937,0,0],"ti":[2.681,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":96,"s":[155.167,107.352,0],"to":[-2.681,0,0],"ti":[2.436,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":97,"s":[147.5,107.352,0],"to":[-2.436,0,0],"ti":[2.201,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":98,"s":[140.554,107.352,0],"to":[-2.201,0,0],"ti":[1.976,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":99,"s":[134.297,107.352,0],"to":[-1.976,0,0],"ti":[1.762,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":100,"s":[128.699,107.352,0],"to":[-1.762,0,0],"ti":[1.558,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":101,"s":[123.727,107.352,0],"to":[-1.558,0,0],"ti":[1.365,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":102,"s":[119.351,107.352,0],"to":[-1.365,0,0],"ti":[1.182,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":103,"s":[115.539,107.352,0],"to":[-1.182,0,0],"ti":[1.009,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.182},"t":104,"s":[112.261,107.352,0],"to":[-1.009,0,0],"ti":[0.847,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.184},"t":105,"s":[109.484,107.352,0],"to":[-0.847,0,0],"ti":[0.696,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.186},"t":106,"s":[107.177,107.352,0],"to":[-0.696,0,0],"ti":[0.555,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":107,"s":[105.31,107.352,0],"to":[-0.555,0,0],"ti":[0.424,0,0]},{"i":{"x":0.833,"y":0.86},"o":{"x":0.167,"y":0.196},"t":108,"s":[103.85,107.352,0],"to":[-0.424,0,0],"ti":[0.304,0,0]},{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.206},"t":109,"s":[102.767,107.352,0],"to":[-0.304,0,0],"ti":[0.194,0,0]},{"i":{"x":0.833,"y":0.889},"o":{"x":0.167,"y":0.228},"t":110,"s":[102.029,107.352,0],"to":[-0.194,0,0],"ti":[0.094,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.333},"t":111,"s":[101.605,107.352,0],"to":[-0.094,0,0],"ti":[0.005,0,0]},{"i":{"x":0.833,"y":0.668},"o":{"x":0.167,"y":0.191},"t":112,"s":[101.463,107.352,0],"to":[-0.005,0,0],"ti":[-0.073,0,0]},{"i":{"x":0.833,"y":0.786},"o":{"x":0.167,"y":0.111},"t":113,"s":[101.572,107.352,0],"to":[0.073,0,0],"ti":[-0.141,0,0]},{"i":{"x":0.833,"y":0.808},"o":{"x":0.167,"y":0.136},"t":114,"s":[101.901,107.352,0],"to":[0.141,0,0],"ti":[-0.199,0,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.147},"t":115,"s":[102.419,107.352,0],"to":[0.199,0,0],"ti":[-0.246,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.154},"t":116,"s":[103.094,107.352,0],"to":[0.246,0,0],"ti":[-0.283,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.158},"t":117,"s":[103.895,107.352,0],"to":[0.283,0,0],"ti":[-0.309,0,0]},{"i":{"x":0.833,"y":0.831},"o":{"x":0.167,"y":0.161},"t":118,"s":[104.791,107.352,0],"to":[0.309,0,0],"ti":[-0.325,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.164},"t":119,"s":[105.75,107.352,0],"to":[0.325,0,0],"ti":[-0.33,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.167},"t":120,"s":[106.741,107.352,0],"to":[0.33,0,0],"ti":[-0.325,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.169},"t":121,"s":[107.733,107.352,0],"to":[0.325,0,0],"ti":[-0.31,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.172},"t":122,"s":[108.694,107.352,0],"to":[0.31,0,0],"ti":[-0.284,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":123,"s":[109.593,107.352,0],"to":[0.284,0,0],"ti":[-0.248,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.182},"t":124,"s":[110.398,107.352,0],"to":[0.248,0,0],"ti":[-0.201,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":125,"s":[111.08,107.352,0],"to":[0.201,0,0],"ti":[-0.144,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.213},"t":126,"s":[111.605,107.352,0],"to":[0.144,0,0],"ti":[-0.076,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.319},"t":127,"s":[111.943,107.352,0],"to":[0.076,0,0],"ti":[-0.02,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[112.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[112.063,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"G","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"n","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[219.813,107.352,0],"to":[-0.64,0,0],"ti":[1.192,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[215.973,107.352,0],"to":[-1.192,0,0],"ti":[1.023,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[212.658,107.352,0],"to":[-1.023,0,0],"ti":[0.866,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[209.833,107.352,0],"to":[-0.866,0,0],"ti":[0.721,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[207.461,107.352,0],"to":[-0.721,0,0],"ti":[0.587,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[205.508,107.352,0],"to":[-0.587,0,0],"ti":[0.465,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[203.938,107.352,0],"to":[-0.465,0,0],"ti":[0.356,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[202.716,107.352,0],"to":[-0.356,0,0],"ti":[0.257,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[201.805,107.352,0],"to":[-0.257,0,0],"ti":[0.171,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[201.171,107.352,0],"to":[-0.171,0,0],"ti":[0.097,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[200.778,107.352,0],"to":[-0.097,0,0],"ti":[0.034,0,0]},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.48},"t":11,"s":[200.591,107.352,0],"to":[-0.034,0,0],"ti":[-0.017,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[200.574,107.352,0],"to":[0.017,0,0],"ti":[-0.056,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[200.692,107.352,0],"to":[0.056,0,0],"ti":[-0.083,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[200.909,107.352,0],"to":[0.083,0,0],"ti":[-0.098,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[201.191,107.352,0],"to":[0.098,0,0],"ti":[-0.102,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[201.5,107.352,0],"to":[0.102,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[201.803,107.352,0],"to":[0.094,0,0],"ti":[-0.074,0,0]},{"i":{"x":0.834,"y":0},"o":{"x":0.167,"y":0.202},"t":18,"s":[202.062,107.352,0],"to":[0.074,0,0],"ti":[-0.042,0,0]},{"i":{"x":0.833,"y":0.366},"o":{"x":0.167,"y":0.091},"t":19,"s":[202.244,107.352,0],"to":[0.042,0,0],"ti":[2.21,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.096},"t":20,"s":[202.313,107.352,0],"to":[-2.21,0,0],"ti":[4.274,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":21,"s":[188.987,107.352,0],"to":[-4.274,0,0],"ti":[3.943,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":22,"s":[176.672,107.352,0],"to":[-3.943,0,0],"ti":[3.624,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":23,"s":[165.33,107.352,0],"to":[-3.624,0,0],"ti":[3.318,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":24,"s":[154.925,107.352,0],"to":[-3.318,0,0],"ti":[3.024,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":25,"s":[145.421,107.352,0],"to":[-3.024,0,0],"ti":[2.743,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":26,"s":[136.78,107.352,0],"to":[-2.743,0,0],"ti":[2.473,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":27,"s":[128.965,107.352,0],"to":[-2.473,0,0],"ti":[2.216,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":28,"s":[121.94,107.352,0],"to":[-2.216,0,0],"ti":[1.971,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.177},"t":29,"s":[115.668,107.352,0],"to":[-1.971,0,0],"ti":[1.739,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":30,"s":[110.111,107.352,0],"to":[-1.739,0,0],"ti":[1.519,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":31,"s":[105.234,107.352,0],"to":[-1.519,0,0],"ti":[1.311,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":32,"s":[100.999,107.352,0],"to":[-1.311,0,0],"ti":[1.115,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":33,"s":[97.37,107.352,0],"to":[-1.115,0,0],"ti":[0.932,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":34,"s":[94.309,107.352,0],"to":[-0.932,0,0],"ti":[0.76,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":35,"s":[91.781,107.352,0],"to":[-0.76,0,0],"ti":[0.602,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.191},"t":36,"s":[89.747,107.352,0],"to":[-0.602,0,0],"ti":[0.455,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.197},"t":37,"s":[88.171,107.352,0],"to":[-0.455,0,0],"ti":[0.321,0,0]},{"i":{"x":0.833,"y":0.871},"o":{"x":0.167,"y":0.208},"t":38,"s":[87.017,107.352,0],"to":[-0.321,0,0],"ti":[0.199,0,0]},{"i":{"x":0.833,"y":0.894},"o":{"x":0.167,"y":0.235},"t":39,"s":[86.247,107.352,0],"to":[-0.199,0,0],"ti":[0.089,0,0]},{"i":{"x":0.833,"y":0.798},"o":{"x":0.167,"y":0.392},"t":40,"s":[85.825,107.352,0],"to":[-0.089,0,0],"ti":[-0.009,0,0]},{"i":{"x":0.833,"y":0.712},"o":{"x":0.167,"y":0.142},"t":41,"s":[85.714,107.352,0],"to":[0.009,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.792},"o":{"x":0.167,"y":0.117},"t":42,"s":[85.877,107.352,0],"to":[0.094,0,0],"ti":[-0.167,0,0]},{"i":{"x":0.833,"y":0.811},"o":{"x":0.167,"y":0.139},"t":43,"s":[86.278,107.352,0],"to":[0.167,0,0],"ti":[-0.227,0,0]},{"i":{"x":0.833,"y":0.82},"o":{"x":0.167,"y":0.149},"t":44,"s":[86.878,107.352,0],"to":[0.227,0,0],"ti":[-0.276,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.155},"t":45,"s":[87.643,107.352,0],"to":[0.276,0,0],"ti":[-0.312,0,0]},{"i":{"x":0.833,"y":0.829},"o":{"x":0.167,"y":0.159},"t":46,"s":[88.534,107.352,0],"to":[0.312,0,0],"ti":[-0.336,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":47,"s":[89.514,107.352,0],"to":[0.336,0,0],"ti":[-0.347,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.165},"t":48,"s":[90.549,107.352,0],"to":[0.347,0,0],"ti":[-0.347,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.168},"t":49,"s":[91.599,107.352,0],"to":[0.347,0,0],"ti":[-0.334,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.172},"t":50,"s":[92.629,107.352,0],"to":[0.334,0,0],"ti":[-0.308,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":51,"s":[93.601,107.352,0],"to":[0.308,0,0],"ti":[-0.271,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":52,"s":[94.479,107.352,0],"to":[0.271,0,0],"ti":[-0.221,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":53,"s":[95.226,107.352,0],"to":[0.221,0,0],"ti":[-0.159,0,0]},{"i":{"x":0.833,"y":0.47},"o":{"x":0.167,"y":0.212},"t":54,"s":[95.805,107.352,0],"to":[0.159,0,0],"ti":[-0.085,0,0]},{"i":{"x":0.833,"y":0.333},"o":{"x":0.167,"y":0.099},"t":55,"s":[96.18,107.352,0],"to":[0.085,0,0],"ti":[-2.369,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":56,"s":[96.313,107.352,0],"to":[2.369,0,0],"ti":[-4.504,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":57,"s":[110.391,107.352,0],"to":[4.504,0,0],"ti":[-4.135,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":58,"s":[123.338,107.352,0],"to":[4.135,0,0],"ti":[-3.78,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":59,"s":[135.199,107.352,0],"to":[3.78,0,0],"ti":[-3.439,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":60,"s":[146.016,107.352,0],"to":[3.439,0,0],"ti":[-3.113,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":61,"s":[155.835,107.352,0],"to":[3.113,0,0],"ti":[-2.802,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":62,"s":[164.697,107.352,0],"to":[2.802,0,0],"ti":[-2.505,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":63,"s":[172.647,107.352,0],"to":[2.505,0,0],"ti":[-2.223,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":64,"s":[179.729,107.352,0],"to":[2.223,0,0],"ti":[-1.956,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":65,"s":[185.987,107.352,0],"to":[1.956,0,0],"ti":[-1.703,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":66,"s":[191.464,107.352,0],"to":[1.703,0,0],"ti":[-1.464,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":67,"s":[196.203,107.352,0],"to":[1.464,0,0],"ti":[-1.24,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":68,"s":[200.249,107.352,0],"to":[1.24,0,0],"ti":[-1.031,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":69,"s":[203.646,107.352,0],"to":[1.031,0,0],"ti":[-0.836,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":70,"s":[206.436,107.352,0],"to":[0.836,0,0],"ti":[-0.656,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.192},"t":71,"s":[208.664,107.352,0],"to":[0.656,0,0],"ti":[-0.491,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.199},"t":72,"s":[210.374,107.352,0],"to":[0.491,0,0],"ti":[-0.34,0,0]},{"i":{"x":0.833,"y":0.873},"o":{"x":0.167,"y":0.211},"t":73,"s":[211.609,107.352,0],"to":[0.34,0,0],"ti":[-0.203,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.244},"t":74,"s":[212.413,107.352,0],"to":[0.203,0,0],"ti":[-0.081,0,0]},{"i":{"x":0.833,"y":0.717},"o":{"x":0.167,"y":0.449},"t":75,"s":[212.829,107.352,0],"to":[0.081,0,0],"ti":[0.026,0,0]},{"i":{"x":0.833,"y":0.739},"o":{"x":0.167,"y":0.118},"t":76,"s":[212.902,107.352,0],"to":[-0.026,0,0],"ti":[0.118,0,0]},{"i":{"x":0.833,"y":0.797},"o":{"x":0.167,"y":0.123},"t":77,"s":[212.674,107.352,0],"to":[-0.118,0,0],"ti":[0.197,0,0]},{"i":{"x":0.833,"y":0.813},"o":{"x":0.167,"y":0.141},"t":78,"s":[212.191,107.352,0],"to":[-0.197,0,0],"ti":[0.26,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.15},"t":79,"s":[211.495,107.352,0],"to":[-0.26,0,0],"ti":[0.309,0,0]},{"i":{"x":0.833,"y":0.826},"o":{"x":0.167,"y":0.156},"t":80,"s":[210.63,107.352,0],"to":[-0.309,0,0],"ti":[0.344,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.16},"t":81,"s":[209.64,107.352,0],"to":[-0.344,0,0],"ti":[0.363,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.164},"t":82,"s":[208.568,107.352,0],"to":[-0.363,0,0],"ti":[0.369,0,0]},{"i":{"x":0.833,"y":0.837},"o":{"x":0.167,"y":0.167},"t":83,"s":[207.459,107.352,0],"to":[-0.369,0,0],"ti":[0.359,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.171},"t":84,"s":[206.356,107.352,0],"to":[-0.359,0,0],"ti":[0.336,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.175},"t":85,"s":[205.303,107.352,0],"to":[-0.336,0,0],"ti":[0.297,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":86,"s":[204.343,107.352,0],"to":[-0.297,0,0],"ti":[0.244,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.19},"t":87,"s":[203.52,107.352,0],"to":[-0.244,0,0],"ti":[0.176,0,0]},{"i":{"x":0.833,"y":0.539},"o":{"x":0.167,"y":0.212},"t":88,"s":[202.879,107.352,0],"to":[-0.176,0,0],"ti":[0.094,0,0]},{"i":{"x":0.833,"y":0.329},"o":{"x":0.167,"y":0.102},"t":89,"s":[202.462,107.352,0],"to":[-0.094,0,0],"ti":[2.246,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":90,"s":[202.313,107.352,0],"to":[-2.246,0,0],"ti":[4.274,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":91,"s":[188.987,107.352,0],"to":[-4.274,0,0],"ti":[3.943,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":92,"s":[176.672,107.352,0],"to":[-3.943,0,0],"ti":[3.624,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":93,"s":[165.33,107.352,0],"to":[-3.624,0,0],"ti":[3.318,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":94,"s":[154.925,107.352,0],"to":[-3.318,0,0],"ti":[3.024,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":95,"s":[145.421,107.352,0],"to":[-3.024,0,0],"ti":[2.743,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":96,"s":[136.78,107.352,0],"to":[-2.743,0,0],"ti":[2.473,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":97,"s":[128.965,107.352,0],"to":[-2.473,0,0],"ti":[2.216,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":98,"s":[121.94,107.352,0],"to":[-2.216,0,0],"ti":[1.971,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.177},"t":99,"s":[115.668,107.352,0],"to":[-1.971,0,0],"ti":[1.739,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":100,"s":[110.111,107.352,0],"to":[-1.739,0,0],"ti":[1.519,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":101,"s":[105.234,107.352,0],"to":[-1.519,0,0],"ti":[1.311,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":102,"s":[100.999,107.352,0],"to":[-1.311,0,0],"ti":[1.115,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":103,"s":[97.37,107.352,0],"to":[-1.115,0,0],"ti":[0.932,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":104,"s":[94.309,107.352,0],"to":[-0.932,0,0],"ti":[0.76,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":105,"s":[91.781,107.352,0],"to":[-0.76,0,0],"ti":[0.602,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.191},"t":106,"s":[89.747,107.352,0],"to":[-0.602,0,0],"ti":[0.455,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.197},"t":107,"s":[88.171,107.352,0],"to":[-0.455,0,0],"ti":[0.321,0,0]},{"i":{"x":0.833,"y":0.871},"o":{"x":0.167,"y":0.208},"t":108,"s":[87.017,107.352,0],"to":[-0.321,0,0],"ti":[0.199,0,0]},{"i":{"x":0.833,"y":0.894},"o":{"x":0.167,"y":0.235},"t":109,"s":[86.247,107.352,0],"to":[-0.199,0,0],"ti":[0.089,0,0]},{"i":{"x":0.833,"y":0.798},"o":{"x":0.167,"y":0.392},"t":110,"s":[85.825,107.352,0],"to":[-0.089,0,0],"ti":[-0.009,0,0]},{"i":{"x":0.833,"y":0.712},"o":{"x":0.167,"y":0.142},"t":111,"s":[85.714,107.352,0],"to":[0.009,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.792},"o":{"x":0.167,"y":0.117},"t":112,"s":[85.877,107.352,0],"to":[0.094,0,0],"ti":[-0.167,0,0]},{"i":{"x":0.833,"y":0.811},"o":{"x":0.167,"y":0.139},"t":113,"s":[86.278,107.352,0],"to":[0.167,0,0],"ti":[-0.227,0,0]},{"i":{"x":0.833,"y":0.82},"o":{"x":0.167,"y":0.149},"t":114,"s":[86.878,107.352,0],"to":[0.227,0,0],"ti":[-0.276,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.155},"t":115,"s":[87.643,107.352,0],"to":[0.276,0,0],"ti":[-0.312,0,0]},{"i":{"x":0.833,"y":0.829},"o":{"x":0.167,"y":0.159},"t":116,"s":[88.534,107.352,0],"to":[0.312,0,0],"ti":[-0.336,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":117,"s":[89.514,107.352,0],"to":[0.336,0,0],"ti":[-0.347,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.165},"t":118,"s":[90.549,107.352,0],"to":[0.347,0,0],"ti":[-0.347,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.168},"t":119,"s":[91.599,107.352,0],"to":[0.347,0,0],"ti":[-0.334,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.172},"t":120,"s":[92.629,107.352,0],"to":[0.334,0,0],"ti":[-0.308,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":121,"s":[93.601,107.352,0],"to":[0.308,0,0],"ti":[-0.271,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":122,"s":[94.479,107.352,0],"to":[0.271,0,0],"ti":[-0.221,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":123,"s":[95.226,107.352,0],"to":[0.221,0,0],"ti":[-0.159,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.212},"t":124,"s":[95.805,107.352,0],"to":[0.159,0,0],"ti":[-0.085,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.318},"t":125,"s":[96.18,107.352,0],"to":[0.085,0,0],"ti":[-0.022,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[96.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[96.313,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"N","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"i","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[219.563,107.352,0],"to":[-1.042,0,0],"ti":[1.942,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[213.31,107.352,0],"to":[-1.942,0,0],"ti":[1.667,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[207.911,107.352,0],"to":[-1.667,0,0],"ti":[1.411,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[203.31,107.352,0],"to":[-1.411,0,0],"ti":[1.174,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[199.448,107.352,0],"to":[-1.174,0,0],"ti":[0.956,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[196.267,107.352,0],"to":[-0.956,0,0],"ti":[0.758,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[193.71,107.352,0],"to":[-0.758,0,0],"ti":[0.579,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[191.719,107.352,0],"to":[-0.579,0,0],"ti":[0.419,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[190.236,107.352,0],"to":[-0.419,0,0],"ti":[0.279,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[189.203,107.352,0],"to":[-0.279,0,0],"ti":[0.157,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[188.564,107.352,0],"to":[-0.157,0,0],"ti":[0.055,0,0]},{"i":{"x":0.833,"y":0.663},"o":{"x":0.167,"y":0.486},"t":11,"s":[188.259,107.352,0],"to":[-0.055,0,0],"ti":[-0.027,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[188.231,107.352,0],"to":[0.027,0,0],"ti":[-0.091,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[188.423,107.352,0],"to":[0.091,0,0],"ti":[-0.135,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[188.777,107.352,0],"to":[0.135,0,0],"ti":[-0.16,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[189.235,107.352,0],"to":[0.16,0,0],"ti":[-0.166,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[189.739,107.352,0],"to":[0.166,0,0],"ti":[-0.153,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[190.232,107.352,0],"to":[0.153,0,0],"ti":[-0.12,0,0]},{"i":{"x":0.833,"y":0.311},"o":{"x":0.167,"y":0.202},"t":18,"s":[190.655,107.352,0],"to":[0.12,0,0],"ti":[-0.068,0,0]},{"i":{"x":0.833,"y":0.372},"o":{"x":0.167,"y":0.095},"t":19,"s":[190.951,107.352,0],"to":[0.068,0,0],"ti":[2.328,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.096},"t":20,"s":[191.063,107.352,0],"to":[-2.328,0,0],"ti":[4.504,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":21,"s":[176.985,107.352,0],"to":[-4.504,0,0],"ti":[4.135,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":22,"s":[164.038,107.352,0],"to":[-4.135,0,0],"ti":[3.78,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":23,"s":[152.177,107.352,0],"to":[-3.78,0,0],"ti":[3.439,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":24,"s":[141.359,107.352,0],"to":[-3.439,0,0],"ti":[3.113,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":25,"s":[131.541,107.352,0],"to":[-3.113,0,0],"ti":[2.802,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":26,"s":[122.679,107.352,0],"to":[-2.802,0,0],"ti":[2.505,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":27,"s":[114.729,107.352,0],"to":[-2.505,0,0],"ti":[2.223,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":28,"s":[107.647,107.352,0],"to":[-2.223,0,0],"ti":[1.956,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":29,"s":[101.389,107.352,0],"to":[-1.956,0,0],"ti":[1.703,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":30,"s":[95.912,107.352,0],"to":[-1.703,0,0],"ti":[1.464,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":31,"s":[91.173,107.352,0],"to":[-1.464,0,0],"ti":[1.24,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":32,"s":[87.127,107.352,0],"to":[-1.24,0,0],"ti":[1.031,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":33,"s":[83.73,107.352,0],"to":[-1.031,0,0],"ti":[0.836,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":34,"s":[80.94,107.352,0],"to":[-0.836,0,0],"ti":[0.656,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.192},"t":35,"s":[78.712,107.352,0],"to":[-0.656,0,0],"ti":[0.491,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.199},"t":36,"s":[77.002,107.352,0],"to":[-0.491,0,0],"ti":[0.34,0,0]},{"i":{"x":0.833,"y":0.873},"o":{"x":0.167,"y":0.211},"t":37,"s":[75.767,107.352,0],"to":[-0.34,0,0],"ti":[0.203,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.244},"t":38,"s":[74.963,107.352,0],"to":[-0.203,0,0],"ti":[0.081,0,0]},{"i":{"x":0.833,"y":0.717},"o":{"x":0.167,"y":0.449},"t":39,"s":[74.547,107.352,0],"to":[-0.081,0,0],"ti":[-0.026,0,0]},{"i":{"x":0.833,"y":0.739},"o":{"x":0.167,"y":0.118},"t":40,"s":[74.474,107.352,0],"to":[0.026,0,0],"ti":[-0.118,0,0]},{"i":{"x":0.833,"y":0.797},"o":{"x":0.167,"y":0.123},"t":41,"s":[74.702,107.352,0],"to":[0.118,0,0],"ti":[-0.197,0,0]},{"i":{"x":0.833,"y":0.813},"o":{"x":0.167,"y":0.141},"t":42,"s":[75.185,107.352,0],"to":[0.197,0,0],"ti":[-0.26,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.15},"t":43,"s":[75.881,107.352,0],"to":[0.26,0,0],"ti":[-0.309,0,0]},{"i":{"x":0.833,"y":0.826},"o":{"x":0.167,"y":0.156},"t":44,"s":[76.746,107.352,0],"to":[0.309,0,0],"ti":[-0.344,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.16},"t":45,"s":[77.736,107.352,0],"to":[0.344,0,0],"ti":[-0.363,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.164},"t":46,"s":[78.808,107.352,0],"to":[0.363,0,0],"ti":[-0.369,0,0]},{"i":{"x":0.833,"y":0.837},"o":{"x":0.167,"y":0.167},"t":47,"s":[79.917,107.352,0],"to":[0.369,0,0],"ti":[-0.359,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.171},"t":48,"s":[81.02,107.352,0],"to":[0.359,0,0],"ti":[-0.336,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.175},"t":49,"s":[82.073,107.352,0],"to":[0.336,0,0],"ti":[-0.297,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":50,"s":[83.033,107.352,0],"to":[0.297,0,0],"ti":[-0.244,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.19},"t":51,"s":[83.855,107.352,0],"to":[0.244,0,0],"ti":[-0.176,0,0]},{"i":{"x":0.833,"y":0.539},"o":{"x":0.167,"y":0.212},"t":52,"s":[84.497,107.352,0],"to":[0.176,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.329},"o":{"x":0.167,"y":0.102},"t":53,"s":[84.914,107.352,0],"to":[0.094,0,0],"ti":[-2.246,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":54,"s":[85.063,107.352,0],"to":[2.246,0,0],"ti":[-4.274,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":55,"s":[98.389,107.352,0],"to":[4.274,0,0],"ti":[-3.943,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":56,"s":[110.704,107.352,0],"to":[3.943,0,0],"ti":[-3.624,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":57,"s":[122.046,107.352,0],"to":[3.624,0,0],"ti":[-3.318,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":58,"s":[132.451,107.352,0],"to":[3.318,0,0],"ti":[-3.024,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":59,"s":[141.955,107.352,0],"to":[3.024,0,0],"ti":[-2.743,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":60,"s":[150.596,107.352,0],"to":[2.743,0,0],"ti":[-2.473,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":61,"s":[158.411,107.352,0],"to":[2.473,0,0],"ti":[-2.216,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":62,"s":[165.436,107.352,0],"to":[2.216,0,0],"ti":[-1.971,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.177},"t":63,"s":[171.708,107.352,0],"to":[1.971,0,0],"ti":[-1.739,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":64,"s":[177.265,107.352,0],"to":[1.739,0,0],"ti":[-1.519,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":65,"s":[182.142,107.352,0],"to":[1.519,0,0],"ti":[-1.311,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":66,"s":[186.377,107.352,0],"to":[1.311,0,0],"ti":[-1.115,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":67,"s":[190.006,107.352,0],"to":[1.115,0,0],"ti":[-0.932,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":68,"s":[193.067,107.352,0],"to":[0.932,0,0],"ti":[-0.76,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":69,"s":[195.595,107.352,0],"to":[0.76,0,0],"ti":[-0.602,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.191},"t":70,"s":[197.629,107.352,0],"to":[0.602,0,0],"ti":[-0.455,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.197},"t":71,"s":[199.205,107.352,0],"to":[0.455,0,0],"ti":[-0.321,0,0]},{"i":{"x":0.833,"y":0.871},"o":{"x":0.167,"y":0.208},"t":72,"s":[200.359,107.352,0],"to":[0.321,0,0],"ti":[-0.199,0,0]},{"i":{"x":0.833,"y":0.894},"o":{"x":0.167,"y":0.235},"t":73,"s":[201.129,107.352,0],"to":[0.199,0,0],"ti":[-0.089,0,0]},{"i":{"x":0.833,"y":0.798},"o":{"x":0.167,"y":0.392},"t":74,"s":[201.55,107.352,0],"to":[0.089,0,0],"ti":[0.009,0,0]},{"i":{"x":0.833,"y":0.712},"o":{"x":0.167,"y":0.142},"t":75,"s":[201.662,107.352,0],"to":[-0.009,0,0],"ti":[0.094,0,0]},{"i":{"x":0.833,"y":0.792},"o":{"x":0.167,"y":0.117},"t":76,"s":[201.499,107.352,0],"to":[-0.094,0,0],"ti":[0.167,0,0]},{"i":{"x":0.833,"y":0.811},"o":{"x":0.167,"y":0.139},"t":77,"s":[201.098,107.352,0],"to":[-0.167,0,0],"ti":[0.227,0,0]},{"i":{"x":0.833,"y":0.82},"o":{"x":0.167,"y":0.149},"t":78,"s":[200.498,107.352,0],"to":[-0.227,0,0],"ti":[0.276,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.155},"t":79,"s":[199.733,107.352,0],"to":[-0.276,0,0],"ti":[0.312,0,0]},{"i":{"x":0.833,"y":0.829},"o":{"x":0.167,"y":0.159},"t":80,"s":[198.842,107.352,0],"to":[-0.312,0,0],"ti":[0.336,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":81,"s":[197.861,107.352,0],"to":[-0.336,0,0],"ti":[0.347,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.165},"t":82,"s":[196.827,107.352,0],"to":[-0.347,0,0],"ti":[0.347,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.168},"t":83,"s":[195.777,107.352,0],"to":[-0.347,0,0],"ti":[0.334,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.172},"t":84,"s":[194.747,107.352,0],"to":[-0.334,0,0],"ti":[0.308,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":85,"s":[193.775,107.352,0],"to":[-0.308,0,0],"ti":[0.271,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":86,"s":[192.897,107.352,0],"to":[-0.271,0,0],"ti":[0.221,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":87,"s":[192.15,107.352,0],"to":[-0.221,0,0],"ti":[0.159,0,0]},{"i":{"x":0.833,"y":0.47},"o":{"x":0.167,"y":0.212},"t":88,"s":[191.571,107.352,0],"to":[-0.159,0,0],"ti":[0.085,0,0]},{"i":{"x":0.833,"y":0.333},"o":{"x":0.167,"y":0.099},"t":89,"s":[191.196,107.352,0],"to":[-0.085,0,0],"ti":[2.369,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":90,"s":[191.063,107.352,0],"to":[-2.369,0,0],"ti":[4.504,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":91,"s":[176.985,107.352,0],"to":[-4.504,0,0],"ti":[4.135,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":92,"s":[164.038,107.352,0],"to":[-4.135,0,0],"ti":[3.78,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":93,"s":[152.177,107.352,0],"to":[-3.78,0,0],"ti":[3.439,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":94,"s":[141.359,107.352,0],"to":[-3.439,0,0],"ti":[3.113,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":95,"s":[131.541,107.352,0],"to":[-3.113,0,0],"ti":[2.802,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":96,"s":[122.679,107.352,0],"to":[-2.802,0,0],"ti":[2.505,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":97,"s":[114.729,107.352,0],"to":[-2.505,0,0],"ti":[2.223,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":98,"s":[107.647,107.352,0],"to":[-2.223,0,0],"ti":[1.956,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":99,"s":[101.389,107.352,0],"to":[-1.956,0,0],"ti":[1.703,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":100,"s":[95.912,107.352,0],"to":[-1.703,0,0],"ti":[1.464,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":101,"s":[91.173,107.352,0],"to":[-1.464,0,0],"ti":[1.24,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":102,"s":[87.127,107.352,0],"to":[-1.24,0,0],"ti":[1.031,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":103,"s":[83.73,107.352,0],"to":[-1.031,0,0],"ti":[0.836,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":104,"s":[80.94,107.352,0],"to":[-0.836,0,0],"ti":[0.656,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.192},"t":105,"s":[78.712,107.352,0],"to":[-0.656,0,0],"ti":[0.491,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.199},"t":106,"s":[77.002,107.352,0],"to":[-0.491,0,0],"ti":[0.34,0,0]},{"i":{"x":0.833,"y":0.873},"o":{"x":0.167,"y":0.211},"t":107,"s":[75.767,107.352,0],"to":[-0.34,0,0],"ti":[0.203,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.244},"t":108,"s":[74.963,107.352,0],"to":[-0.203,0,0],"ti":[0.081,0,0]},{"i":{"x":0.833,"y":0.717},"o":{"x":0.167,"y":0.449},"t":109,"s":[74.547,107.352,0],"to":[-0.081,0,0],"ti":[-0.026,0,0]},{"i":{"x":0.833,"y":0.739},"o":{"x":0.167,"y":0.118},"t":110,"s":[74.474,107.352,0],"to":[0.026,0,0],"ti":[-0.118,0,0]},{"i":{"x":0.833,"y":0.797},"o":{"x":0.167,"y":0.123},"t":111,"s":[74.702,107.352,0],"to":[0.118,0,0],"ti":[-0.197,0,0]},{"i":{"x":0.833,"y":0.813},"o":{"x":0.167,"y":0.141},"t":112,"s":[75.185,107.352,0],"to":[0.197,0,0],"ti":[-0.26,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.15},"t":113,"s":[75.881,107.352,0],"to":[0.26,0,0],"ti":[-0.309,0,0]},{"i":{"x":0.833,"y":0.826},"o":{"x":0.167,"y":0.156},"t":114,"s":[76.746,107.352,0],"to":[0.309,0,0],"ti":[-0.344,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.16},"t":115,"s":[77.736,107.352,0],"to":[0.344,0,0],"ti":[-0.363,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.164},"t":116,"s":[78.808,107.352,0],"to":[0.363,0,0],"ti":[-0.369,0,0]},{"i":{"x":0.833,"y":0.837},"o":{"x":0.167,"y":0.167},"t":117,"s":[79.917,107.352,0],"to":[0.369,0,0],"ti":[-0.359,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.171},"t":118,"s":[81.02,107.352,0],"to":[0.359,0,0],"ti":[-0.336,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.175},"t":119,"s":[82.073,107.352,0],"to":[0.336,0,0],"ti":[-0.297,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.181},"t":120,"s":[83.033,107.352,0],"to":[0.297,0,0],"ti":[-0.244,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.19},"t":121,"s":[83.855,107.352,0],"to":[0.244,0,0],"ti":[-0.176,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.212},"t":122,"s":[84.497,107.352,0],"to":[0.176,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.317},"t":123,"s":[84.914,107.352,0],"to":[0.094,0,0],"ti":[-0.025,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[85.063,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[85.063,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"I","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"d","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[220.063,107.352,0],"to":[-1.444,0,0],"ti":[2.691,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[211.396,107.352,0],"to":[-2.691,0,0],"ti":[2.31,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[203.914,107.352,0],"to":[-2.31,0,0],"ti":[1.955,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[197.537,107.352,0],"to":[-1.955,0,0],"ti":[1.627,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[192.184,107.352,0],"to":[-1.627,0,0],"ti":[1.325,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[187.775,107.352,0],"to":[-1.325,0,0],"ti":[1.051,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[184.231,107.352,0],"to":[-1.051,0,0],"ti":[0.802,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[181.472,107.352,0],"to":[-0.802,0,0],"ti":[0.581,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[179.416,107.352,0],"to":[-0.581,0,0],"ti":[0.386,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[177.985,107.352,0],"to":[-0.386,0,0],"ti":[0.218,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[177.099,107.352,0],"to":[-0.218,0,0],"ti":[0.077,0,0]},{"i":{"x":0.833,"y":0.666},"o":{"x":0.167,"y":0.481},"t":11,"s":[176.677,107.352,0],"to":[-0.077,0,0],"ti":[-0.038,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[176.639,107.352,0],"to":[0.038,0,0],"ti":[-0.126,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[176.905,107.352,0],"to":[0.126,0,0],"ti":[-0.187,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[177.395,107.352,0],"to":[0.187,0,0],"ti":[-0.222,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[178.03,107.352,0],"to":[0.222,0,0],"ti":[-0.23,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[178.728,107.352,0],"to":[0.23,0,0],"ti":[-0.212,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[179.411,107.352,0],"to":[0.212,0,0],"ti":[-0.166,0,0]},{"i":{"x":0.833,"y":0.449},"o":{"x":0.167,"y":0.202},"t":18,"s":[179.998,107.352,0],"to":[0.166,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.377},"o":{"x":0.167,"y":0.098},"t":19,"s":[180.408,107.352,0],"to":[0.094,0,0],"ti":[2.461,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.096},"t":20,"s":[180.563,107.352,0],"to":[-2.461,0,0],"ti":[4.761,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":21,"s":[165.643,107.352,0],"to":[-4.761,0,0],"ti":[4.345,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":22,"s":[151.996,107.352,0],"to":[-4.345,0,0],"ti":[3.947,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":23,"s":[139.57,107.352,0],"to":[-3.947,0,0],"ti":[3.567,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":24,"s":[128.313,107.352,0],"to":[-3.567,0,0],"ti":[3.203,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":25,"s":[118.171,107.352,0],"to":[-3.203,0,0],"ti":[2.858,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":26,"s":[109.093,107.352,0],"to":[-2.858,0,0],"ti":[2.529,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":27,"s":[101.026,107.352,0],"to":[-2.529,0,0],"ti":[2.218,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":28,"s":[93.918,107.352,0],"to":[-2.218,0,0],"ti":[1.925,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":29,"s":[87.715,107.352,0],"to":[-1.925,0,0],"ti":[1.649,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":30,"s":[82.367,107.352,0],"to":[-1.649,0,0],"ti":[1.391,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.183},"t":31,"s":[77.819,107.352,0],"to":[-1.391,0,0],"ti":[1.15,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.185},"t":32,"s":[74.021,107.352,0],"to":[-1.15,0,0],"ti":[0.927,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":33,"s":[70.919,107.352,0],"to":[-0.927,0,0],"ti":[0.721,0,0]},{"i":{"x":0.833,"y":0.857},"o":{"x":0.167,"y":0.193},"t":34,"s":[68.461,107.352,0],"to":[-0.721,0,0],"ti":[0.532,0,0]},{"i":{"x":0.833,"y":0.864},"o":{"x":0.167,"y":0.201},"t":35,"s":[66.594,107.352,0],"to":[-0.532,0,0],"ti":[0.361,0,0]},{"i":{"x":0.833,"y":0.876},"o":{"x":0.167,"y":0.215},"t":36,"s":[65.267,107.352,0],"to":[-0.361,0,0],"ti":[0.208,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.256},"t":37,"s":[64.426,107.352,0],"to":[-0.208,0,0],"ti":[0.072,0,0]},{"i":{"x":0.833,"y":0.635},"o":{"x":0.167,"y":0.459},"t":38,"s":[64.02,107.352,0],"to":[-0.072,0,0],"ti":[-0.047,0,0]},{"i":{"x":0.833,"y":0.758},"o":{"x":0.167,"y":0.108},"t":39,"s":[63.995,107.352,0],"to":[0.047,0,0],"ti":[-0.148,0,0]},{"i":{"x":0.833,"y":0.801},"o":{"x":0.167,"y":0.127},"t":40,"s":[64.3,107.352,0],"to":[0.148,0,0],"ti":[-0.231,0,0]},{"i":{"x":0.833,"y":0.816},"o":{"x":0.167,"y":0.143},"t":41,"s":[64.882,107.352,0],"to":[0.231,0,0],"ti":[-0.297,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.152},"t":42,"s":[65.688,107.352,0],"to":[0.297,0,0],"ti":[-0.346,0,0]},{"i":{"x":0.833,"y":0.828},"o":{"x":0.167,"y":0.158},"t":43,"s":[66.667,107.352,0],"to":[0.346,0,0],"ti":[-0.377,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":44,"s":[67.764,107.352,0],"to":[0.377,0,0],"ti":[-0.391,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.166},"t":45,"s":[68.93,107.352,0],"to":[0.391,0,0],"ti":[-0.387,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.169},"t":46,"s":[70.11,107.352,0],"to":[0.387,0,0],"ti":[-0.366,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.174},"t":47,"s":[71.252,107.352,0],"to":[0.366,0,0],"ti":[-0.327,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.18},"t":48,"s":[72.304,107.352,0],"to":[0.327,0,0],"ti":[-0.271,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.189},"t":49,"s":[73.214,107.352,0],"to":[0.271,0,0],"ti":[-0.197,0,0]},{"i":{"x":0.833,"y":0.599},"o":{"x":0.167,"y":0.211},"t":50,"s":[73.928,107.352,0],"to":[0.197,0,0],"ti":[-0.106,0,0]},{"i":{"x":0.833,"y":0.324},"o":{"x":0.167,"y":0.105},"t":51,"s":[74.396,107.352,0],"to":[0.106,0,0],"ti":[-2.136,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.095},"t":52,"s":[74.563,107.352,0],"to":[2.136,0,0],"ti":[-4.065,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":53,"s":[87.213,107.352,0],"to":[4.065,0,0],"ti":[-3.768,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":54,"s":[98.954,107.352,0],"to":[3.768,0,0],"ti":[-3.48,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":55,"s":[109.818,107.352,0],"to":[3.48,0,0],"ti":[-3.203,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":56,"s":[119.836,107.352,0],"to":[3.203,0,0],"ti":[-2.937,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":57,"s":[129.039,107.352,0],"to":[2.937,0,0],"ti":[-2.681,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":58,"s":[137.458,107.352,0],"to":[2.681,0,0],"ti":[-2.436,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":59,"s":[145.126,107.352,0],"to":[2.436,0,0],"ti":[-2.201,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":60,"s":[152.072,107.352,0],"to":[2.201,0,0],"ti":[-1.976,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":61,"s":[158.329,107.352,0],"to":[1.976,0,0],"ti":[-1.762,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":62,"s":[163.927,107.352,0],"to":[1.762,0,0],"ti":[-1.558,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":63,"s":[168.899,107.352,0],"to":[1.558,0,0],"ti":[-1.365,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":64,"s":[173.275,107.352,0],"to":[1.365,0,0],"ti":[-1.182,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":65,"s":[177.086,107.352,0],"to":[1.182,0,0],"ti":[-1.009,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.182},"t":66,"s":[180.365,107.352,0],"to":[1.009,0,0],"ti":[-0.847,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.184},"t":67,"s":[183.142,107.352,0],"to":[0.847,0,0],"ti":[-0.696,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.186},"t":68,"s":[185.448,107.352,0],"to":[0.696,0,0],"ti":[-0.555,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":69,"s":[187.316,107.352,0],"to":[0.555,0,0],"ti":[-0.424,0,0]},{"i":{"x":0.833,"y":0.86},"o":{"x":0.167,"y":0.196},"t":70,"s":[188.776,107.352,0],"to":[0.424,0,0],"ti":[-0.304,0,0]},{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.206},"t":71,"s":[189.859,107.352,0],"to":[0.304,0,0],"ti":[-0.194,0,0]},{"i":{"x":0.833,"y":0.889},"o":{"x":0.167,"y":0.228},"t":72,"s":[190.597,107.352,0],"to":[0.194,0,0],"ti":[-0.094,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.333},"t":73,"s":[191.021,107.352,0],"to":[0.094,0,0],"ti":[-0.005,0,0]},{"i":{"x":0.833,"y":0.668},"o":{"x":0.167,"y":0.191},"t":74,"s":[191.163,107.352,0],"to":[0.005,0,0],"ti":[0.073,0,0]},{"i":{"x":0.833,"y":0.786},"o":{"x":0.167,"y":0.111},"t":75,"s":[191.054,107.352,0],"to":[-0.073,0,0],"ti":[0.141,0,0]},{"i":{"x":0.833,"y":0.808},"o":{"x":0.167,"y":0.136},"t":76,"s":[190.725,107.352,0],"to":[-0.141,0,0],"ti":[0.199,0,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.147},"t":77,"s":[190.207,107.352,0],"to":[-0.199,0,0],"ti":[0.246,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.154},"t":78,"s":[189.532,107.352,0],"to":[-0.246,0,0],"ti":[0.283,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.158},"t":79,"s":[188.731,107.352,0],"to":[-0.283,0,0],"ti":[0.309,0,0]},{"i":{"x":0.833,"y":0.831},"o":{"x":0.167,"y":0.161},"t":80,"s":[187.835,107.352,0],"to":[-0.309,0,0],"ti":[0.325,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.164},"t":81,"s":[186.876,107.352,0],"to":[-0.325,0,0],"ti":[0.33,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.167},"t":82,"s":[185.885,107.352,0],"to":[-0.33,0,0],"ti":[0.325,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.169},"t":83,"s":[184.893,107.352,0],"to":[-0.325,0,0],"ti":[0.31,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.172},"t":84,"s":[183.932,107.352,0],"to":[-0.31,0,0],"ti":[0.284,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.176},"t":85,"s":[183.033,107.352,0],"to":[-0.284,0,0],"ti":[0.248,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.182},"t":86,"s":[182.227,107.352,0],"to":[-0.248,0,0],"ti":[0.201,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.191},"t":87,"s":[181.546,107.352,0],"to":[-0.201,0,0],"ti":[0.144,0,0]},{"i":{"x":0.833,"y":0.389},"o":{"x":0.167,"y":0.213},"t":88,"s":[181.021,107.352,0],"to":[-0.144,0,0],"ti":[0.076,0,0]},{"i":{"x":0.833,"y":0.336},"o":{"x":0.167,"y":0.096},"t":89,"s":[180.683,107.352,0],"to":[-0.076,0,0],"ti":[2.507,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.095},"t":90,"s":[180.563,107.352,0],"to":[-2.507,0,0],"ti":[4.761,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":91,"s":[165.643,107.352,0],"to":[-4.761,0,0],"ti":[4.345,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":92,"s":[151.996,107.352,0],"to":[-4.345,0,0],"ti":[3.947,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":93,"s":[139.57,107.352,0],"to":[-3.947,0,0],"ti":[3.567,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":94,"s":[128.313,107.352,0],"to":[-3.567,0,0],"ti":[3.203,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":95,"s":[118.171,107.352,0],"to":[-3.203,0,0],"ti":[2.858,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":96,"s":[109.093,107.352,0],"to":[-2.858,0,0],"ti":[2.529,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":97,"s":[101.026,107.352,0],"to":[-2.529,0,0],"ti":[2.218,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":98,"s":[93.918,107.352,0],"to":[-2.218,0,0],"ti":[1.925,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":99,"s":[87.715,107.352,0],"to":[-1.925,0,0],"ti":[1.649,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":100,"s":[82.367,107.352,0],"to":[-1.649,0,0],"ti":[1.391,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.183},"t":101,"s":[77.819,107.352,0],"to":[-1.391,0,0],"ti":[1.15,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.185},"t":102,"s":[74.021,107.352,0],"to":[-1.15,0,0],"ti":[0.927,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":103,"s":[70.919,107.352,0],"to":[-0.927,0,0],"ti":[0.721,0,0]},{"i":{"x":0.833,"y":0.857},"o":{"x":0.167,"y":0.193},"t":104,"s":[68.461,107.352,0],"to":[-0.721,0,0],"ti":[0.532,0,0]},{"i":{"x":0.833,"y":0.864},"o":{"x":0.167,"y":0.201},"t":105,"s":[66.594,107.352,0],"to":[-0.532,0,0],"ti":[0.361,0,0]},{"i":{"x":0.833,"y":0.876},"o":{"x":0.167,"y":0.215},"t":106,"s":[65.267,107.352,0],"to":[-0.361,0,0],"ti":[0.208,0,0]},{"i":{"x":0.833,"y":0.898},"o":{"x":0.167,"y":0.256},"t":107,"s":[64.426,107.352,0],"to":[-0.208,0,0],"ti":[0.072,0,0]},{"i":{"x":0.833,"y":0.635},"o":{"x":0.167,"y":0.459},"t":108,"s":[64.02,107.352,0],"to":[-0.072,0,0],"ti":[-0.047,0,0]},{"i":{"x":0.833,"y":0.758},"o":{"x":0.167,"y":0.108},"t":109,"s":[63.995,107.352,0],"to":[0.047,0,0],"ti":[-0.148,0,0]},{"i":{"x":0.833,"y":0.801},"o":{"x":0.167,"y":0.127},"t":110,"s":[64.3,107.352,0],"to":[0.148,0,0],"ti":[-0.231,0,0]},{"i":{"x":0.833,"y":0.816},"o":{"x":0.167,"y":0.143},"t":111,"s":[64.882,107.352,0],"to":[0.231,0,0],"ti":[-0.297,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.152},"t":112,"s":[65.688,107.352,0],"to":[0.297,0,0],"ti":[-0.346,0,0]},{"i":{"x":0.833,"y":0.828},"o":{"x":0.167,"y":0.158},"t":113,"s":[66.667,107.352,0],"to":[0.346,0,0],"ti":[-0.377,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.162},"t":114,"s":[67.764,107.352,0],"to":[0.377,0,0],"ti":[-0.391,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.166},"t":115,"s":[68.93,107.352,0],"to":[0.391,0,0],"ti":[-0.387,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.169},"t":116,"s":[70.11,107.352,0],"to":[0.387,0,0],"ti":[-0.366,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.174},"t":117,"s":[71.252,107.352,0],"to":[0.366,0,0],"ti":[-0.327,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.18},"t":118,"s":[72.304,107.352,0],"to":[0.327,0,0],"ti":[-0.271,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.189},"t":119,"s":[73.214,107.352,0],"to":[0.271,0,0],"ti":[-0.197,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.211},"t":120,"s":[73.928,107.352,0],"to":[0.197,0,0],"ti":[-0.106,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.316},"t":121,"s":[74.396,107.352,0],"to":[0.106,0,0],"ti":[-0.028,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[74.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[74.563,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"D","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"a","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[217.813,107.352,0],"to":[-1.883,0,0],"ti":[3.509,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[206.513,107.352,0],"to":[-3.509,0,0],"ti":[3.012,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[196.758,107.352,0],"to":[-3.012,0,0],"ti":[2.549,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[188.443,107.352,0],"to":[-2.549,0,0],"ti":[2.121,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[181.464,107.352,0],"to":[-2.121,0,0],"ti":[1.728,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[175.716,107.352,0],"to":[-1.728,0,0],"ti":[1.37,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[171.096,107.352,0],"to":[-1.37,0,0],"ti":[1.046,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[167.498,107.352,0],"to":[-1.046,0,0],"ti":[0.758,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[164.818,107.352,0],"to":[-0.758,0,0],"ti":[0.504,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[162.952,107.352,0],"to":[-0.504,0,0],"ti":[0.284,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[161.797,107.352,0],"to":[-0.284,0,0],"ti":[0.1,0,0]},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.48},"t":11,"s":[161.246,107.352,0],"to":[-0.1,0,0],"ti":[-0.05,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[161.196,107.352,0],"to":[0.05,0,0],"ti":[-0.164,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[161.543,107.352,0],"to":[0.164,0,0],"ti":[-0.244,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[162.183,107.352,0],"to":[0.244,0,0],"ti":[-0.29,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[163.01,107.352,0],"to":[0.29,0,0],"ti":[-0.3,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[163.921,107.352,0],"to":[0.3,0,0],"ti":[-0.276,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[164.811,107.352,0],"to":[0.276,0,0],"ti":[-0.217,0,0]},{"i":{"x":0.833,"y":0.532},"o":{"x":0.167,"y":0.202},"t":18,"s":[165.576,107.352,0],"to":[0.217,0,0],"ti":[-0.123,0,0]},{"i":{"x":0.833,"y":0.382},"o":{"x":0.167,"y":0.101},"t":19,"s":[166.111,107.352,0],"to":[0.123,0,0],"ti":[2.611,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.096},"t":20,"s":[166.313,107.352,0],"to":[-2.611,0,0],"ti":[5.049,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":21,"s":[150.444,107.352,0],"to":[-5.049,0,0],"ti":[4.578,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":22,"s":[136.02,107.352,0],"to":[-4.578,0,0],"ti":[4.128,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":23,"s":[122.977,107.352,0],"to":[-4.128,0,0],"ti":[3.7,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":24,"s":[111.252,107.352,0],"to":[-3.7,0,0],"ti":[3.292,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":25,"s":[100.78,107.352,0],"to":[-3.292,0,0],"ti":[2.906,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":26,"s":[91.498,107.352,0],"to":[-2.906,0,0],"ti":[2.541,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":27,"s":[83.343,107.352,0],"to":[-2.541,0,0],"ti":[2.198,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":28,"s":[76.25,107.352,0],"to":[-2.198,0,0],"ti":[1.875,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.182},"t":29,"s":[70.157,107.352,0],"to":[-1.875,0,0],"ti":[1.574,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.184},"t":30,"s":[64.999,107.352,0],"to":[-1.574,0,0],"ti":[1.294,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.186},"t":31,"s":[60.714,107.352,0],"to":[-1.294,0,0],"ti":[1.035,0,0]},{"i":{"x":0.833,"y":0.854},"o":{"x":0.167,"y":0.189},"t":32,"s":[57.236,107.352,0],"to":[-1.035,0,0],"ti":[0.797,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.194},"t":33,"s":[54.503,107.352,0],"to":[-0.797,0,0],"ti":[0.581,0,0]},{"i":{"x":0.833,"y":0.866},"o":{"x":0.167,"y":0.203},"t":34,"s":[52.451,107.352,0],"to":[-0.581,0,0],"ti":[0.386,0,0]},{"i":{"x":0.833,"y":0.88},"o":{"x":0.167,"y":0.219},"t":35,"s":[51.017,107.352,0],"to":[-0.386,0,0],"ti":[0.212,0,0]},{"i":{"x":0.833,"y":0.895},"o":{"x":0.167,"y":0.271},"t":36,"s":[50.136,107.352,0],"to":[-0.212,0,0],"ti":[0.059,0,0]},{"i":{"x":0.833,"y":0.594},"o":{"x":0.167,"y":0.399},"t":37,"s":[49.746,107.352,0],"to":[-0.059,0,0],"ti":[-0.072,0,0]},{"i":{"x":0.833,"y":0.771},"o":{"x":0.167,"y":0.105},"t":38,"s":[49.782,107.352,0],"to":[0.072,0,0],"ti":[-0.183,0,0]},{"i":{"x":0.833,"y":0.805},"o":{"x":0.167,"y":0.131},"t":39,"s":[50.18,107.352,0],"to":[0.183,0,0],"ti":[-0.272,0,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.146},"t":40,"s":[50.878,107.352,0],"to":[0.272,0,0],"ti":[-0.34,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.154},"t":41,"s":[51.812,107.352,0],"to":[0.34,0,0],"ti":[-0.387,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.159},"t":42,"s":[52.917,107.352,0],"to":[0.387,0,0],"ti":[-0.412,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.164},"t":43,"s":[54.131,107.352,0],"to":[0.412,0,0],"ti":[-0.416,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.168},"t":44,"s":[55.389,107.352,0],"to":[0.416,0,0],"ti":[-0.399,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.173},"t":45,"s":[56.629,107.352,0],"to":[0.399,0,0],"ti":[-0.361,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.179},"t":46,"s":[57.785,107.352,0],"to":[0.361,0,0],"ti":[-0.302,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.189},"t":47,"s":[58.796,107.352,0],"to":[0.302,0,0],"ti":[-0.221,0,0]},{"i":{"x":0.833,"y":0.651},"o":{"x":0.167,"y":0.21},"t":48,"s":[59.596,107.352,0],"to":[0.221,0,0],"ti":[-0.119,0,0]},{"i":{"x":0.833,"y":0.319},"o":{"x":0.167,"y":0.109},"t":49,"s":[60.123,107.352,0],"to":[0.119,0,0],"ti":[-2.038,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.095},"t":50,"s":[60.313,107.352,0],"to":[2.038,0,0],"ti":[-3.876,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":51,"s":[72.352,107.352,0],"to":[3.876,0,0],"ti":[-3.607,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":52,"s":[83.57,107.352,0],"to":[3.607,0,0],"ti":[-3.346,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":53,"s":[93.993,107.352,0],"to":[3.346,0,0],"ti":[-3.095,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":54,"s":[103.649,107.352,0],"to":[3.095,0,0],"ti":[-2.852,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":55,"s":[112.563,107.352,0],"to":[2.852,0,0],"ti":[-2.619,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":56,"s":[120.763,107.352,0],"to":[2.619,0,0],"ti":[-2.394,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":57,"s":[128.276,107.352,0],"to":[2.394,0,0],"ti":[-2.178,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":58,"s":[135.128,107.352,0],"to":[2.178,0,0],"ti":[-1.972,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":59,"s":[141.347,107.352,0],"to":[1.972,0,0],"ti":[-1.774,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":60,"s":[146.958,107.352,0],"to":[1.774,0,0],"ti":[-1.585,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":61,"s":[151.99,107.352,0],"to":[1.585,0,0],"ti":[-1.405,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":62,"s":[156.469,107.352,0],"to":[1.405,0,0],"ti":[-1.234,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":63,"s":[160.421,107.352,0],"to":[1.234,0,0],"ti":[-1.072,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":64,"s":[163.875,107.352,0],"to":[1.072,0,0],"ti":[-0.919,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":65,"s":[166.855,107.352,0],"to":[0.919,0,0],"ti":[-0.775,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.183},"t":66,"s":[169.39,107.352,0],"to":[0.775,0,0],"ti":[-0.64,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.186},"t":67,"s":[171.506,107.352,0],"to":[0.64,0,0],"ti":[-0.514,0,0]},{"i":{"x":0.833,"y":0.854},"o":{"x":0.167,"y":0.189},"t":68,"s":[173.23,107.352,0],"to":[0.514,0,0],"ti":[-0.397,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.194},"t":69,"s":[174.588,107.352,0],"to":[0.397,0,0],"ti":[-0.288,0,0]},{"i":{"x":0.833,"y":0.867},"o":{"x":0.167,"y":0.203},"t":70,"s":[175.609,107.352,0],"to":[0.288,0,0],"ti":[-0.189,0,0]},{"i":{"x":0.833,"y":0.884},"o":{"x":0.167,"y":0.223},"t":71,"s":[176.318,107.352,0],"to":[0.189,0,0],"ti":[-0.098,0,0]},{"i":{"x":0.833,"y":0.879},"o":{"x":0.167,"y":0.296},"t":72,"s":[176.742,107.352,0],"to":[0.098,0,0],"ti":[-0.017,0,0]},{"i":{"x":0.833,"y":0.617},"o":{"x":0.167,"y":0.269},"t":73,"s":[176.909,107.352,0],"to":[0.017,0,0],"ti":[0.055,0,0]},{"i":{"x":0.833,"y":0.778},"o":{"x":0.167,"y":0.107},"t":74,"s":[176.844,107.352,0],"to":[-0.055,0,0],"ti":[0.119,0,0]},{"i":{"x":0.833,"y":0.805},"o":{"x":0.167,"y":0.134},"t":75,"s":[176.576,107.352,0],"to":[-0.119,0,0],"ti":[0.174,0,0]},{"i":{"x":0.833,"y":0.816},"o":{"x":0.167,"y":0.146},"t":76,"s":[176.13,107.352,0],"to":[-0.174,0,0],"ti":[0.219,0,0]},{"i":{"x":0.833,"y":0.822},"o":{"x":0.167,"y":0.152},"t":77,"s":[175.534,107.352,0],"to":[-0.219,0,0],"ti":[0.256,0,0]},{"i":{"x":0.833,"y":0.826},"o":{"x":0.167,"y":0.157},"t":78,"s":[174.814,107.352,0],"to":[-0.256,0,0],"ti":[0.284,0,0]},{"i":{"x":0.833,"y":0.829},"o":{"x":0.167,"y":0.16},"t":79,"s":[173.998,107.352,0],"to":[-0.284,0,0],"ti":[0.303,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.163},"t":80,"s":[173.111,107.352,0],"to":[-0.303,0,0],"ti":[0.312,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.165},"t":81,"s":[172.182,107.352,0],"to":[-0.312,0,0],"ti":[0.313,0,0]},{"i":{"x":0.833,"y":0.837},"o":{"x":0.167,"y":0.168},"t":82,"s":[171.237,107.352,0],"to":[-0.313,0,0],"ti":[0.305,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.17},"t":83,"s":[170.302,107.352,0],"to":[-0.305,0,0],"ti":[0.288,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.173},"t":84,"s":[169.405,107.352,0],"to":[-0.288,0,0],"ti":[0.262,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.177},"t":85,"s":[168.572,107.352,0],"to":[-0.262,0,0],"ti":[0.228,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.182},"t":86,"s":[167.83,107.352,0],"to":[-0.228,0,0],"ti":[0.184,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.192},"t":87,"s":[167.207,107.352,0],"to":[-0.184,0,0],"ti":[0.131,0,0]},{"i":{"x":0.833,"y":0.296},"o":{"x":0.167,"y":0.213},"t":88,"s":[166.728,107.352,0],"to":[-0.131,0,0],"ti":[0.069,0,0]},{"i":{"x":0.833,"y":0.339},"o":{"x":0.167,"y":0.095},"t":89,"s":[166.421,107.352,0],"to":[-0.069,0,0],"ti":[2.663,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.095},"t":90,"s":[166.313,107.352,0],"to":[-2.663,0,0],"ti":[5.049,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":91,"s":[150.444,107.352,0],"to":[-5.049,0,0],"ti":[4.578,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":92,"s":[136.02,107.352,0],"to":[-4.578,0,0],"ti":[4.128,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":93,"s":[122.977,107.352,0],"to":[-4.128,0,0],"ti":[3.7,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":94,"s":[111.252,107.352,0],"to":[-3.7,0,0],"ti":[3.292,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":95,"s":[100.78,107.352,0],"to":[-3.292,0,0],"ti":[2.906,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":96,"s":[91.498,107.352,0],"to":[-2.906,0,0],"ti":[2.541,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":97,"s":[83.343,107.352,0],"to":[-2.541,0,0],"ti":[2.198,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":98,"s":[76.25,107.352,0],"to":[-2.198,0,0],"ti":[1.875,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.182},"t":99,"s":[70.157,107.352,0],"to":[-1.875,0,0],"ti":[1.574,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.184},"t":100,"s":[64.999,107.352,0],"to":[-1.574,0,0],"ti":[1.294,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.186},"t":101,"s":[60.714,107.352,0],"to":[-1.294,0,0],"ti":[1.035,0,0]},{"i":{"x":0.833,"y":0.854},"o":{"x":0.167,"y":0.189},"t":102,"s":[57.236,107.352,0],"to":[-1.035,0,0],"ti":[0.797,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.194},"t":103,"s":[54.503,107.352,0],"to":[-0.797,0,0],"ti":[0.581,0,0]},{"i":{"x":0.833,"y":0.866},"o":{"x":0.167,"y":0.203},"t":104,"s":[52.451,107.352,0],"to":[-0.581,0,0],"ti":[0.386,0,0]},{"i":{"x":0.833,"y":0.88},"o":{"x":0.167,"y":0.219},"t":105,"s":[51.017,107.352,0],"to":[-0.386,0,0],"ti":[0.212,0,0]},{"i":{"x":0.833,"y":0.895},"o":{"x":0.167,"y":0.271},"t":106,"s":[50.136,107.352,0],"to":[-0.212,0,0],"ti":[0.059,0,0]},{"i":{"x":0.833,"y":0.594},"o":{"x":0.167,"y":0.399},"t":107,"s":[49.746,107.352,0],"to":[-0.059,0,0],"ti":[-0.072,0,0]},{"i":{"x":0.833,"y":0.771},"o":{"x":0.167,"y":0.105},"t":108,"s":[49.782,107.352,0],"to":[0.072,0,0],"ti":[-0.183,0,0]},{"i":{"x":0.833,"y":0.805},"o":{"x":0.167,"y":0.131},"t":109,"s":[50.18,107.352,0],"to":[0.183,0,0],"ti":[-0.272,0,0]},{"i":{"x":0.833,"y":0.818},"o":{"x":0.167,"y":0.146},"t":110,"s":[50.878,107.352,0],"to":[0.272,0,0],"ti":[-0.34,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.154},"t":111,"s":[51.812,107.352,0],"to":[0.34,0,0],"ti":[-0.387,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.159},"t":112,"s":[52.917,107.352,0],"to":[0.387,0,0],"ti":[-0.412,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.164},"t":113,"s":[54.131,107.352,0],"to":[0.412,0,0],"ti":[-0.416,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.168},"t":114,"s":[55.389,107.352,0],"to":[0.416,0,0],"ti":[-0.399,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.173},"t":115,"s":[56.629,107.352,0],"to":[0.399,0,0],"ti":[-0.361,0,0]},{"i":{"x":0.833,"y":0.851},"o":{"x":0.167,"y":0.179},"t":116,"s":[57.785,107.352,0],"to":[0.361,0,0],"ti":[-0.302,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.189},"t":117,"s":[58.796,107.352,0],"to":[0.302,0,0],"ti":[-0.221,0,0]},{"i":{"x":0.833,"y":0.887},"o":{"x":0.167,"y":0.21},"t":118,"s":[59.596,107.352,0],"to":[0.221,0,0],"ti":[-0.119,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.315},"t":119,"s":[60.123,107.352,0],"to":[0.119,0,0],"ti":[-0.032,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[60.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[60.313,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"A","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":5,"nm":"o","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[218.063,107.352,0],"to":[-2.432,0,0],"ti":[4.531,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[203.472,107.352,0],"to":[-4.531,0,0],"ti":[3.889,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[190.876,107.352,0],"to":[-3.889,0,0],"ti":[3.291,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[180.139,107.352,0],"to":[-3.291,0,0],"ti":[2.739,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[171.127,107.352,0],"to":[-2.739,0,0],"ti":[2.231,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[163.705,107.352,0],"to":[-2.231,0,0],"ti":[1.769,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[157.739,107.352,0],"to":[-1.769,0,0],"ti":[1.351,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[153.093,107.352,0],"to":[-1.351,0,0],"ti":[0.978,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[149.633,107.352,0],"to":[-0.978,0,0],"ti":[0.65,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[147.224,107.352,0],"to":[-0.65,0,0],"ti":[0.367,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[145.731,107.352,0],"to":[-0.367,0,0],"ti":[0.129,0,0]},{"i":{"x":0.833,"y":0.665},"o":{"x":0.167,"y":0.482},"t":11,"s":[145.02,107.352,0],"to":[-0.129,0,0],"ti":[-0.064,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[144.956,107.352,0],"to":[0.064,0,0],"ti":[-0.212,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[145.404,107.352,0],"to":[0.212,0,0],"ti":[-0.316,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[146.23,107.352,0],"to":[0.316,0,0],"ti":[-0.374,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[147.298,107.352,0],"to":[0.374,0,0],"ti":[-0.388,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[148.474,107.352,0],"to":[0.388,0,0],"ti":[-0.356,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[149.623,107.352,0],"to":[0.356,0,0],"ti":[-0.28,0,0]},{"i":{"x":0.833,"y":0.595},"o":{"x":0.167,"y":0.202},"t":18,"s":[150.611,107.352,0],"to":[0.28,0,0],"ti":[-0.159,0,0]},{"i":{"x":0.833,"y":0.388},"o":{"x":0.167,"y":0.105},"t":19,"s":[151.303,107.352,0],"to":[0.159,0,0],"ti":[2.781,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.096},"t":20,"s":[151.563,107.352,0],"to":[-2.781,0,0],"ti":[5.373,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":21,"s":[134.617,107.352,0],"to":[-5.373,0,0],"ti":[4.835,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":22,"s":[119.324,107.352,0],"to":[-4.835,0,0],"ti":[4.323,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":23,"s":[105.606,107.352,0],"to":[-4.323,0,0],"ti":[3.837,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":24,"s":[93.384,107.352,0],"to":[-3.837,0,0],"ti":[3.378,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":25,"s":[82.581,107.352,0],"to":[-3.378,0,0],"ti":[2.944,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":26,"s":[73.119,107.352,0],"to":[-2.944,0,0],"ti":[2.536,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":27,"s":[64.918,107.352,0],"to":[-2.536,0,0],"ti":[2.155,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":28,"s":[57.9,107.352,0],"to":[-2.155,0,0],"ti":[1.8,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":29,"s":[51.988,107.352,0],"to":[-1.8,0,0],"ti":[1.47,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":30,"s":[47.103,107.352,0],"to":[-1.47,0,0],"ti":[1.167,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":31,"s":[43.166,107.352,0],"to":[-1.167,0,0],"ti":[0.89,0,0]},{"i":{"x":0.833,"y":0.86},"o":{"x":0.167,"y":0.196},"t":32,"s":[40.1,107.352,0],"to":[-0.89,0,0],"ti":[0.639,0,0]},{"i":{"x":0.833,"y":0.867},"o":{"x":0.167,"y":0.205},"t":33,"s":[37.827,107.352,0],"to":[-0.639,0,0],"ti":[0.414,0,0]},{"i":{"x":0.833,"y":0.884},"o":{"x":0.167,"y":0.224},"t":34,"s":[36.267,107.352,0],"to":[-0.414,0,0],"ti":[0.215,0,0]},{"i":{"x":0.833,"y":0.884},"o":{"x":0.167,"y":0.293},"t":35,"s":[35.343,107.352,0],"to":[-0.215,0,0],"ti":[0.042,0,0]},{"i":{"x":0.833,"y":0.615},"o":{"x":0.167,"y":0.299},"t":36,"s":[34.976,107.352,0],"to":[-0.042,0,0],"ti":[-0.104,0,0]},{"i":{"x":0.833,"y":0.781},"o":{"x":0.167,"y":0.106},"t":37,"s":[35.089,107.352,0],"to":[0.104,0,0],"ti":[-0.225,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.135},"t":38,"s":[35.602,107.352,0],"to":[0.225,0,0],"ti":[-0.319,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.148},"t":39,"s":[36.438,107.352,0],"to":[0.319,0,0],"ti":[-0.388,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.156},"t":40,"s":[37.518,107.352,0],"to":[0.388,0,0],"ti":[-0.43,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.161},"t":41,"s":[38.764,107.352,0],"to":[0.43,0,0],"ti":[-0.446,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.166},"t":42,"s":[40.099,107.352,0],"to":[0.446,0,0],"ti":[-0.436,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.171},"t":43,"s":[41.442,107.352,0],"to":[0.436,0,0],"ti":[-0.4,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.178},"t":44,"s":[42.717,107.352,0],"to":[0.4,0,0],"ti":[-0.338,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.187},"t":45,"s":[43.845,107.352,0],"to":[0.338,0,0],"ti":[-0.25,0,0]},{"i":{"x":0.833,"y":0.696},"o":{"x":0.167,"y":0.209},"t":46,"s":[44.747,107.352,0],"to":[0.25,0,0],"ti":[-0.136,0,0]},{"i":{"x":0.833,"y":0.313},"o":{"x":0.167,"y":0.115},"t":47,"s":[45.346,107.352,0],"to":[0.136,0,0],"ti":[-1.95,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.095},"t":48,"s":[45.563,107.352,0],"to":[1.95,0,0],"ti":[-3.704,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.172},"t":49,"s":[57.048,107.352,0],"to":[3.704,0,0],"ti":[-3.459,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":50,"s":[67.787,107.352,0],"to":[3.459,0,0],"ti":[-3.222,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":51,"s":[77.802,107.352,0],"to":[3.222,0,0],"ti":[-2.992,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":52,"s":[87.118,107.352,0],"to":[2.992,0,0],"ti":[-2.771,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":53,"s":[95.756,107.352,0],"to":[2.771,0,0],"ti":[-2.557,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":54,"s":[103.741,107.352,0],"to":[2.557,0,0],"ti":[-2.35,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":55,"s":[111.096,107.352,0],"to":[2.35,0,0],"ti":[-2.152,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":56,"s":[117.844,107.352,0],"to":[2.152,0,0],"ti":[-1.961,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":57,"s":[124.007,107.352,0],"to":[1.961,0,0],"ti":[-1.778,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":58,"s":[129.61,107.352,0],"to":[1.778,0,0],"ti":[-1.603,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":59,"s":[134.675,107.352,0],"to":[1.603,0,0],"ti":[-1.435,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":60,"s":[139.226,107.352,0],"to":[1.435,0,0],"ti":[-1.275,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":61,"s":[143.285,107.352,0],"to":[1.275,0,0],"ti":[-1.123,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.178},"t":62,"s":[146.877,107.352,0],"to":[1.123,0,0],"ti":[-0.979,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":63,"s":[150.023,107.352,0],"to":[0.979,0,0],"ti":[-0.842,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":64,"s":[152.748,107.352,0],"to":[0.842,0,0],"ti":[-0.713,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":65,"s":[155.074,107.352,0],"to":[0.713,0,0],"ti":[-0.592,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":66,"s":[157.025,107.352,0],"to":[0.592,0,0],"ti":[-0.478,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.188},"t":67,"s":[158.624,107.352,0],"to":[0.478,0,0],"ti":[-0.372,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.193},"t":68,"s":[159.895,107.352,0],"to":[0.372,0,0],"ti":[-0.274,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.201},"t":69,"s":[160.859,107.352,0],"to":[0.274,0,0],"ti":[-0.184,0,0]},{"i":{"x":0.833,"y":0.88},"o":{"x":0.167,"y":0.218},"t":70,"s":[161.541,107.352,0],"to":[0.184,0,0],"ti":[-0.101,0,0]},{"i":{"x":0.833,"y":0.892},"o":{"x":0.167,"y":0.272},"t":71,"s":[161.963,107.352,0],"to":[0.101,0,0],"ti":[-0.027,0,0]},{"i":{"x":0.833,"y":0.587},"o":{"x":0.167,"y":0.367},"t":72,"s":[162.15,107.352,0],"to":[0.027,0,0],"ti":[0.04,0,0]},{"i":{"x":0.833,"y":0.769},"o":{"x":0.167,"y":0.104},"t":73,"s":[162.123,107.352,0],"to":[-0.04,0,0],"ti":[0.1,0,0]},{"i":{"x":0.833,"y":0.802},"o":{"x":0.167,"y":0.13},"t":74,"s":[161.907,107.352,0],"to":[-0.1,0,0],"ti":[0.152,0,0]},{"i":{"x":0.833,"y":0.814},"o":{"x":0.167,"y":0.144},"t":75,"s":[161.524,107.352,0],"to":[-0.152,0,0],"ti":[0.195,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.151},"t":76,"s":[160.998,107.352,0],"to":[-0.195,0,0],"ti":[0.232,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.156},"t":77,"s":[160.351,107.352,0],"to":[-0.232,0,0],"ti":[0.26,0,0]},{"i":{"x":0.833,"y":0.828},"o":{"x":0.167,"y":0.159},"t":78,"s":[159.608,107.352,0],"to":[-0.26,0,0],"ti":[0.281,0,0]},{"i":{"x":0.833,"y":0.831},"o":{"x":0.167,"y":0.162},"t":79,"s":[158.79,107.352,0],"to":[-0.281,0,0],"ti":[0.294,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.164},"t":80,"s":[157.923,107.352,0],"to":[-0.294,0,0],"ti":[0.299,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.166},"t":81,"s":[157.027,107.352,0],"to":[-0.299,0,0],"ti":[0.297,0,0]},{"i":{"x":0.833,"y":0.837},"o":{"x":0.167,"y":0.168},"t":82,"s":[156.128,107.352,0],"to":[-0.297,0,0],"ti":[0.286,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.171},"t":83,"s":[155.247,107.352,0],"to":[-0.286,0,0],"ti":[0.269,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.174},"t":84,"s":[154.409,107.352,0],"to":[-0.269,0,0],"ti":[0.243,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.177},"t":85,"s":[153.636,107.352,0],"to":[-0.243,0,0],"ti":[0.21,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.183},"t":86,"s":[152.952,107.352,0],"to":[-0.21,0,0],"ti":[0.168,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.192},"t":87,"s":[152.379,107.352,0],"to":[-0.168,0,0],"ti":[0.12,0,0]},{"i":{"x":0.833,"y":0.186},"o":{"x":0.167,"y":0.214},"t":88,"s":[151.941,107.352,0],"to":[-0.12,0,0],"ti":[0.063,0,0]},{"i":{"x":0.833,"y":0.341},"o":{"x":0.167,"y":0.093},"t":89,"s":[151.661,107.352,0],"to":[-0.063,0,0],"ti":[2.841,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.095},"t":90,"s":[151.563,107.352,0],"to":[-2.841,0,0],"ti":[5.373,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":91,"s":[134.617,107.352,0],"to":[-5.373,0,0],"ti":[4.835,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":92,"s":[119.324,107.352,0],"to":[-4.835,0,0],"ti":[4.323,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":93,"s":[105.606,107.352,0],"to":[-4.323,0,0],"ti":[3.837,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":94,"s":[93.384,107.352,0],"to":[-3.837,0,0],"ti":[3.378,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":95,"s":[82.581,107.352,0],"to":[-3.378,0,0],"ti":[2.944,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":96,"s":[73.119,107.352,0],"to":[-2.944,0,0],"ti":[2.536,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":97,"s":[64.918,107.352,0],"to":[-2.536,0,0],"ti":[2.155,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":98,"s":[57.9,107.352,0],"to":[-2.155,0,0],"ti":[1.8,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":99,"s":[51.988,107.352,0],"to":[-1.8,0,0],"ti":[1.47,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":100,"s":[47.103,107.352,0],"to":[-1.47,0,0],"ti":[1.167,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":101,"s":[43.166,107.352,0],"to":[-1.167,0,0],"ti":[0.89,0,0]},{"i":{"x":0.833,"y":0.86},"o":{"x":0.167,"y":0.196},"t":102,"s":[40.1,107.352,0],"to":[-0.89,0,0],"ti":[0.639,0,0]},{"i":{"x":0.833,"y":0.867},"o":{"x":0.167,"y":0.205},"t":103,"s":[37.827,107.352,0],"to":[-0.639,0,0],"ti":[0.414,0,0]},{"i":{"x":0.833,"y":0.884},"o":{"x":0.167,"y":0.224},"t":104,"s":[36.267,107.352,0],"to":[-0.414,0,0],"ti":[0.215,0,0]},{"i":{"x":0.833,"y":0.884},"o":{"x":0.167,"y":0.293},"t":105,"s":[35.343,107.352,0],"to":[-0.215,0,0],"ti":[0.042,0,0]},{"i":{"x":0.833,"y":0.615},"o":{"x":0.167,"y":0.299},"t":106,"s":[34.976,107.352,0],"to":[-0.042,0,0],"ti":[-0.104,0,0]},{"i":{"x":0.833,"y":0.781},"o":{"x":0.167,"y":0.106},"t":107,"s":[35.089,107.352,0],"to":[0.104,0,0],"ti":[-0.225,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.135},"t":108,"s":[35.602,107.352,0],"to":[0.225,0,0],"ti":[-0.319,0,0]},{"i":{"x":0.833,"y":0.821},"o":{"x":0.167,"y":0.148},"t":109,"s":[36.438,107.352,0],"to":[0.319,0,0],"ti":[-0.388,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.156},"t":110,"s":[37.518,107.352,0],"to":[0.388,0,0],"ti":[-0.43,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.161},"t":111,"s":[38.764,107.352,0],"to":[0.43,0,0],"ti":[-0.446,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.166},"t":112,"s":[40.099,107.352,0],"to":[0.446,0,0],"ti":[-0.436,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.171},"t":113,"s":[41.442,107.352,0],"to":[0.436,0,0],"ti":[-0.4,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.178},"t":114,"s":[42.717,107.352,0],"to":[0.4,0,0],"ti":[-0.338,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.187},"t":115,"s":[43.845,107.352,0],"to":[0.338,0,0],"ti":[-0.25,0,0]},{"i":{"x":0.833,"y":0.886},"o":{"x":0.167,"y":0.209},"t":116,"s":[44.747,107.352,0],"to":[0.25,0,0],"ti":[-0.136,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.313},"t":117,"s":[45.346,107.352,0],"to":[0.136,0,0],"ti":[-0.036,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[45.563,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[45.563,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"O","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":5,"nm":"L","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.898]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.456]},"t":1,"s":[81.741]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[1.522]},"t":2,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":50,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":51,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":52,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":53,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":55,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":56,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":58,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":59,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":60,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":62,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":63,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":64,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":65,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":67,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":68,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":69,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":70,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":71,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":74,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":75,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":76,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":77,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":79,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":80,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":81,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":83,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":84,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":86,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":87,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":88,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":89,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":90,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":91,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":92,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":93,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":95,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":96,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":97,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":98,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":99,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":100,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":101,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":102,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":103,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":104,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":105,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":108,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":109,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":110,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":111,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":112,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":113,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":114,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":115,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":116,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":117,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":118,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":119,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":120,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":121,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":122,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":123,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":124,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":125,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":126,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":127,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":128,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":129,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":130,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":131,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":132,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":133,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":134,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":135,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":136,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":137,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":138,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":139,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":140,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":141,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":142,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":144,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":145,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":146,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":147,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":148,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":149,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":151,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":152,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":153,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":155,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":156,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":157,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":158,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":159,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":160,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":161,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":162,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":163,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":164,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":165,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":166,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":167,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":168,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":169,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":170,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":171,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":172,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":173,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":174,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":175,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":176,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":177,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":178,"s":[100]},{"t":179,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0]},{"t":90,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.167},"t":0,"s":[215.813,107.352,0],"to":[-2.834,0,0],"ti":[5.281,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":1,"s":[198.809,107.352,0],"to":[-5.281,0,0],"ti":[4.532,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":2,"s":[184.129,107.352,0],"to":[-4.532,0,0],"ti":[3.836,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":3,"s":[171.616,107.352,0],"to":[-3.836,0,0],"ti":[3.192,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":4,"s":[161.113,107.352,0],"to":[-3.192,0,0],"ti":[2.601,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.187},"t":5,"s":[152.464,107.352,0],"to":[-2.601,0,0],"ti":[2.061,0,0]},{"i":{"x":0.833,"y":0.855},"o":{"x":0.167,"y":0.19},"t":6,"s":[145.51,107.352,0],"to":[-2.061,0,0],"ti":[1.574,0,0]},{"i":{"x":0.833,"y":0.859},"o":{"x":0.167,"y":0.195},"t":7,"s":[140.096,107.352,0],"to":[-1.574,0,0],"ti":[1.14,0,0]},{"i":{"x":0.833,"y":0.865},"o":{"x":0.167,"y":0.203},"t":8,"s":[136.063,107.352,0],"to":[-1.14,0,0],"ti":[0.758,0,0]},{"i":{"x":0.833,"y":0.877},"o":{"x":0.167,"y":0.218},"t":9,"s":[133.256,107.352,0],"to":[-0.758,0,0],"ti":[0.428,0,0]},{"i":{"x":0.833,"y":0.899},"o":{"x":0.167,"y":0.258},"t":10,"s":[131.516,107.352,0],"to":[-0.428,0,0],"ti":[0.151,0,0]},{"i":{"x":0.833,"y":0.667},"o":{"x":0.167,"y":0.48},"t":11,"s":[130.688,107.352,0],"to":[-0.151,0,0],"ti":[-0.075,0,0]},{"i":{"x":0.833,"y":0.763},"o":{"x":0.167,"y":0.111},"t":12,"s":[130.613,107.352,0],"to":[0.075,0,0],"ti":[-0.247,0,0]},{"i":{"x":0.833,"y":0.809},"o":{"x":0.167,"y":0.129},"t":13,"s":[131.135,107.352,0],"to":[0.247,0,0],"ti":[-0.368,0,0]},{"i":{"x":0.833,"y":0.825},"o":{"x":0.167,"y":0.148},"t":14,"s":[132.098,107.352,0],"to":[0.368,0,0],"ti":[-0.436,0,0]},{"i":{"x":0.833,"y":0.835},"o":{"x":0.167,"y":0.159},"t":15,"s":[133.342,107.352,0],"to":[0.436,0,0],"ti":[-0.452,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.169},"t":16,"s":[134.713,107.352,0],"to":[0.452,0,0],"ti":[-0.415,0,0]},{"i":{"x":0.833,"y":0.858},"o":{"x":0.167,"y":0.18},"t":17,"s":[136.052,107.352,0],"to":[0.415,0,0],"ti":[-0.326,0,0]},{"i":{"x":0.833,"y":0.619},"o":{"x":0.167,"y":0.202},"t":18,"s":[137.204,107.352,0],"to":[0.326,0,0],"ti":[-0.185,0,0]},{"i":{"x":0.833,"y":0.39},"o":{"x":0.167,"y":0.107},"t":19,"s":[138.009,107.352,0],"to":[0.185,0,0],"ti":[2.979,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.097},"t":20,"s":[138.313,107.352,0],"to":[-2.979,0,0],"ti":[5.742,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":21,"s":[120.133,107.352,0],"to":[-5.742,0,0],"ti":[5.121,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":22,"s":[103.863,107.352,0],"to":[-5.121,0,0],"ti":[4.533,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":23,"s":[89.406,107.352,0],"to":[-4.533,0,0],"ti":[3.978,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":24,"s":[76.663,107.352,0],"to":[-3.978,0,0],"ti":[3.455,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":25,"s":[65.538,107.352,0],"to":[-3.455,0,0],"ti":[2.965,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":26,"s":[55.931,107.352,0],"to":[-2.965,0,0],"ti":[2.508,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":27,"s":[47.747,107.352,0],"to":[-2.508,0,0],"ti":[2.083,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":28,"s":[40.886,107.352,0],"to":[-2.083,0,0],"ti":[1.69,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.188},"t":29,"s":[35.251,107.352,0],"to":[-1.69,0,0],"ti":[1.33,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.191},"t":30,"s":[30.745,107.352,0],"to":[-1.33,0,0],"ti":[1.003,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.197},"t":31,"s":[27.269,107.352,0],"to":[-1.003,0,0],"ti":[0.709,0,0]},{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.207},"t":32,"s":[24.725,107.352,0],"to":[-0.709,0,0],"ti":[0.447,0,0]},{"i":{"x":0.833,"y":0.888},"o":{"x":0.167,"y":0.23},"t":33,"s":[23.017,107.352,0],"to":[-0.447,0,0],"ti":[0.217,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.327},"t":34,"s":[22.046,107.352,0],"to":[-0.217,0,0],"ti":[0.02,0,0]},{"i":{"x":0.833,"y":0.664},"o":{"x":0.167,"y":0.211},"t":35,"s":[21.714,107.352,0],"to":[-0.02,0,0],"ti":[-0.144,0,0]},{"i":{"x":0.833,"y":0.789},"o":{"x":0.167,"y":0.111},"t":36,"s":[21.924,107.352,0],"to":[0.144,0,0],"ti":[-0.276,0,0]},{"i":{"x":0.833,"y":0.813},"o":{"x":0.167,"y":0.138},"t":37,"s":[22.579,107.352,0],"to":[0.276,0,0],"ti":[-0.375,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.15},"t":38,"s":[23.579,107.352,0],"to":[0.375,0,0],"ti":[-0.441,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.158},"t":39,"s":[24.828,107.352,0],"to":[0.441,0,0],"ti":[-0.475,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.164},"t":40,"s":[26.227,107.352,0],"to":[0.475,0,0],"ti":[-0.477,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.169},"t":41,"s":[27.679,107.352,0],"to":[0.477,0,0],"ti":[-0.445,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.176},"t":42,"s":[29.087,107.352,0],"to":[0.445,0,0],"ti":[-0.382,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.186},"t":43,"s":[30.352,107.352,0],"to":[0.382,0,0],"ti":[-0.285,0,0]},{"i":{"x":0.833,"y":0.735},"o":{"x":0.167,"y":0.208},"t":44,"s":[31.376,107.352,0],"to":[0.285,0,0],"ti":[-0.156,0,0]},{"i":{"x":0.833,"y":0.305},"o":{"x":0.167,"y":0.122},"t":45,"s":[32.062,107.352,0],"to":[0.156,0,0],"ti":[-1.872,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.095},"t":46,"s":[32.313,107.352,0],"to":[1.872,0,0],"ti":[-3.546,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.172},"t":47,"s":[43.292,107.352,0],"to":[3.546,0,0],"ti":[-3.323,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.172},"t":48,"s":[53.591,107.352,0],"to":[3.323,0,0],"ti":[-3.106,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":49,"s":[63.228,107.352,0],"to":[3.106,0,0],"ti":[-2.896,0,0]},{"i":{"x":0.833,"y":0.839},"o":{"x":0.167,"y":0.173},"t":50,"s":[72.225,107.352,0],"to":[2.896,0,0],"ti":[-2.692,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":51,"s":[80.601,107.352,0],"to":[2.692,0,0],"ti":[-2.495,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.173},"t":52,"s":[88.377,107.352,0],"to":[2.495,0,0],"ti":[-2.305,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":53,"s":[95.573,107.352,0],"to":[2.305,0,0],"ti":[-2.122,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.174},"t":54,"s":[102.209,107.352,0],"to":[2.122,0,0],"ti":[-1.945,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.174},"t":55,"s":[108.305,107.352,0],"to":[1.945,0,0],"ti":[-1.776,0,0]},{"i":{"x":0.833,"y":0.841},"o":{"x":0.167,"y":0.175},"t":56,"s":[113.881,107.352,0],"to":[1.776,0,0],"ti":[-1.612,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.175},"t":57,"s":[118.958,107.352,0],"to":[1.612,0,0],"ti":[-1.456,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.176},"t":58,"s":[123.556,107.352,0],"to":[1.456,0,0],"ti":[-1.306,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":59,"s":[127.695,107.352,0],"to":[1.306,0,0],"ti":[-1.163,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":60,"s":[131.394,107.352,0],"to":[1.163,0,0],"ti":[-1.027,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":61,"s":[134.675,107.352,0],"to":[1.027,0,0],"ti":[-0.898,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":62,"s":[137.557,107.352,0],"to":[0.898,0,0],"ti":[-0.775,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.181},"t":63,"s":[140.061,107.352,0],"to":[0.775,0,0],"ti":[-0.659,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.182},"t":64,"s":[142.206,107.352,0],"to":[0.659,0,0],"ti":[-0.549,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.184},"t":65,"s":[144.014,107.352,0],"to":[0.549,0,0],"ti":[-0.447,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.187},"t":66,"s":[145.503,107.352,0],"to":[0.447,0,0],"ti":[-0.351,0,0]},{"i":{"x":0.833,"y":0.857},"o":{"x":0.167,"y":0.192},"t":67,"s":[146.695,107.352,0],"to":[0.351,0,0],"ti":[-0.262,0,0]},{"i":{"x":0.833,"y":0.863},"o":{"x":0.167,"y":0.199},"t":68,"s":[147.609,107.352,0],"to":[0.262,0,0],"ti":[-0.179,0,0]},{"i":{"x":0.833,"y":0.876},"o":{"x":0.167,"y":0.214},"t":69,"s":[148.266,107.352,0],"to":[0.179,0,0],"ti":[-0.104,0,0]},{"i":{"x":0.833,"y":0.897},"o":{"x":0.167,"y":0.256},"t":70,"s":[148.685,107.352,0],"to":[0.104,0,0],"ti":[-0.035,0,0]},{"i":{"x":0.833,"y":0.616},"o":{"x":0.167,"y":0.439},"t":71,"s":[148.887,107.352,0],"to":[0.035,0,0],"ti":[0.028,0,0]},{"i":{"x":0.833,"y":0.757},"o":{"x":0.167,"y":0.106},"t":72,"s":[148.893,107.352,0],"to":[-0.028,0,0],"ti":[0.083,0,0]},{"i":{"x":0.833,"y":0.799},"o":{"x":0.167,"y":0.127},"t":73,"s":[148.721,107.352,0],"to":[-0.083,0,0],"ti":[0.132,0,0]},{"i":{"x":0.833,"y":0.812},"o":{"x":0.167,"y":0.142},"t":74,"s":[148.393,107.352,0],"to":[-0.132,0,0],"ti":[0.174,0,0]},{"i":{"x":0.833,"y":0.82},"o":{"x":0.167,"y":0.15},"t":75,"s":[147.929,107.352,0],"to":[-0.174,0,0],"ti":[0.21,0,0]},{"i":{"x":0.833,"y":0.824},"o":{"x":0.167,"y":0.155},"t":76,"s":[147.349,107.352,0],"to":[-0.21,0,0],"ti":[0.238,0,0]},{"i":{"x":0.833,"y":0.827},"o":{"x":0.167,"y":0.158},"t":77,"s":[146.672,107.352,0],"to":[-0.238,0,0],"ti":[0.26,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.161},"t":78,"s":[145.92,107.352,0],"to":[-0.26,0,0],"ti":[0.275,0,0]},{"i":{"x":0.833,"y":0.832},"o":{"x":0.167,"y":0.163},"t":79,"s":[145.111,107.352,0],"to":[-0.275,0,0],"ti":[0.284,0,0]},{"i":{"x":0.833,"y":0.834},"o":{"x":0.167,"y":0.165},"t":80,"s":[144.268,107.352,0],"to":[-0.284,0,0],"ti":[0.286,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.167},"t":81,"s":[143.409,107.352,0],"to":[-0.286,0,0],"ti":[0.281,0,0]},{"i":{"x":0.833,"y":0.838},"o":{"x":0.167,"y":0.169},"t":82,"s":[142.554,107.352,0],"to":[-0.281,0,0],"ti":[0.269,0,0]},{"i":{"x":0.833,"y":0.84},"o":{"x":0.167,"y":0.171},"t":83,"s":[141.725,107.352,0],"to":[-0.269,0,0],"ti":[0.251,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.174},"t":84,"s":[140.941,107.352,0],"to":[-0.251,0,0],"ti":[0.225,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.178},"t":85,"s":[140.222,107.352,0],"to":[-0.225,0,0],"ti":[0.194,0,0]},{"i":{"x":0.833,"y":0.853},"o":{"x":0.167,"y":0.183},"t":86,"s":[139.588,107.352,0],"to":[-0.194,0,0],"ti":[0.155,0,0]},{"i":{"x":0.833,"y":0.864},"o":{"x":0.167,"y":0.193},"t":87,"s":[139.061,107.352,0],"to":[-0.155,0,0],"ti":[0.11,0,0]},{"i":{"x":0.833,"y":0.057},"o":{"x":0.167,"y":0.214},"t":88,"s":[138.659,107.352,0],"to":[-0.11,0,0],"ti":[0.058,0,0]},{"i":{"x":0.833,"y":0.343},"o":{"x":0.167,"y":0.091},"t":89,"s":[138.403,107.352,0],"to":[-0.058,0,0],"ti":[3.045,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.095},"t":90,"s":[138.313,107.352,0],"to":[-3.045,0,0],"ti":[5.742,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.176},"t":91,"s":[120.133,107.352,0],"to":[-5.742,0,0],"ti":[5.121,0,0]},{"i":{"x":0.833,"y":0.843},"o":{"x":0.167,"y":0.177},"t":92,"s":[103.863,107.352,0],"to":[-5.121,0,0],"ti":[4.533,0,0]},{"i":{"x":0.833,"y":0.844},"o":{"x":0.167,"y":0.178},"t":93,"s":[89.406,107.352,0],"to":[-4.533,0,0],"ti":[3.978,0,0]},{"i":{"x":0.833,"y":0.845},"o":{"x":0.167,"y":0.179},"t":94,"s":[76.663,107.352,0],"to":[-3.978,0,0],"ti":[3.455,0,0]},{"i":{"x":0.833,"y":0.846},"o":{"x":0.167,"y":0.18},"t":95,"s":[65.538,107.352,0],"to":[-3.455,0,0],"ti":[2.965,0,0]},{"i":{"x":0.833,"y":0.847},"o":{"x":0.167,"y":0.181},"t":96,"s":[55.931,107.352,0],"to":[-2.965,0,0],"ti":[2.508,0,0]},{"i":{"x":0.833,"y":0.848},"o":{"x":0.167,"y":0.183},"t":97,"s":[47.747,107.352,0],"to":[-2.508,0,0],"ti":[2.083,0,0]},{"i":{"x":0.833,"y":0.85},"o":{"x":0.167,"y":0.185},"t":98,"s":[40.886,107.352,0],"to":[-2.083,0,0],"ti":[1.69,0,0]},{"i":{"x":0.833,"y":0.852},"o":{"x":0.167,"y":0.188},"t":99,"s":[35.251,107.352,0],"to":[-1.69,0,0],"ti":[1.33,0,0]},{"i":{"x":0.833,"y":0.856},"o":{"x":0.167,"y":0.191},"t":100,"s":[30.745,107.352,0],"to":[-1.33,0,0],"ti":[1.003,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.197},"t":101,"s":[27.269,107.352,0],"to":[-1.003,0,0],"ti":[0.709,0,0]},{"i":{"x":0.833,"y":0.869},"o":{"x":0.167,"y":0.207},"t":102,"s":[24.725,107.352,0],"to":[-0.709,0,0],"ti":[0.447,0,0]},{"i":{"x":0.833,"y":0.888},"o":{"x":0.167,"y":0.23},"t":103,"s":[23.017,107.352,0],"to":[-0.447,0,0],"ti":[0.217,0,0]},{"i":{"x":0.833,"y":0.862},"o":{"x":0.167,"y":0.327},"t":104,"s":[22.046,107.352,0],"to":[-0.217,0,0],"ti":[0.02,0,0]},{"i":{"x":0.833,"y":0.664},"o":{"x":0.167,"y":0.211},"t":105,"s":[21.714,107.352,0],"to":[-0.02,0,0],"ti":[-0.144,0,0]},{"i":{"x":0.833,"y":0.789},"o":{"x":0.167,"y":0.111},"t":106,"s":[21.924,107.352,0],"to":[0.144,0,0],"ti":[-0.276,0,0]},{"i":{"x":0.833,"y":0.813},"o":{"x":0.167,"y":0.138},"t":107,"s":[22.579,107.352,0],"to":[0.276,0,0],"ti":[-0.375,0,0]},{"i":{"x":0.833,"y":0.823},"o":{"x":0.167,"y":0.15},"t":108,"s":[23.579,107.352,0],"to":[0.375,0,0],"ti":[-0.441,0,0]},{"i":{"x":0.833,"y":0.83},"o":{"x":0.167,"y":0.158},"t":109,"s":[24.828,107.352,0],"to":[0.441,0,0],"ti":[-0.475,0,0]},{"i":{"x":0.833,"y":0.836},"o":{"x":0.167,"y":0.164},"t":110,"s":[26.227,107.352,0],"to":[0.475,0,0],"ti":[-0.477,0,0]},{"i":{"x":0.833,"y":0.842},"o":{"x":0.167,"y":0.169},"t":111,"s":[27.679,107.352,0],"to":[0.477,0,0],"ti":[-0.445,0,0]},{"i":{"x":0.833,"y":0.849},"o":{"x":0.167,"y":0.176},"t":112,"s":[29.087,107.352,0],"to":[0.445,0,0],"ti":[-0.382,0,0]},{"i":{"x":0.833,"y":0.861},"o":{"x":0.167,"y":0.186},"t":113,"s":[30.352,107.352,0],"to":[0.382,0,0],"ti":[-0.285,0,0]},{"i":{"x":0.833,"y":0.886},"o":{"x":0.167,"y":0.208},"t":114,"s":[31.376,107.352,0],"to":[0.285,0,0],"ti":[-0.156,0,0]},{"i":{"x":0.833,"y":0.917},"o":{"x":0.167,"y":0.312},"t":115,"s":[32.062,107.352,0],"to":[0.156,0,0],"ti":[-0.042,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":116,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":117,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":118,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":119,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":121,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":122,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":123,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":124,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":125,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":126,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":127,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":128,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":129,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":131,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":133,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":135,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":136,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":137,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":138,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":139,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":141,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":142,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":143,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":144,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":145,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":146,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":148,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":149,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":152,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":153,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":154,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":155,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":156,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":157,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":158,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":160,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":161,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":163,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":165,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":166,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":167,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":168,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":169,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":170,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":171,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":172,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":173,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":174,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":176,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":178,"s":[32.313,107.352,0],"to":[0,0,0],"ti":[0,0,0]},{"t":179,"s":[32.313,107.352,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":20,"s":[100,100,100]},{"t":90,"s":[100,100,100]}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":21,"f":"SegoeUIHistoric","t":"L","j":2,"tr":0,"lh":25.2,"ls":0,"fc":[0.086,0.086,0.086]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":180,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"L","size":21,"style":"Regular","w":47.07,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[45.508,-7.422],[17.383,-7.422],[17.383,-70.02],[9.18,-70.02],[9.18,0],[45.508,0]],"c":true},"ix":2},"nm":"L","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"L","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"O","size":21,"style":"Regular","w":75.39,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.055,6.641],[0,11.426],[5.908,6.511],[9.668,0],[6.087,-6.705],[0,-11.263],[-5.974,-6.543],[-9.929,0]],"o":[[6.055,-6.641],[0,-10.514],[-5.908,-6.51],[-10.482,0],[-6.087,6.706],[0,10.482],[5.973,6.543],[10.156,0]],"v":[[61.719,-8.789],[70.801,-35.889],[61.938,-61.426],[38.574,-71.191],[13.721,-61.133],[4.59,-34.18],[13.55,-8.643],[37.402,1.172]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-4.297,-5.045],[0,-9.245],[4.427,-5.013],[7.682,0],[4.475,5.257],[0,8.627],[-4.59,5.306],[-7.357,0]],"o":[[4.297,5.046],[0,9.017],[-4.427,5.013],[-7.195,0],[-4.476,-5.257],[0,-8.626],[4.59,-5.305],[7.552,0]],"v":[[55.762,-56.201],[62.207,-34.766],[55.566,-13.721],[37.402,-6.201],[19.897,-14.087],[13.184,-34.912],[20.068,-55.811],[37.988,-63.77]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"A","size":21,"style":"Regular","w":64.5,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[36.426,-70.02],[27.93,-70.02],[1.074,0],[10.205,0],[17.188,-19.629],[46.875,-19.629],[54.297,0],[63.379,0]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.326,1.986],[0,0],[-0.359,-0.977],[0,0]],"o":[[0,0],[0.423,-1.139],[0,0],[0.358,2.148],[0,0],[0,0]],"v":[[19.922,-27.002],[30.811,-56.836],[31.934,-61.523],[32.129,-61.523],[33.203,-56.836],[44.189,-27.002]],"c":true},"ix":2},"nm":"A","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"A","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"D","size":21,"style":"Regular","w":70.12,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.853,6.56],[0,10.808],[24.674,0],[0,0],[0,0]],"o":[[11.491,0],[6.852,-6.559],[0,-22.754],[0,0],[0,0],[0,0]],"v":[[27.734,0],[55.249,-9.839],[65.527,-35.889],[28.516,-70.02],[9.18,-70.02],[9.18,0]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,-17.936],[5.11,-4.915],[9.18,0],[0,0],[0,0]],"o":[[19.075,0],[0,9.017],[-5.111,4.916],[0,0],[0,0],[0,0]],"v":[[28.32,-62.598],[56.934,-35.693],[49.268,-14.795],[27.832,-7.422],[17.383,-7.422],[17.383,-62.598]],"c":true},"ix":2},"nm":"D","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"D","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"I","size":21,"style":"Regular","w":26.61,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[17.383,-70.02],[9.18,-70.02],[9.18,0],[17.383,0]],"c":true},"ix":2},"nm":"I","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"I","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"N","size":21,"style":"Regular","w":74.8,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.326,-2.018],[0,0],[1.465,2.279],[0,0],[0,0],[0,0],[0,0],[0,0],[0.26,1.498],[0,0],[-0.912,-1.399],[0,0],[0,0]],"o":[[0,0],[0,0],[0,4.851],[0,0],[-0.423,-0.846],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-4.915],[0,0],[0.586,1.53],[0,0],[0,0],[0,0]],"v":[[65.625,-70.02],[57.422,-70.02],[57.422,-20.703],[57.91,-10.4],[57.715,-10.4],[54.883,-15.088],[19.824,-70.02],[9.18,-70.02],[9.18,0],[17.383,0],[17.383,-50.586],[16.992,-60.205],[17.285,-60.205],[19.531,-55.811],[55.566,0],[65.625,0]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"N","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"},{"ch":"G","size":21,"style":"Regular","w":68.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[5.469,0],[4.655,5.062],[0,8.855],[-5.013,5.404],[-7.845,0],[-5.664,-3.58],[0,0],[7.617,0],[6.852,-6.95],[0,-10.84],[-6.169,-6.445],[-9.994,0],[-7.031,3.972]],"o":[[0,0],[0,0],[0,0],[0,0],[-4.004,2.181],[-7.976,0],[-4.655,-5.061],[0,-8.594],[5.013,-5.403],[7.747,0],[0,0],[-5.176,-2.473],[-10.515,0],[-6.853,6.95],[0,10.612],[6.168,6.445],[8.594,0],[0,0]],"v":[[61.523,-36.523],[37.988,-36.523],[37.988,-29.102],[53.32,-29.102],[53.32,-9.473],[39.111,-6.201],[20.166,-13.794],[13.184,-34.668],[20.703,-55.664],[39.99,-63.77],[60.107,-58.398],[60.107,-67.48],[40.918,-71.191],[14.868,-60.767],[4.59,-34.082],[13.843,-8.496],[38.086,1.172],[61.523,-4.785]],"c":true},"ix":2},"nm":"G","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"G","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Segoe UI Historic"}]} \ No newline at end of file diff --git a/app/src/main/assets/lottie/loading_alt.json b/app/src/main/assets/lottie/loading_alt.json new file mode 100644 index 0000000..3ec2b79 --- /dev/null +++ b/app/src/main/assets/lottie/loading_alt.json @@ -0,0 +1 @@ +{"v":"5.7.11","fr":60,"ip":0,"op":81,"w":1920,"h":1080,"nm":"Loading Dots","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Dot4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":25,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":39,"s":[100]},{"t":55,"s":[25]}],"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":25,"s":[1142,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":39,"s":[1142,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":55,"s":[1142,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[75,75,100]},{"t":55,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"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":[0.0671741336,0.713725490196,0,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":[-284,92],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Dot3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":31,"s":[100]},{"t":47,"s":[25]}],"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":17,"s":[1022,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[1022,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":47,"s":[1022,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":17,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":31,"s":[75,75,100]},{"t":47,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"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":[0.0671741336,0.713725490196,0,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":[-284,92],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Dot2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":23,"s":[100]},{"t":39,"s":[25]}],"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":9,"s":[902,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[902,500,0],"to":[0,0,0],"ti":[0,0,0]},{"t":39,"s":[902,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":9,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":23,"s":[75,75,100]},{"t":39,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"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":[0.0671741336,0.713725490196,0,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":[-284,92],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Dot1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":14,"s":[100]},{"t":30,"s":[25]}],"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":[782,540,0],"to":[0,-6.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":14,"s":[782,500,0],"to":[0,0,0],"ti":[0,-6.667,0]},{"t":30,"s":[782,540,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-284,92,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[50,50,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":14,"s":[75,75,100]},{"t":30,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[120,120],"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":[0.0671741336,0.713725490196,0,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":[-284,92],"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":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":360,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/AddCustomActionActivity.kt b/app/src/main/java/com/amz/genie/activities/AddCustomActionActivity.kt new file mode 100644 index 0000000..e6a1146 --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/AddCustomActionActivity.kt @@ -0,0 +1,645 @@ +package com.amz.genie.activities + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Bundle +import android.view.View +import android.widget.ArrayAdapter +import android.widget.AutoCompleteTextView +import android.widget.ImageButton +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.adapters.AttachmentAdapter +import com.amz.genie.adapters.RecipientAdapter +import com.amz.genie.adapters.RecipientPickerAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.helpers.Utils.uriToMultipartPart +import com.amz.genie.models.AttachmentItem +import com.amz.genie.models.Message +import com.amz.genie.models.Pegawai +import com.amz.genie.models.Pengguna +import com.amz.genie.models.PostAksi +import com.amz.genie.models.Tentang +import com.amz.genie.models.TipeKomunikasi +import com.amz.genie.services.APIMain +import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.textfield.TextInputEditText +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.JsonParser +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.io.File + +class AddCustomActionActivity : BaseActivity() { + + private lateinit var ibBack: ImageButton + private lateinit var actvTipeKomunikasi: AutoCompleteTextView + private lateinit var actvTentang: AutoCompleteTextView + + private lateinit var rvRecipient: RecyclerView + private lateinit var tvEmpty: TextView + private lateinit var tietDescription: TextInputEditText + private lateinit var btAttachment: MaterialButton + private lateinit var btSend: MaterialButton + private lateinit var llAttachmentsContainer: View + private lateinit var rvAttachments: RecyclerView + private lateinit var tvAddRecipient: TextView + private lateinit var attachmentAdapter: AttachmentAdapter + + private lateinit var recipientAdapter: RecipientAdapter + private val recipientOptions = mutableListOf() + private val selectedRecipients = mutableListOf() + private var idTipeKomunikasi = "" + private var idTentang = "" + private var cameraOutputUri: Uri? = null + private val attachments = mutableListOf() + private val takePictureLauncher = + registerForActivityResult(ActivityResultContracts.TakePicture()) { success -> + if (success) { + cameraOutputUri?.let { addAttachment(it) } + } + } + + private val pickFileLauncher = + registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> + if (uri != null) { + contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) + addAttachment(uri) + } + } + + private val requestCameraPermissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + if (granted) { + openCamera() + } else { + showSnack("Izin kamera ditolak") + } + } + + private fun openCameraWithPermission() { + val granted = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == + PackageManager.PERMISSION_GRANTED + + if (granted) { + openCamera() + } else { + requestCameraPermissionLauncher.launch(Manifest.permission.CAMERA) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_add_custom_action) + + initUI(savedInstanceState) + renderAttachments() + setupDropdowns() + } + + private fun initUI(savedInstanceState: Bundle?) { + ibBack = findViewById(R.id.ib_back_add_custom_action) + actvTipeKomunikasi = findViewById(R.id.actv_tipe_komunikasi_add_custom_action) + actvTentang = findViewById(R.id.actv_tentang_add_custom_action) + rvRecipient = findViewById(R.id.rv_recipient_add_custom_action) + tvEmpty = findViewById(R.id.tv_empty_add_custom_action) + btAttachment = findViewById(R.id.btn_attachment_add_custom_action) + btSend = findViewById(R.id.btn_send_add_custom_action) + llAttachmentsContainer = findViewById(R.id.ll_attachments_container_add_custom_action) + rvAttachments = findViewById(R.id.rv_attachments_add_custom_action) + tvAddRecipient = findViewById(R.id.tv_lbl_recipient_add_custom_action) + tietDescription = findViewById(R.id.et_description_add_custom_action) + + recipientAdapter = RecipientAdapter { pegawai -> + val idx = selectedRecipients.indexOfFirst { it.kode == pegawai.kode } + if (idx != -1) { + selectedRecipients.removeAt(idx) + renderRecipients() + showSnack("Penerima dihapus") + } + } + rvRecipient.layoutManager = LinearLayoutManager(this) + rvRecipient.adapter = recipientAdapter + + attachmentAdapter = AttachmentAdapter { item -> + attachments.remove(item) + renderAttachments() + } + + rvAttachments.layoutManager = GridLayoutManager(this, 2) + rvAttachments.adapter = attachmentAdapter + + setupActions() + } + + private fun renderRecipients() { + val hasData = selectedRecipients.isNotEmpty() + rvRecipient.visibility = if (hasData) View.VISIBLE else View.GONE + tvEmpty.visibility = if (hasData) View.GONE else View.VISIBLE + + recipientAdapter.submitList(selectedRecipients.toList()) + } + + private fun setupDropdowns() { + val communicationTypeList = ArrayList() + APIMain.require().selectionServices.communicationTypes( + Preferences.getAccessToken(this)) + .enqueue(object: Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + val body = response.body().orEmpty() + communicationTypeList.clear() + body.forEach { communicationTypeList.add(it.tipe_komunikasi) } + + val adapterTipe = ArrayAdapter(this@AddCustomActionActivity, + android.R.layout.simple_list_item_1, + communicationTypeList) + actvTipeKomunikasi.setAdapter(adapterTipe) + + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddCustomActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + showSnack(t.message ?: "Terjadi kesalahan") + } + + }) + } + + private fun setupActions() { + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + handleBackPress(0) + } + }) + + ibBack.setOnClickListener { handleBackPress(0) } + + actvTipeKomunikasi.setOnItemClickListener { parent, _, position, _ -> + val selected = parent.getItemAtPosition(position).toString() + idTipeKomunikasi = when (selected) { + "Bertanya" -> "A" + "Informasi" -> "I" + "Laporan" -> "L" + "Approval" -> "P" + "Pengajuan" -> "R" + "Penugasan" -> "T" + else -> "" + } + + val tentangList = ArrayList() + APIMain.require().selectionServices.tentangs( + Preferences.getAccessToken(this), idTipeKomunikasi) + .enqueue(object: Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + val body = response.body().orEmpty() + body.forEach { tentangList.add(it.tentang) } + + val adapterTentang = ArrayAdapter(this@AddCustomActionActivity, + android.R.layout.simple_list_item_1,tentangList) + actvTentang.setAdapter(adapterTentang) + + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddCustomActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + showSnack(t.message.toString()) + } + + }) + } + + actvTipeKomunikasi.setOnClickListener { actvTipeKomunikasi.showDropDown() } + + actvTentang.setOnClickListener { actvTentang.showDropDown() } + + actvTentang.setOnItemClickListener { parent, _, position, _ -> + selectedRecipients.clear() + renderRecipients() + + val selectedTentang = parent.getItemAtPosition(position).toString() + idTentang = when (selectedTentang) { + "Aturan" -> "A" + "Barang" -> "B" + "Kegiatan" -> "G" + "Jadwal" -> "J" + "Keadaan" -> "K" + "Layanan" -> "L" + "Orang" -> "O" + "Sistem" -> "S" + "Transaksi" -> "T" + "Uang" -> "U" + else -> "" + } + + APIMain.require().selectionServices.recipients( + Preferences.getAccessToken(this), idTipeKomunikasi, idTentang) + .enqueue(object: Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + val body = response.body().orEmpty() + val userData = Gson().fromJson(Preferences.getUserData(this@AddCustomActionActivity), + Pengguna::class.java) + + val filtered = body.filter { p -> + p.kode.trim() != userData.pegawai?.kode + } + + recipientOptions.clear() + recipientOptions.addAll(filtered) + + selectedRecipients.clear() + selectedRecipients.addAll(filtered) + renderRecipients() + + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddCustomActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + showSnack(t.message.toString()) + } + + }) + } + + btAttachment.setOnClickListener { + showAttachmentPickerDialog() + } + + tvAddRecipient.setOnClickListener { + if (isNetworkAvailable(this)) { + showProgressDialog(true) + APIMain.require().selectionServices.allRecipient( + Preferences.getAccessToken(this)) + .enqueue(object: Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + showProgressDialog(false) + + if (response.isSuccessful) { + val body = response.body().orEmpty() + val userData = Gson().fromJson(Preferences.getUserData(this@AddCustomActionActivity), + Pengguna::class.java) + + val filtered = body.filter { p -> + p.kode.trim() != userData.pegawai?.kode + } + showRecipientPickerDialog(ArrayList(filtered)) + + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddCustomActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + showProgressDialog(false) + showSnack(t.message.toString()) + } + + }) + + } else { + showProgressDialog(false) + + Snackbar.make(findViewById(android.R.id.content), + ContextCompat.getString(this@AddCustomActionActivity, + R.string.no_internet_message), + Snackbar.LENGTH_LONG + ).show() + } + } + + btSend.setOnClickListener { + showProgressDialog(true) + val semuaKodePegawai: List = selectedRecipients.map { it.kode } + + val newAksi = PostAksi( + null, semuaKodePegawai, idTentang, idTipeKomunikasi, + tietDescription.text.toString(), null + ) + + val gson = GsonBuilder() + .serializeNulls() + .create() + + val jsonData = gson.toJson(newAksi) + val dataBody: RequestBody = + jsonData.toRequestBody("application/json; charset=utf-8".toMediaType()) + + val filesParts: List = + attachments.map { a -> + this.uriToMultipartPart( + partName = "files", + uri = a.uri, + filenameOverride = a.name + ) + } + val filesPartsOrNull = filesParts.takeIf { it.isNotEmpty() } + APIMain.require().actionServices.add( + token = Preferences.getAccessToken(this@AddCustomActionActivity), + data = dataBody, + files = filesPartsOrNull + ).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + showProgressDialog(false) + showSnack("Berhasil kirim aksi") + finish() + return + } + + showProgressDialog(false) + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddCustomActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure(call: Call, t: Throwable) { + showProgressDialog(false) + showSnack(t.message ?: "Gagal kirim") + } + }) + } + + } + + private fun showSnack(message: String) { + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + + private fun showRecipientPickerDialog(allRecipient: ArrayList) { + val userData = Gson().fromJson(Preferences.getUserData(this@AddCustomActionActivity), + Pengguna::class.java) + + // ✅ buang pengirim dulu + val cleaned = allRecipient.filter { it.kode.trim() != userData.pegawai?.kode } + + if (cleaned.isEmpty()) { + showSnack("Daftar penerima kosong") + return + } + + // Base list: hanya yang belum ada di selectedRecipients + val baseList = cleaned.filter { ar -> + selectedRecipients.none { it.kode == ar.kode } + } + + if (baseList.isEmpty()) { + showSnack("Semua penerima sudah dipilih") + return + } + + val v = layoutInflater.inflate(R.layout.dialog_recipient_picker, null) + val rv = v.findViewById(R.id.rv_recipient_picker) + val sv = v.findViewById(R.id.sv_recipient) + + val dialog = MaterialAlertDialogBuilder(this) + .setTitle("Pilih Penerima") + .setView(v) + .setNegativeButton("Tutup", null) + .create() + + val pickerAdapter = RecipientPickerAdapter { picked -> + val exists = selectedRecipients.any { it.kode == picked.kode } + if (exists) { + showSnack("Penerima sudah dipilih") + return@RecipientPickerAdapter + } + + selectedRecipients.add(picked) + renderRecipients() + dialog.dismiss() + } + + rv.layoutManager = LinearLayoutManager(this) + rv.adapter = pickerAdapter + rv.setHasFixedSize(true) + + // tampil awal + pickerAdapter.submitList(baseList) + + // SEARCH + fun applyFilter(query: String?) { + val q = query.orEmpty().trim() + if (q.isEmpty()) { + pickerAdapter.submitList(baseList) + return + } + + val filtered = baseList.filter { p -> + val nama = p.nama + val kode = p.kode + nama.contains(q, ignoreCase = true) || kode.contains(q, ignoreCase = true) + } + + pickerAdapter.submitList(filtered) + } + + sv.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + applyFilter(query) + return true + } + + override fun onQueryTextChange(newText: String?): Boolean { + applyFilter(newText) + return true + } + }) + + dialog.show() + sv.requestFocus() + } + + private fun showAttachmentPickerDialog() { + val items = arrayOf("Kamera", "File Manager") + + MaterialAlertDialogBuilder(this) + .setTitle("Pilih Attachment") + .setItems(items) { _, which -> + when (which) { + 0 -> openCameraWithPermission() + 1 -> openFileManager() + } + } + .setNegativeButton("Batal", null) + .show() + } + + private fun openCamera() { + val imageFile = File.createTempFile( + "ATTACH_", + ".jpg", + cacheDir + ) + + val uri = FileProvider.getUriForFile( + this, + "${packageName}.fileprovider", + imageFile + ) + + cameraOutputUri = uri + takePictureLauncher.launch(uri) + } + + private fun openFileManager() { + pickFileLauncher.launch(arrayOf("image/*", "application/pdf")) + } + + private fun addAttachment(uri: Uri) { + if (attachments.any { it.uri == uri }) { + showSnack("Lampiran sudah ditambahkan") + return + } + val mime = contentResolver.getType(uri).orEmpty() + val name = queryDisplayName(uri) ?: "Attachment" + attachments.add(AttachmentItem(uri, name, mime)) + renderAttachments() + } + + private fun renderAttachments() { + val hasData = attachments.isNotEmpty() + llAttachmentsContainer.visibility = if (hasData) View.VISIBLE else View.GONE + + attachmentAdapter.submitList(attachments.toList()) + rvAttachments.visibility = if (hasData) View.VISIBLE else View.GONE + + val count = attachments.size + btAttachment.text = if (count > 0) "Lampiran ($count)" else getString(R.string.lbl_lampiran) + } + + private fun queryDisplayName(uri: Uri): String? { + val projection = arrayOf(android.provider.OpenableColumns.DISPLAY_NAME) + return runCatching { + contentResolver.query(uri, projection, null, null, null)?.use { cursor -> + val nameIndex = cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME) + if (nameIndex == -1) return@use null + cursor.moveToFirst() + cursor.getString(nameIndex) + } + }.getOrNull() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/AddTemplateActionActivity.kt b/app/src/main/java/com/amz/genie/activities/AddTemplateActionActivity.kt new file mode 100644 index 0000000..4a8120e --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/AddTemplateActionActivity.kt @@ -0,0 +1,989 @@ +package com.amz.genie.activities + +import android.app.DatePickerDialog +import android.app.TimePickerDialog +import android.os.Bundle +import android.provider.OpenableColumns +import android.text.InputType +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.widget.Button +import android.widget.ImageButton +import android.widget.LinearLayout +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.adapters.RecipientAdapter +import com.amz.genie.adapters.RecipientPickerAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.SimpleTextWatcher +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.models.AddActionItem +import com.amz.genie.models.FormAttachment +import com.amz.genie.models.KomunikasiDetail +import com.amz.genie.models.Message +import com.amz.genie.models.Pegawai +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout +import com.google.gson.Gson +import com.google.gson.JsonParser +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MultipartBody +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import java.io.File +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale +import kotlin.collections.emptyList + +class AddTemplateActionActivity : BaseActivity() { + + private lateinit var ibBack: ImageButton + private lateinit var tvKomunikasi: TextView + private lateinit var rvRecipient: RecyclerView + private lateinit var tvEmpty: TextView + private lateinit var tvAddRecipient: TextView + private lateinit var recipientAdapter: RecipientAdapter + private lateinit var actionItem: AddActionItem + private lateinit var btSend: Button + + private val recipientOptions = mutableListOf() + private val selectedRecipients = mutableListOf() + + // value form dinamis: Int / Double / String / MutableList / MutableList + private val formValues = linkedMapOf() + + // untuk validasi & setError field angka/pecahan/text/tanggal/waktu/jam/string + private val fieldTilByKode = linkedMapOf() + private val fieldEtByKode = linkedMapOf() + + // untuk list (error wajib list) + private val listInputEtByKode = linkedMapOf() + + // untuk lampiran (tampilan list nama file + error text) + private val lampiranTvFilesByKode = linkedMapOf() + private val lampiranTvErrorByKode = linkedMapOf() + + private val sdfDate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) + private val sdfDateTime = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) + private val sdfTime = SimpleDateFormat("HH:mm:ss", Locale.getDefault()) + + private var currentLampiranKode: Int? = null + + private val pickLampiranLauncher = + registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris -> + val kode = currentLampiranKode ?: return@registerForActivityResult + currentLampiranKode = null + + val list = (formValues[kode] as? MutableList) ?: mutableListOf() + + for (u in uris) { + val meta = readUriMeta(u) ?: continue + if (list.any { it.uri == u }) continue // avoid duplicate + list.add(meta) + } + + formValues[kode] = list + + // refresh UI + refreshLampiranUI(kode) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_add_template_action) + initUI() + } + + private fun initUI() { + ibBack = findViewById(R.id.ib_back_add_template_action) + tvKomunikasi = findViewById(R.id.tv_komunikasi_add_template_action) + rvRecipient = findViewById(R.id.rv_recipient_add_template_action) + tvEmpty = findViewById(R.id.tv_empty_add_template_action) + tvAddRecipient = findViewById(R.id.tv_lbl_recipient_add_template_action) + btSend = findViewById(R.id.bt_send_add_template_action) + + val intentDataJson = intent.getStringExtra("data") ?: return + actionItem = Gson().fromJson(intentDataJson, AddActionItem::class.java) + + tvKomunikasi.text = actionItem.title.orEmpty() + + recipientAdapter = RecipientAdapter { pegawai -> + val idx = selectedRecipients.indexOfFirst { it.kode == pegawai.kode } + if (idx != -1) { + selectedRecipients.removeAt(idx) + renderRecipients() + showSnack("Penerima dihapus") + } + } + + rvRecipient.layoutManager = LinearLayoutManager(this) + rvRecipient.adapter = recipientAdapter + + val details = actionItem.komunikasi_detail.orEmpty() + if (details.isNotEmpty()) { + renderDynamicForm(details) + } else { + findViewById(R.id.ll_add_template_action).removeAllViews() + } + + initData() + setupActions() + } + + // ========================= + // Dynamic Form Renderer + // ========================= + private fun renderDynamicForm(details: List) { + val container = findViewById(R.id.ll_add_template_action) + + container.removeAllViews() + formValues.clear() + fieldTilByKode.clear() + fieldEtByKode.clear() + listInputEtByKode.clear() + lampiranTvFilesByKode.clear() + lampiranTvErrorByKode.clear() + + val fields = details + .filter { it.is_aktif == 1 } + .sortedBy { it.urutan ?: Int.MAX_VALUE } + + val inflater = LayoutInflater.from(this) + + for (d in fields) { + val kode = d.kode ?: continue + val label = d.isian?.trim().orEmpty().ifBlank { "Field" } + val wajib = d.is_wajib == 1 + val jenisId = d.id_jenis_isian ?: 6 // fallback string + + when (jenisId) { + + // 4 = angka + 4 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + et.inputType = InputType.TYPE_CLASS_NUMBER + + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + et.setText("0") + formValues[kode] = 0 + + et.addTextChangedListener(SimpleTextWatcher { text -> + til.error = null + val value = text.trim() + formValues[kode] = value.toIntOrNull() ?: 0 + }) + + container.addView(v) + } + + // 5 = pecahan + 5 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + et.inputType = InputType.TYPE_CLASS_NUMBER or InputType.TYPE_NUMBER_FLAG_DECIMAL + + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + et.setText("0.00") + formValues[kode] = 0.00 + + et.addTextChangedListener(SimpleTextWatcher { text -> + til.error = null + val value = text.trim().replace(",", ".") + formValues[kode] = value.toDoubleOrNull() ?: 0.00 + }) + + container.addView(v) + } + + // 2 = tanggal (yyyy-MM-dd) + 2 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + setupDateField(kode, et, til) + container.addView(v) + } + + // 1 = waktu (yyyy-MM-dd HH:mm:ss) + 1 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + setupDateTimeField(kode, et, til) + container.addView(v) + } + + // 3 = jam (HH:mm:ss) + 3 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + setupTimeField(kode, et, til) + container.addView(v) + } + + // 10 = list + 10 -> { + val v = inflater.inflate(R.layout.item_dynamic_list, container, false) + val tvLabel = v.findViewById(R.id.tv_label) + val etItem = v.findViewById(R.id.et_item) + val btnAdd = v.findViewById(R.id.btn_add) + val tvItems = v.findViewById(R.id.tv_items) + + tvLabel.text = if (wajib) "$label *" else label + + val items = mutableListOf() + formValues[kode] = items + listInputEtByKode[kode] = etItem + + fun refreshItems() { + tvItems.text = + if (items.isEmpty()) "Belum ada item" + else items.joinToString(", ") + } + + btnAdd.setOnClickListener { + etItem.error = null + val t = etItem.text?.toString().orEmpty().trim() + if (t.isEmpty()) { + etItem.error = "Item tidak boleh kosong" + return@setOnClickListener + } + if (items.any { it.equals(t, true) }) { + showSnack("Item sudah ada") + return@setOnClickListener + } + + items.add(t) + etItem.setText("") + refreshItems() + } + + refreshItems() + container.addView(v) + } + + // 11 = lampiran (multi) + 11 -> { + val v = inflater.inflate(R.layout.item_dynamic_attachment, container, false) + val tvLabel = v.findViewById(R.id.tv_label) + val btnPick = v.findViewById(R.id.btn_pick) + val btnClear = v.findViewById(R.id.btn_clear) + val tvFiles = v.findViewById(R.id.tv_files) + val tvError = v.findViewById(R.id.tv_error) + + tvLabel.text = if (wajib) "$label *" else label + + val list = mutableListOf() + formValues[kode] = list + + lampiranTvFilesByKode[kode] = tvFiles + lampiranTvErrorByKode[kode] = tvError + + btnPick.setOnClickListener { + tvError.visibility = View.GONE + currentLampiranKode = kode + pickLampiranLauncher.launch(arrayOf("*/*")) + } + + btnClear.setOnClickListener { + list.clear() + formValues[kode] = list + refreshLampiranUI(kode) + } + + refreshLampiranUI(kode) + container.addView(v) + } + + // 0 = teks (multiline) + 0 -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + + et.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE + et.minLines = 3 + et.maxLines = 8 + et.setSingleLine(false) + et.setHorizontallyScrolling(false) + et.gravity = Gravity.TOP + + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + et.addTextChangedListener(SimpleTextWatcher { text -> + til.error = null + formValues[kode] = text + }) + + container.addView(v) + } + + // 6 = string (single line) + fallback default + else -> { + val v = inflater.inflate(R.layout.item_dynamic_input, container, false) + val til = v.findViewById(R.id.til) + val et = v.findViewById(R.id.et) + + til.hint = if (wajib) "$label *" else label + et.inputType = InputType.TYPE_CLASS_TEXT + + fieldTilByKode[kode] = til + fieldEtByKode[kode] = et + + et.addTextChangedListener(SimpleTextWatcher { text -> + til.error = null + formValues[kode] = text + }) + + container.addView(v) + } + } + } + } + + private fun refreshLampiranUI(kode: Int) { + val tvFiles = lampiranTvFilesByKode[kode] ?: return + val list = (formValues[kode] as? List).orEmpty() + + tvFiles.text = if (list.isEmpty()) { + "Belum ada file" + } else { + list.joinToString("\n") { "• ${it.fileName}" } + } + } + + private fun setupDateField(kode: Int, et: TextInputEditText, til: TextInputLayout) { + et.isFocusable = false + et.isFocusableInTouchMode = false + et.isClickable = true + + val today = sdfDate.format(Calendar.getInstance().time) + if (et.text.isNullOrBlank()) et.setText(today) + formValues[kode] = et.text?.toString().orEmpty() + + fun openPicker() { + val cal = Calendar.getInstance() + + val currentText = et.text?.toString().orEmpty().trim() + if (currentText.isNotEmpty()) { + runCatching { + sdfDate.isLenient = false + cal.time = sdfDate.parse(currentText)!! + } + } + + DatePickerDialog( + this, + { _, y, m, d -> + val picked = String.format(Locale.getDefault(), "%04d-%02d-%02d", y, m + 1, d) + til.error = null + et.setText(picked) + formValues[kode] = picked + }, + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH), + cal.get(Calendar.DAY_OF_MONTH) + ).show() + } + + et.setOnClickListener { openPicker() } + et.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) openPicker() } + } + + private fun setupTimeField(kode: Int, et: TextInputEditText, til: TextInputLayout) { + et.isFocusable = false + et.isFocusableInTouchMode = false + et.isClickable = true + + val now = Calendar.getInstance() + val def = String.format( + Locale.getDefault(), + "%02d:%02d:%02d", + now.get(Calendar.HOUR_OF_DAY), + now.get(Calendar.MINUTE), + 0 + ) + if (et.text.isNullOrBlank()) et.setText(def) + formValues[kode] = et.text?.toString().orEmpty() + + fun openPicker() { + val cal = Calendar.getInstance() + val current = et.text?.toString().orEmpty().trim() + if (current.isNotEmpty()) { + val parts = current.split(":") + if (parts.size >= 2) { + cal.set(Calendar.HOUR_OF_DAY, parts[0].toIntOrNull() ?: cal.get(Calendar.HOUR_OF_DAY)) + cal.set(Calendar.MINUTE, parts[1].toIntOrNull() ?: cal.get(Calendar.MINUTE)) + cal.set(Calendar.SECOND, parts.getOrNull(2)?.toIntOrNull() ?: 0) + } + } + + TimePickerDialog( + this, + { _, h, m -> + val picked = String.format(Locale.getDefault(), "%02d:%02d:%02d", h, m, 0) + til.error = null + et.setText(picked) + formValues[kode] = picked + }, + cal.get(Calendar.HOUR_OF_DAY), + cal.get(Calendar.MINUTE), + true + ).show() + } + + et.setOnClickListener { openPicker() } + et.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) openPicker() } + } + + private fun setupDateTimeField(kode: Int, et: TextInputEditText, til: TextInputLayout) { + et.isFocusable = false + et.isFocusableInTouchMode = false + et.isClickable = true + + val nowStr = sdfDateTime.format(Calendar.getInstance().time) + if (et.text.isNullOrBlank()) et.setText(nowStr) + formValues[kode] = et.text?.toString().orEmpty() + + fun openDateThenTime() { + val cal = Calendar.getInstance() + + val currentText = et.text?.toString().orEmpty().trim() + if (currentText.isNotEmpty()) { + runCatching { + sdfDateTime.isLenient = false + cal.time = sdfDateTime.parse(currentText)!! + } + } + + DatePickerDialog( + this, + { _, y, m, d -> + TimePickerDialog( + this, + { _, hh, mm -> + cal.set(Calendar.YEAR, y) + cal.set(Calendar.MONTH, m) + cal.set(Calendar.DAY_OF_MONTH, d) + cal.set(Calendar.HOUR_OF_DAY, hh) + cal.set(Calendar.MINUTE, mm) + cal.set(Calendar.SECOND, 0) + + val picked = sdfDateTime.format(cal.time) + til.error = null + et.setText(picked) + formValues[kode] = picked + }, + cal.get(Calendar.HOUR_OF_DAY), + cal.get(Calendar.MINUTE), + true + ).show() + }, + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH), + cal.get(Calendar.DAY_OF_MONTH) + ).show() + } + + et.setOnClickListener { openDateThenTime() } + et.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) openDateThenTime() } + } + + // ========================= + // Validasi Form Dinamis (PAKAI ID JENIS) + // ========================= + private fun validateDynamicForm(details: List): Boolean { + val fields = details + .filter { it.is_aktif == 1 } + .sortedBy { it.urutan ?: Int.MAX_VALUE } + + // clear error + fieldTilByKode.values.forEach { it.error = null } + listInputEtByKode.values.forEach { it.error = null } + lampiranTvErrorByKode.values.forEach { + it.text = "" + it.visibility = View.GONE + } + + for (d in fields) { + if (d.is_wajib != 1) continue + + val kode = d.kode ?: continue + val label = d.isian?.trim().orEmpty().ifBlank { "Field" } + val jenisId = d.id_jenis_isian ?: continue + val value = formValues[kode] + + val valid = when (jenisId) { + 4 -> value is Int // angka (default 0 valid) + 5 -> value is Double // pecahan (default 0.00 valid) + 2 -> (value as? String)?.isNotBlank() == true // tanggal + 1 -> { // waktu yyyy-MM-dd HH:mm:ss + val s = (value as? String).orEmpty().trim() + s.isNotBlank() && runCatching { + sdfDateTime.isLenient = false + sdfDateTime.parse(s) != null + }.getOrDefault(false) + } + 3 -> { // jam HH:mm:ss + val s = (value as? String).orEmpty().trim() + s.isNotBlank() && Regex("""^\d{2}:\d{2}:\d{2}$""").matches(s) + } + 10 -> (value as? List<*>)?.isNotEmpty() == true // list + 11 -> (value as? List<*>)?.isNotEmpty() == true // lampiran + 0, 6 -> (value as? String)?.isNotBlank() == true // teks/string + else -> (value as? String)?.isNotBlank() == true + } + + if (!valid) { + when (jenisId) { + 10 -> listInputEtByKode[kode]?.error = "Wajib diisi" + 11 -> { + lampiranTvErrorByKode[kode]?.apply { + text = "Wajib lampirkan minimal 1 file" + visibility = View.VISIBLE + } + } + else -> fieldTilByKode[kode]?.error = "Wajib diisi" + } + showSnack("Field wajib belum diisi: $label") + return false + } + } + + return true + } + + // ========================= + // Build komunikasiDetail payload (sesuai ID) + // ========================= + private fun buildKomunikasiDetailPayload(details: List): List> { + val fields = details + .filter { it.is_aktif == 1 } + .sortedBy { it.urutan ?: Int.MAX_VALUE } + + return fields.mapNotNull { d -> + val kode = d.kode ?: return@mapNotNull null + val jenisId = d.id_jenis_isian ?: return@mapNotNull null + + val rawValue = formValues[kode] + + val isianForServer: Any? = when (jenisId) { + 4 -> ((rawValue as? Int) ?: 0).toString() + + 5 -> { + val v = (rawValue as? Double) ?: 0.0 + String.format(Locale.US, "%.2f", v) + } + + 2 -> (rawValue as? String).orEmpty() // yyyy-MM-dd + + 1 -> (rawValue as? String).orEmpty() // yyyy-MM-dd HH:mm:ss + + 3 -> (rawValue as? String).orEmpty() // HH:mm:ss + + 10 -> { // list => JSON [{"text":"a"},...] + val items = rawValue as? List<*> + val arr = items.orEmpty() + .mapNotNull { it?.toString()?.trim() } + .filter { it.isNotBlank() } + .map { mapOf("text" to it) } + Gson().toJson(arr) + } + + 11 -> { + // lampiran => isian metadata JSON (opsional), file fisiknya via multipart + val atts = (rawValue as? List).orEmpty() + val meta = atts.map { mapOf("name" to it.fileName, "mime" to it.mimeType) } + Gson().toJson(meta) + } + + 0, 6 -> rawValue?.toString() // teks (multiline) / string + else -> rawValue?.toString() + } + + mapOf( + "kode" to kode, + "id_jenis_isian" to jenisId, + "isian" to isianForServer + ) + } + } + + private fun buildJsonDataBody( + actionItem: AddActionItem, + selectedRecipients: List, + komunikasiDetail: List> + ): RequestBody { + val payload = mapOf( + "kode" to actionItem.id, + "tentang" to actionItem.idTentang, + "topic" to actionItem.idKomunikasi, + "uraian" to "", + "kepada" to selectedRecipients.map { it.kode }, + "komunikasiDetail" to komunikasiDetail + ) + + val json = Gson().toJson(payload) + return json.toRequestBody("text/plain".toMediaType()) + } + + // ========================= + // Lampiran -> Multipart + // ========================= + private fun collectLampiranParts(): List { + val parts = mutableListOf() + formValues.forEach { (kodeDetail, v) -> + val atts = (v as? List<*>)?.filterIsInstance().orEmpty() + for (att in atts) { + val part = uriToMultipart( + uri = att.uri, + fileName = att.fileName, + mimeType = att.mimeType, + fieldName = "isian_$kodeDetail" // ✅ penting! + ) + if (part != null) parts.add(part) + } + } + + return parts + } + + private fun uriToMultipart( + uri: android.net.Uri, + fileName: String, + mimeType: String, + fieldName: String + ): MultipartBody.Part? { + return runCatching { + val input = contentResolver.openInputStream(uri) ?: return null + + val outFile = File(cacheDir, "${System.currentTimeMillis()}_$fileName") + outFile.outputStream().use { out -> + input.use { it.copyTo(out) } + } + + val reqBody = outFile.asRequestBody(mimeType.toMediaType()) + MultipartBody.Part.createFormData(fieldName, fileName, reqBody) + }.getOrNull() + } + + private fun readUriMeta(uri: android.net.Uri): FormAttachment? { + val cr = contentResolver + val mime = cr.getType(uri) ?: "application/octet-stream" + + var name: String? = null + cr.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { c -> + if (c.moveToFirst()) { + name = c.getString(0) + } + } + val fileName = name ?: "attachment" + + return FormAttachment(uri = uri, fileName = fileName, mimeType = mime) + } + + // ========================= + // Existing stuff + // ========================= + private fun initData() { + val idTentang = actionItem.idTentang + val idTipeKomunikasi = actionItem.idKomunikasi + val userData = Gson().fromJson(Preferences.getUserData(this@AddTemplateActionActivity), + Pengguna::class.java) + + APIMain.require().selectionServices.recipients( + Preferences.getAccessToken(this), idTipeKomunikasi, idTentang + ).enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + val body = response.body().orEmpty() + + // ✅ buang pengirim dari list + val myKode = userData.pegawai?.kode?.trim().orEmpty() + val filtered = body.filter { p -> + p.kode.trim() != myKode + } + + recipientOptions.clear() + recipientOptions.addAll(filtered) + + selectedRecipients.clear() + selectedRecipients.addAll(filtered) + renderRecipients() + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddTemplateActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure(call: Call>, t: Throwable) { + showSnack(t.message.toString()) + } + }) + } + + private fun setupActions() { + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + handleBackPress(0) + } + }) + + ibBack.setOnClickListener { handleBackPress(0) } + + tvAddRecipient.setOnClickListener { + if (isNetworkAvailable(this)) { + showProgressDialog(true) + APIMain.require().selectionServices.allRecipient( + Preferences.getAccessToken(this) + ).enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + showProgressDialog(false) + if (response.isSuccessful) { + val body = response.body().orEmpty() + + val userData = Gson().fromJson(Preferences.getUserData(this@AddTemplateActionActivity), + Pengguna::class.java) + + val filtered = body.filter { p -> + p.kode.trim() != userData.pegawai?.kode + } + + showRecipientPickerDialog(ArrayList(filtered)) + return + } + + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@AddTemplateActionActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + override fun onFailure(call: Call>, t: Throwable) { + showProgressDialog(false) + showSnack(t.message.toString()) + } + }) + + } else { + showProgressDialog(false) + Snackbar.make( + findViewById(android.R.id.content), + ContextCompat.getString(this@AddTemplateActionActivity, R.string.no_internet_message), + Snackbar.LENGTH_LONG + ).show() + } + } + + btSend.setOnClickListener { + val details = actionItem.komunikasi_detail.orEmpty() + if (details.isEmpty()) { + showSnack("Tidak ada form yang bisa dikirim") + return@setOnClickListener + } + + if (!validateDynamicForm(details)) return@setOnClickListener + + if (selectedRecipients.isEmpty()) { + selectedRecipients.add(Pegawai( + kode = "0000000000000000", + nama = "Genie", + outlet = null, + jabatan = null, + mulai_bekerja = "0000-00-000", + id_kelamin = "L", + outlets = null + )) + } + + val komunikasiDetail = buildKomunikasiDetailPayload(details) + val dataBody = buildJsonDataBody(actionItem, selectedRecipients, komunikasiDetail) + val fileParts = collectLampiranParts() + + APIMain.require().actionServices.add( + token = Preferences.getAccessToken(this), + data = dataBody, + files = fileParts + ).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + showSnack(response.body()?.message ?: "Berhasil") + finish() + return + } + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + showSnack(raw.ifBlank { "${response.code()} ${response.message()}" }) + } + + override fun onFailure(call: Call, t: Throwable) { + showSnack(t.message ?: "Gagal") + } + }) + } + } + + private fun renderRecipients() { + val hasData = selectedRecipients.isNotEmpty() + rvRecipient.visibility = if (hasData) View.VISIBLE else View.GONE + tvEmpty.visibility = if (hasData) View.GONE else View.VISIBLE + recipientAdapter.submitList(selectedRecipients.toList()) + } + + private fun showSnack(message: String) { + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + + private fun showRecipientPickerDialog(allRecipient: ArrayList) { + val userData = Gson().fromJson(Preferences.getUserData(this@AddTemplateActionActivity), + Pengguna::class.java) + + val cleaned = allRecipient.filter { it.kode.trim() != userData.pegawai?.kode } + if (cleaned.isEmpty()) { + showSnack("Daftar penerima kosong") + return + } + + val baseList = cleaned.filter { ar -> + selectedRecipients.none { it.kode == ar.kode } + } + + if (baseList.isEmpty()) { + showSnack("Semua penerima sudah dipilih") + return + } + + val v = layoutInflater.inflate(R.layout.dialog_recipient_picker, null) + val rv = v.findViewById(R.id.rv_recipient_picker) + val sv = v.findViewById(R.id.sv_recipient) + + val dialog = MaterialAlertDialogBuilder(this) + .setTitle("Pilih Penerima") + .setView(v) + .setNegativeButton("Tutup", null) + .create() + + val pickerAdapter = RecipientPickerAdapter { picked -> + val exists = selectedRecipients.any { it.kode == picked.kode } + if (exists) { + showSnack("Penerima sudah dipilih") + return@RecipientPickerAdapter + } + + selectedRecipients.add(picked) + renderRecipients() + dialog.dismiss() + } + + rv.layoutManager = LinearLayoutManager(this) + rv.adapter = pickerAdapter + rv.setHasFixedSize(true) + + pickerAdapter.submitList(baseList) + + fun applyFilter(query: String?) { + val q = query.orEmpty().trim() + if (q.isEmpty()) { + pickerAdapter.submitList(baseList) + return + } + + val filtered = baseList.filter { p -> + p.nama.contains(q, ignoreCase = true) || p.kode.contains(q, ignoreCase = true) + } + + pickerAdapter.submitList(filtered) + } + + sv.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + applyFilter(query) + return true + } + + override fun onQueryTextChange(newText: String?): Boolean { + applyFilter(newText) + return true + } + }) + + dialog.show() + sv.requestFocus() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/AttachmentPreviewActivity.kt b/app/src/main/java/com/amz/genie/activities/AttachmentPreviewActivity.kt new file mode 100644 index 0000000..03d7d6a --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/AttachmentPreviewActivity.kt @@ -0,0 +1,40 @@ +package com.amz.genie.activities + +import android.os.Bundle +import android.widget.ImageButton +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import com.amz.genie.R +import com.bumptech.glide.Glide +import com.google.android.material.imageview.ShapeableImageView +import java.io.File + +class AttachmentPreviewActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_attachment_preview) + + val localPath = intent.getStringExtra("local_path").orEmpty() + val title = intent.getStringExtra("title").orEmpty() + + val ib = findViewById(R.id.ib_back_attachment_preview) + val iv = findViewById(R.id.iv_attachment_preview) + val tv = findViewById(R.id.tv_title_attachment_preview) + + tv.text = title.ifBlank { "Lampiran" } + + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + handleBackPress(0) + } + }) + + ib.setOnClickListener { handleBackPress(0) } + + // ✅ load dari file lokal + Glide.with(this) + .load(File(localPath)) + .into(iv) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/BaseActivity.kt b/app/src/main/java/com/amz/genie/activities/BaseActivity.kt new file mode 100644 index 0000000..59c9db5 --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/BaseActivity.kt @@ -0,0 +1,120 @@ +package com.amz.genie.activities + +import android.Manifest +import android.app.ActivityOptions +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.ImageView +import android.widget.RelativeLayout +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.NotificationManagerCompat +import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toDrawable +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.fragment.app.Fragment +import com.airbnb.lottie.LottieAnimationView +import com.amz.genie.R + +open class BaseActivity: AppCompatActivity() { + + private var showLoadingDialog: Dialog? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (showLoadingDialog == null) { + showLoadingDialog = Dialog(this) + showLoadingDialog!!.window!!.setBackgroundDrawable(0.toDrawable()) + showLoadingDialog!!.setContentView(R.layout.loading_dialog) + } + } + + fun loadFragment(fragment: Fragment) { + val transaction = supportFragmentManager.beginTransaction() + transaction.replace(R.id.frameLayout_Container, fragment) + transaction.commit() + } + + fun showProgressDialog(show: Boolean, type: Int = 1) { + when { + show -> { + if (!isFinishing) { + + val lottie = showLoadingDialog + ?.findViewById(R.id.lottieLoading) + + val fileName = when (type) { + 1 -> "lottie/loader_circle.json" + 2 -> "lottie/loader_send.json" + else -> "lottie/loading.json" + } + + lottie?.apply { + setAnimation(fileName) + repeatCount = com.airbnb.lottie.LottieDrawable.INFINITE + playAnimation() + } + + showLoadingDialog?.setCanceledOnTouchOutside(false) + if (showLoadingDialog?.isShowing != true) { + showLoadingDialog?.show() + } + } + } + else -> { + try { + if (showLoadingDialog?.isShowing == true && !isFinishing) { + showLoadingDialog?.dismiss() + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + } + + fun navigateTo(target: Class<*>, enterAnim: Int, exitAnim: Int) { + startActivity(Intent(this@BaseActivity, target), + ActivityOptions.makeCustomAnimation(this@BaseActivity, + enterAnim, exitAnim).toBundle()) + } + + fun arePushNotificationsEnabled(context: Context): Boolean { + val enabledByApp = NotificationManagerCompat.from(context).areNotificationsEnabled() + + if (!enabledByApp) return false + + // Android 13+ also needs POST_NOTIFICATIONS permission + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + ContextCompat.checkSelfPermission( + context, + Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED + } else { + true + } + } + + fun setSearchClick(listener: View.OnClickListener?, ibSearch: ImageView) { + ibSearch.setOnClickListener(listener) + } + + fun handleBackPress(stat: Int = 0) { + if (stat == 5) { + navigateTo(LoginActivity::class.java, R.anim.right_in, R.anim.left_out) + } + + finish() + overridePendingTransition(R.anim.left_in, R.anim.right_out) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/GeneralDetailActivity.kt b/app/src/main/java/com/amz/genie/activities/GeneralDetailActivity.kt new file mode 100644 index 0000000..349af48 --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/GeneralDetailActivity.kt @@ -0,0 +1,353 @@ +package com.amz.genie.activities + +import android.content.Intent +import android.os.Bundle +import android.widget.ImageView +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.contract.ActivityResultContracts +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.adapters.GeneralDetailAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isFemale +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.models.GeneralDetailResponse +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.Message +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.imageview.ShapeableImageView +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class GeneralDetailActivity : BaseActivity() { + + private lateinit var ivBack: ImageView + private lateinit var sivUser: ShapeableImageView + private lateinit var tvName: TextView + private lateinit var tvJobDesk: TextView + private lateinit var tvOutlet: TextView + private lateinit var rvgeneralDetail: RecyclerView + + private lateinit var adapter: GeneralDetailAdapter + + private val allItems = mutableListOf() + private var currentPage = 1 + private val perPage = 30 + private var hasMore = true + private var isLoading = false + + private var counterpartKode: String? = null + private var childNeedsRefresh = false + + private val subDetailLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val needsRefresh = result.data?.getBooleanExtra("needs_refresh", false) ?: false + if (result.resultCode == RESULT_OK && needsRefresh) { + childNeedsRefresh = true + refreshListFromFirstPage() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_general_detail) + + initUI(savedInstanceState) + setupActions() + } + + private fun initUI(savedInstanceState: Bundle?) { + ivBack = findViewById(R.id.ib_back_general_detail) + sivUser = findViewById(R.id.siv_employee_general_detail) + tvName = findViewById(R.id.tv_employeename_general_detail) + tvJobDesk = findViewById(R.id.tv_jobdesk_general_detail) + tvOutlet = findViewById(R.id.tv_outlet_general_detail) + rvgeneralDetail = findViewById(R.id.rv_general_detail) + + val userData = Gson().fromJson(Preferences.getUserData(this), Pengguna::class.java) + val myKodePegawai = userData.pegawai?.kode ?: "" + + adapter = GeneralDetailAdapter( + kodePegawai = myKodePegawai, + onItemClick = { item -> + // ✅ klik item: mark as read dulu kalau unread, baru buka detail + markReadIfNeeded(item) { openSubDetail(item) } + }, + onDetailClick = { item -> + // ✅ klik tombol detail juga sama + markReadIfNeeded(item) { openSubDetail(item) } + } + ) + + rvgeneralDetail.layoutManager = LinearLayoutManager(this) + rvgeneralDetail.adapter = adapter + rvgeneralDetail.setHasFixedSize(true) + + if (intent.hasExtra("data")) { + initData() + } + } + + private fun bearerToken(): String { + val raw = Preferences.getAccessToken(this).orEmpty().trim() + // ✅ aman: kalau sudah ada "Bearer " jangan double + return if (raw.startsWith("Bearer ", true)) raw else "Bearer $raw" + } + + private fun openSubDetail(item: GeneralThreadItem) { + val intent = Intent(this, GeneralSubDetailActivity::class.java) + val dataJson = Gson().toJson(item, GeneralThreadItem::class.java) + intent.putExtra("data", dataJson) + intent.putExtra("counterpart", counterpartKode) + subDetailLauncher.launch(intent) + } + + private fun setupActions() { + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (childNeedsRefresh) { + setResult(RESULT_OK, Intent().putExtra("needs_refresh", true)) + } + handleBackPress(0) + } + }) + + ivBack.setOnClickListener { + if (childNeedsRefresh) { + setResult(RESULT_OK, Intent().putExtra("needs_refresh", true)) + } + handleBackPress(0) + } + + rvgeneralDetail.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (dy <= 0) return + + val lm = recyclerView.layoutManager as? LinearLayoutManager ?: return + val totalItemCount = lm.itemCount + val lastVisible = lm.findLastVisibleItemPosition() + + // trigger saat tinggal 5 item lagi + if (!isLoading && hasMore && totalItemCount > 0 && lastVisible >= totalItemCount - 5) { + loadPage(currentPage + 1) + } + } + }) + } + + private fun initData() { + val intentDataJson = intent.getStringExtra("data") ?: return + val data = Gson().fromJson(intentDataJson, GeneralThreadItem::class.java) + + counterpartKode = data.counterpart + + val tipe = data.tipe.uppercase() + val aksi = data.aksi + val reaksi = data.reaksi + + if (tipe == "REAKSI" && reaksi != null) { + tvName.text = reaksi.pembuat.nama + tvJobDesk.text = reaksi.pembuat.jabatan?.nama ?: "-" + tvOutlet.text = reaksi.pembuat.outlet?.nama ?: "-" + + val female = isFemale(reaksi.pembuat.id_kelamin) + sivUser.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + } else { + tvName.text = aksi.pembuat.nama + tvJobDesk.text = aksi.pembuat.jabatan?.nama ?: "-" + tvOutlet.text = aksi.pembuat.outlet?.nama ?: "-" + + val female = isFemale(aksi.pembuat.id_kelamin) + sivUser.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + } + + if (!isNetworkAvailable(this)) { + showSnack(getString(R.string.no_internet_message)) + return + } + + refreshListFromFirstPage() + } + + private fun refreshListFromFirstPage() { + allItems.clear() + adapter.submitRawTimeline(emptyList()) + currentPage = 1 + hasMore = true + isLoading = false + loadPage(1) + } + + private fun loadPage(page: Int) { + val cp = counterpartKode ?: run { + showSnack("counterpart_kode kosong") + return + } + + if (isLoading) return + if (!hasMore && page != 1) return + if (page <= currentPage && page != 1) return + + isLoading = true + showProgressDialog(true) + + APIMain.require().generalServices + .detail(bearerToken(), cp, page, perPage) + .enqueue(object : Callback { + + override fun onResponse( + call: Call, + response: Response + ) { + showProgressDialog(false) + isLoading = false + + if (response.isSuccessful) { + val body = response.body() + val newItems = body?.items.orEmpty() + + val meta = body?.meta + val metaPage = meta?.page + val metaHasMore = meta?.has_more + val metaNextPage = meta?.next_page + + currentPage = metaPage ?: page + + hasMore = when { + metaHasMore != null -> metaHasMore + metaNextPage != null -> true + else -> newItems.size >= perPage + } + + if (page == 1) allItems.clear() + + // ✅ anti-duplikat (penting banget karena backend union bisa double kalau ada data ganda) + val existingKeys = allItems.map { keyOf(it) }.toHashSet() + val filtered = newItems.filter { existingKeys.add(keyOf(it)) } + + allItems.addAll(filtered) + adapter.submitRawTimeline(allItems.toList()) + + if (allItems.isEmpty()) showSnack("Tidak ada pesan") + return + } + + handleError(response) + } + + override fun onFailure(call: Call, t: Throwable) { + showProgressDialog(false) + isLoading = false + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun keyOf(item: GeneralThreadItem): String { + return if (item.tipe.equals("REAKSI", true)) { + "R_${item.reaksi?.id ?: -1}" + } else { + "A_${item.aksi.id}" + } + } + + private fun handleError(response: Response) { + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@GeneralDetailActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + private fun showSnack(message: String) { + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + + // ============================================================ + // MARK AS READ (FIX: REAKSI pakai reaksi.id, AKSI pakai aksi.id) + // ============================================================ + private fun getReadPayload(item: GeneralThreadItem): Pair? { + return if (item.tipe.equals("REAKSI", true)) { + val rxId = item.reaksi?.id ?: return null + Pair(rxId, "REAKSI") + } else { + Pair(item.aksi.id, "AKSI") + } + } + + private fun markReadIfNeeded(item: GeneralThreadItem, thenRun: () -> Unit) { + // backend GetgeneralDetail kamu ngirim is_unread / is_aktif + val isUnread = (item.is_unread == true) || ((item.is_aktif ?: 1) == 0) + if (!isUnread) { + thenRun() + return + } + + val payload = getReadPayload(item) + if (payload == null) { + thenRun() + return + } + + val (id, tipe) = payload + + APIMain.require().generalServices + .readed(bearerToken(), id, tipe) + .enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + applyLocalReadState(id, tipe) + } + thenRun() + } + + override fun onFailure(call: Call, t: Throwable) { + thenRun() + } + }) + } + + private fun applyLocalReadState(id: Int, tipe: String) { + val upper = tipe.uppercase() + var changed = false + + for (i in allItems.indices) { + val it = allItems[i] + val match = if (upper == "REAKSI") { + it.tipe.equals("REAKSI", true) && it.reaksi?.id == id + } else { + !it.tipe.equals("REAKSI", true) && it.aksi.id == id + } + + if (match) { + allItems[i] = it.copy( + is_aktif = 1, + is_unread = false + ) + changed = true + break + } + } + + if (changed) adapter.submitRawTimeline(allItems.toList()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/GeneralSubDetailActivity.kt b/app/src/main/java/com/amz/genie/activities/GeneralSubDetailActivity.kt new file mode 100644 index 0000000..754d32a --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/GeneralSubDetailActivity.kt @@ -0,0 +1,750 @@ +package com.amz.genie.activities + +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.widget.ArrayAdapter +import android.widget.AutoCompleteTextView +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.adapters.ChatAdapter +import com.amz.genie.helpers.EmojiPickerBottomSheet +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.models.ChatItem +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.InboxThreadResponse +import com.amz.genie.models.Message +import com.amz.genie.models.Pengguna +import com.amz.genie.models.RawMessage +import com.amz.genie.models.ReaksiPost +import com.amz.genie.models.ReaksiResponse +import com.amz.genie.services.APIMain +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.JsonElement +import com.google.gson.JsonParser +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.toRequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class GeneralSubDetailActivity : BaseActivity() { + + private lateinit var ivBack: ImageView + private lateinit var tvDescription: TextView + private lateinit var tvName: TextView + private lateinit var tvJobDesk: TextView + private lateinit var ibEmoji: ImageButton + private lateinit var ibAttach: ImageButton + private lateinit var ibCamera: ImageButton + private lateinit var ibMic: ImageButton + private lateinit var tietMessage: TextInputEditText + private lateinit var rvChat: RecyclerView + private lateinit var chatAdapter: ChatAdapter + private lateinit var lm: LinearLayoutManager + private lateinit var tvNewMsg: TextView + + private var counterpartKode: String? = null + private var aksiId: Int? = null + private var reaksiId: Int? = null + private var tentangId: String = "" + + private var isLoading = false + private var hasMore = true + private var currentPage = 1 + private val perPage = 30 + private var isSendMode = false + private var newestMessageId: String? = null + + private var userNearBottom = true + private var pendingNewCount = 0 + + // ✅ FIX READ PAYLOAD + private var readedId: Int? = null + private var readedTipe: String = "AKSI" + private var hasScheduledMark = false + private var hasPostedMark = false + private val markHandler = Handler(Looper.getMainLooper()) + private var markRunnable: Runnable? = null + + private var displayTipe: String = "AKSI" + private var myKodePegawai: String = "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_inbox_sub_detail) + + initUI() + setupActions() + + when { + intent.hasExtra("data") -> initData() + intent.hasExtra("aksi_id") && intent.hasExtra("counterpart_kode") -> initDataFromNotif() + else -> { + showSnack("Data notifikasi tidak lengkap") + finish() + } + } + } + + private fun initDataFromNotif() { + counterpartKode = intent.getStringExtra("counterpart_kode") + aksiId = intent.getStringExtra("aksi_id")?.toIntOrNull() + tentangId = intent.getStringExtra("tentang_id").orEmpty() + + if (counterpartKode.isNullOrBlank() || aksiId == null) { + showSnack("Data thread tidak lengkap") + finish() + return + } + + val userData = Gson().fromJson(Preferences.getUserData(this), Pengguna::class.java) + myKodePegawai = userData.pegawai?.kode.orEmpty() + + displayTipe = (intent.getStringExtra("tipe") ?: "AKSI").uppercase() + readedTipe = "AKSI" + readedId = aksiId + + currentPage = 1 + hasMore = true + newestMessageId = null + pendingNewCount = 0 + tvNewMsg.isVisible = false + chatAdapter.submitList(emptyList()) + + applyHeader(name = counterpartKode, jobDesk = "Memuat...", description = "") + loadOlder(1, scrollToBottom = true) + } + + private fun initUI() { + ivBack = findViewById(R.id.ib_back_inbox_sub_detail) + tvDescription = findViewById(R.id.tv_description_inbox_sub_detail) + tvName = findViewById(R.id.tv_name_inbox_sub_detail) + tvJobDesk = findViewById(R.id.tv_jobdesk_inbox_sub_detail) + ibEmoji = findViewById(R.id.ib_emoji_inbox_sub_detail) + ibAttach = findViewById(R.id.ib_attach_inbox_sub_detail) + ibCamera = findViewById(R.id.ib_camera_inbox_sub_detail) + ibMic = findViewById(R.id.ib_mic_inbox_sub_detail) + tietMessage = findViewById(R.id.tiet_message_inbox_sub_detail) + rvChat = findViewById(R.id.rv_inbox_sub_detail) + + tvNewMsg = findViewById(R.id.tv_new_message_indicator) + tvNewMsg.isVisible = false + + chatAdapter = ChatAdapter() + lm = LinearLayoutManager(this).apply { stackFromEnd = true } + + rvChat.layoutManager = lm + rvChat.adapter = chatAdapter + rvChat.setHasFixedSize(true) + + tietMessage.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + updateMicButtonByMessage() + } + override fun afterTextChanged(s: Editable?) {} + }) + + updateMicButtonByMessage() + } + + private fun setupActions() { + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() = handleBackPress(0) + }) + + ivBack.setOnClickListener { handleBackPress(0) } + + ibEmoji.setOnClickListener { + EmojiPickerBottomSheet { emoji -> insertEmojiToMessage(emoji) } + .show(supportFragmentManager, "emoji_picker") + } + + ibAttach.setOnClickListener { /* TODO */ } + ibCamera.setOnClickListener { /* TODO */ } + + ibMic.setOnClickListener { + if (isSendMode) { + val msg = tietMessage.text?.toString()?.trim().orEmpty() + if (msg.isNotEmpty()) showSendOptionsDialog() + } else { + // TODO + } + } + + rvChat.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + userNearBottom = isUserNearBottom() + + if (userNearBottom && tvNewMsg.isVisible) { + pendingNewCount = 0 + tvNewMsg.isVisible = false + } + + val firstVisible = lm.findFirstVisibleItemPosition() + if (!isLoading && hasMore && firstVisible <= 3) { + loadOlder(currentPage + 1) + } + } + }) + + tvNewMsg.setOnClickListener { + pendingNewCount = 0 + tvNewMsg.isVisible = false + rvChat.scrollToPosition(chatAdapter.itemCount - 1) + } + } + + private fun initData() { + val intentDataJson = intent.getStringExtra("data") ?: return + val data = Gson().fromJson(intentDataJson, GeneralThreadItem::class.java) + + counterpartKode = intent.getStringExtra("counterpart") + displayTipe = data.tipe.uppercase() + + val aksi = data.aksi + val reaksi = data.reaksi + + aksiId = aksi.id + tentangId = aksi.tentang.id + reaksiId = if (displayTipe == "REAKSI" && reaksi != null) reaksi.id else null + + readedTipe = displayTipe + readedId = if (readedTipe == "REAKSI") reaksiId else aksiId + + if (displayTipe == "REAKSI" && reaksi != null) { + tvName.text = reaksi.pembuat.nama + tvJobDesk.text = "${reaksi.pembuat.jabatan?.nama} - ${reaksi.pembuat.outlet?.nama}" + tvDescription.text = reaksi.uraian + } else { + tvName.text = aksi.pembuat.nama + tvJobDesk.text = "${aksi.pembuat.jabatan?.nama} - ${aksi.pembuat.outlet?.nama}" + tvDescription.text = aksi.uraian + } + + val userData = Gson().fromJson(Preferences.getUserData(this), Pengguna::class.java) + myKodePegawai = userData.pegawai?.kode.orEmpty() + + resetThreadStateAndLoad(scrollToBottom = true) + } + + private fun loadOlder(page: Int, scrollToBottom: Boolean = false) { + val cp = counterpartKode ?: return + val idAksi = aksiId ?: return + if (isLoading) return + if (!hasMore && page != 1) return + + isLoading = true + showProgressDialog(true) + + APIMain.require().generalServices + .threadDetail( + Preferences.getAccessToken(this@GeneralSubDetailActivity), + cp, idAksi, page, perPage + ) + .enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + showProgressDialog(false) + isLoading = false + + if (!response.isSuccessful) { + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@GeneralSubDetailActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + showSnack(message) + hasPostedMark = false + return + } + + val body = response.body() ?: return + + currentPage = body.meta?.page ?: page + hasMore = body.meta?.has_more ?: false + + val raw = body.items.orEmpty() // newest -> oldest + if (page == 1) newestMessageId = raw.firstOrNull()?.id + + val display = raw.asReversed() // oldest -> newest + + if (page == 1) { + applyHeaderFromThread(display) + } + + val chatItems = mapToChatItems(display, myKodePegawai) + + if (page == 1) { + chatAdapter.submitList(chatItems) + if (scrollToBottom) rvChat.scrollToPosition(chatAdapter.itemCount - 1) + } else { + val beforeCount = chatAdapter.itemCount + val firstPos = lm.findFirstVisibleItemPosition() + val topView = rvChat.getChildAt(0) + val topOffset = topView?.top ?: 0 + + chatAdapter.prepend(chatItems) + lm.scrollToPositionWithOffset( + firstPos + (chatAdapter.itemCount - beforeCount), + topOffset + ) + } + + if (!hasMore) scheduleMarkAfterFullyLoaded() + } + + override fun onFailure(call: Call, t: Throwable) { + showProgressDialog(false) + isLoading = false + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun mapToChatItems(display: List, myKode: String): List { + val out = ArrayList() + var prevSender: String? = null + + for (m in display) { + val senderKode = m.sender_kode.trim() + if (senderKode.isEmpty()) continue + + val sameAsPrev = prevSender != null && prevSender == senderKode + val isMine = senderKode == myKode + + out.add( + ChatItem( + id = m.id.orEmpty(), + senderKode = senderKode, + senderName = m.sender?.nama, + senderJob = m.sender?.jabatan?.nama, + senderOutlet = m.sender?.outlet?.nama, + message = m.message, + timeText = m.waktu_buat.orEmpty(), + isMine = isMine, + isSameSenderAsPrev = sameAsPrev + ) + ) + + prevSender = senderKode + } + return out + } + + private fun updateMicButtonByMessage() { + val hasText = !tietMessage.text.isNullOrBlank() + isSendMode = hasText + + if (hasText) { + ibMic.setImageResource(R.drawable.send_24px) + ibMic.contentDescription = "send" + } else { + ibMic.setImageResource(R.drawable.mic_24px) + ibMic.contentDescription = "mic" + } + } + + private fun insertEmojiToMessage(emoji: String) { + val editable = tietMessage.text ?: return + val start = tietMessage.selectionStart.coerceAtLeast(0) + val end = tietMessage.selectionEnd.coerceAtLeast(0) + + val minPos = minOf(start, end) + val maxPos = maxOf(start, end) + + editable.replace(minPos, maxPos, emoji) + tietMessage.setSelection(minPos + emoji.length) + tietMessage.requestFocus() + } + + private fun showSnack(message: String) { + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + + private fun isUserNearBottom(threshold: Int = 2): Boolean { + val total = chatAdapter.itemCount + if (total == 0) return true + val lastVisible = lm.findLastVisibleItemPosition() + return lastVisible >= total - 1 - threshold + } + + private fun scheduleMarkAfterFullyLoaded() { + if (hasScheduledMark || hasPostedMark) return + if (readedId == null) return + + hasScheduledMark = true + markRunnable = Runnable { + postMarkToApi() + hasScheduledMark = false + } + markHandler.postDelayed(markRunnable!!, 1200L) + } + + private fun postMarkToApi() { + if (hasPostedMark) return + + val id = readedId ?: return + val tipeKirim = readedTipe + + hasPostedMark = true + + APIMain.require().generalServices.readed( + Preferences.getAccessToken(this), + id, + tipeKirim + ).enqueue(object : Callback { + + override fun onResponse(call: Call, response: Response) { + if (!response.isSuccessful) { + hasPostedMark = false + showSnack("${response.code()} ${response.message()}") + return + } + setResult(RESULT_OK, Intent().putExtra("needs_refresh", true)) + } + + override fun onFailure(call: Call, t: Throwable) { + hasPostedMark = false + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + override fun onPause() { + super.onPause() + markRunnable?.let { markHandler.removeCallbacks(it) } + hasScheduledMark = false + } + + override fun onDestroy() { + super.onDestroy() + markRunnable?.let { markHandler.removeCallbacks(it) } + hasScheduledMark = false + } + + private fun resetThreadStateAndLoad(scrollToBottom: Boolean = true) { + currentPage = 1 + hasMore = true + newestMessageId = null + pendingNewCount = 0 + tvNewMsg.isVisible = false + chatAdapter.submitList(emptyList()) + + hasPostedMark = false + hasScheduledMark = false + + loadOlder(1, scrollToBottom = scrollToBottom) + } + + private fun applyHeader(name: String?, jobDesk: String?, description: String?) { + tvName.text = name ?: "" + tvJobDesk.text = jobDesk ?: "" + tvDescription.text = description ?: "" + } + + private fun applyHeaderFromThread(display: List) { + if (display.isEmpty()) return + + val partnerMsg = display.firstOrNull { it.sender_kode.trim() != myKodePegawai } + ?: display.lastOrNull { it.sender_kode.trim() != myKodePegawai } + + val partner = partnerMsg?.sender + val partnerName = partner?.nama ?: (counterpartKode ?: "") + val partnerJob = listOfNotNull(partner?.jabatan?.nama, partner?.outlet?.nama).joinToString(" - ") + + // ✅ ambil uraian kegiatan dari payload AKSI (message json), bukan dari text header aja + val desc = extractUraianKegiatanFromMsg(partnerMsg?.message) + + tvName.text = partnerName + tvJobDesk.text = partnerJob + if (!desc.isNullOrBlank()) tvDescription.text = desc + } + + // ============================= + // SEND REAKSI (tetap) + // ============================= + private fun showSendOptionsDialog() { + val msg = tietMessage.text?.toString()?.trim().orEmpty() + if (msg.isEmpty()) return + + val options = listOf("Bertanya", "Informasi", "Laporan", "Pengajuan", "Penugasan") + + val view = LayoutInflater.from(this).inflate(R.layout.dialog_send_type, null) + val til = view.findViewById(R.id.til_type) + val actv = view.findViewById(R.id.actv_type_dialog_send_type) + + val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, options) + actv.setAdapter(adapter) + actv.setText(options[0], false) + + actv.keyListener = null + actv.isCursorVisible = false + actv.isFocusable = true + actv.isFocusableInTouchMode = true + actv.showSoftInputOnFocus = false + actv.setOnClickListener { actv.showDropDown() } + + val dialog = MaterialAlertDialogBuilder(this) + .setView(view) + .setNegativeButton("Batal", null) + .setPositiveButton("Kirim", null) + .create() + + dialog.setOnShowListener { + dialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val selected = actv.text?.toString()?.trim().orEmpty() + if (selected.isEmpty()) { + til.error = "Pilih tipe komunikasi" + return@setOnClickListener + } + + showProgressDialog(true) + + val topic = when (selected) { + "Bertanya" -> "A" + "Informasi" -> "I" + "Laporan" -> "L" + "Approval" -> "P" + "Pengajuan" -> "R" + "Penugasan" -> "T" + else -> "" + } + + val reaksi = ReaksiPost( + aksiId!!, "R", + reaksiId, + tentangId, topic, tietMessage.text.toString() + ) + + val gson = GsonBuilder().serializeNulls().create() + val json = gson.toJson(reaksi) + val body = json.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()) + + APIMain.require().reaksiServices.add( + Preferences.getAccessToken(this@GeneralSubDetailActivity), + body, emptyList() + ).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + showProgressDialog(false) + + if (!response.isSuccessful) { + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@GeneralSubDetailActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + showSnack(message) + hasPostedMark = false + return + } + + val body = response.body() + val rawItems = body?.thread?.items + if (rawItems.isNullOrEmpty()) { + showSnack("Reaksi terkirim. Refresh thread...") + loadOlder(1, scrollToBottom = true) + til.error = null + tietMessage.setText("") + dialog.dismiss() + return + } + + val display = rawItems.asReversed() + val chatItems = mapToChatItems(display, myKodePegawai) + chatAdapter.submitList(chatItems) + rvChat.scrollToPosition(chatAdapter.itemCount - 1) + + til.error = null + tietMessage.setText("") + dialog.dismiss() + } + + override fun onFailure(call: Call, t: Throwable) { + showProgressDialog(false) + showSnack(t.message ?: "Terjadi kesalahan") + hasPostedMark = false + } + }) + } + } + + dialog.show() + } + + private fun extractUraianKegiatanFromMsg(msg: com.google.gson.JsonObject?): String? { + if (msg == null) return null + + // ------------------------- + // Safe helpers + // ------------------------- + fun JsonElement?.asStringSafeNullable(): String? { + if (this == null || this.isJsonNull) return null + return try { + when { + this.isJsonPrimitive -> this.asString + this.isJsonArray -> this.asJsonArray.joinToString("\n") { it.asStringSafeNullable().orEmpty() } + this.isJsonObject -> { + // common payload {nilai: "..."} / {value:"..."} + val o = this.asJsonObject + val pick = listOf("nilai", "value", "teks", "string", "uraian", "isi", "jawaban") + .firstNotNullOfOrNull { k -> o.get(k)?.takeIf { !it.isJsonNull } } + pick?.asStringSafeNullable() ?: o.toString() + } + else -> this.toString() + } + } catch (_: Exception) { + null + } + } + + fun getObjAtPath(root: com.google.gson.JsonObject, path: String): JsonElement? { + var cur: JsonElement = root + for (seg in path.split(".")) { + if (!cur.isJsonObject) return null + val o = cur.asJsonObject + if (!o.has(seg)) return null + cur = o.get(seg) + } + return cur + } + + fun arrFrom(vararg paths: String): com.google.gson.JsonArray? { + for (p in paths) { + val el = getObjAtPath(msg, p) + if (el != null && el.isJsonArray) return el.asJsonArray + } + return null + } + + fun rootOrValuesGet(key: String): JsonElement? { + if (msg.has(key) && !msg.get(key).isJsonNull) return msg.get(key) + val values = msg.get("values")?.takeIf { it.isJsonObject }?.asJsonObject + if (values != null && values.has(key) && !values.get(key).isJsonNull) return values.get(key) + + val dv = msg.get("detail_values")?.takeIf { it.isJsonObject }?.asJsonObject + if (dv != null && dv.has(key) && !dv.get(key).isJsonNull) return dv.get(key) + + return null + } + + // ------------------------- + // 1) cari definisi field "Uraian Kegiatan" + // ------------------------- + val detailArr = arrFrom( + "komunikasi.komunikasi_detail", + "komunikasi_detail", + "aksi.komunikasi.komunikasi_detail", + "aksi.komunikasi.komunikasi_detail" // keep + ) ?: return null + + // target field = "Uraian Kegiatan" (kode detail 143) dan jenis teks (id_jenis_isian=0) + var kodeUraian: Int? = null + for (i in 0 until detailArr.size()) { + val el = detailArr[i] + if (!el.isJsonObject) continue + val d = el.asJsonObject + + val kode = d.get("kode")?.takeIf { it.isJsonPrimitive }?.asInt + val jenisId = + d.get("id_jenis_isian")?.takeIf { it.isJsonPrimitive }?.asInt + ?: d.get("jenis_isian")?.takeIf { it.isJsonObject }?.asJsonObject?.get("id") + ?.takeIf { it.isJsonPrimitive }?.asInt + ?: 0 + + val label = d.get("isian")?.asStringSafeNullable()?.trim().orEmpty() + + if (jenisId == ChatAdapter.JENIS_TEKS) { + // paling ideal ketemu kode 143 + if (kode == 143) { + kodeUraian = 143 + break + } + // fallback: label matching + if (kode != null && label.contains("uraian", true) && label.contains("kegiatan", true)) { + kodeUraian = kode + } + } + } + + // kalau tetap gak ketemu, fallback langsung 143 + val kd = kodeUraian ?: 143 + + // ------------------------- + // 2) ambil value dari tempat yang benar + // ------------------------- + + // A) jika backend sudah kirim map detail_values/values by kode detail + rootOrValuesGet(kd.toString())?.asStringSafeNullable()?.trim()?.takeIf { it.isNotBlank() }?.let { return it } + rootOrValuesGet("nilai_$kd")?.asStringSafeNullable()?.trim()?.takeIf { it.isNotBlank() }?.let { return it } + rootOrValuesGet("isian_$kd")?.asStringSafeNullable()?.trim()?.takeIf { it.isNotBlank() }?.let { return it } + + // B) pola sekarang: aksi_komunikasi_teks adalah object {id, aksi_id, nilai:"..."} TANPA kode_detail + // jadi ambil "nilai" dari aksi_komunikasi_teks kalau ada (karena untuk RK Harian biasanya cuma 1 teks yaitu uraian) + msg.get("aksi_komunikasi_teks") + ?.asStringSafeNullable() + ?.trim() + ?.takeIf { it.isNotBlank() } + ?.let { return it } + + val teksObj = msg.get("aksi_komunikasi_teks")?.takeIf { it.isJsonObject }?.asJsonObject + teksObj?.get("nilai")?.asStringSafeNullable()?.trim()?.takeIf { it.isNotBlank() }?.let { return it } + + // fallback lain + msg.get("aksi_komunikasi_string")?.takeIf { it.isJsonObject }?.asJsonObject + ?.get("nilai")?.asStringSafeNullable()?.trim()?.takeIf { it.isNotBlank() }?.let { return it } + + return null + } + + // ========================= + // Helpers Json Safe (single source) + // ========================= + private fun JsonElement?.asStringSafeNullable(): String? { + if (this == null || this.isJsonNull) return null + return try { + when { + this.isJsonPrimitive -> this.asString + this.isJsonArray -> this.asJsonArray.joinToString("\n") { it.asStringSafeNullable().orEmpty() } + this.isJsonObject -> this.toString() + else -> this.toString() + } + } catch (_: Exception) { + null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/LoginActivity.kt b/app/src/main/java/com/amz/genie/activities/LoginActivity.kt new file mode 100644 index 0000000..221b47f --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/LoginActivity.kt @@ -0,0 +1,325 @@ +package com.amz.genie.activities + +import android.Manifest +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.TextUtils +import android.util.Log +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import com.amz.genie.R +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.models.Login +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.android.material.textfield.TextInputEditText +import com.google.firebase.messaging.FirebaseMessaging +import com.google.gson.Gson +import com.google.gson.JsonParser +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import org.json.JSONObject +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class LoginActivity : BaseActivity() { + private lateinit var tietUsername: TextInputEditText + private lateinit var tietPassword: TextInputEditText + private lateinit var tvForgotPassword: TextView + private lateinit var btLogin: Button + + private lateinit var handler: Handler + private var backPressedTime: Long = 0 + private val notificationPermission = Manifest.permission.POST_NOTIFICATIONS + private lateinit var notificationPermissionLauncher: ActivityResultLauncher + private var pendingUserData: Login? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_login) + + initUI() + } + + private fun initUI() { + tietUsername = findViewById(R.id.tiet_username_login) + tietPassword = findViewById(R.id.tiet_password_login) + tvForgotPassword = findViewById(R.id.tv_forgot_password_login) + btLogin = findViewById(R.id.bt_login) + + handler = Handler(Looper.getMainLooper()) + initializePermissionLaunchers() + + setupActions() + } + + private fun initializePermissionLaunchers() { + // Notification permission launcher + notificationPermissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + if (isGranted) { + // Notification permission granted + Log.d("NotificationPermission", "Push notification permission granted") + showCustomNotificationDialog(true) + } else { + // Notification permission denied + Log.w("NotificationPermission", "Push notification permission denied") + showCustomNotificationDialog(false) + } + + // Proceed with login regardless of notification permission + pendingUserData?.let { + proceedAfterPermission(it) + } ?: run { + showProgressDialog(false) + Snackbar.make( + findViewById(android.R.id.content), + "Authentication error, please try again", + Snackbar.LENGTH_LONG + ).show() + } + } + } + + private fun setupActions() { + onBackPressedDispatcher.addCallback(this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (backPressedTime + 2000 > System.currentTimeMillis()) { + finishAffinity() + } else { + Toast.makeText( + this@LoginActivity, + "Tekan Sekali Lagi Untuk Keluar", + Toast.LENGTH_SHORT + ).show() + backPressedTime = System.currentTimeMillis() + } + } + }) + + btLogin.setOnClickListener { + val username: String = tietUsername.text.toString().trim() + val password: String = tietPassword.text.toString().trim { it <= ' ' } + if (!TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) { + if (isNetworkAvailable(this)) { + showProgressDialog(true) + + val paramObject = JSONObject() + paramObject.put("username", username) + paramObject.put("password", password) + + val requestBody: RequestBody = paramObject.toString().toRequestBody( + "application/json".toMediaTypeOrNull()) + + val call: Call = APIMain.require().accountServices.login(requestBody) + call.enqueue(object: Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if (response.isSuccessful) { + val result: Login? = response.body() + result?.let { + pendingUserData = it + checkNotificationPermission() + } + + } else { + showProgressDialog(false) + + val message = if (response.code() == 400) { + val errorJson = response.errorBody()?.string() + if (!errorJson.isNullOrEmpty()) { + JsonParser.parseString(errorJson).asJsonObject["message"]?.asString ?: "Bad Request" + } else { + "Bad Request" + } + } else { + "${response.code()}, ${response.message()}" + } + + Snackbar.make(findViewById(android.R.id.content), + message, + Snackbar.LENGTH_LONG + ).show() + response.errorBody()?.close() + } + } + + override fun onFailure( + call: Call, + t: Throwable + ) { + showProgressDialog(false) + + Snackbar.make(findViewById(android.R.id.content), + t.message.toString(), + Snackbar.LENGTH_LONG + ).show() + } + + }) + + } else { + showProgressDialog(false) + + Snackbar.make(findViewById(android.R.id.content), + ContextCompat.getString(this@LoginActivity, + R.string.no_internet_message), + Snackbar.LENGTH_LONG + ).show() + } + } + } + } + + private fun checkNotificationPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(this, notificationPermission) + != PackageManager.PERMISSION_GRANTED) { + Log.d("NotificationPermission", "Showing notification explanation dialog") + showNotificationExplanationDialog() + } else { + Log.d("NotificationPermission", "Push notification permission already granted") + showCustomNotificationDialog(true) + pendingUserData?.let { + proceedAfterPermission(it) + } + } + } else { + Log.d("NotificationPermission", "No notification permission required for Android < 13") + pendingUserData?.let { + proceedAfterPermission(it) + } + } + } + + private fun showNotificationExplanationDialog() { + AlertDialog.Builder(this) + .setTitle(getString(R.string.enable_push_notifications)) + .setMessage(getString(R.string.notification_explanation)) + .setPositiveButton(getString(R.string.allow_notifications)) { dialog, _ -> + dialog.dismiss() + Log.d("NotificationPermission", "Requesting notification permission") + notificationPermissionLauncher.launch(notificationPermission) + } + .setNegativeButton(getString(R.string.not_now)) { dialog, _ -> + dialog.dismiss() + Log.w("NotificationPermission", "User declined notification permission") + showCustomNotificationDialog(false) + pendingUserData?.let { proceedAfterPermission(it) } + } + .setCancelable(false) + .show() + } + + private fun showCustomNotificationDialog(isGranted: Boolean) { + if (isGranted) { + handler.post { + Snackbar.make( + findViewById(android.R.id.content), + "Notifikasi push sudah diaktifkan! Anda akan menerima pembaruan penting.", + Snackbar.LENGTH_SHORT + ).show() + } + } else { + handler.post { + Snackbar.make( + findViewById(android.R.id.content), + "Notifikasi dinonaktifkan. Anda bisa mengaktifkannya nanti di Pengaturan.", + Snackbar.LENGTH_SHORT + ).show() + } + } + } + + private fun proceedAfterPermission(userData: Login) { + showProgressDialog(false) + + Preferences.setAccessToken(this@LoginActivity, "Bearer ${userData.access_token}") + Preferences.setRefreshToken(this@LoginActivity, "Bearer ${userData.refresh_token}") + + val gson = Gson() + val data = gson.toJson(userData.user) + Preferences.setUserData(this@LoginActivity, data) + + setupFCMAndLogin(userData) + + pendingUserData = null + } + + private fun setupFCMAndLogin(userData: Login) { + val newTopic = userData.user.kode.toString().trim() + if (newTopic.isBlank()) { + Log.w("FCM", "newTopic blank, skip subscribe") + completeLoginProcess() + return + } + + val oldTopic = Preferences.getLastFcmTopic(this).trim() + + FirebaseMessaging.getInstance().token.addOnCompleteListener { tokenTask -> + if (tokenTask.isSuccessful) { + Log.d("FCM", "Token: ${tokenTask.result}") + } else { + Log.w("FCM", "Failed to get token", tokenTask.exception) + } + + // 1) Unsubscribe old topic jika beda + val doSubscribeNew = { + FirebaseMessaging.getInstance().subscribeToTopic(newTopic) + .addOnCompleteListener { subTask -> + Log.d( + "FCM", + "subscribe topic=$newTopic success=${subTask.isSuccessful} err=${subTask.exception}" + ) + + if (subTask.isSuccessful) { + Preferences.setLastFcmTopic(this, newTopic) + } + completeLoginProcess() + } + } + + if (oldTopic.isNotBlank() && oldTopic != newTopic) { + FirebaseMessaging.getInstance().unsubscribeFromTopic(oldTopic) + .addOnCompleteListener { unSubTask -> + Log.d( + "FCM", + "unsubscribe oldTopic=$oldTopic success=${unSubTask.isSuccessful} err=${unSubTask.exception}" + ) + doSubscribeNew() + } + } else { + // old kosong atau sama -> langsung subscribe + doSubscribeNew() + } + } + } + + private fun completeLoginProcess() { + showProgressDialog(false) + navigateTo(MainActivity::class.java, R.anim.right_in, + R.anim.left_out) + finish() + } + + override fun onDestroy() { + super.onDestroy() + handler.removeCallbacksAndMessages(null) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/MainActivity.kt b/app/src/main/java/com/amz/genie/activities/MainActivity.kt new file mode 100644 index 0000000..fb9fe22 --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/MainActivity.kt @@ -0,0 +1,321 @@ +package com.amz.genie.activities + +import android.content.Intent +import android.graphics.PorterDuff +import android.os.Bundle +import android.provider.Settings +import android.view.Gravity +import android.view.View +import android.widget.ImageButton +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.adapters.AddActionAdapter +import com.amz.genie.fragments.ArchiveFragment +import com.amz.genie.fragments.AssignedFragment +import com.amz.genie.fragments.DashboardFragment +import com.amz.genie.fragments.InboxFragment +import com.amz.genie.fragments.TODOFragment +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.models.AddActionItem +import com.amz.genie.models.Komunikasi +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class MainActivity : BaseActivity(), View.OnClickListener { + + private var dashboardFragment = DashboardFragment() + private var inboxFragment = InboxFragment() + private var todoFragment = TODOFragment() + private var assignedFragment = AssignedFragment() + private var archiveFragment = ArchiveFragment() + + private lateinit var llDashboard: LinearLayout + private lateinit var ivDashboard: ImageView + private lateinit var tvDashboard: TextView + private lateinit var llInbox: LinearLayout + private lateinit var ivInbox: ImageView + private lateinit var tvInbox: TextView + private lateinit var llTodo: LinearLayout + private lateinit var ivTodo: ImageView + private lateinit var tvTodo: TextView + private lateinit var llAssigned: LinearLayout + private lateinit var ivAssigned: ImageView + private lateinit var tvAssigned: TextView + private lateinit var llArchive: LinearLayout + private lateinit var ivArchive: ImageView + private lateinit var tvArchive: TextView + lateinit var ibSearch: ImageButton + lateinit var ibAdd: ImageButton + lateinit var ibMenu: ImageButton + + private var layouts: Array? = null + private var imageViews: Array? = null + private var textViews: Array? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + initUI(savedInstanceState) + } + + private fun initUI(savedInstanceState: Bundle?) { + llDashboard = findViewById(R.id.ll_dashboard_bottom_navigation) + ivDashboard = findViewById(R.id.iv_dashboard_bottom_navigation) + tvDashboard = findViewById(R.id.tv_dashboard_bottom_navigation) + llInbox = findViewById(R.id.ll_inbox_bottom_navigation) + ivInbox = findViewById(R.id.iv_inbox_bottom_navigation) + tvInbox = findViewById(R.id.tv_inbox_bottom_navigation) + llTodo = findViewById(R.id.ll_todo_bottom_navigation) + ivTodo = findViewById(R.id.iv_todo_bottom_navigation) + tvTodo = findViewById(R.id.tv_todo_bottom_navigation) + llAssigned = findViewById(R.id.ll_assigned_bottom_navigation) + ivAssigned = findViewById(R.id.iv_assigned_bottom_navigation) + tvAssigned = findViewById(R.id.tv_assigned_bottom_navigation) + llArchive = findViewById(R.id.ll_archive_bottom_navigation) + ivArchive = findViewById(R.id.iv_archive_bottom_navigation) + tvArchive = findViewById(R.id.tv_archive_bottom_navigation) + ibSearch = findViewById(R.id.ib_search_main) + ibAdd = findViewById(R.id.ib_add_aksi_main) + ibMenu = findViewById(R.id.ib_settings_main) + + layouts = arrayOf(llDashboard, llInbox, llTodo, llAssigned, llArchive) + imageViews = arrayOf(ivDashboard, ivInbox, ivTodo, ivAssigned, ivArchive) + textViews = arrayOf(tvDashboard, tvInbox, tvTodo, tvAssigned, tvArchive) + + layouts?.forEach { + it.setOnClickListener(this) + } + + if (savedInstanceState == null) { + dashboardFragment = DashboardFragment() + inboxFragment = InboxFragment() + todoFragment = TODOFragment() + assignedFragment = AssignedFragment() + archiveFragment = ArchiveFragment() + loadFragment(inboxFragment) + ibSearch.visibility = View.VISIBLE + setSelected(llInbox) + } + + setupActions() + } + + private fun setupActions() { + ibAdd.setOnClickListener { showAddActionDialog() } + ibMenu.setOnClickListener { + val intent = Intent(this, MoreActivity::class.java) + startActivity(intent) + } + } + + private fun disableTab(linearLayout: LinearLayout, imageView: ImageView, textView: TextView) { + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + params.weight = 0.8f + params.gravity= Gravity.CENTER + linearLayout.layoutParams = params + linearLayout.background = null + textView.visibility = View.GONE + imageView.background=null + + imageView.setColorFilter( + ContextCompat.getColor(this, R.color.textColorSecondary), + PorterDuff.Mode.MULTIPLY + ) + } + + private fun enable(linearLayout: LinearLayout, imageView: ImageView, textView: TextView) { + linearLayout.background = ContextCompat.getDrawable(this, R.drawable.bg_bottom) + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.MATCH_PARENT + ) + params.weight = 0.8f + params.gravity= Gravity.CENTER + linearLayout.layoutParams = params + imageView.setColorFilter( + ContextCompat.getColor(this, + R.color.colorBlack + )) + textView.visibility = View.VISIBLE + textView.setTextColor(ContextCompat.getColor(this, R.color.colorPrimaryDark)) + } + + private fun setSelected(mBarImg: LinearLayout) { + for ((index, linearLayout) in this.layouts!!.withIndex()) { + if (linearLayout === mBarImg) { + enable(linearLayout, this.imageViews?.get(index)!!, textViews?.get(index)!!) + } else { + disableTab(linearLayout, imageViews?.get(index)!!, textViews?.get(index)!!) + } + } + } + + override fun onClick(p0: View?) { + when (p0!!.id) { + R.id.ll_dashboard_bottom_navigation -> { + loadFragment(dashboardFragment) + setSelected(llDashboard) + + ibSearch.visibility = View.GONE + } + R.id.ll_inbox_bottom_navigation -> { + loadFragment(inboxFragment) + setSelected(llInbox) + + ibSearch.visibility = View.VISIBLE + } + R.id.ll_todo_bottom_navigation -> { + loadFragment(todoFragment) + setSelected(llTodo) + + ibSearch.visibility = View.GONE + } + R.id.ll_assigned_bottom_navigation -> { + loadFragment(assignedFragment) + setSelected(llAssigned) + + ibSearch.visibility = View.GONE + } + R.id.ll_archive_bottom_navigation -> { + loadFragment(archiveFragment) + setSelected(llArchive) + + ibSearch.visibility = View.GONE + } + } + } + + override fun onResume() { + super.onResume() + + if (Preferences.getUserData(this) != null) { // hanya kalau sudah login + if (!arePushNotificationsEnabled(this)) { + showNotificationDisabledPrompt() + } + } + } + + private fun showNotificationDisabledPrompt() { + Snackbar.make(findViewById(android.R.id.content), + "Notifikasi sedang nonaktif. Aktifkan agar dapat pembaruan penting.", + Snackbar.LENGTH_LONG + ).setAction("Pengaturan") { + openAppNotificationSettings() + }.show() + } + + private fun openAppNotificationSettings() { + val intent = Intent().apply { + action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + } + startActivity(intent) + } + + private fun showAddActionDialog() { + val dialogView = layoutInflater.inflate(R.layout.dialog_add_action, null) + val rv = dialogView.findViewById(R.id.rvActions) + + val alertDialog = androidx.appcompat.app.AlertDialog.Builder(this) + .setView(dialogView) + .create() + + // 1) Siapkan list mutable, isi dulu id=0 + val items = mutableListOf( + AddActionItem(0, "Custom") + ) + + // 2) Pasang adapter dari awal biar dialog bisa tampil, lalu nanti update saat API selesai + val adapter = AddActionAdapter(items) { item -> + alertDialog.dismiss() + when (item.id) { + 0 -> { // Custom + startActivity(Intent(this@MainActivity, + AddCustomActionActivity::class.java)) + } + else -> { + val intent = Intent(this@MainActivity, + AddTemplateActionActivity::class.java) + val data = Gson().toJson(item) + intent.putExtra("data", data) + startActivity(intent) + } + } + } + + rv.layoutManager = LinearLayoutManager(this) + rv.adapter = adapter + + alertDialog.show() + + // 3) Ambil data dari API, tambahkan ke list, lalu urutkan dari id=0 + APIMain.require().selectionServices + .komunikasi(Preferences.getAccessToken(this)) + .enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (!response.isSuccessful) { + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(this@MainActivity) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + response.errorBody()?.close() + + return + } + + val body = response.body().orEmpty() + + // tambahkan hasil API ke list + body.forEach { k -> + items.add(AddActionItem(k.kode, k.komunikasi, + k.id_tentang, k.id_tipe_komunikasi, + k.komunikasi_detail)) + } + + // urutkan dari id paling kecil (custom id=0 otomatis di atas) + items.sortBy { it.id } + + // refresh adapter (kalau adapter kamu belum punya method update, lihat catatan di bawah) + adapter.notifyDataSetChanged() + } + + override fun onFailure(call: Call>, t: Throwable) { + showSnack(t.message.toString()) + } + }) + } + + private fun showSnack(message: String) { + Snackbar.make(findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/MoreActivity.kt b/app/src/main/java/com/amz/genie/activities/MoreActivity.kt new file mode 100644 index 0000000..2e14deb --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/MoreActivity.kt @@ -0,0 +1,98 @@ +package com.amz.genie.activities + +import android.net.Uri +import android.os.Bundle +import android.widget.Button +import android.widget.ImageButton +import android.widget.TextView +import androidx.activity.OnBackPressedCallback +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import com.amz.genie.R +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isFemale +import com.amz.genie.helpers.Utils.uriToBase64 +import com.amz.genie.models.Pengguna +import com.google.android.material.imageview.ShapeableImageView +import com.google.gson.Gson + +class MoreActivity : BaseActivity() { + + private lateinit var ibBack: ImageButton + private lateinit var ibBrowsePicture: ImageButton + private lateinit var btLogout: Button + private lateinit var sivEmployee: ShapeableImageView + private lateinit var tvName: TextView + private lateinit var tvJobDesk: TextView + private lateinit var pickImageLauncher: ActivityResultLauncher + private var base64Picture = "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_more) + + initUI() + + } + + private fun initUI() { + ibBack = findViewById(R.id.ib_back_more) + ibBrowsePicture = findViewById(R.id.ib_edit_picture_more) + btLogout = findViewById(R.id.bt_logout_more) + sivEmployee = findViewById(R.id.siv_employee_more) + tvJobDesk = findViewById(R.id.tv_jobdesk_more) + tvName = findViewById(R.id.tv_name_more) + + initData() + setupActions() + } + + private fun setupActions() { + ibBack.setOnClickListener { handleBackPress(0) } + + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() = handleBackPress(0) + }) + + pickImageLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> + uri?.let { + sivEmployee.setImageURI(it) + base64Picture = uriToBase64(this, it).toString() + } + } + + btLogout.setOnClickListener { + showLogoutDialog() + } + + ibBrowsePicture.setOnClickListener { + pickImageLauncher.launch("image/*") + } + } + + private fun initData() { + val data = Gson().fromJson(Preferences.getUserData(this), + Pengguna::class.java) + + tvName.text = data.pegawai?.nama + tvJobDesk.text = data.pegawai?.jabatan?.nama + val female = isFemale(data.pegawai?.id_kelamin) + sivEmployee.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + } + + private fun showLogoutDialog() { + AlertDialog.Builder(this) + .setTitle("Logout") + .setMessage("Yakin ingin keluar dari akun ini?") + .setNegativeButton("Batal") { dialog, _ -> + dialog.dismiss() + } + .setPositiveButton("Logout") { dialog, _ -> + dialog.dismiss() + forceLogoutAndGoLogin(this@MoreActivity) + } + .show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/activities/SplashActivity.kt b/app/src/main/java/com/amz/genie/activities/SplashActivity.kt new file mode 100644 index 0000000..80cadbb --- /dev/null +++ b/app/src/main/java/com/amz/genie/activities/SplashActivity.kt @@ -0,0 +1,39 @@ +package com.amz.genie.activities + +import android.annotation.SuppressLint +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.amz.genie.R +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.isNetworkAvailable + + +@SuppressLint("CustomSplashScreen") +class SplashActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_splash) + + Handler(Looper.getMainLooper()).postDelayed({ + if (isNetworkAvailable(this)) { + if (Preferences.getUserData(this) == null) { + navigateTo(LoginActivity::class.java, + R.anim.right_in, R.anim.left_out) + finish() + + } else { + navigateTo(MainActivity::class.java, + R.anim.right_in, R.anim.left_out) + finish() + } + + } + + }, 800) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/ActivityAdapter.kt b/app/src/main/java/com/amz/genie/adapters/ActivityAdapter.kt new file mode 100644 index 0000000..4dc6dfb --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/ActivityAdapter.kt @@ -0,0 +1,55 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.models.ActivityItem + +class ActivityAdapter( + private val onDelete: (Int) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + fun addItem(item: ActivityItem) { + items.add(item) + notifyItemInserted(items.lastIndex) + } + + fun removeAt(position: Int) { + if (position < 0 || position >= items.size) return + items.removeAt(position) + notifyItemRemoved(position) + } + + fun getItems(): List = items.toList() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context).inflate(R.layout.item_activity, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) = holder.bind(items[position], position) + + override fun getItemCount(): Int = items.size + + inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tv = itemView.findViewById(R.id.tv_activity) + private val btnDelete = itemView.findViewById(R.id.btn_delete_activity) + + fun bind(item: ActivityItem, pos: Int) { + tv.text = item.text + btnDelete.setOnClickListener { onDelete(pos) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/AddActionAdapter.kt b/app/src/main/java/com/amz/genie/adapters/AddActionAdapter.kt new file mode 100644 index 0000000..212b30a --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/AddActionAdapter.kt @@ -0,0 +1,33 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import com.amz.genie.R +import com.amz.genie.models.AddActionItem + +class AddActionAdapter( + private val items: List, + private val onClick: (AddActionItem) -> Unit +) : androidx.recyclerview.widget.RecyclerView.Adapter() { + + inner class VH(itemView: View) : androidx.recyclerview.widget.RecyclerView.ViewHolder(itemView) { + val tvName: TextView = itemView.findViewById(R.id.tv_name_item_add_action) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_add_action, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + val item = items[position] + holder.tvName.text = item.title + + holder.itemView.setOnClickListener { onClick(item) } + } + + override fun getItemCount(): Int = items.size +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/AttachmentAdapter.kt b/app/src/main/java/com/amz/genie/adapters/AttachmentAdapter.kt new file mode 100644 index 0000000..a2f5f38 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/AttachmentAdapter.kt @@ -0,0 +1,45 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageButton +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.models.AttachmentItem + +class AttachmentAdapter( + private val onRemove: (AttachmentItem) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_attachment_chip, parent, false) + return VH(view) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvName: TextView = itemView.findViewById(R.id.tv_name_attachment_chip) + private val ibRemove: ImageButton = itemView.findViewById(R.id.ib_remove_attachment_chip) + + fun bind(item: AttachmentItem) { + tvName.text = item.name + ibRemove.setOnClickListener { onRemove(item) } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/ChatAdapter.kt b/app/src/main/java/com/amz/genie/adapters/ChatAdapter.kt new file mode 100644 index 0000000..3fb58c1 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/ChatAdapter.kt @@ -0,0 +1,637 @@ +package com.amz.genie.adapters + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.graphics.BitmapFactory +import android.net.Uri +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.MimeTypeMap +import android.widget.ImageButton +import android.widget.LinearLayout +import android.widget.TextView +import android.widget.Toast +import androidx.core.content.FileProvider +import androidx.core.view.isVisible +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.activities.AttachmentPreviewActivity +import com.amz.genie.helpers.AttachmentDownloader +import com.amz.genie.helpers.AttachmentExtractor +import com.amz.genie.helpers.ChatMessageRenderer +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Preferences.API_URL +import com.amz.genie.models.ChatItem +import com.amz.genie.services.APIMain +import com.google.android.material.imageview.ShapeableImageView +import com.google.gson.JsonArray +import com.google.gson.JsonElement +import com.google.gson.JsonObject +import java.io.File +import java.util.Locale +import kotlin.concurrent.thread + +class ChatAdapter : RecyclerView.Adapter() { + + companion object { + private const val VT_LEFT = 1 + private const val VT_RIGHT = 2 + + const val JENIS_TEKS = 0 + const val JENIS_WAKTU = 1 + const val JENIS_TANGGAL = 2 + const val JENIS_JAM = 3 + const val JENIS_ANGKA = 4 + const val JENIS_PECAHAN = 5 + const val JENIS_STRING = 6 + const val JENIS_LIST = 10 + const val JENIS_LAMPIRAN = 11 + } + + private data class SimpleAtt(val url: String, val fileName: String, val label: String = "Lampiran") + private val items = mutableListOf() + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + fun prepend(oldItems: List) { + if (oldItems.isEmpty()) return + items.addAll(0, oldItems) + notifyItemRangeInserted(0, oldItems.size) + } + + fun getFirstVisibleId(): String? = items.firstOrNull()?.id + + override fun getItemViewType(position: Int): Int = + if (items[position].isMine) VT_RIGHT else VT_LEFT + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val inf = LayoutInflater.from(parent.context) + return if (viewType == VT_RIGHT) { + RightVH(inf.inflate(R.layout.item_chat_right, parent, false)) + } else { + LeftVH(inf.inflate(R.layout.item_chat_left, parent, false)) + } + } + + override fun getItemCount() = items.size + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val item = items[position] + when (holder) { + is LeftVH -> holder.bind(item) + is RightVH -> holder.bind(item) + } + } + + // ========================= + // ViewHolders + // ========================= + inner class LeftVH(v: View) : RecyclerView.ViewHolder(v) { + private val tvHeader = v.findViewById(R.id.tv_header_item_chat_left) + private val tvMessage = v.findViewById(R.id.tv_message_item_chat_left) + private val tvTime = v.findViewById(R.id.tv_time_item_chat_left) + private val ivAvatar = v.findViewById(R.id.iv_avatar_item_chat_left) + private val llAttachments = v.findViewById(R.id.ll_attachments_item_chat_left) + private val llDetail = v.findViewById(R.id.ll_detail_item_chat_left) + + fun bind(item: ChatItem) { + tvMessage.text = ChatMessageRenderer.render(item.message) + tvTime.text = item.timeText ?: "" + + bindKomunikasiDetail(llDetail, item.message) + + val headerText = buildString { + append(item.senderName ?: "") + val jobOutlet = listOfNotNull(item.senderJob, item.senderOutlet).joinToString(" - ") + if (jobOutlet.isNotBlank()) { + append(" • ") + append(jobOutlet) + } + }.trim() + + val showMeta = !item.isSameSenderAsPrev + tvHeader.isVisible = showMeta + ivAvatar.isVisible = showMeta + tvHeader.text = headerText.ifBlank { "-" } + + bindAttachments(llAttachments, item.message) + } + } + + inner class RightVH(v: View) : RecyclerView.ViewHolder(v) { + private val tvMessage = v.findViewById(R.id.tv_message_item_chat_right) + private val tvTime = v.findViewById(R.id.tv_time_item_chat_right) + private val llAttachments = v.findViewById(R.id.ll_attachments_item_chat_right) + private val llDetail = v.findViewById(R.id.ll_detail_item_chat_right) + + fun bind(item: ChatItem) { + tvMessage.text = ChatMessageRenderer.render(item.message) + tvTime.text = item.timeText ?: "" + bindKomunikasiDetail(llDetail, item.message) + bindAttachments(llAttachments, item.message) + } + } + + // ========================= + // Attachments + // ========================= + private fun fallbackExtractAttachments(msg: JsonObject?): List { + if (msg == null) return emptyList() + + fun arr(vararg keys: String) = keys.firstNotNullOfOrNull { k -> + msg.get(k)?.takeIf { it.isJsonArray }?.asJsonArray + } + + val a = arr("attachments", "lampiran", "files", "berkas") ?: return emptyList() + + val out = ArrayList() + for (i in 0 until a.size()) { + val it = a[i] + if (!it.isJsonObject) continue + val o = it.asJsonObject + + val url = + o.get("url")?.asStringSafe() + ?: o.get("file_url")?.asStringSafe() + ?: o.get("path")?.asStringSafe() + ?: "" + + val name = + o.get("fileName")?.asStringSafe() + ?: o.get("filename")?.asStringSafe() + ?: o.get("name")?.asStringSafe() + ?: o.get("nama_file")?.asStringSafe() + ?: "Attachment" + + if (url.isNotBlank()) out.add(SimpleAtt(url = url, fileName = name)) + } + return out + } + + private fun extractAksiKomunikasiLampiran(msg: JsonObject?): List { + if (msg == null) return emptyList() + val el = msg.get("aksi_komunikasi_lampiran") ?: return emptyList() + + val urls = mutableListOf() + + fun push(u: String) { + val s = u.trim() + if (s.isBlank()) return + urls.add(s) + } + + try { + when { + // ✅ format kamu sekarang: object { "weirdKey": [ "path1", ... ], "weirdKey2": [..] } + el.isJsonObject -> { + val o = el.asJsonObject + + // case normal: {nilai:[...]} (kalau suatu saat kamu rapihin backend) + val nilai = o.get("nilai") + if (nilai != null) { + if (nilai.isJsonArray) { + for (i in 0 until nilai.asJsonArray.size()) push(nilai.asJsonArray[i].asStringSafe()) + } else if (nilai.isJsonPrimitive) push(nilai.asString) + } else { + // case weird: ambil semua entry yang value-nya JsonArray + for ((_, v) in o.entrySet()) { + if (!v.isJsonArray) continue + val arr = v.asJsonArray + for (i in 0 until arr.size()) { + push(arr[i].asStringSafe()) + } + } + } + } + + // fallback kalau jadi array + el.isJsonArray -> { + val arr = el.asJsonArray + for (i in 0 until arr.size()) { + val it = arr[i] + if (it.isJsonPrimitive) push(it.asString) + else if (it.isJsonObject) { + val o = it.asJsonObject + val u = o.get("isian")?.asStringSafe() + ?: o.get("url")?.asStringSafe() + ?: o.get("path")?.asStringSafe() + ?: "" + if (u.isNotBlank()) push(u) + } + } + } + } + } catch (_: Exception) {} + + // dedup + mapping ke chip + return urls.distinct().map { u -> + SimpleAtt(url = u, fileName = fileNameFromUrl(u), label = "Lampiran") + } + } + + private fun bindAttachments(container: LinearLayout, msg: JsonObject?) { + container.removeAllViews() + + val list = AttachmentExtractor.extractAll(msg) + + // ✅ ambil lampiran dari aksi_komunikasi_lampiran (komunikasi detail jenis 11) + val aksiLampiran = extractAksiKomunikasiLampiran(msg) + + val fallback = if (list.isEmpty() && aksiLampiran.isEmpty()) fallbackExtractAttachments(msg) else emptyList() + + val merged = ArrayList() + + // list dari extractor utama (kalau ada) + for (att in list) { + merged.add(SimpleAtt(url = att.url, fileName = att.fileName, label = att.label)) + } + + // lampiran komunikasi detail + merged.addAll(aksiLampiran) + + // fallback legacy + merged.addAll(fallback) + + if (merged.isEmpty()) { + container.isVisible = false + return + } + + container.isVisible = true + val inf = LayoutInflater.from(container.context) + + for (att in merged) { + val chip = inf.inflate(R.layout.item_attachment_chip, container, false) + val tvName = chip.findViewById(R.id.tv_name_attachment_chip) + val ibRemove = chip.findViewById(R.id.ib_remove_attachment_chip) + ibRemove.isVisible = false + + tvName.text = "${att.label} • ${att.fileName}" + chip.setOnClickListener { + openProtectedAttachment(container.context, att.url, att.fileName) + } + container.addView(chip) + } + } + + private fun fileNameFromUrl(url: String): String { + val clean = url.substringBefore("?").substringBefore("#") + return clean.substringAfterLast("/", clean) + } + + private fun openProtectedAttachment(ctx: Context, url: String, fileName: String) { + val rawToken = Preferences.getAccessToken(ctx).orEmpty() + if (rawToken.isBlank()) { + Toast.makeText(ctx, "Token kosong. Tidak bisa buka lampiran.", Toast.LENGTH_LONG).show() + return + } + + Toast.makeText(ctx, "Membuka lampiran...", Toast.LENGTH_SHORT).show() + + val fixedUrl = if (url.startsWith("http", true)) url else { + API_URL.trimEnd('/') + "/uploads/" + url.trimStart('/') + } + + thread { + try { + val file = AttachmentDownloader.downloadToCache( + ctx = ctx, + url = fixedUrl, + fileName = fileName, + token = Preferences.getAccessToken(ctx)!! + ) + + (ctx as? Activity)?.runOnUiThread { + openDownloadedFile(ctx, file, fileName) + } ?: run { + openDownloadedFile(ctx, file, fileName, forceNewTask = true) + } + + } catch (e: Exception) { + (ctx as? Activity)?.runOnUiThread { + Toast.makeText(ctx, e.message ?: "Gagal buka lampiran", Toast.LENGTH_LONG).show() + } ?: run { + Toast.makeText(ctx, e.message ?: "Gagal buka lampiran", Toast.LENGTH_LONG).show() + } + } + } + } + + private fun openDownloadedFile(ctx: Context, file: File, fileName: String, forceNewTask: Boolean = false) { + val isImage = runCatching { BitmapFactory.decodeFile(file.absolutePath) != null }.getOrDefault(false) + + if (isImage) { + val i = Intent(ctx, AttachmentPreviewActivity::class.java).apply { + putExtra("local_path", file.absolutePath) + putExtra("title", fileName.ifBlank { file.name }) + if (forceNewTask) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + ctx.startActivity(i) + } else { + openLocalFile(ctx, file, fileName, forceNewTask) + } + } + + private fun openLocalFile(ctx: Context, file: File, fileName: String, forceNewTask: Boolean) { + val uri: Uri = FileProvider.getUriForFile(ctx, "${ctx.packageName}.fileprovider", file) + val mime = guessMime(fileName) + + val i = Intent(Intent.ACTION_VIEW).apply { + setDataAndType(uri, mime) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + if (forceNewTask) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + ctx.startActivity(Intent.createChooser(i, "Buka lampiran")) + } + + private fun guessMime(fileName: String): String { + val ext = fileName.substringAfterLast('.', "").lowercase(Locale.getDefault()) + val mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext) + return mime ?: "application/octet-stream" + } + + // ========================= + // ✅ Komunikasi Detail (FIX) + // ========================= + private data class DetailField(val label: String, val value: String) + + private fun bindKomunikasiDetail(container: LinearLayout, msg: JsonObject?) { + container.removeAllViews() + if (msg == null) { + container.isVisible = false + return + } + + val details = extractKomunikasiDetailFields(msg) + if (details.isEmpty()) { + container.isVisible = false + return + } + + container.isVisible = true + val inf = LayoutInflater.from(container.context) + + for (d in details) { + val row = inf.inflate(R.layout.item_komunikasi_detail_row, container, false) + val tvLabel = row.findViewById(R.id.tv_label) + val tvValue = row.findViewById(R.id.tv_value) + + tvLabel.text = d.label + tvValue.text = d.value.ifBlank { "-" } + + container.addView(row) + } + } + + private fun extractKomunikasiDetailFields(msg: JsonObject): List { + + fun arrFrom(vararg paths: String): JsonArray? { + for (p in paths) { + var cur: JsonElement = msg + var ok = true + for (seg in p.split(".")) { + if (!cur.isJsonObject) { ok = false; break } + val o = cur.asJsonObject + if (!o.has(seg)) { ok = false; break } + cur = o.get(seg) + } + if (ok && cur.isJsonArray) return cur.asJsonArray + } + return null + } + + fun JsonElement?.asStringSafeNullable(): String? { + if (this == null || this.isJsonNull) return null + return try { + when { + this.isJsonPrimitive -> this.asString + this.isJsonArray -> this.asJsonArray.joinToString("\n") { it.asStringSafeNullable().orEmpty() } + this.isJsonObject -> { + val o = this.asJsonObject + val pick = listOf("nilai", "value", "teks", "string", "uraian", "isi") + .firstNotNullOfOrNull { k -> o.get(k)?.takeIf { !it.isJsonNull } } + pick?.asStringSafeNullable() ?: o.toString() + } + else -> this.toString() + } + } catch (_: Exception) { null } + } + + fun elementToListText(el: JsonElement?): String? { + if (el == null || el.isJsonNull) return null + return try { + when { + el.isJsonArray -> el.asJsonArray.joinToString("\n") { "• " + it.asStringSafe() } + el.isJsonPrimitive -> el.asString + el.isJsonObject -> { + val o = el.asJsonObject + val v = o.get("nilai") + if (v != null && v.isJsonArray) + v.asJsonArray.joinToString("\n") { "• " + it.asStringSafe() } + else el.toString() + } + else -> el.toString() + } + } catch (_: Exception) { null } + } + + fun readFromDetailValues(kodeDetail: Int, jenisId: Int): String? { + val dv = msg.get("detail_values")?.takeIf { it.isJsonObject }?.asJsonObject ?: return null + val el = dv.get(kodeDetail.toString()) ?: return null + return if (jenisId == JENIS_LIST) elementToListText(el) + else el.asStringSafeNullable() + } + + fun readTypedSingle(jenisId: Int): String? { + return when (jenisId) { + + JENIS_TANGGAL -> { + msg.get("aksi_komunikasi_tanggal") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_WAKTU -> { + msg.get("aksi_komunikasi_waktu") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_JAM -> { + msg.get("aksi_komunikasi_jam") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_ANGKA -> { + msg.get("aksi_komunikasi_angka") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_PECAHAN -> { + msg.get("aksi_komunikasi_pecahan") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_TEKS, JENIS_STRING -> { + msg.get("aksi_komunikasi_teks") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + ?: msg.get("aksi_komunikasi_string") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + ?.get("nilai") + .asStringSafeNullable() + } + + JENIS_LIST -> { + val el = msg.get("aksi_komunikasi_list") ?: return null + extractListFromWeirdPayload(el) + } + + JENIS_LAMPIRAN -> { + val atts = extractAksiKomunikasiLampiran(msg) + if (atts.isEmpty()) return null + atts.joinToString("\n") { "• ${it.fileName}" } + } + + else -> null + } + } + + val detailArr = arrFrom( + "komunikasi.komunikasi_detail", + "komunikasi_detail", + "aksi.komunikasi.komunikasi_detail" + ) ?: return emptyList() + + val out = ArrayList() + + for (i in 0 until detailArr.size()) { + val d = detailArr[i] + if (!d.isJsonObject) continue + val dobj = d.asJsonObject + + val label = dobj.get("isian").asStringSafe().ifBlank { "Field" } + + val kodeDetail = + dobj.get("kode")?.asIntSafe() + ?: dobj.get("kode_komunikasi_detail")?.asIntSafe() + ?: continue + + val jenisObj = dobj.get("jenis_isian") + ?.takeIf { it.isJsonObject } + ?.asJsonObject + + val jenisId = + jenisObj?.get("id")?.asIntSafe() + ?: dobj.get("id_jenis_isian")?.asIntSafe() + ?: 0 + + val value = + readFromDetailValues(kodeDetail, jenisId) + ?: readTypedSingle(jenisId) + ?: "" + + if (value.isNotBlank()) { + out.add(DetailField(label, value.trim())) + } + } + + return out + } + + private fun extractListFromWeirdPayload(el: JsonElement): String? { + try { + // Case 1: langsung array + if (el.isJsonArray) { + val arr = el.asJsonArray + val values = mutableListOf() + for (i in 0 until arr.size()) { + val it = arr[i] + when { + it.isJsonPrimitive -> values.add(it.asString) + it.isJsonObject -> { + val o = it.asJsonObject + val v = o.get("nilai")?.let { x -> + if (x.isJsonPrimitive) x.asString else x.toString() + } + if (!v.isNullOrBlank()) values.add(v) + } + } + } + return values.takeIf { it.isNotEmpty() }?.joinToString("\n") { "• $it" } + } + + // Case 2: object normal {nilai:[...]} atau {baris:[...], nilai:[...]} + if (el.isJsonObject) { + val o = el.asJsonObject + + // 2a) standar: ada key "nilai" + val nilai = o.get("nilai") + if (nilai != null) { + return extractListFromWeirdPayload(nilai) + } + + // 2b) payload kamu: key nya string dict -> value nya JsonArray + // ambil semua value yang JsonArray, gabung + val merged = mutableListOf() + for ((_, v) in o.entrySet()) { + if (!v.isJsonArray) continue + val arr = v.asJsonArray + for (i in 0 until arr.size()) { + val it = arr[i] + if (it.isJsonNull) continue + val s = if (it.isJsonPrimitive) it.asString else it.toString() + if (s.isNotBlank()) merged.add(s) + } + } + return merged.takeIf { it.isNotEmpty() }?.joinToString("\n") { "• $it" } + } + + return null + } catch (_: Exception) { + return null + } + } + + // ========================= + // Helpers Json Safe + // ========================= + private fun JsonElement.asStringSafe(): String { + return try { + if (isJsonNull) "" else if (isJsonPrimitive) asString else toString() + } catch (_: Exception) { + "" + } + } + + private fun JsonElement.asIntSafe(): Int? { + return try { + if (isJsonNull) null else if (isJsonPrimitive) asInt else null + } catch (_: Exception) { + null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/GeneralAdapter.kt b/app/src/main/java/com/amz/genie/adapters/GeneralAdapter.kt new file mode 100644 index 0000000..d052f57 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/GeneralAdapter.kt @@ -0,0 +1,94 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.helpers.Utils.formatDateTime +import com.amz.genie.helpers.Utils.isFemale +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.OfficeTrnAksiKepada +import com.amz.genie.models.OfficeTrnReaksiKepada +import com.google.android.material.imageview.ShapeableImageView + +class GeneralAdapter( + private val kodePegawai: String, + private val items: MutableList = mutableListOf(), + private val onItemClick: ((GeneralThreadItem) -> Unit)? = null +) : RecyclerView.Adapter() { + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + inner class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val img: ShapeableImageView = itemView.findViewById(R.id.siv_employee_item_inbox) + private val tvName: TextView = itemView.findViewById(R.id.tv_employeename_item_inbox) + private val tvDateTime: TextView = itemView.findViewById(R.id.tv_datetime_item_inbox) + private val tvJobDesk: TextView = itemView.findViewById(R.id.tv_jobdesk_item_inbox) + private val tvDesc: TextView = itemView.findViewById(R.id.tv_description_item_inbox) + private val tvUnread: TextView = itemView.findViewById(R.id.tv_unread_item_inbox) + + fun bind(row: GeneralThreadItem) { + val tipe = row.tipe.uppercase() + val aksi = row.aksi + val reaksi = row.reaksi + + fun countUnreadAksi(kepada: List?): Int { + return kepada?.count { it.is_aktif == 0 && it.kode_kepada == kodePegawai } ?: 0 + } + + fun countUnreadReaksi(kepada: List?): Int { + return kepada?.count { it.is_aktif == 0 && it.kode_kepada == kodePegawai } ?: 0 + } + + if (tipe == "REAKSI" && reaksi != null) { + tvName.text = reaksi.pembuat.nama + tvDateTime.text = formatDateTime(reaksi.waktu_buat) + tvJobDesk.text = reaksi.pembuat.jabatan?.nama + tvDesc.text = reaksi.uraian?.takeIf { it.isNotBlank() } ?: "-" + + val female = isFemale(reaksi.pembuat.id_kelamin) + img.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + + } else { + tvName.text = aksi.pembuat.nama + tvDateTime.text = formatDateTime(aksi.waktu_buat) + tvJobDesk.text = "${aksi.pembuat.jabatan?.nama} - ${aksi.pembuat.outlet?.nama}" + tvDesc.text = aksi.aksi_komunikasi_teks + ?.nilai + ?.takeIf { it.isNotBlank() } + ?: aksi.uraian + + val female = isFemale(aksi.pembuat.id_kelamin) + img.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + } + + val totalUnread = row.unread_count + if (totalUnread > 0) { + tvUnread.visibility = View.VISIBLE + tvUnread.text = totalUnread.toString() + } else { + tvUnread.visibility = View.GONE + tvUnread.text = "" + } + + itemView.setOnClickListener { onItemClick?.invoke(row) } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context).inflate(R.layout.item_inbox, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/GeneralDetailAdapter.kt b/app/src/main/java/com/amz/genie/adapters/GeneralDetailAdapter.kt new file mode 100644 index 0000000..e408619 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/GeneralDetailAdapter.kt @@ -0,0 +1,171 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.helpers.Utils.formatDateTime +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.OfficeTrnAksiKepada + +class GeneralDetailAdapter( + private val kodePegawai: String, + private val onItemClick: (GeneralThreadItem) -> Unit, + private val onDetailClick: (GeneralThreadItem) -> Unit +) : ListAdapter(DIFF) { + + companion object { + private val DIFF = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: GeneralThreadItem, newItem: GeneralThreadItem): Boolean { + val oldKey = if (oldItem.tipe.equals("REAKSI", true)) + "R_${oldItem.reaksi?.id ?: -1}" + else + "A_${oldItem.aksi.id}" + + val newKey = if (newItem.tipe.equals("REAKSI", true)) + "R_${newItem.reaksi?.id ?: -1}" + else + "A_${newItem.aksi.id}" + + return oldKey == newKey + } + + override fun areContentsTheSame(oldItem: GeneralThreadItem, newItem: GeneralThreadItem): Boolean { + return oldItem == newItem + } + } + } + + fun submitRawTimeline(raw: List?) { + val dedup = raw.orEmpty() + .distinctBy { + if (it.tipe.equals("REAKSI", true)) "R_${it.reaksi?.id}" else "A_${it.aksi.id}" + } + submitList(dedup) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UnifiedVH { + val v = LayoutInflater.from(parent.context).inflate(R.layout.item_inbox_detail, parent, false) + return UnifiedVH(v, kodePegawai, onItemClick, onDetailClick) + } + + override fun onBindViewHolder(holder: UnifiedVH, position: Int) { + holder.bind(getItem(position)) + } + + class UnifiedVH( + itemView: View, + private val kodePegawai: String, + private val onItemClick: (GeneralThreadItem) -> Unit, + private val onDetailClick: (GeneralThreadItem) -> Unit + ) : RecyclerView.ViewHolder(itemView) { + + private val tvTitle: TextView = itemView.findViewById(R.id.tv_title_item_inbox_detail) + private val tvTime: TextView = itemView.findViewById(R.id.tv_time_item_inbox_detail) + private val tvMessage: TextView = itemView.findViewById(R.id.tv_message_item_inbox_detail) // ✅ baru + + private val rvPenerima: RecyclerView = itemView.findViewById(R.id.rv_penerima_item_inbox_detail) + private val rvSubject: RecyclerView = itemView.findViewById(R.id.rv_subject_item_inbox_detail) + private val llContainer: View = itemView.findViewById(R.id.ll_container_item_inbox_detail) + private val ibDetail: View = itemView.findViewById(R.id.ib_detail_item_inbox_detail) + + private var currentItem: GeneralThreadItem? = null + + private val penerimaAdapter = GeneralDetailPenerimaAdapter() + private val subjectAdapter = SubjectAdapter() + + private val glm = GridLayoutManager(itemView.context, 3) + + init { + // ✅ 1 chip = full row, multi = 3 kolom + glm.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (penerimaAdapter.itemCount == 1) 3 else 1 + } + } + + rvPenerima.layoutManager = glm + rvPenerima.adapter = penerimaAdapter + rvPenerima.isNestedScrollingEnabled = false + + rvSubject.layoutManager = LinearLayoutManager(itemView.context, LinearLayoutManager.HORIZONTAL, false) + rvSubject.adapter = subjectAdapter + rvSubject.setHasFixedSize(true) + rvSubject.isNestedScrollingEnabled = false + + ibDetail.setOnClickListener { currentItem?.let { onDetailClick(it) } } + itemView.setOnClickListener { currentItem?.let { onItemClick(it) } } + } + + fun bind(item: GeneralThreadItem) { + currentItem = item + + val isReaksi = item.tipe.equals("REAKSI", true) + val aksi = item.aksi + + // ✅ WARNA berdasar is_aktif untuk saya + val inactiveForMe = aksi.kepada.orEmpty().any { + it.kode_kepada == kodePegawai && it.is_aktif == 0 + } + llContainer.setBackgroundResource( + if (inactiveForMe) R.color.colorGreenVeryLight else R.color.colorWhitePure + ) + + // ✅ Title selalu judul/uraian AKSI + tvTitle.text = aksi.uraian + + if (!isReaksi) { + // AKSI + tvTime.text = formatDateTime(aksi.waktu_buat) + + penerimaAdapter.submitList(aksi.kepada.orEmpty()) + + val listString = arrayListOf( + aksi.tipe_komunikasi?.tipe_komunikasi.toString(), + aksi.tentang.tentang + ) + subjectAdapter.submitList(listString) + + // ✅ tidak ada pesan reaksi + tvMessage.visibility = View.GONE + tvMessage.text = "" + + ibDetail.visibility = View.VISIBLE + + } else { + // REAKSI + val rx = item.reaksi + + tvTitle.text = aksi.uraian + tvTime.text = formatDateTime(rx?.waktu_buat ?: aksi.waktu_buat) + + val pembuat = rx?.pembuat + val chip: List = pembuat?.let { peg -> + listOf( + OfficeTrnAksiKepada( + id = -(rx?.id ?: 1), + aksi_id = aksi.id, + kode_kepada = peg.kode, + kepada = peg, + is_aktif = 1, + waktu_buat = rx?.waktu_buat ?: aksi.waktu_buat, + waktu_ubah = rx?.waktu_buat ?: aksi.waktu_buat + ) + ) + } ?: emptyList() + + penerimaAdapter.submitList(chip) + subjectAdapter.submitList(arrayListOf("REAKSI")) + tvMessage.visibility = View.VISIBLE + tvMessage.text = rx?.uraian?.takeIf { it.isNotBlank() } ?: "(Reaksi)" + ibDetail.visibility = View.VISIBLE + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/GeneralDetailPenerimaAdapter.kt b/app/src/main/java/com/amz/genie/adapters/GeneralDetailPenerimaAdapter.kt new file mode 100644 index 0000000..7f124a6 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/GeneralDetailPenerimaAdapter.kt @@ -0,0 +1,52 @@ +package com.amz.genie.adapters + +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.models.OfficeTrnAksiKepada + +class GeneralDetailPenerimaAdapter : + ListAdapter(DIFF) { + + companion object { + private val DIFF = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: OfficeTrnAksiKepada, newItem: OfficeTrnAksiKepada): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: OfficeTrnAksiKepada, newItem: OfficeTrnAksiKepada): Boolean { + return oldItem == newItem + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_inbox_detail_penerima, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(getItem(position)) + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tv: TextView = itemView.findViewById(R.id.tv_penerima_item) + + fun bind(item: OfficeTrnAksiKepada) { + val nama = item.kepada.nama + tv.text = nama + tv.setBackgroundResource(R.drawable.bg_chip_penerima_dark_green) + tv.setTextColor(itemView.context.getColor(R.color.colorWhitePure)) + + val px = itemView.resources.getDimension(R.dimen.font_size_nano) // sudah px + tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, px) + } + } +} diff --git a/app/src/main/java/com/amz/genie/adapters/RecipientAdapter.kt b/app/src/main/java/com/amz/genie/adapters/RecipientAdapter.kt new file mode 100644 index 0000000..d4ac23a --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/RecipientAdapter.kt @@ -0,0 +1,56 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.helpers.Utils.isFemale +import com.amz.genie.models.Pegawai +import com.google.android.material.button.MaterialButton +import com.google.android.material.imageview.ShapeableImageView + +class RecipientAdapter( + private val onRemove: (Pegawai) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + val ivAvatar: ShapeableImageView = itemView.findViewById(R.id.iv_avatar_recipient) + val tvName: TextView = itemView.findViewById(R.id.tv_name_recipient) + val btnRemove: MaterialButton = itemView.findViewById(R.id.btn_remove_recipient) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_recipient, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + val item = items[position] + holder.tvName.text = item.nama + + // Avatar: + // Kalau Pegawai kamu punya field fotoUrl, nanti bisa pakai Glide/Coil. + // Untuk sekarang pakai default icon sudah cukup. + // holder.ivAvatar.setImageResource(R.drawable.ic_person_24) + + val female = isFemale(item.id_kelamin) + holder.ivAvatar.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + + holder.btnRemove.setOnClickListener { + onRemove(item) + } + } + + override fun getItemCount(): Int = items.size +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/RecipientPickerAdapter.kt b/app/src/main/java/com/amz/genie/adapters/RecipientPickerAdapter.kt new file mode 100644 index 0000000..8a5b204 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/RecipientPickerAdapter.kt @@ -0,0 +1,51 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R +import com.amz.genie.helpers.Utils.isFemale +import com.amz.genie.models.Pegawai +import com.google.android.material.imageview.ShapeableImageView + +class RecipientPickerAdapter( + private val onPick: (Pegawai) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + val ivAvatar: ShapeableImageView = itemView.findViewById(R.id.iv_avatar_recipient) + val tvName: TextView = itemView.findViewById(R.id.tv_name_recipient) + val btnRemove: View = itemView.findViewById(R.id.btn_remove_recipient) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_recipient, parent, false) // item XML yang kamu kasih + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + val item = items[position] + holder.tvName.text = item.nama + + // di dialog, tombol remove tidak dipakai + holder.btnRemove.visibility = View.GONE + + val female = isFemale(item.id_kelamin) + holder.ivAvatar.setImageResource(if (female) R.drawable.ic_woman else R.drawable.ic_man) + + holder.itemView.setOnClickListener { onPick(item) } + } + + override fun getItemCount(): Int = items.size +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/adapters/SubjectAdapter.kt b/app/src/main/java/com/amz/genie/adapters/SubjectAdapter.kt new file mode 100644 index 0000000..db9e586 --- /dev/null +++ b/app/src/main/java/com/amz/genie/adapters/SubjectAdapter.kt @@ -0,0 +1,53 @@ +package com.amz.genie.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.R + +class SubjectAdapter( + private val items: ArrayList = arrayListOf() +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_inbox_detail_penerima, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(items[position], position) + } + + override fun getItemCount(): Int = items.size + + class VH(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tv: TextView = itemView.findViewById(R.id.tv_penerima_item) + + fun bind(item: String, position: Int) { + tv.text = item + + val isGreen = position % 2 == 0 + + tv.setBackgroundResource( + if (isGreen) R.drawable.bg_chip_penerima else R.drawable.bg_chip_penerima_gray + ) + + tv.setTextColor( + ContextCompat.getColor( + itemView.context, + if (isGreen) R.color.colorBlack else R.color.colorWhitePure + ) + ) + } + } + + fun submitList(newItems: List) { + items.clear() + items.addAll(newItems) + notifyDataSetChanged() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/fragments/ArchiveFragment.kt b/app/src/main/java/com/amz/genie/fragments/ArchiveFragment.kt new file mode 100644 index 0000000..3a8937b --- /dev/null +++ b/app/src/main/java/com/amz/genie/fragments/ArchiveFragment.kt @@ -0,0 +1,183 @@ +package com.amz.genie.fragments + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.amz.genie.R +import com.amz.genie.activities.GeneralDetailActivity +import com.amz.genie.activities.MainActivity +import com.amz.genie.adapters.GeneralAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.helpers.Utils.showEmpty +import com.amz.genie.models.GeneralResponse +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import kotlin.collections.orEmpty + + +class ArchiveFragment : Fragment() { + + private lateinit var srlArchive: SwipeRefreshLayout + private lateinit var tvEmpty: TextView + private lateinit var rvArchive: RecyclerView + private lateinit var adapter: GeneralAdapter + private lateinit var detailLauncher: androidx.activity.result.ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + detailLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val needsRefresh = result.data?.getBooleanExtra("needs_refresh", false) ?: false + if (result.resultCode == android.app.Activity.RESULT_OK && needsRefresh) { + initData() + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_archive, container, false) + initUI(view) + return view + } + + private fun initUI(view: View) { + srlArchive = view.findViewById(R.id.srl_archive) + tvEmpty = view.findViewById(R.id.tv_empty_archive) + rvArchive = view.findViewById(R.id.rl_archive) + + val userData = Gson().fromJson(Preferences.getUserData(requireContext()), + Pengguna::class.java) + adapter = GeneralAdapter(userData.pegawai?.kode!!) { item -> + val intent = Intent(requireContext(), GeneralDetailActivity::class.java) + + val gson = Gson() + val dataJson = gson.toJson(item, GeneralThreadItem::class.java) + intent.putExtra("data", dataJson) + detailLauncher.launch(intent) + } + + rvArchive.layoutManager = LinearLayoutManager(requireContext()) + rvArchive.adapter = adapter + rvArchive.setHasFixedSize(true) + + srlArchive.setOnRefreshListener { initData() } + + initData() + } + + private fun initData() { + if (!isNetworkAvailable(requireContext())) { + showSnack(getString(R.string.no_internet_message)) + srlArchive.isRefreshing = false + return + } + + showLoading(true) + + APIMain.require().generalServices + .list( + Preferences.getAccessToken(requireContext()), + 4 + ) + .enqueue(object : Callback { + + override fun onResponse(call: Call, response: Response) { + showLoading(false) + + if (response.isSuccessful) { + val list = response.body()?.items.orEmpty() + + if (list.isEmpty()) { + showEmpty(true, tvEmpty, rvArchive) + adapter.submitList(emptyList()) + } else { + showEmpty(false, tvEmpty, rvArchive) + adapter.submitList(list) + } + return + } + + handleError(response) + } + + override fun onFailure(call: Call, t: Throwable) { + showLoading(false) + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun handleError(response: Response) { + showLoading(false) + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(requireActivity()) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + private fun showLoading(show: Boolean) { + srlArchive.isRefreshing = false + (activity as? MainActivity)?.showProgressDialog(show) + } + + private fun showSnack(message: String) { + (activity as? MainActivity)?.let { act -> + Snackbar.make(act.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + } + + private fun setupActions() { + (activity as? MainActivity)?.setSearchClick({ + Toast.makeText(requireContext(), "TEST RUN", Toast.LENGTH_LONG).show() + }, (activity as MainActivity).ibSearch) + } + + override fun onResume() { + super.onResume() + setupActions() + } + + override fun onPause() { + super.onPause() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + + override fun onDestroy() { + super.onDestroy() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/fragments/AssignedFragment.kt b/app/src/main/java/com/amz/genie/fragments/AssignedFragment.kt new file mode 100644 index 0000000..a66b089 --- /dev/null +++ b/app/src/main/java/com/amz/genie/fragments/AssignedFragment.kt @@ -0,0 +1,183 @@ +package com.amz.genie.fragments + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.amz.genie.R +import com.amz.genie.activities.GeneralDetailActivity +import com.amz.genie.activities.MainActivity +import com.amz.genie.adapters.GeneralAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.helpers.Utils.showEmpty +import com.amz.genie.models.GeneralResponse +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import kotlin.collections.orEmpty + + +class AssignedFragment : Fragment() { + + private lateinit var srlAssigned: SwipeRefreshLayout + private lateinit var tvEmpty: TextView + private lateinit var rvAssigned: RecyclerView + private lateinit var adapter: GeneralAdapter + private lateinit var detailLauncher: androidx.activity.result.ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + detailLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val needsRefresh = result.data?.getBooleanExtra("needs_refresh", false) ?: false + if (result.resultCode == android.app.Activity.RESULT_OK && needsRefresh) { + initData() + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_assigned, container, false) + initUI(view) + return view + } + + private fun initUI(view: View) { + srlAssigned = view.findViewById(R.id.srl_assigned) + tvEmpty = view.findViewById(R.id.tv_empty_assigned) + rvAssigned = view.findViewById(R.id.rl_assigned) + + val userData = Gson().fromJson(Preferences.getUserData(requireContext()), + Pengguna::class.java) + adapter = GeneralAdapter(userData.pegawai?.kode!!) { item -> + val intent = Intent(requireContext(), GeneralDetailActivity::class.java) + + val gson = Gson() + val dataJson = gson.toJson(item, GeneralThreadItem::class.java) + intent.putExtra("data", dataJson) + detailLauncher.launch(intent) + } + + rvAssigned.layoutManager = LinearLayoutManager(requireContext()) + rvAssigned.adapter = adapter + rvAssigned.setHasFixedSize(true) + + srlAssigned.setOnRefreshListener { initData() } + + initData() + } + + private fun initData() { + if (!isNetworkAvailable(requireContext())) { + showSnack(getString(R.string.no_internet_message)) + srlAssigned.isRefreshing = false + return + } + + showLoading(true) + + APIMain.require().generalServices + .list( + Preferences.getAccessToken(requireContext()), + 3 + ) + .enqueue(object : Callback { + + override fun onResponse(call: Call, response: Response) { + showLoading(false) + + if (response.isSuccessful) { + val list = response.body()?.items.orEmpty() + + if (list.isEmpty()) { + showEmpty(true, tvEmpty, rvAssigned) + adapter.submitList(emptyList()) + } else { + showEmpty(false, tvEmpty, rvAssigned) + adapter.submitList(list) + } + return + } + + handleError(response) + } + + override fun onFailure(call: Call, t: Throwable) { + showLoading(false) + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun handleError(response: Response) { + showLoading(false) + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(requireActivity()) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + private fun showLoading(show: Boolean) { + srlAssigned.isRefreshing = false + (activity as? MainActivity)?.showProgressDialog(show) + } + + private fun showSnack(message: String) { + (activity as? MainActivity)?.let { act -> + Snackbar.make(act.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + } + + private fun setupActions() { + (activity as? MainActivity)?.setSearchClick({ + Toast.makeText(requireContext(), "TEST RUN", Toast.LENGTH_LONG).show() + }, (activity as MainActivity).ibSearch) + } + + override fun onResume() { + super.onResume() + setupActions() + } + + override fun onPause() { + super.onPause() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + + override fun onDestroy() { + super.onDestroy() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/fragments/DashboardFragment.kt b/app/src/main/java/com/amz/genie/fragments/DashboardFragment.kt new file mode 100644 index 0000000..fff78ae --- /dev/null +++ b/app/src/main/java/com/amz/genie/fragments/DashboardFragment.kt @@ -0,0 +1,60 @@ +package com.amz.genie.fragments + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.amz.genie.R + +// TODO: Rename parameter arguments, choose names that match +// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER +private const val ARG_PARAM1 = "param1" +private const val ARG_PARAM2 = "param2" + +/** + * A simple [Fragment] subclass. + * Use the [DashboardFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class DashboardFragment : Fragment() { + // TODO: Rename and change types of parameters + private var param1: String? = null + private var param2: String? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + arguments?.let { + param1 = it.getString(ARG_PARAM1) + param2 = it.getString(ARG_PARAM2) + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_dashboard, container, false) + } + + companion object { + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment DashboardFragment. + */ + // TODO: Rename and change types and number of parameters + @JvmStatic + fun newInstance(param1: String, param2: String) = + DashboardFragment().apply { + arguments = Bundle().apply { + putString(ARG_PARAM1, param1) + putString(ARG_PARAM2, param2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/fragments/InboxFragment.kt b/app/src/main/java/com/amz/genie/fragments/InboxFragment.kt new file mode 100644 index 0000000..261351d --- /dev/null +++ b/app/src/main/java/com/amz/genie/fragments/InboxFragment.kt @@ -0,0 +1,180 @@ +package com.amz.genie.fragments + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.amz.genie.R +import com.amz.genie.activities.GeneralDetailActivity +import com.amz.genie.activities.MainActivity +import com.amz.genie.adapters.GeneralAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.helpers.Utils.showEmpty +import com.amz.genie.models.GeneralResponse +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class InboxFragment : Fragment() { + + private lateinit var srlInbox: SwipeRefreshLayout + private lateinit var tvEmpty: TextView + private lateinit var rvInbox: RecyclerView + private lateinit var adapter: GeneralAdapter + private lateinit var detailLauncher: androidx.activity.result.ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + detailLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val needsRefresh = result.data?.getBooleanExtra("needs_refresh", false) ?: false + if (result.resultCode == android.app.Activity.RESULT_OK && needsRefresh) { + initData() + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view = inflater.inflate(R.layout.fragment_inbox, container, false) + initUI(view) + return view + } + + private fun initUI(view: View) { + srlInbox = view.findViewById(R.id.srl_inbox) + tvEmpty = view.findViewById(R.id.tv_empty_inbox) + rvInbox = view.findViewById(R.id.rl_inbox) + + val userData = Gson().fromJson(Preferences.getUserData(requireContext()), + Pengguna::class.java) + adapter = GeneralAdapter(userData.pegawai?.kode!!) { item -> + val intent = Intent(requireContext(), GeneralDetailActivity::class.java) + + val gson = Gson() + val dataJson = gson.toJson(item, GeneralThreadItem::class.java) + intent.putExtra("data", dataJson) + detailLauncher.launch(intent) + } + + rvInbox.layoutManager = LinearLayoutManager(requireContext()) + rvInbox.adapter = adapter + rvInbox.setHasFixedSize(true) + + srlInbox.setOnRefreshListener { initData() } + + initData() + } + + private fun initData() { + if (!isNetworkAvailable(requireContext())) { + showSnack(getString(R.string.no_internet_message)) + srlInbox.isRefreshing = false + return + } + + showLoading(true) + + APIMain.require().generalServices + .list( + Preferences.getAccessToken(requireContext()), + 1 + ) + .enqueue(object : Callback { + + override fun onResponse(call: Call, response: Response) { + showLoading(false) + + if (response.isSuccessful) { + val list = response.body()?.items.orEmpty() + + if (list.isEmpty()) { + showEmpty(true, tvEmpty, rvInbox) + adapter.submitList(emptyList()) + } else { + showEmpty(false, tvEmpty, rvInbox) + adapter.submitList(list) + } + return + } + + handleError(response) + } + + override fun onFailure(call: Call, t: Throwable) { + showLoading(false) + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun handleError(response: Response) { + showLoading(false) + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(requireActivity()) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + private fun showLoading(show: Boolean) { + srlInbox.isRefreshing = false + (activity as? MainActivity)?.showProgressDialog(show) + } + + private fun showSnack(message: String) { + (activity as? MainActivity)?.let { act -> + Snackbar.make(act.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + } + + private fun setupActions() { + (activity as? MainActivity)?.setSearchClick({ + Toast.makeText(requireContext(), "TEST RUN", Toast.LENGTH_LONG).show() + }, (activity as MainActivity).ibSearch) + } + + override fun onResume() { + super.onResume() + setupActions() + } + + override fun onPause() { + super.onPause() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + + override fun onDestroy() { + super.onDestroy() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } +} diff --git a/app/src/main/java/com/amz/genie/fragments/TODOFragment.kt b/app/src/main/java/com/amz/genie/fragments/TODOFragment.kt new file mode 100644 index 0000000..055a060 --- /dev/null +++ b/app/src/main/java/com/amz/genie/fragments/TODOFragment.kt @@ -0,0 +1,182 @@ +package com.amz.genie.fragments + +import android.content.Intent +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.amz.genie.R +import com.amz.genie.activities.GeneralDetailActivity +import com.amz.genie.activities.MainActivity +import com.amz.genie.adapters.GeneralAdapter +import com.amz.genie.helpers.Preferences +import com.amz.genie.helpers.Utils.forceLogoutAndGoLogin +import com.amz.genie.helpers.Utils.isNetworkAvailable +import com.amz.genie.helpers.Utils.showEmpty +import com.amz.genie.models.GeneralResponse +import com.amz.genie.models.GeneralThreadItem +import com.amz.genie.models.Pengguna +import com.amz.genie.services.APIMain +import com.google.android.material.snackbar.Snackbar +import com.google.gson.Gson +import com.google.gson.JsonParser +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import kotlin.collections.orEmpty + + +class TODOFragment : Fragment() { + + private lateinit var srlTODO: SwipeRefreshLayout + private lateinit var tvEmpty: TextView + private lateinit var rvTODO: RecyclerView + private lateinit var adapter: GeneralAdapter + private lateinit var detailLauncher: androidx.activity.result.ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + detailLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val needsRefresh = result.data?.getBooleanExtra("needs_refresh", false) ?: false + if (result.resultCode == android.app.Activity.RESULT_OK && needsRefresh) { + initData() + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val view = inflater.inflate(R.layout.fragment_todo, container, false) + initUI(view) + return view + } + + private fun initUI(view: View) { + srlTODO = view.findViewById(R.id.srl_todo) + tvEmpty = view.findViewById(R.id.tv_empty_todo) + rvTODO = view.findViewById(R.id.rl_todo) + + val userData = Gson().fromJson(Preferences.getUserData(requireContext()), + Pengguna::class.java) + adapter = GeneralAdapter(userData.pegawai?.kode!!) { item -> + val intent = Intent(requireContext(), GeneralDetailActivity::class.java) + + val gson = Gson() + val dataJson = gson.toJson(item, GeneralThreadItem::class.java) + intent.putExtra("data", dataJson) + detailLauncher.launch(intent) + } + + rvTODO.layoutManager = LinearLayoutManager(requireContext()) + rvTODO.adapter = adapter + rvTODO.setHasFixedSize(true) + + srlTODO.setOnRefreshListener { initData() } + + initData() + } + + private fun initData() { + if (!isNetworkAvailable(requireContext())) { + showSnack(getString(R.string.no_internet_message)) + srlTODO.isRefreshing = false + return + } + + showLoading(true) + + APIMain.require().generalServices + .list( + Preferences.getAccessToken(requireContext()), + 2 + ) + .enqueue(object : Callback { + + override fun onResponse(call: Call, response: Response) { + showLoading(false) + + if (response.isSuccessful) { + val list = response.body()?.items.orEmpty() + + if (list.isEmpty()) { + showEmpty(true, tvEmpty, rvTODO) + adapter.submitList(emptyList()) + } else { + showEmpty(false, tvEmpty, rvTODO) + adapter.submitList(list) + } + return + } + + handleError(response) + } + + override fun onFailure(call: Call, t: Throwable) { + showLoading(false) + showSnack(t.message ?: "Terjadi kesalahan") + } + }) + } + + private fun handleError(response: Response) { + showLoading(false) + val raw = runCatching { response.errorBody()?.string().orEmpty() }.getOrDefault("") + val expired = raw.contains("Signature has expired", true) || raw.contains("token_expired", true) + + val message = when { + (response.code() == 401 || response.code() == 500) && expired -> { + forceLogoutAndGoLogin(requireActivity()) + "Session expired. Please login again." + } + response.code() == 400 -> runCatching { + JsonParser.parseString(raw).asJsonObject["message"].asString + }.getOrDefault("Bad request") + else -> "${response.code()}, ${response.message()}" + } + + showSnack(message) + } + + private fun showLoading(show: Boolean) { + srlTODO.isRefreshing = false + (activity as? MainActivity)?.showProgressDialog(show) + } + + private fun showSnack(message: String) { + (activity as? MainActivity)?.let { act -> + Snackbar.make(act.findViewById(android.R.id.content), message, Snackbar.LENGTH_LONG).show() + } + } + + private fun setupActions() { + (activity as? MainActivity)?.setSearchClick({ + Toast.makeText(requireContext(), "TEST RUN", Toast.LENGTH_LONG).show() + }, (activity as MainActivity).ibSearch) + } + + override fun onResume() { + super.onResume() + setupActions() + } + + override fun onPause() { + super.onPause() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } + + override fun onDestroy() { + super.onDestroy() + (activity as? MainActivity)?.ibSearch?.setOnClickListener(null) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/AttachmentDownloader.kt b/app/src/main/java/com/amz/genie/helpers/AttachmentDownloader.kt new file mode 100644 index 0000000..7d97072 --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/AttachmentDownloader.kt @@ -0,0 +1,40 @@ +package com.amz.genie.helpers + +import android.content.Context +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.File + +object AttachmentDownloader { + + fun downloadToCache( + ctx: Context, + url: String, + fileName: String, + token: String + ): File { + val safeName = fileName.ifBlank { "attachment_${System.currentTimeMillis()}" } + val outFile = File(ctx.cacheDir, safeName) + + val client = OkHttpClient.Builder().build() + + val req = Request.Builder() + .url(url) + .addHeader("Authorization", token) + .build() + + client.newCall(req).execute().use { resp -> + if (!resp.isSuccessful) { + throw RuntimeException("Download gagal: ${resp.code} ${resp.message}") + } + val body = resp.body ?: throw RuntimeException("Body kosong") + outFile.outputStream().use { os -> + body.byteStream().use { input -> + input.copyTo(os) + } + } + } + + return outFile + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/AttachmentExtractor.kt b/app/src/main/java/com/amz/genie/helpers/AttachmentExtractor.kt new file mode 100644 index 0000000..121ac7b --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/AttachmentExtractor.kt @@ -0,0 +1,137 @@ +package com.amz.genie.helpers + +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import java.util.Locale + +data class AttachmentItem( + val label: String, // "PDF", "JPG" + val fileName: String, // "xxx.jpg" + val relativePath: String, // "aksi/30030/xxx.jpg" / "aksi_lampiran/16/xxx.jpg" / "reaksi/xxx.jpg" + val url: String // full url +) + +private enum class Source { AKSI, REAKSI, AKSI_LAMPIRAN, UNKNOWN } + +object AttachmentExtractor { + fun extractAll(msg: JsonObject?): List { + if (msg == null) return emptyList() + + val base = Preferences.BASE_UPLOAD_URL.trimEnd('/') // contoh: https://api.../uploads + val out = mutableListOf() + + // A) lampiran umum (aksi) -> path_to_arsip: "aksi/30030/xxx.jpg" + out += extractFromArray( + arr = msg.getArray("lampiran"), + baseUrl = base, + defaultSource = Source.AKSI, + possiblePathKeys = listOf("path_to_arsip", "path", "isian", "file", "filename") + ) + + // B) lampiran reaksi -> kadang cuma filename "Screenshot_....jpg" + out += extractFromArray( + arr = msg.getArray("lampiran_reaksi"), + baseUrl = base, + defaultSource = Source.REAKSI, + possiblePathKeys = listOf("path_to_arsip", "path", "isian", "file", "filename") + ) + + // C) komunikasi detail lampiran -> isian/nilai/value: "aksi_lampiran/16/xxx.jpg" + out += extractFromArray( + arr = msg.getArray("aksi_komunikasi_lampiran"), + baseUrl = base, + defaultSource = Source.AKSI_LAMPIRAN, + possiblePathKeys = listOf("nilai", "value", "isian", "path", "path_to_arsip", "filename") + ) + + // D) fallback (optional) + val fallbackKeys = listOf("aksi_komunikasi_teks", "aksi_komunikasi_string") + for (k in fallbackKeys) { + out += extractFromArray( + arr = msg.getArray(k), + baseUrl = base, + defaultSource = Source.UNKNOWN, + possiblePathKeys = listOf("nilai", "value", "isian", "path", "path_to_arsip", "filename") + ) + } + + return out.distinctBy { it.url } + } + + private fun extractFromArray( + arr: JsonArray?, + baseUrl: String, + defaultSource: Source, + possiblePathKeys: List + ): List { + if (arr == null || arr.size() == 0) return emptyList() + + val out = mutableListOf() + + for (el in arr) { + if (!el.isJsonObject) continue + val obj = el.asJsonObject + + val rawPath = pickFirstString(obj, possiblePathKeys)?.trim().orEmpty() + if (rawPath.isBlank()) continue + + val normalized = normalizeRelativePath(rawPath, defaultSource) ?: continue + + val fileName = normalized.substringAfterLast('/') + if (fileName.isBlank()) continue + + val ext = fileName.substringAfterLast('.', missingDelimiterValue = "") + .lowercase(Locale.getDefault()) + + val label = if (ext.isBlank()) "FILE" else ext.uppercase(Locale.getDefault()) + val url = "$baseUrl/$normalized" + + out += AttachmentItem( + label = label, + fileName = fileName, + relativePath = normalized, + url = url + ) + } + + return out + } + + private fun pickFirstString(obj: JsonObject, keys: List): String? { + for (k in keys) { + val el = obj.get(k) ?: continue + if (el.isJsonNull) continue + val s = runCatching { el.asString }.getOrNull() + if (!s.isNullOrBlank()) return s + } + return null + } + + /** + * Sesuai data DB kamu: + * - aksi: "aksi/30030/...." + * - aksi_lampiran: "aksi_lampiran/16/...." + * - reaksi: kadang cuma filename -> jadi "reaksi/" + */ + private fun normalizeRelativePath(raw: String, defaultSource: Source): String? { + val p = raw.replace("\\", "/").trim().trimStart('/') + if (p.isBlank()) return null + + val lower = p.lowercase(Locale.getDefault()) + if (lower.startsWith("aksi/") || lower.startsWith("aksi_lampiran/") || lower.startsWith("reaksi/")) { + return p + } + + // cuma filename + return when (defaultSource) { + Source.REAKSI -> "reaksi/$p" + Source.AKSI -> "aksi/$p" + Source.AKSI_LAMPIRAN -> "aksi_lampiran/$p" + Source.UNKNOWN -> p + } + } +} + +// extension helper +private fun JsonObject.getArray(key: String) = + get(key)?.takeIf { it.isJsonArray }?.asJsonArray \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/ChatMessageRenderer.kt b/app/src/main/java/com/amz/genie/helpers/ChatMessageRenderer.kt new file mode 100644 index 0000000..607a165 --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/ChatMessageRenderer.kt @@ -0,0 +1,97 @@ +package com.amz.genie.helpers + +import com.google.gson.JsonObject + +object ChatMessageRenderer { + fun render(message: JsonObject?): String { + if (message == null) return "" + + val sb = StringBuilder() + + // 1) uraian (kalau ada) + val uraian = message.getString("uraian") + if (!uraian.isNullOrBlank()) { + sb.append(uraian.trim()) + } + + // 2) komunikasi / tipe_komunikasi / tentang (optional) +// message.getObj("komunikasi")?.getString("komunikasi")?.let { addLine(sb, "Komunikasi", it) } +// message.getObj("tipe_komunikasi")?.getString("tipe_komunikasi")?.let { addLine(sb, "Tipe", it) } +// message.getObj("tentang")?.getString("tentang")?.let { addLine(sb, "Tentang", it) } + + // 3) Render field komunikasi dinamis (list, angka, teks, tanggal, waktu, jam, pecahan, string) + // Semua ini umumnya array of object yang punya "isian" dan "nilai" (atau variasinya). + addSectionFromArray(sb, "aksi_komunikasi_teks", message) + addSectionFromArray(sb, "aksi_komunikasi_string", message) + addSectionFromArray(sb, "aksi_komunikasi_angka", message) + addSectionFromArray(sb, "aksi_komunikasi_pecahan", message) + addSectionFromArray(sb, "aksi_komunikasi_tanggal", message) + addSectionFromArray(sb, "aksi_komunikasi_waktu", message) + addSectionFromArray(sb, "aksi_komunikasi_jam", message) + addSectionFromArray(sb, "aksi_komunikasi_list", message) + + // 4) Lampiran (jika ingin tampil sebagai teks) + val lampiranArr = message.getArray("lampiran") + if (lampiranArr != null && lampiranArr.size() > 0) { + // tampilkan ringkas saja + addLine(sb, "Lampiran", "${lampiranArr.size()} file") + } + + // ✅ 5) Lampiran REAKSI (taruh di sini) + val lampReaksi = message.getArray("lampiran_reaksi") + if (lampReaksi != null && lampReaksi.size() > 0) { + addLine(sb, "Lampiran", "${lampReaksi.size()} file") + } + + // Kalau kosong total, fallback tampilkan JSON singkat + return sb.toString().ifBlank { message.toString() } + } + + private fun addSectionFromArray(sb: StringBuilder, key: String, msg: JsonObject) { + val arr = msg.getArray(key) ?: return + if (arr.size() == 0) return + + for (el in arr) { + if (!el.isJsonObject) continue + val obj = el.asJsonObject + + // Label pertanyaan/isian + val label = obj.getString("isian") + ?: obj.getString("label") + ?: obj.getString("nama") + ?: key + + // Nilai jawaban (banyak variasi field di backend) + val value = obj.getString("nilai") + ?: obj.getString("value") + ?: obj.getString("uraian") + ?: obj.getString("isi") + ?: obj.getString("jawaban") + + if (!value.isNullOrBlank()) { + addLine(sb, label, value) + } + } + } + + private fun addLine(sb: StringBuilder, label: String, value: String) { + if (sb.isNotEmpty()) sb.append("\n") + sb.append("• ").append(label).append(": ").append(value) + } + + // ---- Json helpers ---- + private fun JsonObject.getString(key: String): String? { + val el = get(key) ?: return null + if (el.isJsonNull) return null + return runCatching { el.asString }.getOrNull() + } + + private fun JsonObject.getObj(key: String): JsonObject? { + val el = get(key) ?: return null + if (el.isJsonNull || !el.isJsonObject) return null + return el.asJsonObject + } + + private fun JsonObject.getArray(key: String) = + get(key)?.takeIf { it.isJsonArray }?.asJsonArray +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/EmojiPickerBottomSheet.kt b/app/src/main/java/com/amz/genie/helpers/EmojiPickerBottomSheet.kt new file mode 100644 index 0000000..14b1d59 --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/EmojiPickerBottomSheet.kt @@ -0,0 +1,28 @@ +package com.amz.genie.helpers + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import androidx.emoji2.emojipicker.EmojiPickerView + +class EmojiPickerBottomSheet( + private val onEmojiPicked: (String) -> Unit +) : BottomSheetDialogFragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val picker = EmojiPickerView(requireContext()) + + picker.setOnEmojiPickedListener { emojiViewItem -> + onEmojiPicked(emojiViewItem.emoji) + dismiss() + } + + return picker + } +} diff --git a/app/src/main/java/com/amz/genie/helpers/Preferences.kt b/app/src/main/java/com/amz/genie/helpers/Preferences.kt new file mode 100644 index 0000000..5980543 --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/Preferences.kt @@ -0,0 +1,61 @@ +package com.amz.genie.helpers + +import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit + +object Preferences { + const val PREFS_NAME = "genieData" +// const val API_URL = "https://api-genie.naminaniar.com/api/" +// const val API_URL = "http://192.168.21.102:5000/api/" +// const val API_URL = "http://192.160.3.17:5000/api/" +// const val API_URL = "http://192.168.18.19:5000/api/" + const val API_URL = "http://192.168.1.22:5000/api/" + const val BASE_UPLOAD_URL = "https://api-genie.naminaniar.com/uploads" + const val PROFILE_PICTURE_URL = "https://api-genie.naminaniar.com/profile_picture" + private const val USER = "user" + private const val REFRESH_TOKEN = "refreshToken" + private const val ACCESS_TOKEN = "accessToken" + private const val KEY_LAST_FCM_TOPIC = "last_fcm_topic" + + fun getLastFcmTopic(ctx: Context): String { + val sp = ctx.getSharedPreferences("prefs", Context.MODE_PRIVATE) + return sp.getString(KEY_LAST_FCM_TOPIC, "") ?: "" + } + + fun setLastFcmTopic(ctx: Context, topic: String) { + val sp = ctx.getSharedPreferences("prefs", Context.MODE_PRIVATE) + sp.edit { putString(KEY_LAST_FCM_TOPIC, topic) } + } + + fun preferences(context: Context): SharedPreferences = + context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + + fun setRefreshToken(context: Context, value: String?) { + preferences(context).edit { putString(REFRESH_TOKEN, value) } + } + + fun setAccessToken(context: Context, value: String?) { + preferences(context).edit { putString(ACCESS_TOKEN, value) } + } + + fun getAccessToken(context: Context): String? = + preferences(context).getString(ACCESS_TOKEN, null) + + fun getRefreshToken(context: Context): String? = + preferences(context) + .getString(REFRESH_TOKEN, null) + + fun setUserData(context: Context, value: String?) { + preferences(context).edit { putString(USER, value) } + } + + fun getUserData(context: Context): String? = + preferences(context).getString(USER, null) + + fun clearAll(context: Context) { + preferences(context).edit { + clear() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/SimpleTextWatcher.kt b/app/src/main/java/com/amz/genie/helpers/SimpleTextWatcher.kt new file mode 100644 index 0000000..cd931ad --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/SimpleTextWatcher.kt @@ -0,0 +1,12 @@ +package com.amz.genie.helpers + +import android.text.Editable +import android.text.TextWatcher + +class SimpleTextWatcher(private val onChanged: (String) -> Unit) : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + onChanged(s?.toString().orEmpty()) + } + override fun afterTextChanged(s: Editable?) {} +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/helpers/Utils.kt b/app/src/main/java/com/amz/genie/helpers/Utils.kt new file mode 100644 index 0000000..a51a6cc --- /dev/null +++ b/app/src/main/java/com/amz/genie/helpers/Utils.kt @@ -0,0 +1,221 @@ +package com.amz.genie.helpers + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.net.Uri +import android.provider.OpenableColumns +import android.util.Base64 +import android.util.Log +import android.view.View +import android.webkit.MimeTypeMap +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.amz.genie.activities.LoginActivity +import com.google.firebase.FirebaseApp +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.messaging.FirebaseMessaging +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody +import java.io.File +import java.io.FileOutputStream +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.Locale + +object Utils { + fun isNetworkAvailable(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + } + + fun formatDateTime(raw: String): String { + return try { + val locale = Locale("id", "ID") + val inFmt = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", locale) + val date = inFmt.parse(raw) ?: return raw + + fun isSameDay(a: Calendar, b: Calendar): Boolean { + return a.get(Calendar.YEAR) == b.get(Calendar.YEAR) && + a.get(Calendar.DAY_OF_YEAR) == b.get(Calendar.DAY_OF_YEAR) + } + + val cal = Calendar.getInstance().apply { time = date } + val today = Calendar.getInstance() + val yesterday = Calendar.getInstance().apply { add(Calendar.DAY_OF_YEAR, -1) } + + val timeStr = SimpleDateFormat("HH:mm", locale).format(date) + + when { + isSameDay(cal, today) -> timeStr + isSameDay(cal, yesterday) -> "Kemarin $timeStr" + isWithinLastDays(date, 7) -> { + val dayStr = SimpleDateFormat("EEEE", locale).format(date).replace(".", "") + "$dayStr $timeStr" + } + else -> { + val dateStr = SimpleDateFormat("dd/MM/yy", locale).format(date) + "$dateStr $timeStr" + } + } + } catch (e: Exception) { + raw + } + } + + private fun isWithinLastDays(date: Date, days: Int): Boolean { + val diff = System.currentTimeMillis() - date.time + val limit = days.toLong() * 24L * 60L * 60L * 1000L + return diff in 0 until limit + } + + fun isFemale(gender: String?): Boolean { + return gender == "P" + } + + fun showEmpty(isEmpty: Boolean, tvEmpty: TextView, rl: RecyclerView) { + tvEmpty.visibility = if (isEmpty) View.VISIBLE else View.GONE + rl.visibility = if (isEmpty) View.GONE else View.VISIBLE + } + + fun Context.queryDisplayName(uri: Uri): String? { + val projection = arrayOf(OpenableColumns.DISPLAY_NAME) + return runCatching { + contentResolver.query(uri, projection, null, null, null)?.use { cursor: Cursor -> + val idx = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + if (idx == -1) return@use null + cursor.moveToFirst() + cursor.getString(idx) + } + }.getOrNull() + } + + fun Context.copyUriToCacheFile( + uri: Uri, + prefix: String = "ATTACH_" + ): File { + val mime = contentResolver.getType(uri).orEmpty() + + val nameFromProvider = queryDisplayName(uri) + val extFromMime = runCatching { + MimeTypeMap.getSingleton().getExtensionFromMimeType(mime) + }.getOrNull().orEmpty() + + // Nama file aman + val baseName = nameFromProvider?.takeIf { it.isNotBlank() } + ?: "${prefix}${System.currentTimeMillis()}" + + val safeName = when { + extFromMime.isNotBlank() && !baseName.endsWith(".$extFromMime", true) -> "$baseName.$extFromMime" + else -> baseName + } + + val outFile = File(cacheDir, safeName) + + contentResolver.openInputStream(uri)?.use { input -> + FileOutputStream(outFile).use { output -> + input.copyTo(output) + } + } ?: throw IllegalStateException("Gagal membuka file dari Uri: $uri") + + return outFile + } + + fun Context.uriToMultipartPart( + partName: String, + uri: Uri, + filenameOverride: String? = null + ): MultipartBody.Part { + val mime = contentResolver.getType(uri).orEmpty() + val file = copyUriToCacheFile(uri) + + val mediaType = mime.toMediaTypeOrNull() + val body = file.asRequestBody(mediaType) + + val filename = filenameOverride ?: (queryDisplayName(uri) ?: file.name) + return MultipartBody.Part.createFormData(partName, filename, body) + } + + fun forceLogoutAndGoLogin(activity: Activity) { + val firebaseReady = FirebaseApp.getApps(activity.applicationContext).isNotEmpty() + + // ambil topic sebelum clear prefs + val oldTopic = Preferences.getLastFcmTopic(activity).trim() + + fun finishLogout() { + // clear semua data setelah unsubscribe selesai + Preferences.clearAll(activity) + goLoginClearTask(activity) + } + + // Sign out FirebaseAuth (kalau dipakai) + runCatching { + if (firebaseReady) FirebaseAuth.getInstance().signOut() + }.onFailure { + Log.w("Logout", "FirebaseAuth.signOut failed: ${it.message}", it) + } + + if (!firebaseReady) { + finishLogout() + return + } + + // 1) Unsubscribe dari topic terakhir (kalau ada) + val doDeleteToken = { + runCatching { + FirebaseMessaging.getInstance().deleteToken() + .addOnCompleteListener { + finishLogout() + } + }.onFailure { + Log.w("Logout", "deleteToken failed: ${it.message}", it) + finishLogout() + } + } + + if (oldTopic.isNotBlank()) { + FirebaseMessaging.getInstance().unsubscribeFromTopic(oldTopic) + .addOnCompleteListener { task -> + Log.d( + "Logout", + "unsubscribe topic=$oldTopic success=${task.isSuccessful} err=${task.exception}" + ) + // bersihkan last topic + Preferences.setLastFcmTopic(activity, "") + doDeleteToken() + } + } else { + doDeleteToken() + } + } + + private fun goLoginClearTask(activity: Activity) { + val intent = Intent(activity, LoginActivity::class.java).apply { + flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + } + activity.startActivity(intent) + activity.finish() + } + + fun uriToBase64(context: Context, uri: Uri): String? { + return try { + val inputStream = context.contentResolver.openInputStream(uri) + val bytes = inputStream?.readBytes() + inputStream?.close() + if (bytes != null) { + Base64.encodeToString(bytes, Base64.DEFAULT) + } else null + } catch (e: Exception) { + e.printStackTrace() + null + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/models/ActivityItem.kt b/app/src/main/java/com/amz/genie/models/ActivityItem.kt new file mode 100644 index 0000000..0be4bb3 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/ActivityItem.kt @@ -0,0 +1,5 @@ +package com.amz.genie.models + +data class ActivityItem( + val text: String +) diff --git a/app/src/main/java/com/amz/genie/models/AddActionItem.kt b/app/src/main/java/com/amz/genie/models/AddActionItem.kt new file mode 100644 index 0000000..d2d2dcb --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/AddActionItem.kt @@ -0,0 +1,9 @@ +package com.amz.genie.models + +data class AddActionItem( + val id: Int, + val title: String, + val idTentang: String? = null, + val idKomunikasi: String? = null, + val komunikasi_detail: ArrayList? = null, +) diff --git a/app/src/main/java/com/amz/genie/models/Aksi.kt b/app/src/main/java/com/amz/genie/models/Aksi.kt new file mode 100644 index 0000000..1a93859 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Aksi.kt @@ -0,0 +1,24 @@ +package com.amz.genie.models + +data class Aksi( + val id: Int, + val komunikasi: Komunikasi, + val tentang: Tentang, + val tipe_komunikasi: TipeKomunikasi? = null, + val pembuat: Pegawai, + val uraian: String, + val selesai: String = "T", + val waktu_buat: String, + val kepada: ArrayList? = null, + val lampiran: ArrayList? = null, + val reaksi: ArrayList? = null, + val aksi_komunikasi_angka: OfficeTrnAksiKomunikasiAngka? = null, + val aksi_komunikasi_jam: OfficeTrnAksiKomunikasiJam? = null, + val aksi_komunikasi_lampiran: ArrayList? = null, + val aksi_komunikasi_list: ArrayList? = null, + val aksi_komunikasi_pecahan: OfficeTrnAksiKomunikasiPecahan? = null, + val aksi_komunikasi_string: OfficeTrnAksiKomunikasiString? = null, + val aksi_komunikasi_tanggal: OfficeTrnAksiKomunikasiTanggal? = null, + val aksi_komunikasi_teks: OfficeTrnAksiKomunikasiTeks? = null, + val aksi_komunikasi_waktu: OfficeTrnAksiKomunikasiWaktu? = null, +) diff --git a/app/src/main/java/com/amz/genie/models/AttachmentItem.kt b/app/src/main/java/com/amz/genie/models/AttachmentItem.kt new file mode 100644 index 0000000..d532206 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/AttachmentItem.kt @@ -0,0 +1,5 @@ +package com.amz.genie.models + +import android.net.Uri + +data class AttachmentItem(val uri: Uri, val name: String, val mime: String) diff --git a/app/src/main/java/com/amz/genie/models/ChatItem.kt b/app/src/main/java/com/amz/genie/models/ChatItem.kt new file mode 100644 index 0000000..f68c545 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/ChatItem.kt @@ -0,0 +1,16 @@ +package com.amz.genie.models + +import com.google.gson.JsonObject + +data class ChatItem( + val id: String, + val senderKode: String?, + val senderName: String?, + val senderJob: String?, + val senderOutlet: String?, + val message: JsonObject?, + val timeText: String?, + val isMine: Boolean, + val isSameSenderAsPrev: Boolean +) + diff --git a/app/src/main/java/com/amz/genie/models/FormAttachment.kt b/app/src/main/java/com/amz/genie/models/FormAttachment.kt new file mode 100644 index 0000000..7d7c694 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/FormAttachment.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class FormAttachment( + val uri: android.net.Uri, + val fileName: String, + val mimeType: String +) diff --git a/app/src/main/java/com/amz/genie/models/GeneralResponse.kt b/app/src/main/java/com/amz/genie/models/GeneralResponse.kt new file mode 100644 index 0000000..78835d1 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/GeneralResponse.kt @@ -0,0 +1,61 @@ +package com.amz.genie.models + +import com.google.gson.JsonObject + +data class GeneralResponse( + val items: ArrayList? = arrayListOf() +) + +data class GeneralThreadItem( + val counterpart: String? = null, + val tipe: String, // "AKSI" atau "REAKSI" + val aksi: Aksi, + val unread_count: Int = 0, + val reaksi: Reaksi? = null, + val is_unread: Boolean? = null, + val is_aktif: Int? = null +) + +data class GeneralDetailResponse( + val counterpart: Pegawai? = null, + val items: List = emptyList(), + val meta: Meta? = null +) { + data class Meta( + val page: Int? = null, + val per_page: Int? = null, + val total: Int? = null, + val has_more: Boolean? = null, + val next_page: Int? = null + ) +} + +data class InboxThreadResponse( + val items: List?, + val meta: Meta? +) + +data class Meta( + val page: Int?, + val per_page: Int?, + val total: Int?, + val has_more: Boolean?, + val next_page: Int? +) + +data class Sender( + val nama: String?, + val jabatan: Jabatan?, + val outlet: Outlet? +) + +data class RawMessage( + val id: String?, + val sender_kode: String, + val sender: Sender?, + val message: JsonObject?, + val waktu_buat: String?, + val tipe: String? +) + + diff --git a/app/src/main/java/com/amz/genie/models/Jabatan.kt b/app/src/main/java/com/amz/genie/models/Jabatan.kt new file mode 100644 index 0000000..1a01f93 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Jabatan.kt @@ -0,0 +1,6 @@ +package com.amz.genie.models + +data class Jabatan( + val kode: Int, + val nama: String +) diff --git a/app/src/main/java/com/amz/genie/models/Komunikasi.kt b/app/src/main/java/com/amz/genie/models/Komunikasi.kt new file mode 100644 index 0000000..3788409 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Komunikasi.kt @@ -0,0 +1,10 @@ +package com.amz.genie.models + +data class Komunikasi( + val kode: Int, + val id_tipe_komunikasi: String, + val id_tentang: String, + val komunikasi: String, + val id_status_data: Int, + val komunikasi_detail: ArrayList? +) diff --git a/app/src/main/java/com/amz/genie/models/KomunikasiDetail.kt b/app/src/main/java/com/amz/genie/models/KomunikasiDetail.kt new file mode 100644 index 0000000..9d348a0 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/KomunikasiDetail.kt @@ -0,0 +1,24 @@ +package com.amz.genie.models + +data class KomunikasiDetail( + val kode: Int? = null, + val kode_komunikasi: Int, + val urutan: Int? = null, + val id_jenis_isian: Int, + val jenis_isian: OfficeRefJenisIsian? = null, + val isian: String, + val petunjuk: String? = null, + val is_wajib: Int = 1, + val is_aktif: Int = 1, + val nilai_pemicu: String?, + val is_wajib_kondisional: Int = 0, + val id_tahap_isian: String = "A", + val operator_pemicu: String?, + val kode_detail_induk: Int? = null, + val is_separator: Int = 0, + val is_pertanyaan: Int = 0, + val is_rantai_komunikasi: Int = 0, + val is_pemicu_tindak_lanjut_isian: Int = 0, + val max_item: Int, + val min_item: Int +) diff --git a/app/src/main/java/com/amz/genie/models/Login.kt b/app/src/main/java/com/amz/genie/models/Login.kt new file mode 100644 index 0000000..cc3dc7e --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Login.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class Login( + val access_token: String, + val refresh_token: String, + val user: Pengguna +) diff --git a/app/src/main/java/com/amz/genie/models/Message.kt b/app/src/main/java/com/amz/genie/models/Message.kt new file mode 100644 index 0000000..c2d2334 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Message.kt @@ -0,0 +1,5 @@ +package com.amz.genie.models + +data class Message( + val message: String +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeRefJenisIsian.kt b/app/src/main/java/com/amz/genie/models/OfficeRefJenisIsian.kt new file mode 100644 index 0000000..3619c49 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeRefJenisIsian.kt @@ -0,0 +1,6 @@ +package com.amz.genie.models + +data class OfficeRefJenisIsian( + val id: Int, + val nama_jenis_isian: String +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKepada.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKepada.kt new file mode 100644 index 0000000..12a5dfa --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKepada.kt @@ -0,0 +1,16 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKepada( + val id: Int, + val aksi_id: Int, + val kode_kepada: String, + val kepada: Pegawai, + val id_status_komunikasi: String = "T", + val id_kotak_pesan: Int = 1, + val is_adhoc: Int = 0, + val is_aktif: Int = 0, + val is_selesai: Int = 0, + val id_status_data: Int = 1, + val waktu_buat: String, + val waktu_ubah: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiAngka.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiAngka.kt new file mode 100644 index 0000000..e66d972 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiAngka.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiAngka( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: Int, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiJam.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiJam.kt new file mode 100644 index 0000000..04d6868 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiJam.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiJam( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiLampiran.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiLampiran.kt new file mode 100644 index 0000000..135e1ec --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiLampiran.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiLampiran( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiList.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiList.kt new file mode 100644 index 0000000..95568fd --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiList.kt @@ -0,0 +1,9 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiList( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val baris: Int, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiPecahan.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiPecahan.kt new file mode 100644 index 0000000..7364467 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiPecahan.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiPecahan( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: Float, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiString.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiString.kt new file mode 100644 index 0000000..cd1d4e9 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiString.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiString( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTanggal.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTanggal.kt new file mode 100644 index 0000000..b97b8c2 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTanggal.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiTanggal( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTeks.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTeks.kt new file mode 100644 index 0000000..e73b1da --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiTeks.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiTeks( + val id: Int? = null, + val aksi_id: Int? = null, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiWaktu.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiWaktu.kt new file mode 100644 index 0000000..9987e84 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiKomunikasiWaktu.kt @@ -0,0 +1,8 @@ +package com.amz.genie.models + +data class OfficeTrnAksiKomunikasiWaktu( + val id: Int, + val aksi_id: Int, + val komunikasi_detail: KomunikasiDetail? = null, + val nilai: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnAksiLampiran.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiLampiran.kt new file mode 100644 index 0000000..b60efb8 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnAksiLampiran.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class OfficeTrnAksiLampiran( + val id: Int, + val aksi_id: String, + val path_to_arsip: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiKepada.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiKepada.kt new file mode 100644 index 0000000..57951b9 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiKepada.kt @@ -0,0 +1,14 @@ +package com.amz.genie.models + +data class OfficeTrnReaksiKepada( + val id: Int, + val reaksi_id: Int, + val kode_kepada: String, + val id_status_komunikasi: String = "T", + val id_kotak_pesan: Int = 1, + val is_adhoc: Int = 0, + val is_aktif: Int = 0, + val is_selesai: Int = 0, + val waktu_buat: String, + val waktu_ubah: String, +) diff --git a/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiLampiran.kt b/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiLampiran.kt new file mode 100644 index 0000000..047336c --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/OfficeTrnReaksiLampiran.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class OfficeTrnReaksiLampiran( + val id: Int, + val reaksi_id: String, + val path_to_arsip: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/models/Outlet.kt b/app/src/main/java/com/amz/genie/models/Outlet.kt new file mode 100644 index 0000000..a7205fb --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Outlet.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class Outlet( + val kode: Int, + val nama: String, + val singkatan: String, +) diff --git a/app/src/main/java/com/amz/genie/models/Pegawai.kt b/app/src/main/java/com/amz/genie/models/Pegawai.kt new file mode 100644 index 0000000..b36aabb --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Pegawai.kt @@ -0,0 +1,11 @@ +package com.amz.genie.models + +data class Pegawai( + val kode: String, + val nama: String, + val outlet: Outlet?, + val jabatan: Jabatan?, + val mulai_bekerja: String, + val id_kelamin: String, + val outlets: ArrayList? +) diff --git a/app/src/main/java/com/amz/genie/models/Pengguna.kt b/app/src/main/java/com/amz/genie/models/Pengguna.kt new file mode 100644 index 0000000..16a71e0 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Pengguna.kt @@ -0,0 +1,9 @@ +package com.amz.genie.models + +data class Pengguna( + val kode: Int, + val pegawai: Pegawai?, + val email: String?, + val telephone: String?, + val username: String +) diff --git a/app/src/main/java/com/amz/genie/models/PostAksi.kt b/app/src/main/java/com/amz/genie/models/PostAksi.kt new file mode 100644 index 0000000..cf314da --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/PostAksi.kt @@ -0,0 +1,10 @@ +package com.amz.genie.models + +data class PostAksi( + var kode: Int?, + var kepada: List, + var tentang: String, + var topic: String, + var uraian: String, + var komunikasiDetail: ArrayList? +) diff --git a/app/src/main/java/com/amz/genie/models/Reaksi.kt b/app/src/main/java/com/amz/genie/models/Reaksi.kt new file mode 100644 index 0000000..b29db85 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Reaksi.kt @@ -0,0 +1,16 @@ +package com.amz.genie.models + +data class Reaksi( + val id: Int, + val id_aksi: Int? = null, + val id_reaksi: Int? = null, + val id_jenis_reaksi: String? = null, + val kode_komunikasi: Int? = null, + val tentang: Tentang? = null, + val tipe_komunikasi: TipeKomunikasi? = null, + val pembuat: Pegawai, + val uraian: String?, + val waktu_buat: String, + val kepada_reaksi: ArrayList? = null, + val lampiran_reaksi: ArrayList? = null +) diff --git a/app/src/main/java/com/amz/genie/models/ReaksiPost.kt b/app/src/main/java/com/amz/genie/models/ReaksiPost.kt new file mode 100644 index 0000000..eee44f8 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/ReaksiPost.kt @@ -0,0 +1,10 @@ +package com.amz.genie.models + +data class ReaksiPost( + var aksi_id: Int, + var jenis_reaksi: String, + var reaksi_id: Int? = null, + var tentang: String, + var topic: String, + var uraian: String +) \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/models/ReaksiResponse.kt b/app/src/main/java/com/amz/genie/models/ReaksiResponse.kt new file mode 100644 index 0000000..e291042 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/ReaksiResponse.kt @@ -0,0 +1,7 @@ +package com.amz.genie.models + +data class ReaksiResponse( + val message: String, + val reaksi_id: Int, + val thread: InboxThreadResponse +) diff --git a/app/src/main/java/com/amz/genie/models/Tentang.kt b/app/src/main/java/com/amz/genie/models/Tentang.kt new file mode 100644 index 0000000..5eabf61 --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/Tentang.kt @@ -0,0 +1,11 @@ +package com.amz.genie.models + +data class Tentang( + val id: String, + val tentang: String, + val keterangan: String?, + val is_aktif: Int = 1, + val id_status_data: Int = 1, + val waktu_ubah: String, + val diubah_oleh: Int? = null +) diff --git a/app/src/main/java/com/amz/genie/models/TipeKomunikasi.kt b/app/src/main/java/com/amz/genie/models/TipeKomunikasi.kt new file mode 100644 index 0000000..f95459b --- /dev/null +++ b/app/src/main/java/com/amz/genie/models/TipeKomunikasi.kt @@ -0,0 +1,11 @@ +package com.amz.genie.models + +data class TipeKomunikasi( + val id: String, + val tipe_komunikasi: String, + val keterangan: String?, + val is_aktif: Int = 1, + val id_status_data: Int = 1, + val waktu_ubah: String, + val diubah_oleh: Int? = null +) diff --git a/app/src/main/java/com/amz/genie/services/APIMain.kt b/app/src/main/java/com/amz/genie/services/APIMain.kt new file mode 100644 index 0000000..041fe8c --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/APIMain.kt @@ -0,0 +1,100 @@ +package com.amz.genie.services + +import android.app.Application +import android.content.pm.ApplicationInfo +import android.util.Log +import androidx.appcompat.app.AppCompatDelegate +import com.amz.genie.helpers.Preferences +import com.google.firebase.FirebaseApp +import com.google.firebase.messaging.FirebaseMessaging +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.util.concurrent.TimeUnit + +class APIMain: Application() { + companion object { + lateinit var instance: APIMain + private set + + fun require(): APIMain { + check(::instance.isInitialized) { + "APIMain belum diinisialisasi. Pastikan android:name='.services.APIMain' sudah ada " + + "di AndroidManifest dan jangan panggil APIMain() secara langsung." + } + return instance + } + } + + lateinit var accountServices: AuthServices + lateinit var generalServices: GeneralServices + lateinit var reaksiServices: ReaksiServices + lateinit var selectionServices: SelectionServices + lateinit var actionServices: ActionServices + + override fun onCreate() { + super.onCreate() + + // Paksa aplikasi selalu LIGHT (disable dark mode) + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO) + + instance = this + + val firebaseApp = runCatching { FirebaseApp.initializeApp(this) }.getOrNull() + if (firebaseApp == null) { + Log.e("FirebaseInit", "FirebaseApp.initializeApp() returned NULL. App lanjut tanpa Firebase.") + } else { + runCatching { + FirebaseMessaging.getInstance().isAutoInitEnabled = true + Log.d("FirebaseInit", "Firebase ready, FCM autoInit enabled") + }.onFailure { + Log.e("FirebaseInit", "FCM init failed: ${it.message}", it) + } + } + + Log.d("APIMain", "onCreate() called, initializing Retrofit...") + + val tokenRepo = TokenRepository(this) + + val isDebug = (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0 + val logging = HttpLoggingInterceptor().apply { + level = if (isDebug) HttpLoggingInterceptor.Level.BODY + else HttpLoggingInterceptor.Level.NONE + } + + val baseClient = OkHttpClient.Builder() + .addInterceptor(logging) + .connectTimeout(100, TimeUnit.SECONDS) + .readTimeout(3600, TimeUnit.SECONDS) + .writeTimeout(120, TimeUnit.SECONDS) + .callTimeout(3600, TimeUnit.SECONDS) + .retryOnConnectionFailure(true) + .build() + + val retrofitAuth = Retrofit.Builder() + .baseUrl(Preferences.API_URL) + .client(baseClient) + .addConverterFactory(GsonConverterFactory.create()) + .build() + val authServices = retrofitAuth.create(AuthServices::class.java) + + val mainClient = baseClient.newBuilder() + .addInterceptor(HeaderInterceptor(tokenRepo)) + .addInterceptor(ExpiredRetryInterceptor(tokenRepo, authServices)) + .authenticator(TokenAuthenticator(tokenRepo, authServices)) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl(Preferences.API_URL) + .client(mainClient) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + accountServices = retrofit.create(AuthServices::class.java) + generalServices = retrofit.create(GeneralServices::class.java) + reaksiServices = retrofit.create(ReaksiServices::class.java) + selectionServices = retrofit.create(SelectionServices::class.java) + actionServices = retrofit.create(ActionServices::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/ActionServices.kt b/app/src/main/java/com/amz/genie/services/ActionServices.kt new file mode 100644 index 0000000..f9873bf --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/ActionServices.kt @@ -0,0 +1,20 @@ +package com.amz.genie.services + +import com.amz.genie.models.Message +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.http.Header +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface ActionServices { + @Multipart + @POST("aksi/add") + fun add( + @Header("Authorization") token: String?, + @Part("data") data: RequestBody, + @Part files: List? = emptyList() + ): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/AuthServices.kt b/app/src/main/java/com/amz/genie/services/AuthServices.kt new file mode 100644 index 0000000..59738d8 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/AuthServices.kt @@ -0,0 +1,34 @@ +package com.amz.genie.services + +import com.amz.genie.models.Login +import com.amz.genie.models.Message +import com.google.gson.annotations.SerializedName +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.DELETE +import retrofit2.http.Header +import retrofit2.http.POST +import retrofit2.http.Path + +interface AuthServices { + @POST("auth/refresh") + fun refresh( + @Header("Authorization") refreshAuthorization: String // "Bearer " + ): Call + + @POST("login") + fun login( + @Body requestBody: RequestBody + ): Call + + @DELETE("api/{path}") + fun logoutDynamic( + @Path("path") path: String, + @Header("Authorization") token: String? + ): Call +} + +data class RefreshResponse( + @SerializedName("access_token") val accessToken: String +) \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/ExpiredRetryInterceptor.kt b/app/src/main/java/com/amz/genie/services/ExpiredRetryInterceptor.kt new file mode 100644 index 0000000..d7882ee --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/ExpiredRetryInterceptor.kt @@ -0,0 +1,37 @@ +package com.amz.genie.services + +import okhttp3.Interceptor +import okhttp3.Response + +class ExpiredRetryInterceptor(private val tokenRepo: TokenRepository, + private val authServices: AuthServices +) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + var req = chain.request() + var resp = chain.proceed(req) + + if (resp.code == 500) { + val peek = resp.peekBody(1024 * 1024).string() + val looksExpired = peek.contains("token_expired", true) || + peek.contains("Signature has expired", true) + + if (looksExpired) { + resp.close() + val refresh = tokenRepo.getRefreshToken() + if (!refresh.isNullOrBlank()) { + val r = try { authServices.refresh("Bearer $refresh").execute() } catch (_: Exception) { null } + val newAccess = r?.body()?.accessToken + if (r != null && r.isSuccessful && !newAccess.isNullOrBlank()) { + tokenRepo.saveAccessToken(newAccess) + req = req.newBuilder() + .header("Authorization", "Bearer $newAccess") + .build() + return chain.proceed(req) // retry sekali + } + } + } + } + + return resp + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/GeneralServices.kt b/app/src/main/java/com/amz/genie/services/GeneralServices.kt new file mode 100644 index 0000000..5847f2d --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/GeneralServices.kt @@ -0,0 +1,44 @@ +package com.amz.genie.services + +import com.amz.genie.models.GeneralDetailResponse +import com.amz.genie.models.GeneralResponse +import com.amz.genie.models.InboxThreadResponse +import com.amz.genie.models.Message +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST +import retrofit2.http.Query + +interface GeneralServices { + @GET("general/list") + fun list( + @Header("Authorization") token: String?, + @Query("general_id") generalId: Int + ): Call + + @GET("inbox/detail") + fun detail( + @Header("Authorization") token: String?, + @Query("counterpart_kode") counterPartKode: String?, + @Query("page") page: Int, + @Query("per_page") perPage: Int + ): Call + + @GET("inbox/thread") + fun threadDetail( + @Header("Authorization") token: String?, + @Query("counterpart_kode") counterpart: String, + @Query("aksi_id") aksiId: Int, + @Query("page") page: Int, + @Query("per_page") perPage: Int + ): Call + + @POST("inbox/readed") + fun readed( + @Header("Authorization") token: String?, + @Query("aksi_reaksi_id") aksiReaksiId: Int, + @Query("tipe") tipe: String, + ): Call + +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/HeaderInterceptor.kt b/app/src/main/java/com/amz/genie/services/HeaderInterceptor.kt new file mode 100644 index 0000000..86e174d --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/HeaderInterceptor.kt @@ -0,0 +1,21 @@ +package com.amz.genie.services + +import okhttp3.Interceptor +import okhttp3.Response + +class HeaderInterceptor( + private val tokenRepo: TokenRepository +) : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val original = chain.request() + val b = original.newBuilder() + .header("Content-Type", "application/json") + + val access = tokenRepo.getAccessToken() + if (!access.isNullOrBlank()) { + b.header("Authorization", access) + } + + return chain.proceed(b.method(original.method, original.body).build()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/MyFirebaseMessagingService.kt b/app/src/main/java/com/amz/genie/services/MyFirebaseMessagingService.kt new file mode 100644 index 0000000..75e2fb1 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/MyFirebaseMessagingService.kt @@ -0,0 +1,162 @@ +package com.amz.genie.services + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Intent +import android.media.AudioAttributes +import android.os.Build +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.core.net.toUri +import com.amz.genie.R +import com.amz.genie.activities.MainActivity +import com.google.firebase.messaging.RemoteMessage +import com.google.firebase.messaging.FirebaseMessagingService +import androidx.core.app.TaskStackBuilder +import com.amz.genie.activities.GeneralDetailActivity +import com.amz.genie.activities.GeneralSubDetailActivity + + +class MyFirebaseMessagingService: FirebaseMessagingService() { + override fun onNewToken(token: String) { + super.onNewToken(token) + Log.d("FCM", "Refreshed token: $token") + } + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + super.onMessageReceived(remoteMessage) + + val titleFromNotif = remoteMessage.notification?.title + val bodyFromNotif = remoteMessage.notification?.body + + val title = remoteMessage.data["title"] ?: titleFromNotif + val body = remoteMessage.data["body"] ?: bodyFromNotif + + Log.d("FCM", "data=${remoteMessage.data} notifTitle=$titleFromNotif") + + if (!title.isNullOrBlank() || !body.isNullOrBlank() || remoteMessage.data.isNotEmpty()) { + sendNotification(title, body, remoteMessage.data) + } + } + + private fun ensureChannels(notificationManager: NotificationManager) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return + + val soundUri = "android.resource://${packageName}/${R.raw.notification}".toUri() + val attrs = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build() + + // DEFAULT + val defaultChannel = NotificationChannel( + "genie_default_v1", + "Genie - Umum", + NotificationManager.IMPORTANCE_DEFAULT + ) + + // URGENT (lebih kenceng) + val urgentChannel = NotificationChannel( + "genie_urgent_v1", + "Genie - Penting", + NotificationManager.IMPORTANCE_HIGH + ).apply { + enableVibration(true) + setSound(soundUri, attrs) + // enableLights(true) // optional + } + + notificationManager.createNotificationChannel(defaultChannel) + notificationManager.createNotificationChannel(urgentChannel) + } + + private fun buildClickPendingIntent(data: Map, requestCode: Int): PendingIntent { + val open = data["open"] ?: "main" // main | inbox_detail | inbox_subdetail + val dataJson = data["data"] // JSON InboxThreadItem + val counterpart = data["counterpart"] // untuk subdetail + + // 1) MainActivity dulu (biar masuk app dan stack rapi) + val mainIntent = Intent(this, MainActivity::class.java).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + // optional: kasih sinyal supaya Main fokus ke inbox tab + putExtra("open_tab", "inbox") + } + + val stack = TaskStackBuilder.create(this) + stack.addNextIntent(mainIntent) + + val aksiId = data["aksi_id"] ?: data["id_aksi"] // support dua key + val cp = data["counterpart"] ?: data["kode_pembuat"] + val tentangId = data["tentang_id"] ?: data["id_tentang"] + + if (open == "inbox_subdetail") { + // Kalau ada JSON lama, tetap support + if (!dataJson.isNullOrBlank()) { + val detailIntent = Intent(this, GeneralDetailActivity::class.java).apply { + putExtra("data", dataJson) + } + stack.addNextIntent(detailIntent) + + val subIntent = Intent(this, GeneralSubDetailActivity::class.java).apply { + putExtra("data", dataJson) + if (!counterpart.isNullOrBlank()) putExtra("counterpart", counterpart) + } + stack.addNextIntent(subIntent) + } else if (!aksiId.isNullOrBlank() && !cp.isNullOrBlank()) { + // ✅ Mode baru: buka thread pakai cp + aksi_id (tanpa JSON) + val subIntent = Intent(this, GeneralSubDetailActivity::class.java).apply { + putExtra("aksi_id", aksiId) + putExtra("counterpart_kode", cp) + if (!tentangId.isNullOrBlank()) putExtra("tentang_id", tentangId) + // optional: putExtra("tipe", data["tipe"]) + } + stack.addNextIntent(subIntent) + } + } + + return stack.getPendingIntent( + requestCode, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + )!! + } + + private fun sendNotification( + title: String?, + message: String?, + data: Map + ) { + val notificationManager = + getSystemService(NOTIFICATION_SERVICE) as NotificationManager + + ensureChannels(notificationManager) + + val isUrgent = data["is_urgent"] == "yes" + val channelId = if (isUrgent) "genie_urgent_v1" else "genie_default_v1" + + val soundUri = "android.resource://${packageName}/${R.raw.notification}".toUri() + + // Intent ketika notif diklik + val notificationId = (System.currentTimeMillis() % Int.MAX_VALUE).toInt() + val pendingIntent = buildClickPendingIntent(data, notificationId) + + val builder = NotificationCompat.Builder(this, channelId) + .setSmallIcon(R.drawable.logo_normal) + .setContentTitle(title ?: "Genie") + .setContentText(message ?: "Ada notifikasi masuk") + .setStyle(NotificationCompat.BigTextStyle().bigText(message ?: "Ada notifikasi masuk")) + .setAutoCancel(true) + .setContentIntent(pendingIntent) // ✅ INI KUNCI: biar klik ada aksi + .setPriority( + if (isUrgent) NotificationCompat.PRIORITY_HIGH + else NotificationCompat.PRIORITY_DEFAULT + ) + + // Android < 8 (Oreo) perlu set sound langsung + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + builder.setSound(soundUri) + } + + notificationManager.notify(notificationId, builder.build()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/ReaksiServices.kt b/app/src/main/java/com/amz/genie/services/ReaksiServices.kt new file mode 100644 index 0000000..0941b01 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/ReaksiServices.kt @@ -0,0 +1,20 @@ +package com.amz.genie.services + +import com.amz.genie.models.ReaksiResponse +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.http.Header +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.Part + +interface ReaksiServices { + @Multipart + @POST("reaksi/add") + fun add( + @Header("Authorization") token: String?, + @Part("data") data: RequestBody, + @Part files: List? = emptyList() + ): Call +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/SelectionServices.kt b/app/src/main/java/com/amz/genie/services/SelectionServices.kt new file mode 100644 index 0000000..2637736 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/SelectionServices.kt @@ -0,0 +1,40 @@ +package com.amz.genie.services + +import com.amz.genie.models.Komunikasi +import com.amz.genie.models.Pegawai +import com.amz.genie.models.Tentang +import com.amz.genie.models.TipeKomunikasi +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface SelectionServices { + @GET("topics") + fun communicationTypes( + @Header("Authorization") token: String? + ): Call> + + @GET("tentang") + fun tentangs( + @Header("Authorization") token: String?, + @Query("id_tipe_komunikasi") idTipeKomunikasi: String + ): Call> + + @GET("penerima") + fun recipients( + @Header("Authorization") token: String?, + @Query("id_tipe_komunikasi") idTipeKomunikasi: String?, + @Query("id_tentang") idTentang: String?, + ): Call> + + @GET("list_pegawai") + fun allRecipient( + @Header("Authorization") token: String?, + ): Call> + + @GET("komunikasi") + fun komunikasi( + @Header("Authorization") token: String? + ): Call> +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/TokenAuthenticator.kt b/app/src/main/java/com/amz/genie/services/TokenAuthenticator.kt new file mode 100644 index 0000000..92e7418 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/TokenAuthenticator.kt @@ -0,0 +1,38 @@ +package com.amz.genie.services + +import okhttp3.Authenticator +import okhttp3.Request +import okhttp3.Response +import okhttp3.Route + +class TokenAuthenticator( + private val tokenRepo: TokenRepository, + private val authApi: AuthServices +) : Authenticator { + + override fun authenticate(route: Route?, response: Response): Request? { + // Hindari loop tak berujung + if (responseCount(response) >= 2) return null + + val refresh = tokenRepo.getRefreshToken() ?: return null + + val refreshResp = try { + authApi.refresh("Bearer $refresh").execute() + } catch (_: Exception) { return null } + + if (!refreshResp.isSuccessful) return null + val newAccess = refreshResp.body()?.accessToken ?: return null + + tokenRepo.saveAccessToken(newAccess) + + return response.request.newBuilder() + .header("Authorization", "Bearer $newAccess") + .build() + } + + private fun responseCount(response: Response): Int { + var r = response; var count = 1 + while (r.priorResponse != null) { r = r.priorResponse!!; count++ } + return count + } +} \ No newline at end of file diff --git a/app/src/main/java/com/amz/genie/services/TokenRepository.kt b/app/src/main/java/com/amz/genie/services/TokenRepository.kt new file mode 100644 index 0000000..b261a44 --- /dev/null +++ b/app/src/main/java/com/amz/genie/services/TokenRepository.kt @@ -0,0 +1,10 @@ +package com.amz.genie.services + +import android.content.Context +import com.amz.genie.helpers.Preferences + +class TokenRepository(private val ctx: Context) { + fun getAccessToken() = Preferences.getAccessToken(ctx) + fun getRefreshToken() = Preferences.getRefreshToken(ctx) + fun saveAccessToken(token: String) = Preferences.setAccessToken(ctx, token) +} \ No newline at end of file diff --git a/app/src/main/res/anim/left_in.xml b/app/src/main/res/anim/left_in.xml new file mode 100644 index 0000000..ba93530 --- /dev/null +++ b/app/src/main/res/anim/left_in.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/left_out.xml b/app/src/main/res/anim/left_out.xml new file mode 100644 index 0000000..3400fa5 --- /dev/null +++ b/app/src/main/res/anim/left_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/right_in.xml b/app/src/main/res/anim/right_in.xml new file mode 100644 index 0000000..c6c05fe --- /dev/null +++ b/app/src/main/res/anim/right_in.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/right_out.xml b/app/src/main/res/anim/right_out.xml new file mode 100644 index 0000000..6ae4d74 --- /dev/null +++ b/app/src/main/res/anim/right_out.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add_notes_24px.xml b/app/src/main/res/drawable/add_notes_24px.xml new file mode 100644 index 0000000..d5a29ed --- /dev/null +++ b/app/src/main/res/drawable/add_notes_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/add_reaction_24px.xml b/app/src/main/res/drawable/add_reaction_24px.xml new file mode 100644 index 0000000..2e32a48 --- /dev/null +++ b/app/src/main/res/drawable/add_reaction_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/all_inbox_24px.xml b/app/src/main/res/drawable/all_inbox_24px.xml new file mode 100644 index 0000000..3f7eeea --- /dev/null +++ b/app/src/main/res/drawable/all_inbox_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/archive_24px.xml b/app/src/main/res/drawable/archive_24px.xml new file mode 100644 index 0000000..a7d0bf2 --- /dev/null +++ b/app/src/main/res/drawable/archive_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/arrow_back_24px.xml b/app/src/main/res/drawable/arrow_back_24px.xml new file mode 100644 index 0000000..0e2e863 --- /dev/null +++ b/app/src/main/res/drawable/arrow_back_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/assignment_ind_24px.xml b/app/src/main/res/drawable/assignment_ind_24px.xml new file mode 100644 index 0000000..5c1104a --- /dev/null +++ b/app/src/main/res/drawable/assignment_ind_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/attach_file_24px.xml b/app/src/main/res/drawable/attach_file_24px.xml new file mode 100644 index 0000000..6d9ac73 --- /dev/null +++ b/app/src/main/res/drawable/attach_file_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/bg_bottom.xml b/app/src/main/res/drawable/bg_bottom.xml new file mode 100644 index 0000000..6dd917c --- /dev/null +++ b/app/src/main/res/drawable/bg_bottom.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_bottom_shadow.xml b/app/src/main/res/drawable/bg_bottom_shadow.xml new file mode 100644 index 0000000..c9a4bb7 --- /dev/null +++ b/app/src/main/res/drawable/bg_bottom_shadow.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_bubble_aksi.xml b/app/src/main/res/drawable/bg_bubble_aksi.xml new file mode 100644 index 0000000..b136ad6 --- /dev/null +++ b/app/src/main/res/drawable/bg_bubble_aksi.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_bubble_me.xml b/app/src/main/res/drawable/bg_bubble_me.xml new file mode 100644 index 0000000..654d3f5 --- /dev/null +++ b/app/src/main/res/drawable/bg_bubble_me.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_bubble_other.xml b/app/src/main/res/drawable/bg_bubble_other.xml new file mode 100644 index 0000000..aae45cf --- /dev/null +++ b/app/src/main/res/drawable/bg_bubble_other.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_bubble_reply.xml b/app/src/main/res/drawable/bg_bubble_reply.xml new file mode 100644 index 0000000..ea255e0 --- /dev/null +++ b/app/src/main/res/drawable/bg_bubble_reply.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_bubble_unread.xml b/app/src/main/res/drawable/bg_bubble_unread.xml new file mode 100644 index 0000000..654d3f5 --- /dev/null +++ b/app/src/main/res/drawable/bg_bubble_unread.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_chip_penerima.xml b/app/src/main/res/drawable/bg_chip_penerima.xml new file mode 100644 index 0000000..eaa6cf6 --- /dev/null +++ b/app/src/main/res/drawable/bg_chip_penerima.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_chip_penerima_dark_green.xml b/app/src/main/res/drawable/bg_chip_penerima_dark_green.xml new file mode 100644 index 0000000..e760304 --- /dev/null +++ b/app/src/main/res/drawable/bg_chip_penerima_dark_green.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_chip_penerima_gray.xml b/app/src/main/res/drawable/bg_chip_penerima_gray.xml new file mode 100644 index 0000000..251994b --- /dev/null +++ b/app/src/main/res/drawable/bg_chip_penerima_gray.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_circle.xml b/app/src/main/res/drawable/bg_circle.xml new file mode 100644 index 0000000..5c62afc --- /dev/null +++ b/app/src/main/res/drawable/bg_circle.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_new_message_indicator.xml b/app/src/main/res/drawable/bg_new_message_indicator.xml new file mode 100644 index 0000000..527f4d8 --- /dev/null +++ b/app/src/main/res/drawable/bg_new_message_indicator.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_rectangle_rounded_stroke.xml b/app/src/main/res/drawable/bg_rectangle_rounded_stroke.xml new file mode 100644 index 0000000..0acb5b4 --- /dev/null +++ b/app/src/main/res/drawable/bg_rectangle_rounded_stroke.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_top_shadow.xml b/app/src/main/res/drawable/bg_top_shadow.xml new file mode 100644 index 0000000..17337c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_top_shadow.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/btn_background.xml b/app/src/main/res/drawable/btn_background.xml new file mode 100644 index 0000000..9bc6913 --- /dev/null +++ b/app/src/main/res/drawable/btn_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/button_shadow.xml b/app/src/main/res/drawable/button_shadow.xml new file mode 100644 index 0000000..95b17c8 --- /dev/null +++ b/app/src/main/res/drawable/button_shadow.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/clarify_24px.xml b/app/src/main/res/drawable/clarify_24px.xml new file mode 100644 index 0000000..0a5c2ff --- /dev/null +++ b/app/src/main/res/drawable/clarify_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/close_24px.xml b/app/src/main/res/drawable/close_24px.xml new file mode 100644 index 0000000..e64fe39 --- /dev/null +++ b/app/src/main/res/drawable/close_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/document_search_24px.xml b/app/src/main/res/drawable/document_search_24px.xml new file mode 100644 index 0000000..70374ce --- /dev/null +++ b/app/src/main/res/drawable/document_search_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/expand_circle_right_24px.xml b/app/src/main/res/drawable/expand_circle_right_24px.xml new file mode 100644 index 0000000..0659195 --- /dev/null +++ b/app/src/main/res/drawable/expand_circle_right_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_fingerprint.xml b/app/src/main/res/drawable/ic_fingerprint.xml new file mode 100644 index 0000000..ef67585 --- /dev/null +++ b/app/src/main/res/drawable/ic_fingerprint.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml new file mode 100644 index 0000000..88ddae4 --- /dev/null +++ b/app/src/main/res/drawable/ic_home.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_left_arrow.xml b/app/src/main/res/drawable/ic_left_arrow.xml new file mode 100644 index 0000000..889fc70 --- /dev/null +++ b/app/src/main/res/drawable/ic_left_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_man.jpeg b/app/src/main/res/drawable/ic_man.jpeg new file mode 100644 index 0000000..8b9f98b Binary files /dev/null and b/app/src/main/res/drawable/ic_man.jpeg differ diff --git a/app/src/main/res/drawable/ic_visibility_black_24dp.xml b/app/src/main/res/drawable/ic_visibility_black_24dp.xml new file mode 100644 index 0000000..5d162eb --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_visibility_off_black_24dp.xml b/app/src/main/res/drawable/ic_visibility_off_black_24dp.xml new file mode 100644 index 0000000..c97a69f --- /dev/null +++ b/app/src/main/res/drawable/ic_visibility_off_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_woman.jpg b/app/src/main/res/drawable/ic_woman.jpg new file mode 100644 index 0000000..fcd60a8 Binary files /dev/null and b/app/src/main/res/drawable/ic_woman.jpg differ diff --git a/app/src/main/res/drawable/list_alt_24px.xml b/app/src/main/res/drawable/list_alt_24px.xml new file mode 100644 index 0000000..7440170 --- /dev/null +++ b/app/src/main/res/drawable/list_alt_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/logo_normal.png b/app/src/main/res/drawable/logo_normal.png new file mode 100644 index 0000000..6a09307 Binary files /dev/null and b/app/src/main/res/drawable/logo_normal.png differ diff --git a/app/src/main/res/drawable/logo_reflection.png b/app/src/main/res/drawable/logo_reflection.png new file mode 100644 index 0000000..7a748a7 Binary files /dev/null and b/app/src/main/res/drawable/logo_reflection.png differ diff --git a/app/src/main/res/drawable/menu_24px.xml b/app/src/main/res/drawable/menu_24px.xml new file mode 100644 index 0000000..538d1cf --- /dev/null +++ b/app/src/main/res/drawable/menu_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/mic_24px.xml b/app/src/main/res/drawable/mic_24px.xml new file mode 100644 index 0000000..7d2e099 --- /dev/null +++ b/app/src/main/res/drawable/mic_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/photo_camera_24px.xml b/app/src/main/res/drawable/photo_camera_24px.xml new file mode 100644 index 0000000..1230acf --- /dev/null +++ b/app/src/main/res/drawable/photo_camera_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/photo_library_24px.xml b/app/src/main/res/drawable/photo_library_24px.xml new file mode 100644 index 0000000..492224c --- /dev/null +++ b/app/src/main/res/drawable/photo_library_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/registration.png b/app/src/main/res/drawable/registration.png new file mode 100644 index 0000000..73687bb Binary files /dev/null and b/app/src/main/res/drawable/registration.png differ diff --git a/app/src/main/res/drawable/search_24px.xml b/app/src/main/res/drawable/search_24px.xml new file mode 100644 index 0000000..390774b --- /dev/null +++ b/app/src/main/res/drawable/search_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/send_24px.xml b/app/src/main/res/drawable/send_24px.xml new file mode 100644 index 0000000..254f05c --- /dev/null +++ b/app/src/main/res/drawable/send_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/settings_24px.xml b/app/src/main/res/drawable/settings_24px.xml new file mode 100644 index 0000000..4bcd4aa --- /dev/null +++ b/app/src/main/res/drawable/settings_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/shadow.xml b/app/src/main/res/drawable/shadow.xml new file mode 100644 index 0000000..26a2e2d --- /dev/null +++ b/app/src/main/res/drawable/shadow.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splashscreen_background.xml b/app/src/main/res/drawable/splashscreen_background.xml new file mode 100644 index 0000000..9e08042 --- /dev/null +++ b/app/src/main/res/drawable/splashscreen_background.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/googlesansbold.ttf b/app/src/main/res/font/googlesansbold.ttf new file mode 100644 index 0000000..8049766 Binary files /dev/null and b/app/src/main/res/font/googlesansbold.ttf differ diff --git a/app/src/main/res/font/googlesansmedium.ttf b/app/src/main/res/font/googlesansmedium.ttf new file mode 100644 index 0000000..1543660 Binary files /dev/null and b/app/src/main/res/font/googlesansmedium.ttf differ diff --git a/app/src/main/res/font/googlesansregular.ttf b/app/src/main/res/font/googlesansregular.ttf new file mode 100644 index 0000000..ab605f9 Binary files /dev/null and b/app/src/main/res/font/googlesansregular.ttf differ diff --git a/app/src/main/res/layout/activity_add_custom_action.xml b/app/src/main/res/layout/activity_add_custom_action.xml new file mode 100644 index 0000000..b55dc73 --- /dev/null +++ b/app/src/main/res/layout/activity_add_custom_action.xml @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_add_template_action.xml b/app/src/main/res/layout/activity_add_template_action.xml new file mode 100644 index 0000000..a0844fd --- /dev/null +++ b/app/src/main/res/layout/activity_add_template_action.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + +