diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 65a6f045cc1..6f6482daeb5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1803,6 +1803,10 @@
android:theme="@style/GlifV3Theme.Light"
android:exported="false"/>
+
+
@@ -1837,6 +1841,7 @@
+
diff --git a/res/drawable-nodpi/accessibility_timeout.png b/res/drawable-nodpi/accessibility_timeout.png
deleted file mode 100644
index 887f117e3ca..00000000000
Binary files a/res/drawable-nodpi/accessibility_timeout.png and /dev/null differ
diff --git a/res/drawable/extra_dim_banner.gif b/res/drawable/extra_dim_banner.gif
deleted file mode 100644
index a31087cdd6f..00000000000
Binary files a/res/drawable/extra_dim_banner.gif and /dev/null differ
diff --git a/res/drawable/ic_face_enroll_introduction_shield.xml b/res/drawable/ic_face_enroll_introduction_shield.xml
deleted file mode 100644
index 09d3909cbe1..00000000000
--- a/res/drawable/ic_face_enroll_introduction_shield.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml
index 77a10197f1b..2887bcac277 100644
--- a/res/layout/face_enroll_introduction.xml
+++ b/res/layout/face_enroll_introduction.xml
@@ -30,7 +30,9 @@
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd">
+
-
-
-
+ android:textSize="16sp"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:textSize="16sp"/>
+
+ android:textSize="16sp"/>
+
@@ -184,12 +155,11 @@
android:layout_height="24dp"/>
+ android:textSize="16sp"/>
diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index beac124f6e8..65c1497d9ff 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -30,7 +30,9 @@
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
- android:orientation="vertical">
+ android:orientation="vertical"
+ android:layout_marginStart="?attr/sudMarginStart"
+ android:layout_marginEnd="?attr/sudMarginEnd">
+
-
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="20sp"/>
+ android:paddingTop="24dp">
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="16sp"/>
+ android:paddingTop="24dp">
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="16sp"/>
+
+
-
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="20sp"/>
+ android:paddingTop="24dp">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:text="@string/security_settings_fingerprint_v2_enroll_introduction_message_learn_more"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="16sp"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/raw/accessibility_timeout.mp4 b/res/raw/accessibility_timeout.mp4
deleted file mode 100644
index 2214e2b8c59..00000000000
Binary files a/res/raw/accessibility_timeout.mp4 and /dev/null differ
diff --git a/res/raw/accessibility_timeout_banner.json b/res/raw/accessibility_timeout_banner.json
new file mode 100644
index 00000000000..2f77fe564d0
--- /dev/null
+++ b/res/raw/accessibility_timeout_banner.json
@@ -0,0 +1,10617 @@
+{
+ "v": "5.6.5",
+ "fr": 60,
+ "ip": 0,
+ "op": 420,
+ "w": 412,
+ "h": 300,
+ "nm": "Time_To_Take_Action",
+ "ddd": 0,
+ "assets": [],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 204,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 215,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 396,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 413,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 151.263,
+ 97.6,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 44.25,
+ 18.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 204,
+ "s": [
+ 115.2,
+ 115.2,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 215,
+ "s": [
+ 120,
+ 120,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 396,
+ "s": [
+ 120,
+ 120,
+ 100
+ ]
+ },
+ {
+ "t": 413,
+ "s": [
+ 115.2,
+ 115.2,
+ 100
+ ]
+ }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -5,
+ 7.5
+ ],
+ [
+ 5,
+ 0
+ ],
+ [
+ -5,
+ -7.5
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 45.25,
+ 18.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -2.26,
+ 3.389
+ ],
+ [
+ -3.389,
+ 3.389
+ ],
+ [
+ -3.389,
+ -3.389
+ ],
+ [
+ -2.26,
+ -3.389
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 3.389,
+ -3.389
+ ],
+ [
+ -1.413,
+ 0
+ ],
+ [
+ 3.389,
+ 3.389
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 1,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 2",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 16.862,
+ 18.485
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 5,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.26,
+ -3.389
+ ],
+ [
+ 3.389,
+ -3.389
+ ],
+ [
+ 3.389,
+ 3.389
+ ],
+ [
+ 2.26,
+ 3.389
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -3.389,
+ 3.389
+ ],
+ [
+ 1.413,
+ 0
+ ],
+ [
+ -3.389,
+ -3.389
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 1,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 2",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 71.638,
+ 18.485
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 5,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 44.25,
+ 18.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 44.25,
+ 18.25
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 5",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": ".blue100",
+ "cl": "blue100",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 204,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 215,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 396,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 413,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 151.263,
+ 97.6,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 44.25,
+ 18.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 204,
+ "s": [
+ 115.2,
+ 115.2,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 215,
+ "s": [
+ 120,
+ 120,
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ "t": 396,
+ "s": [
+ 120,
+ 120,
+ 100
+ ]
+ },
+ {
+ "t": 413,
+ "s": [
+ 115.2,
+ 115.2,
+ 100
+ ]
+ }
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 9.941,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 9.941
+ ],
+ [
+ -9.941,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -9.941
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -9.941,
+ 0
+ ],
+ [
+ 0,
+ -9.941
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 9.941,
+ 0
+ ],
+ [
+ 0,
+ 9.941
+ ]
+ ],
+ "v": [
+ [
+ 26,
+ 18
+ ],
+ [
+ -26,
+ 18
+ ],
+ [
+ -44,
+ 0
+ ],
+ [
+ -26,
+ -18
+ ],
+ [
+ 26,
+ -18
+ ],
+ [
+ 44,
+ 0
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.823529411765,
+ 0.890196078431,
+ 0.988235294118,
+ 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": [
+ 44.25,
+ 18.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": "BoxMatte",
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": ".blue300",
+ "cl": "blue300",
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 9,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 29,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 81.063,
+ 95.405,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 7.75,
+ 7.75,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -4.142
+ ],
+ [
+ 4.142,
+ 0
+ ],
+ [
+ 0,
+ 4.142
+ ],
+ [
+ -4.143,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 4.142
+ ],
+ [
+ -4.143,
+ 0
+ ],
+ [
+ 0,
+ -4.142
+ ],
+ [
+ 4.142,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 7.5,
+ 0
+ ],
+ [
+ 0,
+ 7.5
+ ],
+ [
+ -7.5,
+ 0
+ ],
+ [
+ 0,
+ -7.5
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.541176470588,
+ 0.705882352941,
+ 0.972549019608,
+ 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": [
+ 7.75,
+ 7.75
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": "BoxMatte 2",
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 4,
+ "nm": ".blue300",
+ "cl": "blue300",
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 9,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 29,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 97.212,
+ 90.005,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0.207,
+ 3.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "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": [
+ [
+ 20.27,
+ 3
+ ],
+ [
+ -20.27,
+ 3
+ ],
+ [
+ -20.27,
+ -3
+ ],
+ [
+ 20.27,
+ -3
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.541176470588,
+ 0.705882352941,
+ 0.972549079446,
+ 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": [
+ 20.52,
+ 3.25
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 4,
+ "nm": "BoxMatte 3",
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": ".blue300",
+ "cl": "blue300",
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 9,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 29,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 97.188,
+ 100.805,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0.188,
+ 3.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "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": [
+ [
+ 31.5,
+ 3
+ ],
+ [
+ -31.5,
+ 3
+ ],
+ [
+ -31.5,
+ -3
+ ],
+ [
+ 31.5,
+ -3
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.541176470588,
+ 0.705882352941,
+ 0.972549079446,
+ 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": [
+ 31.75,
+ 3.25
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 9,
+ "ty": 4,
+ "nm": "BoxMatte 4",
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 10,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 9,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 29,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 109.263,
+ 120.576,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 10.25,
+ 4.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 1.104,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.104
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.105,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.104
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.105,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.104
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.104,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.104
+ ]
+ ],
+ "v": [
+ [
+ 8,
+ 4
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 10,
+ 2
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 10.25,
+ 4.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 11,
+ "ty": 4,
+ "nm": "BoxMatte 5",
+ "td": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 12,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "tt": 1,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 9,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 29,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 142.863,
+ 120.576,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 10.25,
+ 4.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 1.104,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.104
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.105,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.104
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.105,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.104
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.104,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.104
+ ]
+ ],
+ "v": [
+ [
+ 8,
+ 4
+ ],
+ [
+ -8,
+ 4
+ ],
+ [
+ -10,
+ 2
+ ],
+ [
+ -10,
+ -2
+ ],
+ [
+ -8,
+ -4
+ ],
+ [
+ 8,
+ -4
+ ],
+ [
+ 10,
+ -2
+ ],
+ [
+ 10,
+ 2
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 10.25,
+ 4.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 13,
+ "ty": 4,
+ "nm": ".blue100",
+ "cl": "blue100",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 191,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ -1.833,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 151.281,
+ 106.014,
+ 0
+ ],
+ "to": [
+ 0,
+ -1.833,
+ 0
+ ],
+ "ti": [
+ 0,
+ 1.833,
+ 0
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 151.281,
+ 95.014,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ -54.844,
+ -43.986,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ty": "rc",
+ "d": 1,
+ "s": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 9,
+ "s": [
+ 173.312,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833,
+ 0.833
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.001,
+ 0.001
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 29,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2,
+ 0.2
+ ],
+ "y": [
+ 1,
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4,
+ 0.4
+ ],
+ "y": [
+ 0,
+ 0
+ ]
+ },
+ "t": 191,
+ "s": [
+ 173.312,
+ 60.027
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 173.312,
+ 0
+ ]
+ }
+ ],
+ "ix": 2
+ },
+ "p": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0
+ },
+ "t": 9,
+ "s": [
+ 0,
+ -30
+ ],
+ "to": [
+ 0,
+ 5
+ ],
+ "ti": [
+ 0,
+ -5
+ ]
+ },
+ {
+ "i": {
+ "x": 0.833,
+ "y": 0.833
+ },
+ "o": {
+ "x": 0.001,
+ "y": 0.001
+ },
+ "t": 29,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ 0
+ ],
+ "ti": [
+ 0,
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": 0.2,
+ "y": 1
+ },
+ "o": {
+ "x": 0.4,
+ "y": 0
+ },
+ "t": 191,
+ "s": [
+ 0,
+ 0
+ ],
+ "to": [
+ 0,
+ -5
+ ],
+ "ti": [
+ 0,
+ 5
+ ]
+ },
+ {
+ "t": 208,
+ "s": [
+ 0,
+ -30
+ ]
+ }
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 5,
+ "ix": 4
+ },
+ "nm": "Rectangle Path 1",
+ "mn": "ADBE Vector Shape - Rect",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.823529411765,
+ 0.890196078431,
+ 0.988235294118,
+ 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": [
+ -54.844,
+ -43.986
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 14,
+ "ty": 3,
+ "nm": "Null 2",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 0,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 193,
+ 142,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 15,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 20,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 191.408,
+ "s": [
+ -135
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 218.072,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 391.385,
+ "s": [
+ -135
+ ]
+ },
+ {
+ "t": 419,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 143.118,
+ -25.213,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 6.272,
+ 5.403,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ -1.055,
+ 0
+ ],
+ [
+ -0.805,
+ -0.804
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0.768,
+ -0.768
+ ],
+ [
+ 0.522,
+ 0
+ ],
+ [
+ 0.388,
+ 0.336
+ ],
+ [
+ 6.225,
+ 5.393
+ ],
+ [
+ 0.071,
+ 0.072
+ ],
+ [
+ -1.609,
+ 1.608
+ ]
+ ],
+ "o": [
+ [
+ 1.054,
+ 0
+ ],
+ [
+ 0.071,
+ 0.071
+ ],
+ [
+ 5.394,
+ 6.225
+ ],
+ [
+ 0.7,
+ 0.809
+ ],
+ [
+ -0.4,
+ 0.401
+ ],
+ [
+ -0.483,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -1.609,
+ -1.608
+ ],
+ [
+ 0.804,
+ -0.804
+ ]
+ ],
+ "v": [
+ [
+ -9.06,
+ -13.279
+ ],
+ [
+ -6.148,
+ -12.072
+ ],
+ [
+ -5.948,
+ -11.856
+ ],
+ [
+ 12.874,
+ 9.883
+ ],
+ [
+ 12.78,
+ 12.68
+ ],
+ [
+ 11.336,
+ 13.279
+ ],
+ [
+ 9.983,
+ 12.773
+ ],
+ [
+ -11.758,
+ -6.048
+ ],
+ [
+ -11.973,
+ -6.248
+ ],
+ [
+ -11.973,
+ -12.072
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 16.022,
+ 15.528
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 16,
+ "ty": 4,
+ "nm": ".white",
+ "cl": "white",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 20,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 191.408,
+ "s": [
+ -135
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 218.072,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 391.385,
+ "s": [
+ -135
+ ]
+ },
+ {
+ "t": 419,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 143.118,
+ -25.213,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 6.272,
+ 5.403,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 1.634,
+ 0
+ ],
+ [
+ 1.155,
+ -1.156
+ ],
+ [
+ -2.386,
+ -2.386
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -0.977,
+ 0
+ ],
+ [
+ -0.764,
+ 0.763
+ ],
+ [
+ 1.388,
+ 1.602
+ ],
+ [
+ 5.394,
+ 6.225
+ ],
+ [
+ 0.098,
+ 0.098
+ ]
+ ],
+ "o": [
+ [
+ -1.635,
+ 0
+ ],
+ [
+ -2.386,
+ 2.386
+ ],
+ [
+ 0.097,
+ 0.097
+ ],
+ [
+ 6.251,
+ 5.416
+ ],
+ [
+ 0.74,
+ 0.64
+ ],
+ [
+ 1.08,
+ 0
+ ],
+ [
+ 1.494,
+ -1.495
+ ],
+ [
+ 0.001,
+ 0.001
+ ],
+ [
+ -0.023,
+ -0.026
+ ],
+ [
+ -1.155,
+ -1.156
+ ]
+ ],
+ "v": [
+ [
+ -9.06,
+ -15.279
+ ],
+ [
+ -13.387,
+ -13.486
+ ],
+ [
+ -13.387,
+ -4.833
+ ],
+ [
+ -13.092,
+ -4.559
+ ],
+ [
+ 8.672,
+ 14.286
+ ],
+ [
+ 11.336,
+ 15.279
+ ],
+ [
+ 14.194,
+ 14.096
+ ],
+ [
+ 14.384,
+ 8.574
+ ],
+ [
+ -4.436,
+ -13.166
+ ],
+ [
+ -4.734,
+ -13.486
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 16.022,
+ 15.528
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 17,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 123.6,
+ -20.352,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 17.5,
+ 28.46,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ 2.122
+ ],
+ [
+ -2.121,
+ -2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 13.201,
+ 4.121
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ -2.122
+ ],
+ [
+ -2.121,
+ 2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 13.201,
+ 43.72
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 2",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 8,
+ 23.921
+ ],
+ [
+ 2,
+ 23.921
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 33,
+ 48.921
+ ],
+ [
+ 33,
+ 54.921
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 4,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 18,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 142.2,
+ -59.4,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 2,
+ 5,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2,
+ 2
+ ],
+ [
+ 2,
+ 8
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960791794,
+ 0.450980422076,
+ 0.909803981407,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 19,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 150,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 160,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 197,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 200,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 337,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 347,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 399,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "t": 402,
+ "s": [
+ 0
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 165.959,
+ -49.559,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.121,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ -2.122
+ ],
+ [
+ -2.121,
+ 2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.122
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 20,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 165.959,
+ -49.559,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.121,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ -2.122
+ ],
+ [
+ -2.121,
+ 2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960791794,
+ 0.450980422076,
+ 0.909803981407,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.122
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 21,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 90,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 100,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 203,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 206,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 282,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 292,
+ "s": [
+ 100
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 175.8,
+ -25.8,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 5,
+ 2,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 22,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 175.8,
+ -25.8,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 5,
+ 2,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 8,
+ 2
+ ],
+ [
+ 2,
+ 2
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960793138,
+ 0.450980424881,
+ 0.909803986549,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 2,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 23,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 33,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 43,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 211,
+ "s": [
+ 100
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 214,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 229,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 239,
+ "s": [
+ 100
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 165.959,
+ -2.041,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.121,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ 2.122
+ ],
+ [
+ -2.121,
+ -2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.122
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 24,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 165.959,
+ -2.041,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.121,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 2.121,
+ 2.122
+ ],
+ [
+ -2.121,
+ -2.122
+ ]
+ ],
+ "c": false
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960791794,
+ 0.450980422076,
+ 0.909803981407,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 4,
+ "ix": 5
+ },
+ "lc": 2,
+ "lj": 1,
+ "ml": 10,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 4.121,
+ 4.122
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 25,
+ "ty": 4,
+ "nm": ".blue100",
+ "cl": "blue100",
+ "parent": 14,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 140.279,
+ -25.921,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 116.899,
+ -21.601,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "d": 1,
+ "ty": "el",
+ "s": {
+ "a": 0,
+ "k": [
+ 57.799,
+ 57.799
+ ],
+ "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.823529471603,
+ 0.89019613827,
+ 0.988235353956,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 6,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 0,
+ 0,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": true
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 118.399,
+ -21.101
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 96.668,
+ 96.166
+ ],
+ "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
+ },
+ {
+ "ty": "tm",
+ "s": {
+ "a": 0,
+ "k": 0,
+ "ix": 1
+ },
+ "e": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 20,
+ "s": [
+ 37
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 191.408,
+ "s": [
+ 2
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 218.072,
+ "s": [
+ 37
+ ]
+ },
+ {
+ "i": {
+ "x": [
+ 0.2
+ ],
+ "y": [
+ 1
+ ]
+ },
+ "o": {
+ "x": [
+ 0.4
+ ],
+ "y": [
+ 0
+ ]
+ },
+ "t": 391.385,
+ "s": [
+ 2
+ ]
+ },
+ {
+ "t": 419,
+ "s": [
+ 37
+ ]
+ }
+ ],
+ "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": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 26,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 153.063,
+ 235,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 85.75,
+ 159.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.617,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.617
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -69,
+ -92.75
+ ],
+ [
+ -81,
+ -80.75
+ ],
+ [
+ -81,
+ 207.25
+ ],
+ [
+ -69,
+ 219.25
+ ],
+ [
+ 69,
+ 219.25
+ ],
+ [
+ 81,
+ 207.25
+ ],
+ [
+ 81,
+ -80.75
+ ],
+ [
+ 69,
+ -92.75
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 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": [
+ 84.25,
+ 96
+ ],
+ "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
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 27,
+ "ty": 4,
+ "nm": ".grey300",
+ "cl": "grey300",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 153.063,
+ 235,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 85.75,
+ 159.25,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 120,
+ 120,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.617,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ -6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.617
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.617,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.617
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -69,
+ -92.75
+ ],
+ [
+ -81,
+ -80.75
+ ],
+ [
+ -81,
+ 207.25
+ ],
+ [
+ -69,
+ 219.25
+ ],
+ [
+ 69,
+ 219.25
+ ],
+ [
+ 81,
+ 207.25
+ ],
+ [
+ 81,
+ -80.75
+ ],
+ [
+ 69,
+ -92.75
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 8.271,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 8.271
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -8.271,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -8.271
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -8.271,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -8.271
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 8.271,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 8.271
+ ]
+ ],
+ "v": [
+ [
+ 69,
+ 222.25
+ ],
+ [
+ -69,
+ 222.25
+ ],
+ [
+ -84,
+ 207.25
+ ],
+ [
+ -84,
+ -80.75
+ ],
+ [
+ -69,
+ -95.75
+ ],
+ [
+ 69,
+ -95.75
+ ],
+ [
+ 84,
+ -80.75
+ ],
+ [
+ 84,
+ 207.25
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.855000035903,
+ 0.862999949736,
+ 0.877999997606,
+ 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": [
+ 84.25,
+ 96
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.657
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.657
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -1.5,
+ 18
+ ],
+ [
+ -1.5,
+ 18
+ ],
+ [
+ 1.5,
+ 15
+ ],
+ [
+ 1.5,
+ -15
+ ],
+ [
+ -1.5,
+ -18
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.855000035903,
+ 0.862999949736,
+ 0.877999997606,
+ 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": [
+ 169.75,
+ 138.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 3",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.657
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.657
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -1.5,
+ 9
+ ],
+ [
+ -1.5,
+ 9
+ ],
+ [
+ 1.5,
+ 6
+ ],
+ [
+ 1.5,
+ -6
+ ],
+ [
+ -1.5,
+ -9
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.855000035903,
+ 0.862999949736,
+ 0.877999997606,
+ 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": [
+ 169.75,
+ 87.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 4",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 3,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.657
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.657
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -1.5,
+ 18
+ ],
+ [
+ -1.5,
+ 18
+ ],
+ [
+ 1.5,
+ 15
+ ],
+ [
+ 1.5,
+ -15
+ ],
+ [
+ -1.5,
+ -18
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.855000035903,
+ 0.862999949736,
+ 0.877999997606,
+ 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": [
+ 167.75,
+ 138.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 6",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 4,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.657
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.657,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.657
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ -1.5,
+ 9
+ ],
+ [
+ -1.5,
+ 9
+ ],
+ [
+ 1.5,
+ 6
+ ],
+ [
+ 1.5,
+ -6
+ ],
+ [
+ -1.5,
+ -9
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "mm",
+ "mm": 4,
+ "nm": "Merge Paths 1",
+ "mn": "ADBE Vector Filter - Merge",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.855000035903,
+ 0.862999949736,
+ 0.877999997606,
+ 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": [
+ 167.75,
+ 87.25
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100
+ ],
+ "ix": 3
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 6
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 7
+ },
+ "sk": {
+ "a": 0,
+ "k": 0,
+ "ix": 4
+ },
+ "sa": {
+ "a": 0,
+ "k": 0,
+ "ix": 5
+ },
+ "nm": "Transform"
+ }
+ ],
+ "nm": "Group 5",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 5,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 420,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 28,
+ "ty": 4,
+ "nm": ".white",
+ "cl": "white",
+ "hd": true,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 15.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -15.4
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -15.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 15.4
+ ]
+ ],
+ "v": [
+ [
+ 178,
+ 150
+ ],
+ [
+ -178,
+ 150
+ ],
+ [
+ -206,
+ 122
+ ],
+ [
+ -206,
+ -122
+ ],
+ [
+ -178,
+ -150
+ ],
+ [
+ 178,
+ -150
+ ],
+ [
+ 206,
+ -122
+ ],
+ [
+ 206,
+ 122
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 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
+ }
+ ],
+ "ip": 0,
+ "op": 1800,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": []
+}
\ No newline at end of file
diff --git a/res/raw/extra_dim_banner.json b/res/raw/extra_dim_banner.json
new file mode 100644
index 00000000000..7e65eed3917
--- /dev/null
+++ b/res/raw/extra_dim_banner.json
@@ -0,0 +1,2859 @@
+{
+ "v": "5.6.5",
+ "fr": 54.2070007324219,
+ "ip": 0,
+ "op": 134.000001810551,
+ "w": 412,
+ "h": 300,
+ "nm": "Extra_Dim",
+ "ddd": 0,
+ "assets": [
+ {
+ "id": "comp_0",
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".black",
+ "cl": "black",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 64.12,
+ 114.112
+ ],
+ [
+ 54.611,
+ 123.622
+ ],
+ [
+ -54.747,
+ 123.622
+ ],
+ [
+ -64.256,
+ 114.112
+ ],
+ [
+ -64.256,
+ -114.112
+ ],
+ [
+ -54.747,
+ -123.622
+ ],
+ [
+ 54.611,
+ -123.622
+ ],
+ [
+ 64.12,
+ -114.112
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 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": [
+ 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
+ }
+ ],
+ "ip": 0,
+ "op": 1092.2710647583,
+ "st": 0,
+ "bm": 0
+ }
+ ]
+ },
+ {
+ "id": "comp_1",
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".grey300",
+ "cl": "grey300",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 64.12,
+ 114.112
+ ],
+ [
+ 54.611,
+ 123.622
+ ],
+ [
+ -54.747,
+ 123.622
+ ],
+ [
+ -64.256,
+ 114.112
+ ],
+ [
+ -64.256,
+ -114.112
+ ],
+ [
+ -54.747,
+ -123.622
+ ],
+ [
+ 54.611,
+ -123.622
+ ],
+ [
+ 64.12,
+ -114.112
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ind": 1,
+ "ty": "sh",
+ "ix": 2,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 6.555
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 6.554,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -1.313
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 1.313,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 68.875,
+ -52.302
+ ],
+ [
+ 68.875,
+ -61.811
+ ],
+ [
+ 66.498,
+ -64.188
+ ],
+ [
+ 66.498,
+ -114.112
+ ],
+ [
+ 54.611,
+ -126
+ ],
+ [
+ -54.747,
+ -126
+ ],
+ [
+ -66.634,
+ -114.112
+ ],
+ [
+ -66.634,
+ 114.112
+ ],
+ [
+ -54.747,
+ 126
+ ],
+ [
+ 54.611,
+ 126
+ ],
+ [
+ 66.498,
+ 114.112
+ ],
+ [
+ 66.498,
+ -2.378
+ ],
+ [
+ 68.875,
+ -4.755
+ ],
+ [
+ 68.875,
+ -28.528
+ ],
+ [
+ 66.498,
+ -30.906
+ ],
+ [
+ 66.498,
+ -49.924
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 2",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.854901969433,
+ 0.86274510622,
+ 0.878431379795,
+ 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": [
+ 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": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 838.401611328125,
+ "st": 0,
+ "bm": 0
+ }
+ ]
+ },
+ {
+ "id": "comp_2",
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 4,
+ "nm": ".white",
+ "cl": "white",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -5.244
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 5.243,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 64.12,
+ 114.112
+ ],
+ [
+ 54.611,
+ 123.622
+ ],
+ [
+ -54.747,
+ 123.622
+ ],
+ [
+ -64.256,
+ 114.112
+ ],
+ [
+ -64.256,
+ -114.112
+ ],
+ [
+ -54.747,
+ -123.622
+ ],
+ [
+ 54.611,
+ -123.622
+ ],
+ [
+ 64.12,
+ -114.112
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 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
+ }
+ ],
+ "ip": 0,
+ "op": 841.111961364746,
+ "st": 0,
+ "bm": 0
+ }
+ ]
+ }
+ ],
+ "layers": [
+ {
+ "ddd": 0,
+ "ind": 1,
+ "ty": 0,
+ "nm": "ScreenBlack",
+ "refId": "comp_0",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 1,
+ "k": [
+ {
+ "i": {
+ "x": [
+ 0.833
+ ],
+ "y": [
+ 0.833
+ ]
+ },
+ "o": {
+ "x": [
+ 0.167
+ ],
+ "y": [
+ 0.167
+ ]
+ },
+ "t": 47,
+ "s": [
+ 0
+ ]
+ },
+ {
+ "t": 65.0000008782523,
+ "s": [
+ 60
+ ]
+ }
+ ],
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "w": 412,
+ "h": 300,
+ "ip": 0,
+ "op": 813.105010986328,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 2,
+ "ty": 4,
+ "nm": ".blue600",
+ "cl": "blue600",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 242.369,
+ 247.869,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 36.869,
+ 96.869,
+ 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": [
+ 24.738,
+ 24.738
+ ],
+ "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": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.101960784314,
+ 0.450980392157,
+ 0.909803921569,
+ 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": [
+ 36.869,
+ 96.869
+ ],
+ "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": 134.000001810551,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 3,
+ "ty": 4,
+ "nm": ".blue400",
+ "cl": "blue400",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 242.369,
+ 247.869,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 36.869,
+ 96.869,
+ 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": [
+ 24.738,
+ 24.738
+ ],
+ "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": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.4,
+ 0.61568627451,
+ 0.964705882353,
+ 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": [
+ 36.869,
+ 96.869
+ ],
+ "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": 134.000001810551,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 4,
+ "ty": 4,
+ "nm": ".grey700",
+ "cl": "grey700",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 70,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 193.017,
+ 167.386,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 11.892,
+ -66.614,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.875,
+ 21.802
+ ],
+ [
+ 37.875,
+ 53.448
+ ],
+ [
+ 33.875,
+ 57.448
+ ],
+ [
+ -33.943,
+ 57.448
+ ],
+ [
+ -37.943,
+ 53.448
+ ],
+ [
+ -37.943,
+ 21.802
+ ],
+ [
+ -33.943,
+ 17.802
+ ],
+ [
+ 33.875,
+ 17.802
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.909803981407,
+ 0.917646998985,
+ 0.929412004059,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.372549019608,
+ 0.388235294118,
+ 0.407843137255,
+ 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": [
+ 11.909,
+ -88.677
+ ],
+ "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": "Rectangle 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.909,
+ -9.323
+ ],
+ [
+ 37.909,
+ 9.323
+ ],
+ [
+ 33.909,
+ 13.323
+ ],
+ [
+ -33.909,
+ 13.323
+ ],
+ [
+ -37.909,
+ 9.323
+ ],
+ [
+ -37.909,
+ -9.323
+ ],
+ [
+ -33.909,
+ -13.323
+ ],
+ [
+ 33.909,
+ -13.323
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.909803981407,
+ 0.917646998985,
+ 0.929412004059,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.372549019608,
+ 0.388235294118,
+ 0.407843137255,
+ 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": [
+ 11.909,
+ -88.677
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 134.000001810551,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 5,
+ "ty": 4,
+ "nm": ".grey600",
+ "cl": "grey600",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 40,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 218.517,
+ 83.886,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 11.892,
+ -66.614,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.875,
+ 21.802
+ ],
+ [
+ 37.875,
+ 53.448
+ ],
+ [
+ 33.875,
+ 57.448
+ ],
+ [
+ -33.943,
+ 57.448
+ ],
+ [
+ -37.943,
+ 53.448
+ ],
+ [
+ -37.943,
+ 21.802
+ ],
+ [
+ -33.943,
+ 17.802
+ ],
+ [
+ 33.875,
+ 17.802
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.909803981407,
+ 0.917646998985,
+ 0.929412004059,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 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": [
+ 11.909,
+ -88.677
+ ],
+ "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": "Rectangle 2",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 1,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ },
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -2.209,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -2.209
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 2.209,
+ 0
+ ]
+ ],
+ "v": [
+ [
+ 37.909,
+ -9.323
+ ],
+ [
+ 37.909,
+ 9.323
+ ],
+ [
+ 33.909,
+ 13.323
+ ],
+ [
+ -33.909,
+ 13.323
+ ],
+ [
+ -37.909,
+ 9.323
+ ],
+ [
+ -37.909,
+ -9.323
+ ],
+ [
+ -33.909,
+ -13.323
+ ],
+ [
+ 33.909,
+ -13.323
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "st",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.909803981407,
+ 0.917646998985,
+ 0.929412004059,
+ 1
+ ],
+ "ix": 3
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 4
+ },
+ "w": {
+ "a": 0,
+ "k": 7,
+ "ix": 5
+ },
+ "lc": 1,
+ "lj": 1,
+ "ml": 4,
+ "bm": 0,
+ "nm": "Stroke 1",
+ "mn": "ADBE Vector Graphic - Stroke",
+ "hd": true
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 0.501960784314,
+ 0.525490196078,
+ 0.545098039216,
+ 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": [
+ 11.909,
+ -88.677
+ ],
+ "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": "Rectangle 1",
+ "np": 3,
+ "cix": 2,
+ "bm": 0,
+ "ix": 2,
+ "mn": "ADBE Vector Group",
+ "hd": false
+ }
+ ],
+ "ip": 0,
+ "op": 134.000001810551,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 6,
+ "ty": 0,
+ "nm": "Phone",
+ "refId": "comp_1",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "w": 412,
+ "h": 300,
+ "ip": 0,
+ "op": 542.070007324219,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 7,
+ "ty": 0,
+ "nm": "Screen",
+ "refId": "comp_2",
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "w": 412,
+ "h": 300,
+ "ip": 0,
+ "op": 813.105010986328,
+ "st": 0,
+ "bm": 0
+ },
+ {
+ "ddd": 0,
+ "ind": 8,
+ "ty": 4,
+ "nm": ".white",
+ "cl": "white",
+ "hd": true,
+ "sr": 1,
+ "ks": {
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 11
+ },
+ "r": {
+ "a": 0,
+ "k": 0,
+ "ix": 10
+ },
+ "p": {
+ "a": 0,
+ "k": [
+ 206,
+ 150,
+ 0
+ ],
+ "ix": 2
+ },
+ "a": {
+ "a": 0,
+ "k": [
+ 0,
+ 0,
+ 0
+ ],
+ "ix": 1
+ },
+ "s": {
+ "a": 0,
+ "k": [
+ 100,
+ 100,
+ 100
+ ],
+ "ix": 6
+ }
+ },
+ "ao": 0,
+ "shapes": [
+ {
+ "ty": "gr",
+ "it": [
+ {
+ "ind": 0,
+ "ty": "sh",
+ "ix": 1,
+ "ks": {
+ "a": 0,
+ "k": {
+ "i": [
+ [
+ 15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 15.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ -15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -15.4
+ ],
+ [
+ 0,
+ 0
+ ]
+ ],
+ "o": [
+ [
+ 0,
+ 0
+ ],
+ [
+ -15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ -15.4
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 15.4,
+ 0
+ ],
+ [
+ 0,
+ 0
+ ],
+ [
+ 0,
+ 15.4
+ ]
+ ],
+ "v": [
+ [
+ 178,
+ 150
+ ],
+ [
+ -178,
+ 150
+ ],
+ [
+ -206,
+ 122
+ ],
+ [
+ -206,
+ -122
+ ],
+ [
+ -178,
+ -150
+ ],
+ [
+ 178,
+ -150
+ ],
+ [
+ 206,
+ -122
+ ],
+ [
+ 206,
+ 122
+ ]
+ ],
+ "c": true
+ },
+ "ix": 2
+ },
+ "nm": "Path 1",
+ "mn": "ADBE Vector Shape - Group",
+ "hd": false
+ },
+ {
+ "ty": "fl",
+ "c": {
+ "a": 0,
+ "k": [
+ 1,
+ 1,
+ 1,
+ 1
+ ],
+ "ix": 4
+ },
+ "o": {
+ "a": 0,
+ "k": 100,
+ "ix": 5
+ },
+ "r": 1,
+ "bm": 0,
+ "nm": "Fill 1",
+ "mn": "ADBE Vector Graphic - Fill",
+ "hd": false
+ },
+ {
+ "ty": "tr",
+ "p": {
+ "a": 0,
+ "k": [
+ 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
+ }
+ ],
+ "ip": 0,
+ "op": 1626.21002197266,
+ "st": 0,
+ "bm": 0
+ }
+ ],
+ "markers": []
+}
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 96fd344db49..1fba96c26e4 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -777,10 +777,14 @@
More
Unlock with your face
+
+ Allow face unlock
Use your face to authenticate
Use your face to unlock your phone, authorize purchases, or sign in to apps.
+
+ Allow your child to use their face to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.
Use your face to unlock your phone or approve purchases.\n\nNote: You can\u2019t use your face to unlock this device. For more information, contact your organization\u2019s admin.
@@ -789,18 +793,26 @@
+
+
-
-
+
+
+
+
+
+
+
+
Center your face in the circle
@@ -888,15 +900,21 @@
-
+
Set up your fingerprint
+
+ Allow fingerprint unlock
Use your fingerprint
- Just touch the fingerprint sensor to unlock your phone, authorize purchases, or sign in to apps. Be careful whose fingerprints you add. Even one added print can do any of these things.
+ Use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase.
+
+ Allow your child to use their fingerprint to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.
You\u2019re in control
+ You and your child are in control
+
Keep in mind
The data recorded by Fingerprint is stored securely and never leaves your phone. You can delete your data anytime in Settings.
@@ -935,13 +953,21 @@
How it works
- Fingerprint Unlock creates a unique model of your fingerprint to recognize you during authentication. To create this fingerprint model during setup, you will take images of your fingerprint from different positions.
+ Fingerprint Unlock creates a unique model of your fingerprint to verify it\u2019s you. To create this fingerprint model during setup, you will take images of your fingerprint from different positions.
+
+ Fingerprint Unlock creates a unique model of your child\u2019s fingerprint to verify it\u2019s them. To create this fingerprint model during setup, they will take images of their fingerprint from different positions.
- The phone will also use images from your interactions with Fingerprint Unlock to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your phone and never leaves the phone. All processing occurs securely on your phone.
-
- You can delete your fingerprint model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint models are stored on the phone until you delete them.
+ When you use Pixel Imprint, images are used to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your phone and never leaves the phone. All processing occurs securely on your phone.
+
+ When they use Pixel Imprint, images are used to update their fingerprint model. Images used to create your child\u2019s fingerprint model are never stored, but the fingerprint model is stored securely on the phone and never leaves the phone. All processing occurs securely on the phone.
+
+ You can delete your fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until you delete them.
+
+ You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until they\u2019re deleted.
Your phone can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger.
+
+ Your child\u2019s phone can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger.
@@ -961,7 +987,7 @@
You\u2019ve reached the maximum number of attempts
- Use your fingerprint to unlock your phone or for authentication, like when you sign in to apps or approve a purchase\n\nLearn more
+ Use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase.\n\nLearn more
@@ -5334,10 +5360,8 @@
Swipe up from the bottom of the screen with 2 fingers.\n\nTo switch between features, swipe up with 2 fingers and hold.
Swipe up from the bottom of the screen with 3 fingers.\n\nTo switch between features, swipe up with 3 fingers and hold.
-
- Customize accessibility gesture
- Customize accessibility button
+ More options
Learn more about %1$s
@@ -5376,6 +5400,8 @@
Using the accessibility button. The gesture isn\u2019t available with 3-button navigation.
Quickly access accessibility features
+
+ Quickly access accessibility features from any screen. \n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button or gesture.
Quickly access accessibility features from any screen. \n\nTo get started, go to accessibility settings and select a feature. Tap on the shortcut and select the accessibility button.
@@ -12863,7 +12889,11 @@
Choose a number to use
- %1$d numbers are available on this device, but only one can be used at a time
+ {count, plural,
+ =1 {1 number is available on this device, but only one can be used at a time}
+ =2 {2 numbers are available on this device, but only one can be used at a time}
+ other {# numbers are available on this device, but only one can be used at a time}
+ }
Activating…
@@ -13322,6 +13352,12 @@
No other networks available
No networks available
+
+ Turn off mobile data?
+
+ You won\’t have access to data or the internet through %s. Internet will only be available via Wi\u2011Fi.
+
+ your carrier
Unavailable because bedtime mode is on
diff --git a/res/xml/accessibility_control_timeout_settings.xml b/res/xml/accessibility_control_timeout_settings.xml
index 71a6605df98..e1a7df47726 100644
--- a/res/xml/accessibility_control_timeout_settings.xml
+++ b/res/xml/accessibility_control_timeout_settings.xml
@@ -21,13 +21,9 @@
android:title="@string/accessibility_control_timeout_preference_title"
android:persistent="false" >
-
+
{
private final ManageApplications mManageApplications;
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index ef01a4bfb7e..6ab9ab8828c 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -19,6 +19,9 @@ package com.android.settings.biometrics;
import static android.provider.Settings.ACTION_BIOMETRIC_ENROLL;
import static android.provider.Settings.EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_DENIED;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_GRANTED;
+
import android.annotation.NonNull;
import android.app.admin.DevicePolicyManager;
import android.app.settings.SettingsEnums;
@@ -64,6 +67,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private static final int REQUEST_CHOOSE_LOCK = 1;
private static final int REQUEST_CONFIRM_LOCK = 2;
+ // prompt for parental consent options
+ private static final int REQUEST_CHOOSE_OPTIONS = 3;
public static final int RESULT_SKIP = BiometricEnrollBase.RESULT_SKIP;
@@ -71,8 +76,12 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
// this only applies to fingerprint.
public static final String EXTRA_SKIP_INTRO = "skip_intro";
+ // TODO: temporary while waiting for team to add real flag
+ public static final String EXTRA_TEMP_REQUIRE_PARENTAL_CONSENT = "require_consent";
+
private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials";
private static final String SAVED_STATE_ENROLL_ACTION_LOGGED = "enroll_action_logged";
+ private static final String SAVED_STATE_PARENTAL_OPTIONS = "enroll_preferences";
private static final String SAVED_STATE_GK_PW_HANDLE = "gk_pw_handle";
public static final class InternalActivity extends BiometricEnrollActivity {}
@@ -80,9 +89,14 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private int mUserId = UserHandle.myUserId();
private boolean mConfirmingCredentials;
private boolean mIsEnrollActionLogged;
- private boolean mIsFaceEnrollable;
- private boolean mIsFingerprintEnrollable;
+ private boolean mHasFeatureFace = false;
+ private boolean mHasFeatureFingerprint = false;
+ private boolean mIsFaceEnrollable = false;
+ private boolean mIsFingerprintEnrollable = false;
+ private boolean mParentalOptionsRequired = false;
+ private Bundle mParentalOptions;
@Nullable private Long mGkPwHandle;
+ @Nullable private ParentalConsentHelper mParentalConsentHelper;
@Nullable private MultiBiometricEnrollHelper mMultiBiometricEnrollHelper;
@Override
@@ -101,6 +115,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
SAVED_STATE_CONFIRMING_CREDENTIALS, false);
mIsEnrollActionLogged = savedInstanceState.getBoolean(
SAVED_STATE_ENROLL_ACTION_LOGGED, false);
+ mParentalOptions = savedInstanceState.getBundle(SAVED_STATE_PARENTAL_OPTIONS);
if (savedInstanceState.containsKey(SAVED_STATE_GK_PW_HANDLE)) {
mGkPwHandle = savedInstanceState.getLong(SAVED_STATE_GK_PW_HANDLE);
}
@@ -141,52 +156,98 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
SetupWizardUtils.getThemeString(intent));
}
- // Default behavior is to enroll BIOMETRIC_WEAK or above. See ACTION_BIOMETRIC_ENROLL.
- final int authenticators = intent.getIntExtra(
- EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, Authenticators.BIOMETRIC_WEAK);
+ final PackageManager pm = getApplicationContext().getPackageManager();
+ mHasFeatureFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
+ mHasFeatureFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
+ // determine what can be enrolled
+ final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
+ if (mHasFeatureFace) {
+ final FaceManager faceManager = getSystemService(FaceManager.class);
+ final List faceProperties =
+ faceManager.getSensorPropertiesInternal();
+ if (!faceProperties.isEmpty()) {
+ final int maxEnrolls =
+ isSetupWizard ? 1 : faceProperties.get(0).maxEnrollmentsPerUser;
+ mIsFaceEnrollable =
+ faceManager.getEnrolledFaces(mUserId).size() < maxEnrolls;
+ }
+ }
+ if (mHasFeatureFingerprint) {
+ final FingerprintManager fpManager = getSystemService(FingerprintManager.class);
+ final List fpProperties =
+ fpManager.getSensorPropertiesInternal();
+ if (!fpProperties.isEmpty()) {
+ final int maxEnrolls =
+ isSetupWizard ? 1 : fpProperties.get(0).maxEnrollmentsPerUser;
+ mIsFingerprintEnrollable =
+ fpManager.getEnrolledFingerprints(mUserId).size() < maxEnrolls;
+ }
+ }
+
+ // TODO(b/188847063): replace with real flag when ready
+ mParentalOptionsRequired = intent.getBooleanExtra(
+ BiometricEnrollActivity.EXTRA_TEMP_REQUIRE_PARENTAL_CONSENT, false);
+
+ if (mParentalOptionsRequired && mParentalOptions == null) {
+ mParentalConsentHelper = new ParentalConsentHelper(
+ mIsFaceEnrollable, mIsFingerprintEnrollable, mGkPwHandle);
+ setOrConfirmCredentialsNow();
+ } else {
+ startEnroll();
+ }
+ }
+
+ private void startEnroll() {
+ // TODO(b/188847063): This can be deleted, but log it now until it's wired up for real.
+ if (mParentalOptionsRequired) {
+ if (mParentalOptions == null) {
+ throw new IllegalStateException("consent options required, but not set");
+ }
+ Log.d(TAG, "consent for face: "
+ + ParentalConsentHelper.hasFaceConsent(mParentalOptions));
+ Log.d(TAG, "consent for fingerprint: "
+ + ParentalConsentHelper.hasFingerprintConsent(mParentalOptions));
+ } else {
+ Log.d(TAG, "startEnroll without requiring consent");
+ }
+
+ // Default behavior is to enroll BIOMETRIC_WEAK or above. See ACTION_BIOMETRIC_ENROLL.
+ final int authenticators = getIntent().getIntExtra(
+ EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED, Authenticators.BIOMETRIC_WEAK);
Log.d(TAG, "Authenticators: " + authenticators);
- final PackageManager pm = getApplicationContext().getPackageManager();
- final boolean hasFeatureFingerprint =
- pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
- final boolean hasFeatureFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
- final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
+ startEnrollWith(authenticators, WizardManagerHelper.isAnySetupWizard(getIntent()));
+ }
- if (isSetupWizard) {
- if (hasFeatureFace && hasFeatureFingerprint) {
- setupForMultiBiometricEnroll();
- } else if (hasFeatureFace) {
- launchFaceOnlyEnroll();
- } else if (hasFeatureFingerprint) {
- launchFingerprintOnlyEnroll();
- } else {
- Log.e(TAG, "No biometrics but started by SUW?");
- finish();
- }
- } else {
- // If the caller is not setup wizard, and the user has something enrolled, finish.
+ private void startEnrollWith(@Authenticators.Types int authenticators, boolean setupWizard) {
+ // If the caller is not setup wizard, and the user has something enrolled, finish.
+ if (!setupWizard) {
final BiometricManager bm = getSystemService(BiometricManager.class);
final @BiometricError int result = bm.canAuthenticate(authenticators);
if (result != BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED) {
- Log.e(TAG, "Unexpected result: " + result);
+ Log.e(TAG, "Unexpected result (has enrollments): " + result);
finish();
return;
}
+ }
- // This will need to be updated if the device has sensors other than BIOMETRIC_STRONG
- if (authenticators == BiometricManager.Authenticators.DEVICE_CREDENTIAL) {
- launchCredentialOnlyEnroll();
- } else if (hasFeatureFace && hasFeatureFingerprint) {
- setupForMultiBiometricEnroll();
- } else if (hasFeatureFingerprint) {
- launchFingerprintOnlyEnroll();
- } else if (hasFeatureFace) {
- launchFaceOnlyEnroll();
+ // This will need to be updated if the device has sensors other than BIOMETRIC_STRONG
+ if (!setupWizard && authenticators == BiometricManager.Authenticators.DEVICE_CREDENTIAL) {
+ launchCredentialOnlyEnroll();
+ } else if (mHasFeatureFace && mHasFeatureFingerprint) {
+ if (mParentalOptionsRequired && mGkPwHandle != null) {
+ launchFaceAndFingerprintEnroll();
} else {
- Log.e(TAG, "Unknown state, finishing");
- finish();
+ setOrConfirmCredentialsNow();
}
+ } else if (mHasFeatureFingerprint) {
+ launchFingerprintOnlyEnroll();
+ } else if (mHasFeatureFace) {
+ launchFaceOnlyEnroll();
+ } else {
+ Log.e(TAG, "Unknown state, finishing (was SUW: " + setupWizard + ")");
+ finish();
}
}
@@ -195,6 +256,9 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
super.onSaveInstanceState(outState);
outState.putBoolean(SAVED_STATE_CONFIRMING_CREDENTIALS, mConfirmingCredentials);
outState.putBoolean(SAVED_STATE_ENROLL_ACTION_LOGGED, mIsEnrollActionLogged);
+ if (mParentalOptions != null) {
+ outState.putBundle(SAVED_STATE_PARENTAL_OPTIONS, mParentalOptions);
+ }
if (mGkPwHandle != null) {
outState.putLong(SAVED_STATE_GK_PW_HANDLE, mGkPwHandle);
}
@@ -204,31 +268,84 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
+ // single enrollment is handled entirely by the launched activity
+ // this handles multi enroll or if parental consent is required
+ if (mParentalConsentHelper != null) {
+ handleOnActivityResultWhileConsenting(requestCode, resultCode, data);
+ } else {
+ handleOnActivityResultWhileEnrollingMultiple(requestCode, resultCode, data);
+ }
+ }
+
+ // handles responses while parental consent is pending
+ private void handleOnActivityResultWhileConsenting(
+ int requestCode, int resultCode, Intent data) {
+ overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
+
+ switch (requestCode) {
+ case REQUEST_CHOOSE_LOCK:
+ case REQUEST_CONFIRM_LOCK:
+ mConfirmingCredentials = false;
+ if (isSuccessfulConfirmOrChooseCredential(requestCode, resultCode)) {
+ updateGatekeeperPasswordHandle(data);
+ if (!mParentalConsentHelper.launchNext(this, REQUEST_CHOOSE_OPTIONS)) {
+ Log.e(TAG, "Nothing to prompt for consent (no modalities enabled)!");
+ finish();
+ }
+ } else {
+ Log.d(TAG, "Unknown result for set/choose lock: " + resultCode);
+ setResult(resultCode);
+ finish();
+ }
+ break;
+ case REQUEST_CHOOSE_OPTIONS:
+ if (resultCode == RESULT_CONSENT_GRANTED || resultCode == RESULT_CONSENT_DENIED) {
+ final boolean isStillPrompting = mParentalConsentHelper.launchNext(
+ this, REQUEST_CHOOSE_OPTIONS, resultCode, data);
+ if (!isStillPrompting) {
+ Log.d(TAG, "Enrollment options set, starting enrollment now");
+
+ mParentalOptions = mParentalConsentHelper.getConsentResult();
+ mParentalConsentHelper = null;
+ startEnroll();
+ }
+ } else {
+ Log.d(TAG, "Unknown or cancelled parental consent");
+ setResult(RESULT_CANCELED);
+ finish();
+ }
+ break;
+ default:
+ Log.w(TAG, "Unknown consenting requestCode: " + requestCode + ", finishing");
+ finish();
+ }
+ }
+
+ // handles responses while multi biometric enrollment is pending
+ private void handleOnActivityResultWhileEnrollingMultiple(
+ int requestCode, int resultCode, Intent data) {
if (mMultiBiometricEnrollHelper == null) {
overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
switch (requestCode) {
case REQUEST_CHOOSE_LOCK:
+ case REQUEST_CONFIRM_LOCK:
mConfirmingCredentials = false;
- if (resultCode == ChooseLockPattern.RESULT_FINISHED) {
- startMultiBiometricEnroll(data);
+ final boolean isOk =
+ isSuccessfulConfirmOrChooseCredential(requestCode, resultCode);
+ // single modality enrollment requests confirmation directly
+ // via BiometricEnrollBase#onCreate and should never get here
+ if (isOk && mHasFeatureFace && mHasFeatureFingerprint) {
+ updateGatekeeperPasswordHandle(data);
+ launchFaceAndFingerprintEnroll();
} else {
- Log.d(TAG, "Unknown result for chooseLock: " + resultCode);
+ Log.d(TAG, "Unknown result for set/choose lock: " + resultCode);
setResult(resultCode);
finish();
}
break;
- case REQUEST_CONFIRM_LOCK:
- mConfirmingCredentials = false;
- if (resultCode == RESULT_OK) {
- startMultiBiometricEnroll(data);
- } else {
- Log.d(TAG, "Unknown result for confirmLock: " + resultCode);
- finish();
- }
- break;
default:
- Log.d(TAG, "Unknown requestCode: " + requestCode + ", finishing");
+ Log.w(TAG, "Unknown enrolling requestCode: " + requestCode + ", finishing");
finish();
}
} else {
@@ -236,18 +353,28 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
}
}
+ private static boolean isSuccessfulConfirmOrChooseCredential(int requestCode, int resultCode) {
+ final boolean okChoose = requestCode == REQUEST_CHOOSE_LOCK
+ && resultCode == ChooseLockPattern.RESULT_FINISHED;
+ final boolean okConfirm = requestCode == REQUEST_CONFIRM_LOCK
+ && resultCode == RESULT_OK;
+ return okChoose || okConfirm;
+ }
+
@Override
protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
- final int new_resid = SetupWizardUtils.getTheme(this, getIntent());
+ final int newResid = SetupWizardUtils.getTheme(this, getIntent());
theme.applyStyle(R.style.SetupWizardPartnerResource, true);
- super.onApplyThemeResource(theme, new_resid, first);
+ super.onApplyThemeResource(theme, newResid, first);
}
@Override
protected void onStop() {
super.onStop();
- if (mConfirmingCredentials || mMultiBiometricEnrollHelper != null) {
+ if (mConfirmingCredentials
+ || mMultiBiometricEnrollHelper != null
+ || mParentalConsentHelper != null) {
return;
}
@@ -257,7 +384,8 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
}
}
- private void setupForMultiBiometricEnroll() {
+
+ private void setOrConfirmCredentialsNow() {
if (!mConfirmingCredentials) {
mConfirmingCredentials = true;
if (!userHasPassword(mUserId)) {
@@ -268,37 +396,11 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
}
}
- private void startMultiBiometricEnroll(Intent data) {
- final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
- final FingerprintManager fingerprintManager = getSystemService(FingerprintManager.class);
- final FaceManager faceManager = getSystemService(FaceManager.class);
- final List fpProperties =
- fingerprintManager.getSensorPropertiesInternal();
- final List faceProperties =
- faceManager.getSensorPropertiesInternal();
-
+ private void updateGatekeeperPasswordHandle(@NonNull Intent data) {
mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(data);
-
- if (isSetupWizard) {
- // This would need to be updated for devices with multiple sensors of the same modality
- mIsFaceEnrollable = !faceProperties.isEmpty()
- && faceManager.getEnrolledFaces(mUserId).size() == 0;
- mIsFingerprintEnrollable = !fpProperties.isEmpty()
- && fingerprintManager.getEnrolledFingerprints(mUserId).size() == 0;
- } else {
- // This would need to be updated for devices with multiple sensors of the same modality
- mIsFaceEnrollable = !faceProperties.isEmpty()
- && faceManager.getEnrolledFaces(mUserId).size()
- < faceProperties.get(0).maxEnrollmentsPerUser;
- mIsFingerprintEnrollable = !fpProperties.isEmpty()
- && fingerprintManager.getEnrolledFingerprints(mUserId).size()
- < fpProperties.get(0).maxEnrollmentsPerUser;
-
+ if (mParentalConsentHelper != null) {
+ mParentalConsentHelper.updateGatekeeperHandle(data);
}
-
- mMultiBiometricEnrollHelper = new MultiBiometricEnrollHelper(this, mUserId,
- mIsFaceEnrollable, mIsFingerprintEnrollable, mGkPwHandle);
- mMultiBiometricEnrollHelper.startNextStep();
}
private boolean userHasPassword(int userId) {
@@ -310,6 +412,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private void launchChooseLock() {
Log.d(TAG, "launchChooseLock");
+
Intent intent = BiometricUtils.getChooseLockIntent(this, getIntent());
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, true);
@@ -323,6 +426,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
private void launchConfirmLock() {
Log.d(TAG, "launchConfirmLock");
+
final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(this);
builder.setRequestCode(REQUEST_CONFIRM_LOCK)
.setRequestGatekeeperPasswordHandle(true)
@@ -346,7 +450,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
* @param intent Enrollment activity that should be started (e.g. FaceEnrollIntroduction.class,
* etc).
*/
- private void launchEnrollActivity(@NonNull Intent intent) {
+ private void launchSingleSensorEnrollActivity(@NonNull Intent intent) {
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
byte[] hardwareAuthToken = null;
if (this instanceof InternalActivity) {
@@ -362,7 +466,7 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
// If only device credential was specified, ask the user to only set that up.
intent = new Intent(this, ChooseLockGeneric.class);
intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true);
- launchEnrollActivity(intent);
+ launchSingleSensorEnrollActivity(intent);
}
private void launchFingerprintOnlyEnroll() {
@@ -374,12 +478,18 @@ public class BiometricEnrollActivity extends InstrumentedActivity {
} else {
intent = BiometricUtils.getFingerprintIntroIntent(this, getIntent());
}
- launchEnrollActivity(intent);
+ launchSingleSensorEnrollActivity(intent);
}
private void launchFaceOnlyEnroll() {
final Intent intent = BiometricUtils.getFaceIntroIntent(this, getIntent());
- launchEnrollActivity(intent);
+ launchSingleSensorEnrollActivity(intent);
+ }
+
+ private void launchFaceAndFingerprintEnroll() {
+ mMultiBiometricEnrollHelper = new MultiBiometricEnrollHelper(this, mUserId,
+ mIsFaceEnrollable, mIsFingerprintEnrollable, mGkPwHandle);
+ mMultiBiometricEnrollHelper.startNextStep();
}
@Override
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index b62b35fe201..6e7d04f26b5 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -26,6 +26,7 @@ import android.graphics.Color;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -50,12 +51,15 @@ import com.google.android.setupdesign.util.ThemeHelper;
*/
public abstract class BiometricEnrollBase extends InstrumentedActivity {
+ private static final String TAG = "BiometricEnrollBase";
+
public static final String EXTRA_FROM_SETTINGS_SUMMARY = "from_settings_summary";
public static final String EXTRA_KEY_LAUNCHED_CONFIRM = "launched_confirm_lock";
public static final String EXTRA_KEY_REQUIRE_VISION = "accessibility_vision";
public static final String EXTRA_KEY_REQUIRE_DIVERSITY = "accessibility_diversity";
public static final String EXTRA_KEY_SENSOR_ID = "sensor_id";
public static final String EXTRA_KEY_CHALLENGE = "challenge";
+ public static final String EXTRA_KEY_MODALITY = "sensor_modality";
/**
* Used by the choose fingerprint wizard to indicate the wizard is
@@ -84,11 +88,26 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
*/
public static final int RESULT_TIMEOUT = RESULT_FIRST_USER + 2;
+ /**
+ * Used by consent screens to indicate that consent was granted. Extras, such as
+ * EXTRA_KEY_MODALITY, will be included in the result to provide details about the
+ * consent that was granted.
+ */
+ public static final int RESULT_CONSENT_GRANTED = RESULT_FIRST_USER + 3;
+
+ /**
+ * Used by consent screens to indicate that consent was denied. Extras, such as
+ * EXTRA_KEY_MODALITY, will be included in the result to provide details about the
+ * consent that was not granted.
+ */
+ public static final int RESULT_CONSENT_DENIED = RESULT_FIRST_USER + 4;
+
public static final int CHOOSE_LOCK_GENERIC_REQUEST = 1;
public static final int BIOMETRIC_FIND_SENSOR_REQUEST = 2;
public static final int LEARN_MORE_REQUEST = 3;
public static final int CONFIRM_REQUEST = 4;
public static final int ENROLL_REQUEST = 5;
+
/**
* Request code when starting another biometric enrollment from within a biometric flow. For
* example, when starting fingerprint enroll after face enroll.
@@ -242,6 +261,8 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity {
}
protected void launchConfirmLock(int titleResId) {
+ Log.d(TAG, "launchConfirmLock");
+
final ChooseLockSettingsHelper.Builder builder = new ChooseLockSettingsHelper.Builder(this);
builder.setRequestCode(CONFIRM_REQUEST)
.setTitle(getString(titleResId))
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 580c753bd32..c073c3c2eac 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -294,15 +294,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
mConfirmingCredentials = false;
if (resultCode == RESULT_FINISHED) {
updatePasswordQuality();
- overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
- getNextButton().setEnabled(false);
- getChallenge(((sensorId, userId, challenge) -> {
- mSensorId = sensorId;
- mChallenge = challenge;
- mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, challenge);
- BiometricUtils.removeGatekeeperPasswordHandle(this, data);
- getNextButton().setEnabled(true);
- }));
+ final boolean handled = onSetOrConfirmCredentials(data);
+ if (!handled) {
+ overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
+ getNextButton().setEnabled(false);
+ getChallenge(((sensorId, userId, challenge) -> {
+ mSensorId = sensorId;
+ mChallenge = challenge;
+ mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId,
+ challenge);
+ BiometricUtils.removeGatekeeperPasswordHandle(this, data);
+ getNextButton().setEnabled(true);
+ }));
+ }
} else {
setResult(resultCode, data);
finish();
@@ -310,15 +314,19 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
} else if (requestCode == CONFIRM_REQUEST) {
mConfirmingCredentials = false;
if (resultCode == RESULT_OK && data != null) {
- overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
- getNextButton().setEnabled(false);
- getChallenge(((sensorId, userId, challenge) -> {
- mSensorId = sensorId;
- mChallenge = challenge;
- mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId, challenge);
- BiometricUtils.removeGatekeeperPasswordHandle(this, data);
- getNextButton().setEnabled(true);
- }));
+ final boolean handled = onSetOrConfirmCredentials(data);
+ if (!handled) {
+ overridePendingTransition(R.anim.sud_slide_next_in, R.anim.sud_slide_next_out);
+ getNextButton().setEnabled(false);
+ getChallenge(((sensorId, userId, challenge) -> {
+ mSensorId = sensorId;
+ mChallenge = challenge;
+ mToken = BiometricUtils.requestGatekeeperHat(this, data, mUserId,
+ challenge);
+ BiometricUtils.removeGatekeeperPasswordHandle(this, data);
+ getNextButton().setEnabled(true);
+ }));
+ }
} else {
setResult(resultCode, data);
finish();
@@ -335,6 +343,18 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
super.onActivityResult(requestCode, resultCode, data);
}
+ /**
+ * Called after confirming credentials. Can be used to prevent the default
+ * behavior of immediately calling #getChallenge (useful to things like intro
+ * consent screens that don't actually do enrollment and will later start an
+ * activity that does).
+ *
+ * @return True if the default behavior should be skipped and handled by this method instead.
+ */
+ protected boolean onSetOrConfirmCredentials(@Nullable Intent data) {
+ return false;
+ }
+
protected void onCancelButtonClick(View view) {
finish();
}
diff --git a/src/com/android/settings/biometrics/ParentalConsentHelper.java b/src/com/android/settings/biometrics/ParentalConsentHelper.java
new file mode 100644
index 00000000000..905a95527ef
--- /dev/null
+++ b/src/com/android/settings/biometrics/ParentalConsentHelper.java
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_NONE;
+
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_MODALITY;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_DENIED;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_GRANTED;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.settings.biometrics.face.FaceEnrollParentalConsent;
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollParentalConsent;
+import com.android.settings.password.ChooseLockSettingsHelper;
+
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
+/**
+ * Helper for {@link BiometricEnrollActivity} to ask for parental consent prior to actual user
+ * enrollment.
+ */
+public class ParentalConsentHelper {
+
+ private static final String KEY_FACE_CONSENT = "face";
+ private static final String KEY_FINGERPRINT_CONSENT = "fingerprint";
+
+ private final boolean mRequireFace;
+ private final boolean mRequireFingerprint;
+
+ private long mGkPwHandle;
+ @Nullable
+ private Boolean mConsentFace;
+ @Nullable
+ private Boolean mConsentFingerprint;
+
+ /**
+ * Helper for aggregating user consent.
+ *
+ * @param requireFace if face consent should be shown
+ * @param requireFingerprint if fingerprint consent should be shown
+ * @param gkPwHandle for launched intents
+ */
+ public ParentalConsentHelper(boolean requireFace, boolean requireFingerprint,
+ @Nullable Long gkPwHandle) {
+ mRequireFace = requireFace;
+ mRequireFingerprint = requireFingerprint;
+ mGkPwHandle = gkPwHandle != null ? gkPwHandle : 0L;
+ }
+
+ /**
+ * Updated the handle used for launching activities
+ *
+ * @param data result intent for credential verification
+ */
+ public void updateGatekeeperHandle(Intent data) {
+ mGkPwHandle = BiometricUtils.getGatekeeperPasswordHandle(data);
+ }
+
+ /**
+ * Launch the next consent screen.
+ *
+ * @param activity root activity
+ * @param requestCode request code to launch new activity
+ * @param resultCode result code of the last consent launch
+ * @param data result data from the last consent launch
+ * @return true if a consent activity was launched or false when complete
+ */
+ public boolean launchNext(@NonNull Activity activity, int requestCode, int resultCode,
+ @Nullable Intent data) {
+ if (data != null) {
+ switch (data.getIntExtra(EXTRA_KEY_MODALITY, TYPE_NONE)) {
+ case TYPE_FACE:
+ mConsentFace = isConsent(resultCode, mConsentFace);
+ break;
+ case TYPE_FINGERPRINT:
+ mConsentFingerprint = isConsent(resultCode, mConsentFingerprint);
+ break;
+ }
+ }
+ return launchNext(activity, requestCode);
+ }
+
+ @Nullable
+ private static Boolean isConsent(int resultCode, @Nullable Boolean defaultValue) {
+ switch (resultCode) {
+ case RESULT_CONSENT_GRANTED:
+ return true;
+ case RESULT_CONSENT_DENIED:
+ return false;
+ }
+ return defaultValue;
+ }
+
+ /** @see #launchNext(Activity, int, int, Intent) */
+ public boolean launchNext(@NonNull Activity activity, int requestCode) {
+ final Intent intent = getNextConsentIntent(activity);
+ if (intent != null) {
+ WizardManagerHelper.copyWizardManagerExtras(activity.getIntent(), intent);
+ if (mGkPwHandle != 0) {
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, mGkPwHandle);
+ }
+ activity.startActivityForResult(intent, requestCode);
+ return true;
+ }
+ return false;
+ }
+
+ @Nullable
+ private Intent getNextConsentIntent(@NonNull Context context) {
+ if (mRequireFace && mConsentFace == null) {
+ return new Intent(context, FaceEnrollParentalConsent.class);
+ }
+ if (mRequireFingerprint && mConsentFingerprint == null) {
+ return new Intent(context, FingerprintEnrollParentalConsent.class);
+ }
+ return null;
+ }
+
+ /**
+ * Get the result of all consent requests.
+ *
+ * This should be called when {@link #launchNext(Activity, int, int, Intent)} returns false
+ * to indicate that all responses have been recorded.
+ *
+ * @return The aggregate consent status.
+ */
+ @NonNull
+ public Bundle getConsentResult() {
+ final Bundle result = new Bundle();
+ result.putBoolean(KEY_FACE_CONSENT, mConsentFace != null ? mConsentFace : false);
+ result.putBoolean(KEY_FINGERPRINT_CONSENT,
+ mConsentFingerprint != null ? mConsentFingerprint : false);
+ return result;
+ }
+
+ /** @return If the result bundle contains consent for face authentication. */
+ public static boolean hasFaceConsent(@NonNull Bundle bundle) {
+ return bundle.getBoolean(KEY_FACE_CONSENT, false);
+ }
+
+ /** @return If the result bundle contains consent for fingerprint authentication. */
+ public static boolean hasFingerprintConsent(@NonNull Bundle bundle) {
+ return bundle.getBoolean(KEY_FINGERPRINT_CONSENT, false);
+ }
+}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index 8e733b4da89..91cc3a9bfdc 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -76,31 +76,71 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
final ImageView iconGlasses = findViewById(R.id.icon_glasses);
final ImageView iconLooking = findViewById(R.id.icon_looking);
- final ImageView iconSecurity = findViewById(R.id.icon_security);
iconGlasses.getBackground().setColorFilter(getIconColorFilter());
iconLooking.getBackground().setColorFilter(getIconColorFilter());
- iconSecurity.getBackground().setColorFilter(getIconColorFilter());
+
+ final TextView infoMessageGlasses = findViewById(R.id.info_message_glasses);
+ final TextView infoMessageLooking = findViewById(R.id.info_message_looking);
+ final TextView howMessage = findViewById(R.id.how_message);
+ final TextView inControlTitle = findViewById(R.id.title_in_control);
+ final TextView inControlMessage = findViewById(R.id.message_in_control);
+ infoMessageGlasses.setText(getInfoMessageGlasses());
+ infoMessageLooking.setText(getInfoMessageLooking());
+ howMessage.setText(getHowMessage());
+ inControlTitle.setText(getInControlTitle());
+ inControlMessage.setText(getInControlMessage());
mFaceManager = Utils.getFaceManagerOrNull(this);
mFaceFeatureProvider = FeatureFactory.getFactory(getApplicationContext())
.getFaceFeatureProvider();
-
// This path is an entry point for SetNewPasswordController, e.g.
// adb shell am start -a android.app.action.SET_NEW_PASSWORD
if (mToken == null && BiometricUtils.containsGatekeeperPasswordHandle(getIntent())) {
- mFooterBarMixin.getPrimaryButton().setEnabled(false);
- // We either block on generateChallenge, or need to gray out the "next" button until
- // the challenge is ready. Let's just do this for now.
- mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
- mToken = BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId, challenge);
- mSensorId = sensorId;
- mChallenge = challenge;
- mFooterBarMixin.getPrimaryButton().setEnabled(true);
- });
+ if (generateChallengeOnCreate()) {
+ mFooterBarMixin.getPrimaryButton().setEnabled(false);
+ // We either block on generateChallenge, or need to gray out the "next" button until
+ // the challenge is ready. Let's just do this for now.
+ mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> {
+ mToken = BiometricUtils.requestGatekeeperHat(this, getIntent(), mUserId,
+ challenge);
+ mSensorId = sensorId;
+ mChallenge = challenge;
+ mFooterBarMixin.getPrimaryButton().setEnabled(true);
+ });
+ }
}
}
+ protected boolean generateChallengeOnCreate() {
+ return true;
+ }
+
+ @StringRes
+ protected int getInfoMessageGlasses() {
+ return R.string.security_settings_face_enroll_introduction_info_glasses;
+ }
+
+ @StringRes
+ protected int getInfoMessageLooking() {
+ return R.string.security_settings_face_enroll_introduction_info_looking;
+ }
+
+ @StringRes
+ protected int getHowMessage() {
+ return R.string.security_settings_face_enroll_introduction_how_message;
+ }
+
+ @StringRes
+ protected int getInControlTitle() {
+ return R.string.security_settings_face_enroll_introduction_control_title;
+ }
+
+ @StringRes
+ protected int getInControlMessage() {
+ return R.string.security_settings_face_enroll_introduction_control_message;
+ }
+
@Override
protected boolean isDisabledByAdmin() {
return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
new file mode 100644
index 00000000000..1f55d82145f
--- /dev/null
+++ b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.face;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import com.android.settings.R;
+
+/**
+ * Displays parental consent information for face authentication.
+ *
+ * TODO(b/188847063): swap strings for consent screen
+ */
+public class FaceEnrollParentalConsent extends FaceEnrollIntroduction {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setDescriptionText(R.string.security_settings_face_enroll_introduction_consent_message);
+ }
+
+ @Override
+ protected void onNextButtonClick(View view) {
+ onConsentResult(true /* granted */);
+ }
+
+ @Override
+ protected void onSkipButtonClick(View view) {
+ onConsentResult(false /* granted */);
+ }
+
+ private void onConsentResult(boolean granted) {
+ final Intent result = new Intent();
+ result.putExtra(EXTRA_KEY_MODALITY, TYPE_FACE);
+ setResult(granted ? RESULT_CONSENT_GRANTED : RESULT_CONSENT_DENIED, result);
+ finish();
+ }
+
+ @Override
+ protected boolean onSetOrConfirmCredentials(@Nullable Intent data) {
+ // prevent challenge from being generated by default
+ return true;
+ }
+
+ @Override
+ protected boolean generateChallengeOnCreate() {
+ return false;
+ }
+
+ @Override
+ @StringRes
+ protected int getInfoMessageGlasses() {
+ return R.string.security_settings_face_enroll_introduction_info_consent_glasses;
+ }
+
+ @Override
+ @StringRes
+ protected int getInfoMessageLooking() {
+ return R.string.security_settings_face_enroll_introduction_info_consent_looking;
+ }
+
+ @Override
+ @StringRes
+ protected int getHowMessage() {
+ return R.string.security_settings_face_enroll_introduction_how_consent_message;
+ }
+
+ @Override
+ @StringRes
+ protected int getInControlTitle() {
+ return R.string.security_settings_face_enroll_introduction_control_consent_title;
+ }
+
+ @Override
+ @StringRes
+ protected int getInControlMessage() {
+ return R.string.security_settings_face_enroll_introduction_control_consent_message;
+ }
+
+ @Override
+ protected int getHeaderResDefault() {
+ return R.string.security_settings_face_enroll_consent_introduction_title;
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 5142e21dc49..8c3b1ceb89a 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -64,21 +64,62 @@ public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction {
super.onCreate(savedInstanceState);
final ImageView iconFingerprint = findViewById(R.id.icon_fingerprint);
- final ImageView iconLocked = findViewById(R.id.icon_locked);
- final ImageView iconDelete = findViewById(R.id.icon_delete);
final ImageView iconInfo = findViewById(R.id.icon_info);
final ImageView iconLink = findViewById(R.id.icon_link);
iconFingerprint.getDrawable().setColorFilter(getIconColorFilter());
- iconLocked.getDrawable().setColorFilter(getIconColorFilter());
- iconDelete.getDrawable().setColorFilter(getIconColorFilter());
iconInfo.getDrawable().setColorFilter(getIconColorFilter());
iconLink.getDrawable().setColorFilter(getIconColorFilter());
+
+ final TextView footerMessage2 = findViewById(R.id.footer_message_2);
+ final TextView footerMessage3 = findViewById(R.id.footer_message_3);
+ final TextView footerMessage4 = findViewById(R.id.footer_message_4);
+ final TextView footerMessage5 = findViewById(R.id.footer_message_5);
+ footerMessage2.setText(getFooterMessage2());
+ footerMessage3.setText(getFooterMessage3());
+ footerMessage4.setText(getFooterMessage4());
+ footerMessage5.setText(getFooterMessage5());
+
+ final TextView footerTitle1 = findViewById(R.id.footer_title_1);
+ final TextView footerTitle2 = findViewById(R.id.footer_title_2);
+ footerTitle1.setText(getFooterTitle1());
+ footerTitle2.setText(getFooterTitle2());
}
+ @StringRes
int getNegativeButtonTextId() {
return R.string.security_settings_fingerprint_enroll_introduction_skip;
}
+ @StringRes
+ protected int getFooterTitle1() {
+ return R.string.security_settings_fingerprint_enroll_introduction_footer_title_1;
+ }
+
+ @StringRes
+ protected int getFooterTitle2() {
+ return R.string.security_settings_fingerprint_enroll_introduction_footer_title_2;
+ }
+
+ @StringRes
+ protected int getFooterMessage2() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_2;
+ }
+
+ @StringRes
+ protected int getFooterMessage3() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_3;
+ }
+
+ @StringRes
+ protected int getFooterMessage4() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_4;
+ }
+
+ @StringRes
+ protected int getFooterMessage5() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_5;
+ }
+
@Override
protected boolean isDisabledByAdmin() {
return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java
new file mode 100644
index 00000000000..5d8cf9b0423
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics.fingerprint;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+import com.android.settings.R;
+
+/**
+ * Displays parental consent information for fingerprint authentication.
+ *
+ * TODO(b/188847063): swap strings for consent screen
+ */
+public class FingerprintEnrollParentalConsent extends FingerprintEnrollIntroduction {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setDescriptionText(
+ R.string.security_settings_fingerprint_enroll_introduction_consent_message);
+ }
+
+ @Override
+ protected void onNextButtonClick(View view) {
+ onConsentResult(true /* granted */);
+ }
+
+ @Override
+ protected void onSkipButtonClick(View view) {
+ onConsentResult(false /* granted */);
+ }
+
+ private void onConsentResult(boolean granted) {
+ final Intent result = new Intent();
+ result.putExtra(EXTRA_KEY_MODALITY, TYPE_FINGERPRINT);
+ setResult(granted ? RESULT_CONSENT_GRANTED : RESULT_CONSENT_DENIED, result);
+ finish();
+ }
+
+ @Override
+ protected boolean onSetOrConfirmCredentials(@Nullable Intent data) {
+ // prevent challenge from being generated by default
+ return true;
+ }
+
+ @StringRes
+ @Override
+ protected int getFooterTitle1() {
+ return R.string.security_settings_fingerprint_enroll_introduction_footer_title_consent_1;
+ }
+
+ @StringRes
+ @Override
+ protected int getFooterMessage2() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_2;
+ }
+
+ @StringRes
+ @Override
+ protected int getFooterMessage3() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3;
+ }
+
+ @StringRes
+ protected int getFooterMessage4() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4;
+ }
+
+ @StringRes
+ protected int getFooterMessage5() {
+ return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5;
+ }
+
+ @Override
+ protected int getHeaderResDefault() {
+ return R.string.security_settings_fingerprint_enroll_consent_introduction_title;
+ }
+}
diff --git a/src/com/android/settings/core/CategoryMixin.java b/src/com/android/settings/core/CategoryMixin.java
new file mode 100644
index 00000000000..8d0a412a60c
--- /dev/null
+++ b/src/com/android/settings/core/CategoryMixin.java
@@ -0,0 +1,225 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
+
+import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncTask;
+import android.text.TextUtils;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.LifecycleObserver;
+import androidx.lifecycle.OnLifecycleEvent;
+
+import com.android.settings.dashboard.CategoryManager;
+import com.android.settingslib.drawer.Tile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A mixin that handles live categories for Injection
+ */
+public class CategoryMixin implements LifecycleObserver {
+
+ private static final String TAG = "CategoryMixin";
+ private static final String DATA_SCHEME_PKG = "package";
+
+ // Serves as a temporary list of tiles to ignore until we heard back from the PM that they
+ // are disabled.
+ private static final ArraySet sTileDenylist = new ArraySet<>();
+
+ private final Context mContext;
+ private final PackageReceiver mPackageReceiver = new PackageReceiver();
+ private final List mCategoryListeners = new ArrayList<>();
+ private int mCategoriesUpdateTaskCount;
+
+ public CategoryMixin(Context context) {
+ mContext = context;
+ }
+
+ /**
+ * Resume Lifecycle event
+ */
+ @OnLifecycleEvent(ON_RESUME)
+ public void onResume() {
+ final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
+ filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ filter.addDataScheme(DATA_SCHEME_PKG);
+ mContext.registerReceiver(mPackageReceiver, filter);
+
+ updateCategories();
+ }
+
+ /**
+ * Pause Lifecycle event
+ */
+ @OnLifecycleEvent(ON_PAUSE)
+ public void onPause() {
+ mContext.unregisterReceiver(mPackageReceiver);
+ }
+
+ /**
+ * Add a category listener
+ */
+ public void addCategoryListener(CategoryListener listener) {
+ mCategoryListeners.add(listener);
+ }
+
+ /**
+ * Remove a category listener
+ */
+ public void removeCategoryListener(CategoryListener listener) {
+ mCategoryListeners.remove(listener);
+ }
+
+ /**
+ * Updates dashboard categories.
+ */
+ public void updateCategories() {
+ updateCategories(false /* fromBroadcast */);
+ }
+
+ void addToDenylist(ComponentName component) {
+ sTileDenylist.add(component);
+ }
+
+ void removeFromDenylist(ComponentName component) {
+ sTileDenylist.remove(component);
+ }
+
+ @VisibleForTesting
+ void onCategoriesChanged(Set categories) {
+ mCategoryListeners.forEach(listener -> listener.onCategoriesChanged(categories));
+ }
+
+ private void updateCategories(boolean fromBroadcast) {
+ // Only allow at most 2 tasks existing at the same time since when the first one is
+ // executing, there may be new data from the second update request.
+ // Ignore the third update request because the second task is still waiting for the first
+ // task to complete in a serial thread, which will get the latest data.
+ if (mCategoriesUpdateTaskCount < 2) {
+ new CategoriesUpdateTask().execute(fromBroadcast);
+ }
+ }
+
+ /**
+ * A handler implementing a {@link CategoryMixin}
+ */
+ public interface CategoryHandler {
+ /** returns a {@link CategoryMixin} */
+ CategoryMixin getCategoryMixin();
+ }
+
+ /**
+ * A listener receiving category change events.
+ */
+ public interface CategoryListener {
+ /**
+ * @param categories the changed categories that have to be refreshed, or null to force
+ * refreshing all.
+ */
+ void onCategoriesChanged(@Nullable Set categories);
+ }
+
+ private class CategoriesUpdateTask extends AsyncTask> {
+
+ private final CategoryManager mCategoryManager;
+ private Map mPreviousTileMap;
+
+ CategoriesUpdateTask() {
+ mCategoriesUpdateTaskCount++;
+ mCategoryManager = CategoryManager.get(mContext);
+ }
+
+ @Override
+ protected Set doInBackground(Boolean... params) {
+ mPreviousTileMap = mCategoryManager.getTileByComponentMap();
+ mCategoryManager.reloadAllCategories(mContext);
+ mCategoryManager.updateCategoryFromDenylist(sTileDenylist);
+ return getChangedCategories(params[0]);
+ }
+
+ @Override
+ protected void onPostExecute(Set categories) {
+ if (categories == null || !categories.isEmpty()) {
+ onCategoriesChanged(categories);
+ }
+ mCategoriesUpdateTaskCount--;
+ }
+
+ // Return the changed categories that have to be refreshed, or null to force refreshing all.
+ private Set getChangedCategories(boolean fromBroadcast) {
+ if (!fromBroadcast) {
+ // Always refresh for non-broadcast case.
+ return null;
+ }
+
+ final Set changedCategories = new ArraySet<>();
+ final Map currentTileMap =
+ mCategoryManager.getTileByComponentMap();
+ currentTileMap.forEach((component, currentTile) -> {
+ final Tile previousTile = mPreviousTileMap.get(component);
+ // Check if the tile is newly added.
+ if (previousTile == null) {
+ Log.i(TAG, "Tile added: " + component.flattenToShortString());
+ changedCategories.add(currentTile.getCategory());
+ return;
+ }
+
+ // Check if the title or summary has changed.
+ if (!TextUtils.equals(currentTile.getTitle(mContext),
+ previousTile.getTitle(mContext))
+ || !TextUtils.equals(currentTile.getSummary(mContext),
+ previousTile.getSummary(mContext))) {
+ Log.i(TAG, "Tile changed: " + component.flattenToShortString());
+ changedCategories.add(currentTile.getCategory());
+ }
+ });
+
+ // Check if any previous tile is removed.
+ final Set removal = new ArraySet(mPreviousTileMap.keySet());
+ removal.removeAll(currentTileMap.keySet());
+ removal.forEach(component -> {
+ Log.i(TAG, "Tile removed: " + component.flattenToShortString());
+ changedCategories.add(mPreviousTileMap.get(component).getCategory());
+ });
+
+ return changedCategories;
+ }
+ }
+
+ private class PackageReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateCategories(true /* fromBroadcast */);
+ }
+ }
+}
diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java
index 6dba83b8aff..47993cfbd5a 100644
--- a/src/com/android/settings/core/SettingsBaseActivity.java
+++ b/src/com/android/settings/core/SettingsBaseActivity.java
@@ -16,21 +16,15 @@
package com.android.settings.core;
import android.annotation.LayoutRes;
-import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityOptions;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
-import android.content.Context;
import android.content.Intent;
-import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.os.UserHandle;
import android.text.TextUtils;
-import android.util.ArraySet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
@@ -40,14 +34,14 @@ import android.view.Window;
import android.widget.Toolbar;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.FragmentActivity;
import com.android.settings.R;
import com.android.settings.SubSettings;
import com.android.settings.Utils;
-import com.android.settings.dashboard.CategoryManager;
+import com.android.settings.core.CategoryMixin.CategoryHandler;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
-import com.android.settingslib.drawer.Tile;
import com.android.settingslib.transition.SettingsTransitionHelper;
import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType;
@@ -56,12 +50,8 @@ import com.google.android.material.resources.TextAppearanceConfig;
import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.util.ThemeHelper;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class SettingsBaseActivity extends FragmentActivity {
+/** Base activity for Settings pages */
+public class SettingsBaseActivity extends FragmentActivity implements CategoryHandler {
/**
* What type of page transition should be apply.
@@ -70,20 +60,17 @@ public class SettingsBaseActivity extends FragmentActivity {
protected static final boolean DEBUG_TIMING = false;
private static final String TAG = "SettingsBaseActivity";
- private static final String DATA_SCHEME_PKG = "package";
private static final int DEFAULT_REQUEST = -1;
- // Serves as a temporary list of tiles to ignore until we heard back from the PM that they
- // are disabled.
- private static ArraySet sTileDenylist = new ArraySet<>();
-
- private final PackageReceiver mPackageReceiver = new PackageReceiver();
- private final List mCategoryListeners = new ArrayList<>();
-
+ protected CategoryMixin mCategoryMixin;
protected CollapsingToolbarLayout mCollapsingToolbarLayout;
- private int mCategoriesUpdateTaskCount;
private Toolbar mToolbar;
+ @Override
+ public CategoryMixin getCategoryMixin() {
+ return mCategoryMixin;
+ }
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
if (Utils.isPageTransitionEnabled(this)) {
@@ -102,6 +89,9 @@ public class SettingsBaseActivity extends FragmentActivity {
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
TextAppearanceConfig.setShouldLoadFontSynchronously(true);
+ mCategoryMixin = new CategoryMixin(this);
+ getLifecycle().addObserver(mCategoryMixin);
+
final TypedArray theme = getTheme().obtainStyledAttributes(android.R.styleable.Theme);
if (!theme.getBoolean(android.R.styleable.Theme_windowNoTitle, false)) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
@@ -192,37 +182,15 @@ public class SettingsBaseActivity extends FragmentActivity {
userHandle);
}
- @Override
- protected void onResume() {
- super.onResume();
- final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
- filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
- filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
- filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
- filter.addDataScheme(DATA_SCHEME_PKG);
- registerReceiver(mPackageReceiver, filter);
-
- updateCategories();
- }
-
@Override
protected void onPause() {
// For accessibility activities launched from setup wizard.
if (getTransitionType(getIntent()) == TransitionType.TRANSITION_FADE) {
overridePendingTransition(R.anim.sud_stay, android.R.anim.fade_out);
}
- unregisterReceiver(mPackageReceiver);
super.onPause();
}
- public void addCategoryListener(CategoryListener listener) {
- mCategoryListeners.add(listener);
- }
-
- public void remCategoryListener(CategoryListener listener) {
- mCategoryListeners.remove(listener);
- }
-
@Override
public void setContentView(@LayoutRes int layoutResID) {
final ViewGroup parent = findViewById(R.id.content_frame);
@@ -270,13 +238,6 @@ public class SettingsBaseActivity extends FragmentActivity {
return true;
}
- private void onCategoriesChanged(Set categories) {
- final int N = mCategoryListeners.size();
- for (int i = 0; i < N; i++) {
- mCategoryListeners.get(i).onCategoriesChanged(categories);
- }
- }
-
private boolean isLockTaskModePinned() {
final ActivityManager activityManager =
getApplicationContext().getSystemService(ActivityManager.class);
@@ -300,9 +261,9 @@ public class SettingsBaseActivity extends FragmentActivity {
boolean isEnabled = state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
if (isEnabled != enabled || state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) {
if (enabled) {
- sTileDenylist.remove(component);
+ mCategoryMixin.removeFromDenylist(component);
} else {
- sTileDenylist.add(component);
+ mCategoryMixin.addToDenylist(component);
}
pm.setComponentEnabledSetting(component, enabled
? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
@@ -313,29 +274,12 @@ public class SettingsBaseActivity extends FragmentActivity {
return false;
}
- /**
- * Updates dashboard categories. Only necessary to call this after setTileEnabled
- */
- public void updateCategories() {
- updateCategories(false /* fromBroadcast */);
- }
-
- private void updateCategories(boolean fromBroadcast) {
- // Only allow at most 2 tasks existing at the same time since when the first one is
- // executing, there may be new data from the second update request.
- // Ignore the third update request because the second task is still waiting for the first
- // task to complete in a serial thread, which will get the latest data.
- if (mCategoriesUpdateTaskCount < 2) {
- new CategoriesUpdateTask().execute(fromBroadcast);
- }
- }
-
private int getTransitionType(Intent intent) {
return intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE,
SettingsTransitionHelper.TransitionType.TRANSITION_SHARED_AXIS);
}
- @androidx.annotation.Nullable
+ @Nullable
private Bundle createActivityOptionsBundleForTransition(
@androidx.annotation.Nullable Bundle options) {
if (mToolbar == null) {
@@ -352,87 +296,4 @@ public class SettingsBaseActivity extends FragmentActivity {
return mergedOptions;
}
- public interface CategoryListener {
- /**
- * @param categories the changed categories that have to be refreshed, or null to force
- * refreshing all.
- */
- void onCategoriesChanged(@Nullable Set categories);
- }
-
- private class CategoriesUpdateTask extends AsyncTask> {
-
- private final Context mContext;
- private final CategoryManager mCategoryManager;
- private Map mPreviousTileMap;
-
- public CategoriesUpdateTask() {
- mCategoriesUpdateTaskCount++;
- mContext = SettingsBaseActivity.this;
- mCategoryManager = CategoryManager.get(mContext);
- }
-
- @Override
- protected Set doInBackground(Boolean... params) {
- mPreviousTileMap = mCategoryManager.getTileByComponentMap();
- mCategoryManager.reloadAllCategories(mContext);
- mCategoryManager.updateCategoryFromDenylist(sTileDenylist);
- return getChangedCategories(params[0]);
- }
-
- @Override
- protected void onPostExecute(Set categories) {
- if (categories == null || !categories.isEmpty()) {
- onCategoriesChanged(categories);
- }
- mCategoriesUpdateTaskCount--;
- }
-
- // Return the changed categories that have to be refreshed, or null to force refreshing all.
- private Set getChangedCategories(boolean fromBroadcast) {
- if (!fromBroadcast) {
- // Always refresh for non-broadcast case.
- return null;
- }
-
- final Set changedCategories = new ArraySet<>();
- final Map currentTileMap =
- mCategoryManager.getTileByComponentMap();
- currentTileMap.forEach((component, currentTile) -> {
- final Tile previousTile = mPreviousTileMap.get(component);
- // Check if the tile is newly added.
- if (previousTile == null) {
- Log.i(TAG, "Tile added: " + component.flattenToShortString());
- changedCategories.add(currentTile.getCategory());
- return;
- }
-
- // Check if the title or summary has changed.
- if (!TextUtils.equals(currentTile.getTitle(mContext),
- previousTile.getTitle(mContext))
- || !TextUtils.equals(currentTile.getSummary(mContext),
- previousTile.getSummary(mContext))) {
- Log.i(TAG, "Tile changed: " + component.flattenToShortString());
- changedCategories.add(currentTile.getCategory());
- }
- });
-
- // Check if any previous tile is removed.
- final Set removal = new ArraySet(mPreviousTileMap.keySet());
- removal.removeAll(currentTileMap.keySet());
- removal.forEach(component -> {
- Log.i(TAG, "Tile removed: " + component.flattenToShortString());
- changedCategories.add(mPreviousTileMap.get(component).getCategory());
- });
-
- return changedCategories;
- }
- }
-
- private class PackageReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- updateCategories(true /* fromBroadcast */);
- }
- }
}
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
index 0a6966fe17f..616d72f3c27 100644
--- a/src/com/android/settings/core/SubSettingLauncher.java
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -28,7 +28,6 @@ import androidx.fragment.app.Fragment;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
-import com.android.settings.Utils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType;
@@ -182,10 +181,6 @@ public class SubSettingLauncher {
@VisibleForTesting
void launchAsUser(Intent intent, UserHandle userHandle) {
- if (!Utils.isPageTransitionEnabled(mContext)) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
- }
mContext.startActivityAsUser(intent, userHandle);
}
diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java
index 29a11a3e056..dfd931db7e9 100644
--- a/src/com/android/settings/dashboard/DashboardFragment.java
+++ b/src/com/android/settings/dashboard/DashboardFragment.java
@@ -35,8 +35,9 @@ import androidx.preference.SwitchPreference;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.CategoryMixin.CategoryHandler;
+import com.android.settings.core.CategoryMixin.CategoryListener;
import com.android.settings.core.PreferenceControllerListHelper;
-import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.PrimarySwitchPreference;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -61,8 +62,7 @@ import java.util.concurrent.ExecutionException;
* Base fragment for dashboard style UI containing a list of static and dynamic setting items.
*/
public abstract class DashboardFragment extends SettingsPreferenceFragment
- implements SettingsBaseActivity.CategoryListener, Indexable,
- PreferenceGroup.OnExpandButtonClickListener,
+ implements CategoryListener, Indexable, PreferenceGroup.OnExpandButtonClickListener,
BasePreferenceController.UiBlockListener {
public static final String CATEGORY = "category";
private static final String TAG = "DashboardFragment";
@@ -198,9 +198,9 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
return;
}
final Activity activity = getActivity();
- if (activity instanceof SettingsBaseActivity) {
+ if (activity instanceof CategoryHandler) {
mListeningToCategoryChange = true;
- ((SettingsBaseActivity) activity).addCategoryListener(this);
+ ((CategoryHandler) activity).getCategoryMixin().addCategoryListener(this);
}
final ContentResolver resolver = getContentResolver();
mDashboardTilePrefKeys.values().stream()
@@ -243,8 +243,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
unregisterDynamicDataObservers(new ArrayList<>(mRegisteredObservers));
if (mListeningToCategoryChange) {
final Activity activity = getActivity();
- if (activity instanceof SettingsBaseActivity) {
- ((SettingsBaseActivity) activity).remCategoryListener(this);
+ if (activity instanceof CategoryHandler) {
+ ((CategoryHandler) activity).getCategoryMixin().removeCategoryListener(this);
}
mListeningToCategoryChange = false;
}
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index 5c5900e8f37..460f3909f74 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -39,10 +39,8 @@ import androidx.loader.content.Loader;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.PreferenceCategory;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settings.applications.AppInfoBase;
import com.android.settings.widget.EntityHeaderController;
import com.android.settingslib.AppItem;
@@ -223,14 +221,6 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
}
LoaderManager.getInstance(this).restartLoader(LOADER_APP_USAGE_DATA, null /* args */,
mUidDataCallbacks);
-
- if (Utils.isPageTransitionEnabled(mContext)) {
- final RecyclerView recyclerView = getListView();
- if (recyclerView != null) {
- recyclerView.setItemAnimator(null);
- }
- }
-
updatePrefs();
}
diff --git a/src/com/android/settings/datetime/timezone/BaseTimeZonePicker.java b/src/com/android/settings/datetime/timezone/BaseTimeZonePicker.java
index 6032abd9b17..6ce9f6f9ae8 100644
--- a/src/com/android/settings/datetime/timezone/BaseTimeZonePicker.java
+++ b/src/com/android/settings/datetime/timezone/BaseTimeZonePicker.java
@@ -27,6 +27,8 @@ import android.widget.LinearLayout;
import android.widget.SearchView;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.view.ViewCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@@ -95,6 +97,7 @@ public abstract class BaseTimeZonePicker extends InstrumentedFragment
LinearLayoutManager.VERTICAL, /* reverseLayout */ false));
mRecyclerView.setAdapter(mAdapter);
mAppBarLayout = getActivity().findViewById(R.id.app_bar);
+ disableToolBarScrollableBehavior();
// Initialize TimeZoneDataLoader only when mRecyclerView is ready to avoid race
// during onDateLoaderReady callback.
@@ -160,13 +163,15 @@ public abstract class BaseTimeZonePicker extends InstrumentedFragment
public boolean onMenuItemActionExpand(MenuItem item) {
// To prevent a large space on tool bar.
mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
- // To prevent user can expand the collpasing tool bar view.
+ // To prevent user can expand the collapsing tool bar view.
ViewCompat.setNestedScrollingEnabled(mRecyclerView, false);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
+ // We keep the collapsed status after user cancel the search function.
+ mAppBarLayout.setExpanded(false /*expanded*/, false /*animate*/);
ViewCompat.setNestedScrollingEnabled(mRecyclerView, true);
return true;
}
@@ -188,4 +193,17 @@ public abstract class BaseTimeZonePicker extends InstrumentedFragment
void onListItemClick(T item);
}
+ private void disableToolBarScrollableBehavior() {
+ CoordinatorLayout.LayoutParams params =
+ (CoordinatorLayout.LayoutParams) mAppBarLayout.getLayoutParams();
+ AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
+ behavior.setDragCallback(
+ new AppBarLayout.Behavior.DragCallback() {
+ @Override
+ public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
+ return false;
+ }
+ });
+ params.setBehavior(behavior);
+ }
}
diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
index 0a67ef29a27..611ee24baaa 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
@@ -122,7 +122,7 @@ public class StorageAsyncLoader
UserHandle.of(userId));
} catch (NameNotFoundException e) {
Log.e(TAG, "Not able to get Context for user ID " + userId);
- return 0;
+ return 0L;
}
try (Cursor cursor = perUserContext.getContentResolver().query(
@@ -131,9 +131,9 @@ public class StorageAsyncLoader
queryArgs,
null /* cancellationSignal */)) {
if (cursor == null) {
- return 0;
+ return 0L;
}
- return cursor.moveToFirst() ? cursor.getInt(0) : 0;
+ return cursor.moveToFirst() ? cursor.getLong(0) : 0L;
}
}
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 75b2eaedf42..1d7b5dc14b9 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -34,12 +34,15 @@ import androidx.fragment.app.FragmentTransaction;
import com.android.settings.R;
import com.android.settings.accounts.AvatarViewMixin;
+import com.android.settings.core.CategoryMixin;
import com.android.settings.core.FeatureFlags;
import com.android.settings.homepage.contextualcards.ContextualCardsFragment;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
-public class SettingsHomepageActivity extends FragmentActivity {
+/** Settings homepage activity */
+public class SettingsHomepageActivity extends FragmentActivity implements
+ CategoryMixin.CategoryHandler {
private static final String TAG = "SettingsHomepageActivity";
@@ -47,6 +50,12 @@ public class SettingsHomepageActivity extends FragmentActivity {
private View mHomepageView;
private View mSuggestionView;
+ private CategoryMixin mCategoryMixin;
+
+ @Override
+ public CategoryMixin getCategoryMixin() {
+ return mCategoryMixin;
+ }
/**
* Shows the homepage and shows/hides the suggestion together. Only allows to be executed once
@@ -76,6 +85,8 @@ public class SettingsHomepageActivity extends FragmentActivity {
.initSearchToolbar(this /* activity */, toolbar, SettingsEnums.SETTINGS_HOMEPAGE);
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
+ mCategoryMixin = new CategoryMixin(this);
+ getLifecycle().addObserver(mCategoryMixin);
if (!getSystemService(ActivityManager.class).isLowRamDevice()) {
// Only allow features on high ram devices.
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index b34d9cd7a63..25cf4ce7dab 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -267,9 +267,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
if (mWifiManager != null) {
setLoading(true, false);
mIsViewLoading = true;
- if (!mWifiManager.isWifiEnabled()) {
- getView().postDelayed(mRemoveLoadingRunnable, 100);
- }
+ getView().postDelayed(mRemoveLoadingRunnable,
+ mWifiManager.isWifiEnabled() ? 1000 : 100);
}
}
diff --git a/src/com/android/settings/network/ProviderModelSlice.java b/src/com/android/settings/network/ProviderModelSlice.java
index 0ae270c64b8..aafe715c4a5 100644
--- a/src/com/android/settings/network/ProviderModelSlice.java
+++ b/src/com/android/settings/network/ProviderModelSlice.java
@@ -22,16 +22,20 @@ import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
import android.annotation.ColorInt;
+import android.app.AlertDialog;
+import android.app.AlertDialog.Builder;
import android.app.PendingIntent;
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.telephony.SubscriptionManager;
import android.util.Log;
+import android.view.WindowManager.LayoutParams;
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
@@ -64,12 +68,16 @@ import java.util.stream.Collectors;
public class ProviderModelSlice extends WifiSlice {
private static final String TAG = "ProviderModelSlice";
+ protected static final String PREF_NAME = "ProviderModelSlice";
+ protected static final String PREF_HAS_TURNED_OFF_MOBILE_DATA = "PrefHasTurnedOffMobileData";
private final ProviderModelSliceHelper mHelper;
+ private final SharedPreferences mSharedPref;
public ProviderModelSlice(Context context) {
super(context);
mHelper = getHelper();
+ mSharedPref = getSharedPreference();
}
@Override
@@ -194,10 +202,21 @@ public class ProviderModelSlice extends WifiSlice {
boolean isToggleAction = intent.hasExtra(EXTRA_TOGGLE_STATE);
boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
mHelper.isMobileDataEnabled());
+
if (isToggleAction) {
// The ToggleAction is used to set mobile data enabled.
- MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState,
- false /* disableOtherSubscriptions */);
+ if (!newState && mSharedPref != null
+ && mSharedPref.getBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true)) {
+ String carrierName = mHelper.getMobileTitle();
+ if (carrierName.equals(mContext.getString(R.string.mobile_data_settings_title))) {
+ carrierName = mContext.getString(
+ R.string.mobile_data_disable_message_default_carrier);
+ }
+ showMobileDataDisableDialog(getMobileDataDisableDialog(defaultSubId, carrierName));
+ } else {
+ MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId, newState,
+ false /* disableOtherSubscriptions */);
+ }
}
final boolean isDataEnabled =
@@ -205,6 +224,38 @@ public class ProviderModelSlice extends WifiSlice {
doCarrierNetworkAction(isToggleAction, isDataEnabled, defaultSubId);
}
+ @VisibleForTesting
+ AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
+ return new Builder(mContext)
+ .setTitle(R.string.mobile_data_disable_title)
+ .setMessage(mContext.getString(R.string.mobile_data_disable_message,
+ carrierName))
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(
+ com.android.internal.R.string.alert_windows_notification_turn_off_action,
+ (dialog, which) -> {
+ MobileNetworkUtils.setMobileDataEnabled(mContext, defaultSubId,
+ false /* enabled */,
+ false /* disableOtherSubscriptions */);
+ if (mSharedPref != null) {
+ SharedPreferences.Editor editor = mSharedPref.edit();
+ editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, false);
+ editor.apply();
+ }
+ })
+ .create();
+ }
+
+ private void showMobileDataDisableDialog(AlertDialog dialog) {
+ if (dialog == null) {
+ log("AlertDialog is null");
+ return;
+ }
+
+ dialog.getWindow().setType(LayoutParams.TYPE_KEYGUARD_DIALOG);
+ dialog.show();
+ }
+
@VisibleForTesting
void doCarrierNetworkAction(boolean isToggleAction, boolean isDataEnabled, int subId) {
final NetworkProviderWorker worker = getWorker();
@@ -247,6 +298,11 @@ public class ProviderModelSlice extends WifiSlice {
return SliceBackgroundWorker.getInstance(getUri());
}
+ @VisibleForTesting
+ SharedPreferences getSharedPreference() {
+ return mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+ }
+
private @InternetUpdater.InternetType int getInternetType() {
final NetworkProviderWorker worker = getWorker();
if (worker == null) {
diff --git a/src/com/android/settings/network/ProviderModelSliceHelper.java b/src/com/android/settings/network/ProviderModelSliceHelper.java
index 28f857464ae..16d5c924552 100644
--- a/src/com/android/settings/network/ProviderModelSliceHelper.java
+++ b/src/com/android/settings/network/ProviderModelSliceHelper.java
@@ -264,7 +264,7 @@ public class ProviderModelSliceHelper {
return summary;
}
- private String getMobileTitle() {
+ protected String getMobileTitle() {
String title = mContext.getText(R.string.mobile_data_settings_title).toString();
if (mSubscriptionManager == null) {
return title;
diff --git a/src/com/android/settings/notification/app/AppNotificationSettings.java b/src/com/android/settings/notification/app/AppNotificationSettings.java
index 8d0819cd979..d7694d7e45e 100644
--- a/src/com/android/settings/notification/app/AppNotificationSettings.java
+++ b/src/com/android/settings/notification/app/AppNotificationSettings.java
@@ -25,11 +25,9 @@ import android.util.Log;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.widget.LockPatternUtils;
import com.android.settings.R;
-import com.android.settings.Utils;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.ArrayList;
@@ -80,13 +78,6 @@ public class AppNotificationSettings extends NotificationSettings {
return;
}
- if (Utils.isPageTransitionEnabled(mContext)) {
- final RecyclerView recyclerView = getListView();
- if (recyclerView != null) {
- recyclerView.setItemAnimator(null);
- }
- }
-
for (NotificationPreferenceController controller : mControllers) {
controller.onResume(mAppRow, mChannel, mChannelGroup, null, null, mSuspendedAppsAdmin,
null);
diff --git a/src/com/android/settings/sim/ChooseSimActivity.java b/src/com/android/settings/sim/ChooseSimActivity.java
index f51445a92a9..d0ccc4c9d01 100644
--- a/src/com/android/settings/sim/ChooseSimActivity.java
+++ b/src/com/android/settings/sim/ChooseSimActivity.java
@@ -19,6 +19,7 @@ package com.android.settings.sim;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.icu.text.MessageFormat;
import android.os.Bundle;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -43,7 +44,10 @@ import com.google.android.setupdesign.items.ItemGroup;
import com.google.android.setupdesign.items.RecyclerItemAdapter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
+import java.util.Map;
/** Activity to show a list of profiles for user to choose. */
public class ChooseSimActivity extends Activity
@@ -108,7 +112,12 @@ public class ChooseSimActivity extends Activity
subscriptionCount++;
}
layout.setHeaderText(getString(R.string.choose_sim_title));
- layout.setDescriptionText(getString(R.string.choose_sim_text, subscriptionCount));
+ MessageFormat msgFormat = new MessageFormat(
+ getString(R.string.choose_sim_text),
+ Locale.getDefault());
+ Map arguments = new HashMap<>();
+ arguments.put("count", subscriptionCount);
+ layout.setDescriptionText(msgFormat.format(arguments));
displaySubscriptions();
diff --git a/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
new file mode 100644
index 00000000000..d64f95dc4ad
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/CategoryMixinTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anySet;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.util.ArraySet;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.android.settings.core.CategoryMixin.CategoryListener;
+import com.android.settingslib.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.android.controller.ActivityController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+public class CategoryMixinTest {
+ private ActivityController mActivityController;
+
+ @Before
+ public void setUp() {
+ mActivityController = Robolectric.buildActivity(TestActivity.class);
+ }
+
+ @Test
+ public void resumeActivity_shouldRegisterReceiver() {
+ mActivityController.setup();
+
+ final TestActivity activity = mActivityController.get();
+ assertThat(activity.getRegisteredReceivers()).isNotEmpty();
+ }
+
+ @Test
+ public void pauseActivity_shouldUnregisterReceiver() {
+ mActivityController.setup().pause();
+
+ final TestActivity activity = mActivityController.get();
+ assertThat(activity.getRegisteredReceivers()).isEmpty();
+ }
+
+ @Test
+ public void onCategoriesChanged_listenerAdded_shouldNotifyChanged() {
+ mActivityController.setup().pause();
+ final CategoryMixin categoryMixin = mActivityController.get().getCategoryMixin();
+ final CategoryListener listener = mock(CategoryListener.class);
+ categoryMixin.addCategoryListener(listener);
+
+ categoryMixin.onCategoriesChanged(new ArraySet<>());
+
+ verify(listener).onCategoriesChanged(anySet());
+ }
+
+ static class TestActivity extends AppCompatActivity implements CategoryMixin.CategoryHandler {
+
+ private CategoryMixin mCategoryMixin;
+ private List mRegisteredReceivers = new ArrayList<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setTheme(R.style.Theme_AppCompat);
+ mCategoryMixin = new CategoryMixin(this);
+ getLifecycle().addObserver(mCategoryMixin);
+ }
+
+ @Override
+ public CategoryMixin getCategoryMixin() {
+ return mCategoryMixin;
+ }
+
+ @Override
+ public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
+ mRegisteredReceivers.add(receiver);
+ return super.registerReceiver(receiver, filter);
+ }
+
+ @Override
+ public void unregisterReceiver(BroadcastReceiver receiver) {
+ mRegisteredReceivers.remove(receiver);
+ super.unregisterReceiver(receiver);
+ }
+
+ List getRegisteredReceivers() {
+ return mRegisteredReceivers;
+ }
+ }
+}
diff --git a/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java b/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java
new file mode 100644
index 00000000000..78856da7692
--- /dev/null
+++ b/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics;
+
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
+import static android.hardware.biometrics.BiometricAuthenticator.TYPE_NONE;
+
+import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_MODALITY;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_DENIED;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_CONSENT_GRANTED;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.hardware.biometrics.BiometricAuthenticator;
+import android.util.Pair;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import com.android.settings.biometrics.face.FaceEnrollParentalConsent;
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollParentalConsent;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RunWith(AndroidJUnit4.class)
+public class ParentalConsentHelperTest {
+
+ private static final int REQUEST_CODE = 12;
+
+ @Rule
+ public final MockitoRule mMocks = MockitoJUnit.rule();
+
+ @Mock
+ private Activity mRootActivity;
+ @Mock
+ private Intent mRootActivityIntent;
+ @Captor
+ ArgumentCaptor mLastStarted;
+
+ @Before
+ public void setup() {
+ when(mRootActivity.getIntent()).thenAnswer(invocation -> mRootActivityIntent);
+ when(mRootActivityIntent.getBundleExtra(any())).thenAnswer(invocation -> null);
+ when(mRootActivityIntent.getStringExtra(any())).thenAnswer(invocation -> null);
+ when(mRootActivityIntent.getBooleanExtra(any(), anyBoolean()))
+ .thenAnswer(invocation -> invocation.getArguments()[1]);
+ }
+
+ @Test
+ public void testLaunchNext_face_and_fingerprint_all_consent() {
+ testLaunchNext(
+ true /* requireFace */, true /* grantFace */,
+ true /* requireFingerprint */, true /* grantFace */,
+ 90 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_nothing_to_consent() {
+ testLaunchNext(
+ false /* requireFace */, false /* grantFace */,
+ false /* requireFingerprint */, false /* grantFace */,
+ 80 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_face_and_fingerprint_no_consent() {
+ testLaunchNext(
+ true /* requireFace */, false /* grantFace */,
+ true /* requireFingerprint */, false /* grantFace */,
+ 70 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_face_and_fingerprint_only_face_consent() {
+ testLaunchNext(
+ true /* requireFace */, true /* grantFace */,
+ true /* requireFingerprint */, false /* grantFace */,
+ 60 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_face_and_fingerprint_only_fingerprint_consent() {
+ testLaunchNext(
+ true /* requireFace */, false /* grantFace */,
+ true /* requireFingerprint */, true /* grantFace */,
+ 50 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_face_with_consent() {
+ testLaunchNext(
+ true /* requireFace */, true /* grantFace */,
+ false /* requireFingerprint */, false /* grantFace */,
+ 40 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_face_without_consent() {
+ testLaunchNext(
+ true /* requireFace */, false /* grantFace */,
+ false /* requireFingerprint */, false /* grantFace */,
+ 30 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_fingerprint_with_consent() {
+ testLaunchNext(
+ false /* requireFace */, false /* grantFace */,
+ true /* requireFingerprint */, true /* grantFace */,
+ 20 /* gkpw */);
+ }
+
+ @Test
+ public void testLaunchNext_fingerprint_without_consent() {
+ testLaunchNext(
+ false /* requireFace */, false /* grantFace */,
+ true /* requireFingerprint */, false /* grantFace */,
+ 10 /* gkpw */);
+ }
+
+ private void testLaunchNext(
+ boolean requireFace, boolean grantFace,
+ boolean requireFingerprint, boolean grantFingerprint,
+ long gkpw) {
+ final List> expectedLaunches = new ArrayList<>();
+ if (requireFace) {
+ expectedLaunches.add(new Pair(FaceEnrollParentalConsent.class.getName(), grantFace));
+ }
+ if (requireFingerprint) {
+ expectedLaunches.add(
+ new Pair(FingerprintEnrollParentalConsent.class.getName(), grantFingerprint));
+ }
+
+ // initial consent status
+ final ParentalConsentHelper helper =
+ new ParentalConsentHelper(requireFace, requireFingerprint, gkpw);
+ assertThat(ParentalConsentHelper.hasFaceConsent(helper.getConsentResult()))
+ .isFalse();
+ assertThat(ParentalConsentHelper.hasFingerprintConsent(helper.getConsentResult()))
+ .isFalse();
+
+ // check expected launches
+ for (int i = 0; i <= expectedLaunches.size(); i++) {
+ final Pair expected = i > 0 ? expectedLaunches.get(i - 1) : null;
+ final boolean launchedNext = i == 0
+ ? helper.launchNext(mRootActivity, REQUEST_CODE)
+ : helper.launchNext(mRootActivity, REQUEST_CODE,
+ expected.second ? RESULT_CONSENT_GRANTED : RESULT_CONSENT_DENIED,
+ getResultIntent(getStartedModality(expected.first)));
+ assertThat(launchedNext).isEqualTo(i < expectedLaunches.size());
+ }
+ verify(mRootActivity, times(expectedLaunches.size()))
+ .startActivityForResult(mLastStarted.capture(), eq(REQUEST_CODE));
+ assertThat(mLastStarted.getAllValues()
+ .stream().map(i -> i.getComponent().getClassName()).collect(Collectors.toList()))
+ .containsExactlyElementsIn(
+ expectedLaunches.stream().map(i -> i.first).collect(Collectors.toList()))
+ .inOrder();
+ if (!expectedLaunches.isEmpty()) {
+ assertThat(mLastStarted.getAllValues()
+ .stream().map(BiometricUtils::getGatekeeperPasswordHandle).distinct()
+ .collect(Collectors.toList()))
+ .containsExactly(gkpw);
+ }
+
+ // final consent status
+ assertThat(ParentalConsentHelper.hasFaceConsent(helper.getConsentResult()))
+ .isEqualTo(requireFace && grantFace);
+ assertThat(ParentalConsentHelper.hasFingerprintConsent(helper.getConsentResult()))
+ .isEqualTo(requireFingerprint && grantFingerprint);
+ }
+
+ private static Intent getResultIntent(@BiometricAuthenticator.Modality int modality) {
+ final Intent intent = new Intent();
+ intent.putExtra(EXTRA_KEY_MODALITY, modality);
+ return intent;
+ }
+
+ @BiometricAuthenticator.Modality
+ private static int getStartedModality(String name) {
+ if (name.equals(FaceEnrollParentalConsent.class.getName())) {
+ return TYPE_FACE;
+ }
+ if (name.equals(FingerprintEnrollParentalConsent.class.getName())) {
+ return TYPE_FINGERPRINT;
+ }
+ return TYPE_NONE;
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
index 4e9ed762fb8..722e305197d 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java
@@ -16,6 +16,10 @@
package com.android.settings.network;
+import static android.app.slice.Slice.EXTRA_TOGGLE_STATE;
+
+import static com.android.settings.network.ProviderModelSlice.PREF_HAS_TURNED_OFF_MOBILE_DATA;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -28,9 +32,11 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager;
@@ -100,6 +106,7 @@ public class ProviderModelSliceTest {
WifiPickerTracker mWifiPickerTracker;
@Mock
WifiSliceItem mWifiSliceItem;
+ AlertDialog mMockAlertDialog;
private FakeFeatureFactory mFeatureFactory;
@@ -128,6 +135,11 @@ public class ProviderModelSliceTest {
PROVIDER_MODEL_SLICE_URI));
mMockProviderModelSlice = spy(new MockProviderModelSlice(
mContext, mMockNetworkProviderWorker));
+ mMockAlertDialog = new AlertDialog.Builder(mContext)
+ .setTitle("")
+ .create();
+ mMockAlertDialog = spy(mMockAlertDialog);
+ mMockProviderModelSlice.setMobileDataDisableDialog(mMockAlertDialog);
mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI,
ListBuilder.INFINITY).setAccentColor(-1));
when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn(
@@ -350,6 +362,7 @@ public class ProviderModelSliceTest {
private MockNetworkProviderWorker mNetworkProviderWorker;
private boolean mHasCreateEthernetRow;
private boolean mHasSeeAllRow;
+ private AlertDialog mAlertDialog;
MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
super(context);
@@ -366,6 +379,11 @@ public class ProviderModelSliceTest {
return mNetworkProviderWorker;
}
+ @Override
+ AlertDialog getMobileDataDisableDialog(int defaultSubId, String carrierName) {
+ return mAlertDialog;
+ }
+
@Override
ListBuilder.RowBuilder createEthernetRow() {
mHasCreateEthernetRow = true;
@@ -385,6 +403,64 @@ public class ProviderModelSliceTest {
public boolean hasSeeAllRow() {
return mHasSeeAllRow;
}
+
+ public void setMobileDataDisableDialog(AlertDialog alertDialog) {
+ mAlertDialog = alertDialog;
+ }
+ }
+
+ @Test
+ @UiThreadTest
+ public void onNotifyChange_FirstTimeDisableToggleState_showDialog() {
+ final Intent intent = new Intent();
+ intent.putExtra(EXTRA_TOGGLE_STATE, false);
+ SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+ when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+ if (sharedPref != null) {
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true);
+ editor.apply();
+ }
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockAlertDialog).show();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onNotifyChange_EnableToggleState_doNotShowDialog() {
+ final Intent intent = new Intent();
+ intent.putExtra(EXTRA_TOGGLE_STATE, true);
+ SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+ when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+ if (sharedPref != null) {
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, true);
+ editor.apply();
+ }
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockAlertDialog, never()).show();
+ }
+
+ @Test
+ @UiThreadTest
+ public void onNotifyChange_notFirstTimeDisableToggleState_doNotShowDialog() {
+ final Intent intent = new Intent();
+ intent.putExtra(EXTRA_TOGGLE_STATE, false);
+ SharedPreferences sharedPref = mMockProviderModelSlice.getSharedPreference();
+ when(mProviderModelSliceHelper.getMobileTitle()).thenReturn("mockRow");
+ if (sharedPref != null) {
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(PREF_HAS_TURNED_OFF_MOBILE_DATA, false);
+ editor.apply();
+ }
+
+ mMockProviderModelSlice.onNotifyChange(intent);
+
+ verify(mMockAlertDialog, never()).show();
}
@Test