summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-04-22 17:04:55 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-22 17:04:55 +0000
commit3c3c227d0ab21b87865e9ed48fa70e5f9cd77f50 (patch)
tree0d78257c08c86ff35e12bf9217c1f8be9c52d7b4
parent8fbb454bc60f195e872fb8f64105adc8363bd6f6 (diff)
parentbdfd58ba4d34bdbf0493a698d58bf42d9c4fe476 (diff)
downloadnoto-fonts-androidx-viewpager2-release.tar.gz
Merge "Snap for 11740702 from 61449a7b7148cdfc6296dfa86ba2933ee11b4143 to androidx-viewpager2-release" into androidx-viewpager2-releaseandroidx-viewpager2-release
-rw-r--r--TEST_MAPPING7
-rw-r--r--emoji-compat-flatbuffers/Android.mk (renamed from emoji-compat/Android.mk)4
-rw-r--r--emoji-compat-flatbuffers/build.gradle42
-rw-r--r--emoji-compat-flatbuffers/data/emoji_metadata.fbs (renamed from emoji-compat/data/emoji_metadata.fbs)0
-rw-r--r--emoji-compat-flatbuffers/data/flatbuffer_header.txt (renamed from emoji-compat/data/flatbuffer_header.txt)13
-rw-r--r--emoji-compat-flatbuffers/jarjar-rules.txt (renamed from emoji-compat/jarjar-rules.txt)0
-rw-r--r--emoji-compat-flatbuffers/settings.gradle (renamed from emoji-compat/settings.gradle)0
-rw-r--r--emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java89
-rw-r--r--emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataList.java76
-rw-r--r--emoji-compat/README.android19
-rw-r--r--emoji-compat/build.gradle76
-rwxr-xr-xemoji-compat/createfont.py686
-rw-r--r--emoji-compat/data/emoji_metadata.txt758
-rwxr-xr-xemoji-compat/fetch.sh118
-rw-r--r--emoji-compat/font/NotoColorEmojiCompat.ttfbin9530128 -> 10773992 bytes
-rw-r--r--emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java160
-rw-r--r--emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataList.java124
-rw-r--r--emoji-compat/supported-emojis/emojis.txt758
-rw-r--r--emoji/NotoColorEmoji.ttfbin9384876 -> 10082864 bytes
-rw-r--r--fonts.mk19
-rw-r--r--other/Android.bp71
-rw-r--r--other/NotoSansAdlam-Regular.ttfbin50720 -> 0 bytes
-rw-r--r--other/NotoSansAdlam-VF.ttfbin0 -> 103892 bytes
-rw-r--r--other/NotoSansGeorgian-Bold.otfbin20760 -> 0 bytes
-rw-r--r--other/NotoSansGeorgian-Medium.otfbin21060 -> 0 bytes
-rw-r--r--other/NotoSansGeorgian-Regular.otfbin19976 -> 0 bytes
-rw-r--r--other/NotoSansGeorgian-VF.ttfbin0 -> 66720 bytes
-rw-r--r--other/NotoSansGunjalaGondi-Regular.otfbin0 -> 32336 bytes
-rw-r--r--other/NotoSansHanifiRohingya-Regular.otfbin0 -> 13432 bytes
-rw-r--r--other/NotoSansJavanese-Regular.otfbin0 -> 86944 bytes
-rw-r--r--other/NotoSansJavanese-Regular.ttfbin37620 -> 0 bytes
-rw-r--r--other/NotoSansKhojki-Regular.otfbin0 -> 26928 bytes
-rw-r--r--other/NotoSansMasaramGondi-Regular.otfbin0 -> 23016 bytes
-rw-r--r--other/NotoSansTifinagh-Regular.otfbin0 -> 24924 bytes
-rw-r--r--other/NotoSansTifinagh-Regular.ttfbin15272 -> 0 bytes
-rw-r--r--other/NotoSansWancho-Regular.otfbin0 -> 14216 bytes
-rw-r--r--other/NotoSansWarangCiti-Regular.otfbin0 -> 20532 bytes
-rw-r--r--other/NotoSerifGeorgian-Bold.otfbin23620 -> 0 bytes
-rw-r--r--other/NotoSerifGeorgian-Regular.otfbin22320 -> 0 bytes
-rw-r--r--other/NotoSerifGeorgian-VF.ttfbin0 -> 80416 bytes
40 files changed, 1914 insertions, 1106 deletions
diff --git a/TEST_MAPPING b/TEST_MAPPING
new file mode 100644
index 0000000..279657d
--- /dev/null
+++ b/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "presubmit": [
+ {
+ "name": "minikin_tests"
+ }
+ ]
+}
diff --git a/emoji-compat/Android.mk b/emoji-compat-flatbuffers/Android.mk
index bc47046..a022aba 100644
--- a/emoji-compat/Android.mk
+++ b/emoji-compat-flatbuffers/Android.mk
@@ -15,7 +15,7 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_MODULE := noto-emoji-compat-java
+LOCAL_MODULE := noto-emoji-compat-flatbuffers-java
LOCAL_SRC_FILES := $(call all-java-files-under, src/java)
LOCAL_SDK_VERSION := current
@@ -23,6 +23,6 @@ LOCAL_STATIC_JAVA_LIBRARIES := \
flatbuffers-java
LOCAL_JAR_EXCLUDE_FILES := none
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+LOCAL_JAVA_LANGUAGE_VERSION := 1.8
LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/emoji-compat-flatbuffers/build.gradle b/emoji-compat-flatbuffers/build.gradle
new file mode 100644
index 0000000..25b3cb6
--- /dev/null
+++ b/emoji-compat-flatbuffers/build.gradle
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+plugins {
+ id("java")
+}
+
+sourceSets {
+ main {
+ java.srcDirs = ['src/java']
+ }
+}
+
+compileJava {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+}
+project.tasks.withType(JavaCompile).configureEach { task ->
+ // JDK 21 considers Java 8 an obsolete source and target value. Disable this warning.
+ task.options.compilerArgs.add("-Xlint:-options")
+}
+
+dependencies {
+ implementation("com.google.flatbuffers:flatbuffers-java:1.12.0")
+}
+
+// The "javadoc" task is unused so we don't want it to appear in the output of `./gradlew tasks`
+// So, we set the group to null
+tasks["javadoc"].group = null
diff --git a/emoji-compat/data/emoji_metadata.fbs b/emoji-compat-flatbuffers/data/emoji_metadata.fbs
index 23d0db9..23d0db9 100644
--- a/emoji-compat/data/emoji_metadata.fbs
+++ b/emoji-compat-flatbuffers/data/emoji_metadata.fbs
diff --git a/emoji-compat/data/flatbuffer_header.txt b/emoji-compat-flatbuffers/data/flatbuffer_header.txt
index d67f3a8..2b40a04 100644
--- a/emoji-compat/data/flatbuffer_header.txt
+++ b/emoji-compat-flatbuffers/data/flatbuffer_header.txt
@@ -14,16 +14,3 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package androidx.text.emoji.flatbuffer;
-
-import com.google.flatbuffers.FlatBufferBuilder;
-import com.google.flatbuffers.Table;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Automatically generated by the FlatBuffers compiler, do not modify.
- */
-@SuppressWarnings("unused") \ No newline at end of file
diff --git a/emoji-compat/jarjar-rules.txt b/emoji-compat-flatbuffers/jarjar-rules.txt
index fdc3188..fdc3188 100644
--- a/emoji-compat/jarjar-rules.txt
+++ b/emoji-compat-flatbuffers/jarjar-rules.txt
diff --git a/emoji-compat/settings.gradle b/emoji-compat-flatbuffers/settings.gradle
index 5e6c61e..5e6c61e 100644
--- a/emoji-compat/settings.gradle
+++ b/emoji-compat-flatbuffers/settings.gradle
diff --git a/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java b/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java
new file mode 100644
index 0000000..0b2a694
--- /dev/null
+++ b/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java
@@ -0,0 +1,89 @@
+// CHECKSTYLE:OFF Generated code
+/*
+ * Copyright (C) 2017 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.
+ */
+
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package androidx.text.emoji.flatbuffer;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class MetadataItem extends Table {
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
+ public static MetadataItem getRootAsMetadataItem(ByteBuffer _bb) { return getRootAsMetadataItem(_bb, new MetadataItem()); }
+ public static MetadataItem getRootAsMetadataItem(ByteBuffer _bb, MetadataItem obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public MetadataItem __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public int id() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+ public boolean emojiStyle() { int o = __offset(6); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
+ public short sdkAdded() { int o = __offset(8); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public short compatAdded() { int o = __offset(10); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public short width() { int o = __offset(12); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public short height() { int o = __offset(14); return o != 0 ? bb.getShort(o + bb_pos) : 0; }
+ public int codepoints(int j) { int o = __offset(16); return o != 0 ? bb.getInt(__vector(o) + j * 4) : 0; }
+ public int codepointsLength() { int o = __offset(16); return o != 0 ? __vector_len(o) : 0; }
+ public IntVector codepointsVector() { return codepointsVector(new IntVector()); }
+ public IntVector codepointsVector(IntVector obj) { int o = __offset(16); return o != 0 ? obj.__assign(__vector(o), bb) : null; }
+ public ByteBuffer codepointsAsByteBuffer() { return __vector_as_bytebuffer(16, 4); }
+ public ByteBuffer codepointsInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 16, 4); }
+
+ public static int createMetadataItem(FlatBufferBuilder builder,
+ int id,
+ boolean emojiStyle,
+ short sdkAdded,
+ short compatAdded,
+ short width,
+ short height,
+ int codepointsOffset) {
+ builder.startTable(7);
+ MetadataItem.addCodepoints(builder, codepointsOffset);
+ MetadataItem.addId(builder, id);
+ MetadataItem.addHeight(builder, height);
+ MetadataItem.addWidth(builder, width);
+ MetadataItem.addCompatAdded(builder, compatAdded);
+ MetadataItem.addSdkAdded(builder, sdkAdded);
+ MetadataItem.addEmojiStyle(builder, emojiStyle);
+ return MetadataItem.endMetadataItem(builder);
+ }
+
+ public static void startMetadataItem(FlatBufferBuilder builder) { builder.startTable(7); }
+ public static void addId(FlatBufferBuilder builder, int id) { builder.addInt(0, id, 0); }
+ public static void addEmojiStyle(FlatBufferBuilder builder, boolean emojiStyle) { builder.addBoolean(1, emojiStyle, false); }
+ public static void addSdkAdded(FlatBufferBuilder builder, short sdkAdded) { builder.addShort(2, sdkAdded, 0); }
+ public static void addCompatAdded(FlatBufferBuilder builder, short compatAdded) { builder.addShort(3, compatAdded, 0); }
+ public static void addWidth(FlatBufferBuilder builder, short width) { builder.addShort(4, width, 0); }
+ public static void addHeight(FlatBufferBuilder builder, short height) { builder.addShort(5, height, 0); }
+ public static void addCodepoints(FlatBufferBuilder builder, int codepointsOffset) { builder.addOffset(6, codepointsOffset, 0); }
+ public static int createCodepointsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addInt(data[i]); return builder.endVector(); }
+ public static void startCodepointsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
+ public static int endMetadataItem(FlatBufferBuilder builder) {
+ int o = builder.endTable();
+ return o;
+ }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public MetadataItem get(int j) { return get(new MetadataItem(), j); }
+ public MetadataItem get(MetadataItem obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
+}
+
diff --git a/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataList.java b/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataList.java
new file mode 100644
index 0000000..6330098
--- /dev/null
+++ b/emoji-compat-flatbuffers/src/java/androidx/text/emoji/flatbuffer/MetadataList.java
@@ -0,0 +1,76 @@
+// CHECKSTYLE:OFF Generated code
+/*
+ * Copyright (C) 2017 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.
+ */
+
+// automatically generated by the FlatBuffers compiler, do not modify
+
+package androidx.text.emoji.flatbuffer;
+
+import java.nio.*;
+import java.lang.*;
+import java.util.*;
+import com.google.flatbuffers.*;
+
+@SuppressWarnings("unused")
+public final class MetadataList extends Table {
+ public static void ValidateVersion() { Constants.FLATBUFFERS_1_12_0(); }
+ public static MetadataList getRootAsMetadataList(ByteBuffer _bb) { return getRootAsMetadataList(_bb, new MetadataList()); }
+ public static MetadataList getRootAsMetadataList(ByteBuffer _bb, MetadataList obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
+ public void __init(int _i, ByteBuffer _bb) { __reset(_i, _bb); }
+ public MetadataList __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
+
+ public int version() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
+ public androidx.text.emoji.flatbuffer.MetadataItem list(int j) { return list(new androidx.text.emoji.flatbuffer.MetadataItem(), j); }
+ public androidx.text.emoji.flatbuffer.MetadataItem list(androidx.text.emoji.flatbuffer.MetadataItem obj, int j) { int o = __offset(6); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
+ public int listLength() { int o = __offset(6); return o != 0 ? __vector_len(o) : 0; }
+ public androidx.text.emoji.flatbuffer.MetadataItem.Vector listVector() { return listVector(new androidx.text.emoji.flatbuffer.MetadataItem.Vector()); }
+ public androidx.text.emoji.flatbuffer.MetadataItem.Vector listVector(androidx.text.emoji.flatbuffer.MetadataItem.Vector obj) { int o = __offset(6); return o != 0 ? obj.__assign(__vector(o), 4, bb) : null; }
+ public String sourceSha() { int o = __offset(8); return o != 0 ? __string(o + bb_pos) : null; }
+ public ByteBuffer sourceShaAsByteBuffer() { return __vector_as_bytebuffer(8, 1); }
+ public ByteBuffer sourceShaInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); }
+
+ public static int createMetadataList(FlatBufferBuilder builder,
+ int version,
+ int listOffset,
+ int sourceShaOffset) {
+ builder.startTable(3);
+ MetadataList.addSourceSha(builder, sourceShaOffset);
+ MetadataList.addList(builder, listOffset);
+ MetadataList.addVersion(builder, version);
+ return MetadataList.endMetadataList(builder);
+ }
+
+ public static void startMetadataList(FlatBufferBuilder builder) { builder.startTable(3); }
+ public static void addVersion(FlatBufferBuilder builder, int version) { builder.addInt(0, version, 0); }
+ public static void addList(FlatBufferBuilder builder, int listOffset) { builder.addOffset(1, listOffset, 0); }
+ public static int createListVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
+ public static void startListVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
+ public static void addSourceSha(FlatBufferBuilder builder, int sourceShaOffset) { builder.addOffset(2, sourceShaOffset, 0); }
+ public static int endMetadataList(FlatBufferBuilder builder) {
+ int o = builder.endTable();
+ return o;
+ }
+ public static void finishMetadataListBuffer(FlatBufferBuilder builder, int offset) { builder.finish(offset); }
+ public static void finishSizePrefixedMetadataListBuffer(FlatBufferBuilder builder, int offset) { builder.finishSizePrefixed(offset); }
+
+ public static final class Vector extends BaseVector {
+ public Vector __assign(int _vector, int _element_size, ByteBuffer _bb) { __reset(_vector, _element_size, _bb); return this; }
+
+ public MetadataList get(int j) { return get(new MetadataList(), j); }
+ public MetadataList get(MetadataList obj, int j) { return obj.__assign(__indirect(__element(j), bb), bb); }
+ }
+}
+
diff --git a/emoji-compat/README.android b/emoji-compat/README.android
index 07cabe1..908ee0c 100644
--- a/emoji-compat/README.android
+++ b/emoji-compat/README.android
@@ -5,16 +5,17 @@ License: Unicode
License File: LICENSE_UNICODE
Description:
-Noto Color Emoji Compat font is generated using Noto Color Emoji font using createfont.py. The
-compat font is under font/ directory.
+Noto Color Emoji Compat font is generated using Noto Color Emoji font using
+<a href="https://github.com/googlefonts/emojicompat">github.com/googlefonts/emojicompat</a>
-While generating the compat font, Noto Color Emoji font and data files from Unicode are used.
+Canonical source of truth for fonts is
-data/emoji-metadata.txt is updated using the Noto Color Emoji font and data files from
-Unicode.
+* <a href="http://github.com/googlefonts/noto-emoji">github.com/googlefonts/noto-emoji</a>
-supported-emojis/emojis.txt file contains list of emojis that are supported by the font. Main
-purpose is testing. It is generated using the Unicode files.
+However, we do not pull down that entire project as it would increase repo size.
-Noto Color Emoji font is under the <android_source>/external/noto-fonts/emoji/ directory. Unicode
-files are under the <android_source>/external/unicode/ directory. \ No newline at end of file
+To pull in a new font please update
+
+* font/NotoColorEmoji.txt
+* data/emoji-metadata.txt
+* supported-emojis.emojis.txt
diff --git a/emoji-compat/build.gradle b/emoji-compat/build.gradle
deleted file mode 100644
index 34acb79..0000000
--- a/emoji-compat/build.gradle
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-apply plugin: 'java'
-apply plugin: 'org.anarres.jarjar'
-apply plugin: 'maven'
-
-ext {
- flatbuffersDir = '../../flatbuffers'
-}
-
-buildscript {
- boolean unbundleBuild = (new File("unbundled-build")).exists()
- repositories {
- maven { url '../../../prebuilts/androidx/external' }
- if (unbundleBuild) {
- jcenter()
- }
- }
-
- dependencies {
- classpath 'org.anarres.jarjar:jarjar-gradle:1.0.1'
- }
-}
-
-sourceSets {
- main {
- java.srcDirs = ['src/java']
- }
-}
-
-compileJava {
- sourceCompatibility = JavaVersion.VERSION_1_7
- targetCompatibility = JavaVersion.VERSION_1_7
-}
-
-dependencies {
- compile 'com.google.flatbuffers:flatbuffers-java:1.8.0'
-}
-
-jarjar.repackage('rename') {
- destinationName "noto-emoji-compat-java.jar"
- from 'com.google.flatbuffers:flatbuffers-java:1.8.0'
- from files(sourceSets.main.output.classesDirs)
- dependsOn sourceSets.main.output
- classRename 'com.google.flatbuffers.**', 'androidx.text.emoji.flatbuffer.@1'
-}
-
-configurations {
- parser
-}
-
-artifacts {
- parser(rename.destinationPath) {
- name 'noto-emoji-compat'
- type 'jar'
- builtBy rename
- }
-}
-
-// The "javadoc" task is unused so we don't want it to appear in the output of `./gradlew tasks`
-// So, we set the group to null
-tasks["javadoc"].group = null
diff --git a/emoji-compat/createfont.py b/emoji-compat/createfont.py
deleted file mode 100755
index 7b42c5e..0000000
--- a/emoji-compat/createfont.py
+++ /dev/null
@@ -1,686 +0,0 @@
-#!/usr/bin/python
-#
-# Copyright (C) 2017 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.
-
-"""
-Creates the EmojiCompat font with the metadata. Metadata is embedded in FlatBuffers binary format
-under a meta tag with name 'Emji'.
-
-In order to create the final font the followings are used as inputs:
-
-- NotoColorEmoji.ttf: Emoji font in the Android framework. Currently at
-external/noto-fonts/emoji/NotoColorEmoji.ttf
-
-- Unicode files: Unicode files that are in the framework, and lists information about all the
-emojis. These files are emoji-data.txt, emoji-sequences.txt, emoji-zwj-sequences.txt,
-and emoji-variation-sequences.txt. Currently at external/unicode/.
-
-- additions/emoji-zwj-sequences.txt: Includes emojis that are not defined in Unicode files, but are
-in the Android font. Resides in framework and currently under external/unicode/.
-
-- data/emoji_metadata.txt: The file that includes the id, codepoints, the first
-Android OS version that the emoji was added (sdkAdded), and finally the first EmojiCompat font
-version that the emoji was added (compatAdded). Updated when the script is executed.
-
-- data/emoji_metadata.fbs: The flatbuffer schema file. See http://google.github.io/flatbuffers/.
-
-After execution the following files are generated if they don't exist otherwise, they are updated:
-- font/NotoColorEmojiCompat.ttf
-- supported-emojis/emojis.txt
-- data/emoji_metadata.txt
-- src/java/android/support/text/emoji/flatbuffer/*
-"""
-
-from __future__ import print_function
-
-import contextlib
-import csv
-import hashlib
-import itertools
-import json
-import os
-import shutil
-import sys
-import tempfile
-from fontTools import ttLib
-
-########### UPDATE OR CHECK WHEN A NEW FONT IS BEING GENERATED ###########
-# Last Android SDK Version
-SDK_VERSION = 29
-# metadata version that will be embedded into font. If there are updates to the font that would
-# cause data/emoji_metadata.txt to change, this integer number should be incremented. This number
-# defines in which EmojiCompat metadata version the emoji is added to the font.
-METADATA_VERSION = 4
-
-####### main directories where output files are created #######
-SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
-FONT_DIR = os.path.join(SCRIPT_DIR, 'font')
-DATA_DIR = os.path.join(SCRIPT_DIR, 'data')
-SUPPORTED_EMOJIS_DIR = os.path.join(SCRIPT_DIR, 'supported-emojis')
-JAVA_SRC_DIR = os.path.join(SCRIPT_DIR, 'src', 'java')
-####### output files #######
-# font file
-FONT_PATH = os.path.join(FONT_DIR, 'NotoColorEmojiCompat.ttf')
-# emoji metadata json output file
-OUTPUT_META_FILE = os.path.join(DATA_DIR, 'emoji_metadata.txt')
-# emojis test file
-TEST_DATA_PATH = os.path.join(SUPPORTED_EMOJIS_DIR, 'emojis.txt')
-####### input files #######
-# Unicode file names to read emoji data
-EMOJI_DATA_FILE = 'emoji-data.txt'
-EMOJI_SEQ_FILE = 'emoji-sequences.txt'
-EMOJI_ZWJ_FILE = 'emoji-zwj-sequences.txt'
-EMOJI_VARIATION_SEQ_FILE = 'emoji-variation-sequences.txt'
-# Android OS emoji file for emojis that are not in Unicode files
-ANDROID_EMOJI_ZWJ_SEQ_FILE = os.path.join('additions', 'emoji-zwj-sequences.txt')
-ANDROID_EMOJIS_SEQ_FILE = os.path.join('additions', 'emoji-sequences.txt')
-# Android OS emoji style override file. Codepoints that are rendered with emoji style by default
-# even though not defined so in <code>emoji-data.txt</code>.
-EMOJI_STYLE_OVERRIDE_FILE = os.path.join('additions', 'emoji-data.txt')
-# emoji metadata file
-INPUT_META_FILE = OUTPUT_META_FILE
-# flatbuffer schema
-FLATBUFFER_SCHEMA = os.path.join(DATA_DIR, 'emoji_metadata.fbs')
-# file path for java header, it will be prepended to flatbuffer java files
-FLATBUFFER_HEADER = os.path.join(DATA_DIR, "flatbuffer_header.txt")
-# temporary emoji metadata json output file
-OUTPUT_JSON_FILE_NAME = 'emoji_metadata.json'
-# temporary binary file generated by flatbuffer
-FLATBUFFER_BIN = 'emoji_metadata.bin'
-# directory representation for flatbuffer java package
-FLATBUFFER_PACKAGE_PATH = os.path.join('androidx', 'text', 'emoji', 'flatbuffer', '')
-# temporary directory that contains flatbuffer java files
-FLATBUFFER_JAVA_PATH = os.path.join(FLATBUFFER_PACKAGE_PATH)
-FLATBUFFER_METADATA_LIST_JAVA = "MetadataList.java"
-FLATBUFFER_METADATA_ITEM_JAVA = "MetadataItem.java"
-# directory under source where flatbuffer java files will be copied into
-FLATBUFFER_JAVA_TARGET = os.path.join(JAVA_SRC_DIR, FLATBUFFER_PACKAGE_PATH)
-# meta tag name used in the font to embed the emoji metadata. This value is also used in
-# MetadataListReader.java in order to locate the metadata location.
-EMOJI_META_TAG_NAME = 'Emji'
-
-EMOJI_STR = 'EMOJI'
-EMOJI_PRESENTATION_STR = 'EMOJI_PRESENTATION'
-ACCEPTED_EMOJI_PROPERTIES = [EMOJI_PRESENTATION_STR, EMOJI_STR]
-STD_VARIANTS_EMOJI_STYLE = 'EMOJI STYLE'
-
-DEFAULT_EMOJI_ID = 0xF0001
-EMOJI_STYLE_VS = 0xFE0F
-
-def to_hex_str(value):
- """Converts given int value to hex without the 0x prefix"""
- return format(value, 'X')
-
-def hex_str_to_int(string):
- """Convert a hex string into int"""
- return int(string, 16)
-
-def codepoint_to_string(codepoints):
- """Converts a list of codepoints into a string separated with space."""
- return ' '.join([to_hex_str(x) for x in codepoints])
-
-def prepend_header_to_file(file_path):
- """Prepends the header to the file. Used to update flatbuffer java files with header, comments
- and annotations."""
- with open(file_path, "r+") as original_file:
- with open(FLATBUFFER_HEADER, "r") as copyright_file:
- original_content = original_file.read()
- start_index = original_content.index("public final class")
- original_file.seek(0)
- original_file.write(copyright_file.read() + "\n" + original_content[start_index:])
-
-
-def update_flatbuffer_java_files(flatbuffer_java_dir):
- """Prepends headers to flatbuffer java files and copies to the final destination"""
- tmp_metadata_list = flatbuffer_java_dir + FLATBUFFER_METADATA_LIST_JAVA
- tmp_metadata_item = flatbuffer_java_dir + FLATBUFFER_METADATA_ITEM_JAVA
- prepend_header_to_file(tmp_metadata_list)
- prepend_header_to_file(tmp_metadata_item)
-
- if not os.path.exists(FLATBUFFER_JAVA_TARGET):
- os.makedirs(FLATBUFFER_JAVA_TARGET)
-
- shutil.copy(tmp_metadata_list, FLATBUFFER_JAVA_TARGET + FLATBUFFER_METADATA_LIST_JAVA)
- shutil.copy(tmp_metadata_item, FLATBUFFER_JAVA_TARGET + FLATBUFFER_METADATA_ITEM_JAVA)
-
-def create_test_data(unicode_path):
- """Read all the emojis in the unicode files and update the test file"""
- lines = read_emoji_lines(os.path.join(unicode_path, EMOJI_ZWJ_FILE))
- lines += read_emoji_lines(os.path.join(unicode_path, EMOJI_SEQ_FILE))
-
- lines += read_emoji_lines(os.path.join(unicode_path, ANDROID_EMOJI_ZWJ_SEQ_FILE), optional=True)
- lines += read_emoji_lines(os.path.join(unicode_path, ANDROID_EMOJIS_SEQ_FILE), optional=True)
-
- # standardized variants contains a huge list of sequences, only read the ones that are emojis
- # and also the ones with FE0F (emoji style)
- standardized_variants_lines = read_emoji_lines(
- os.path.join(unicode_path, EMOJI_VARIATION_SEQ_FILE))
- for line in standardized_variants_lines:
- if STD_VARIANTS_EMOJI_STYLE in line:
- lines.append(line)
-
- emojis_set = set()
- for line in lines:
- # In unicode 12.0, "emoji-sequences.txt" contains "Basic_Emoji" session. We ignore them
- # here since we are already checking the emoji presentations with
- # emoji-variation-sequences.txt.
- if "BASIC_EMOJI" in line:
- continue
- codepoints = [hex_str_to_int(x) for x in line.split(';')[0].strip().split(' ')]
- emojis_set.add(codepoint_to_string(codepoints).upper())
-
- emoji_data_lines = read_emoji_lines(os.path.join(unicode_path, EMOJI_DATA_FILE))
- for line in emoji_data_lines:
- codepoints_range, emoji_property = codepoints_and_emoji_prop(line)
- if not emoji_property in ACCEPTED_EMOJI_PROPERTIES:
- continue
- is_emoji_style = emoji_property == EMOJI_PRESENTATION_STR
- if is_emoji_style:
- codepoints = [to_hex_str(x) for x in
- codepoints_for_emojirange(codepoints_range)]
- emojis_set.update(codepoints)
-
- emoji_style_exceptions = get_emoji_style_exceptions(unicode_path)
- # finally add the android default emoji exceptions
- emojis_set.update([to_hex_str(x) for x in emoji_style_exceptions])
-
- emojis_list = list(emojis_set)
- emojis_list.sort()
- with open(TEST_DATA_PATH, "w") as test_file:
- for line in emojis_list:
- test_file.write("%s\n" % line)
-
-class _EmojiData(object):
- """Holds the information about a single emoji."""
-
- def __init__(self, codepoints, is_emoji_style):
- self.codepoints = codepoints
- self.emoji_style = is_emoji_style
- self.emoji_id = 0
- self.width = 0
- self.height = 0
- self.sdk_added = SDK_VERSION
- self.compat_added = METADATA_VERSION
-
- def update_metrics(self, metrics):
- """Updates width/height instance variables with the values given in metrics dictionary.
- :param metrics: a dictionary object that has width and height values.
- """
- self.width = metrics.width
- self.height = metrics.height
-
- def __repr__(self):
- return '<EmojiData {0} - {1}>'.format(self.emoji_style,
- codepoint_to_string(self.codepoints))
-
- def create_json_element(self):
- """Creates the json representation of EmojiData."""
- json_element = {}
- json_element['id'] = self.emoji_id
- json_element['emojiStyle'] = self.emoji_style
- json_element['sdkAdded'] = self.sdk_added
- json_element['compatAdded'] = self.compat_added
- json_element['width'] = self.width
- json_element['height'] = self.height
- json_element['codepoints'] = self.codepoints
- return json_element
-
- def create_txt_row(self):
- """Creates array of values for CSV of EmojiData."""
- row = [to_hex_str(self.emoji_id), self.sdk_added, self.compat_added]
- row += [to_hex_str(x) for x in self.codepoints]
- return row
-
- def update(self, emoji_id, sdk_added, compat_added):
- """Updates current EmojiData with the values in a json element"""
- self.emoji_id = emoji_id
- self.sdk_added = sdk_added
- self.compat_added = compat_added
-
-
-def read_emoji_lines(file_path, optional=False):
- """Read all lines in an unicode emoji file into a list of uppercase strings. Ignore the empty
- lines and comments
- :param file_path: unicode emoji file path
- :param optional: if True no exception is raised when the file cannot be read
- :return: list of uppercase strings
- """
- result = []
- try:
- with open(file_path) as file_stream:
- for line in file_stream:
- line = line.strip()
- if line and not line.startswith('#'):
- result.append(line.upper())
- except IOError:
- if optional:
- pass
- else:
- raise
-
- return result
-
-def get_emoji_style_exceptions(unicode_path):
- """Read EMOJI_STYLE_OVERRIDE_FILE and return the codepoints as integers"""
- lines = read_emoji_lines(os.path.join(unicode_path, EMOJI_STYLE_OVERRIDE_FILE))
- exceptions = []
- for line in lines:
- codepoint = hex_str_to_int(codepoints_and_emoji_prop(line)[0])
- exceptions.append(codepoint)
- return exceptions
-
-def codepoints_for_emojirange(codepoints_range):
- """ Return codepoints given in emoji files. Expand the codepoints that are given as a range
- such as XYZ ... UVT
- """
- codepoints = []
- if '..' in codepoints_range:
- range_start, range_end = codepoints_range.split('..')
- codepoints_range = range(hex_str_to_int(range_start),
- hex_str_to_int(range_end) + 1)
- codepoints.extend(codepoints_range)
- else:
- codepoints.append(hex_str_to_int(codepoints_range))
- return codepoints
-
-def codepoints_and_emoji_prop(line):
- """For a given emoji file line, return codepoints and emoji property in the line.
- 1F93C..1F93E ; [Emoji|Emoji_Presentation|Emoji_Modifier_Base|Emoji_Component
- |Extended_Pictographic] # [...]"""
- line = line.strip()
- if '#' in line:
- line = line[:line.index('#')]
- else:
- raise ValueError("Line is expected to have # in it")
- line = line.split(';')
- codepoints_range = line[0].strip()
- emoji_property = line[1].strip()
-
- return codepoints_range, emoji_property
-
-def read_emoji_intervals(emoji_data_map, file_path, emoji_style_exceptions):
- """Read unicode lines of unicode emoji file in which each line describes a set of codepoint
- intervals. Expands the interval on a line and inserts related EmojiDatas into emoji_data_map.
- A line format that is expected is as follows:
- 1F93C..1F93E ; [Emoji|Emoji_Presentation|Emoji_Modifier_Base|Emoji_Component
- |Extended_Pictographic] # [...]"""
- lines = read_emoji_lines(file_path)
-
- for line in lines:
- codepoints_range, emoji_property = codepoints_and_emoji_prop(line)
- if not emoji_property in ACCEPTED_EMOJI_PROPERTIES:
- continue
- is_emoji_style = emoji_property == EMOJI_PRESENTATION_STR
- codepoints = codepoints_for_emojirange(codepoints_range)
-
- for codepoint in codepoints:
- key = codepoint_to_string([codepoint])
- codepoint_is_emoji_style = is_emoji_style or codepoint in emoji_style_exceptions
- if key in emoji_data_map:
- # since there are multiple definitions of emojis, only update when emoji style is
- # True
- if codepoint_is_emoji_style:
- emoji_data_map[key].emoji_style = True
- else:
- emoji_data = _EmojiData([codepoint], codepoint_is_emoji_style)
- emoji_data_map[key] = emoji_data
-
-
-def read_emoji_sequences(emoji_data_map, file_path, optional=False):
- """Reads the content of the file which contains emoji sequences. Creates EmojiData for each
- line and puts into emoji_data_map."""
- lines = read_emoji_lines(file_path, optional)
- # 1F1E6 1F1E8 ; Name ; [...]
- for line in lines:
- # In unicode 12.0, "emoji-sequences.txt" contains "Basic_Emoji" session. We ignore them
- # here since we are already checking the emoji presentations with
- # emoji-variation-sequences.txt.
- if "BASIC_EMOJI" in line:
- continue
- codepoints = [hex_str_to_int(x) for x in line.split(';')[0].strip().split(' ')]
- codepoints = [x for x in codepoints if x != EMOJI_STYLE_VS]
- key = codepoint_to_string(codepoints)
- if not key in emoji_data_map:
- emoji_data = _EmojiData(codepoints, False)
- emoji_data_map[key] = emoji_data
-
-
-def load_emoji_data_map(unicode_path):
- """Reads the emoji data files, constructs a map of space separated codepoints to EmojiData.
- :return: map of space separated codepoints to EmojiData
- """
- emoji_data_map = {}
- emoji_style_exceptions = get_emoji_style_exceptions(unicode_path)
- read_emoji_intervals(emoji_data_map, os.path.join(unicode_path, EMOJI_DATA_FILE),
- emoji_style_exceptions)
- read_emoji_sequences(emoji_data_map, os.path.join(unicode_path, EMOJI_ZWJ_FILE))
- read_emoji_sequences(emoji_data_map, os.path.join(unicode_path, EMOJI_SEQ_FILE))
-
- # Add the optional ANDROID_EMOJI_ZWJ_SEQ_FILE if it exists.
- read_emoji_sequences(emoji_data_map, os.path.join(unicode_path, ANDROID_EMOJI_ZWJ_SEQ_FILE),
- optional=True)
- # Add the optional ANDROID_EMOJIS_SEQ_FILE if it exists.
- read_emoji_sequences(emoji_data_map, os.path.join(unicode_path, ANDROID_EMOJIS_SEQ_FILE),
- optional=True)
-
- return emoji_data_map
-
-
-def load_previous_metadata(emoji_data_map):
- """Updates emoji data elements in emoji_data_map using the id, sdk_added and compat_added fields
- in emoji_metadata.txt. Returns the smallest available emoji id to use. i.e. if the largest
- emoji id emoji_metadata.txt is 1, function would return 2. If emoji_metadata.txt does not
- exist, or contains no emojis defined returns DEFAULT_EMOJI_ID"""
- current_emoji_id = DEFAULT_EMOJI_ID
- if os.path.isfile(INPUT_META_FILE):
- with open(INPUT_META_FILE) as csvfile:
- reader = csv.reader(csvfile, delimiter=' ')
- for row in reader:
- if row[0].startswith('#'):
- continue
- emoji_id = hex_str_to_int(row[0])
- sdk_added = int(row[1])
- compat_added = int(row[2])
- key = codepoint_to_string(hex_str_to_int(x) for x in row[3:])
- if key in emoji_data_map:
- emoji_data = emoji_data_map[key]
- emoji_data.update(emoji_id, sdk_added, compat_added)
- if emoji_data.emoji_id >= current_emoji_id:
- current_emoji_id = emoji_data.emoji_id + 1
-
- return current_emoji_id
-
-
-def update_ttlib_orig_sort():
- """Updates the ttLib tag sort with a closure that makes the meta table first."""
- orig_sort = ttLib.sortedTagList
-
- def meta_first_table_sort(tag_list, table_order=None):
- """Sorts the tables with the original ttLib sort, then makes the meta table first."""
- tag_list = orig_sort(tag_list, table_order)
- tag_list.remove('meta')
- tag_list.insert(0, 'meta')
- return tag_list
-
- ttLib.sortedTagList = meta_first_table_sort
-
-
-def inject_meta_into_font(ttf, flatbuffer_bin_filename):
- """inject metadata binary into font"""
- if not 'meta' in ttf:
- ttf['meta'] = ttLib.getTableClass('meta')()
- meta = ttf['meta']
- with open(flatbuffer_bin_filename) as flatbuffer_bin_file:
- meta.data[EMOJI_META_TAG_NAME] = flatbuffer_bin_file.read()
-
- # sort meta tables for faster access
- update_ttlib_orig_sort()
-
-
-def validate_input_files(font_path, unicode_path):
- """Validate the existence of font file and the unicode files"""
- if not os.path.isfile(font_path):
- raise ValueError("Font file does not exist: " + font_path)
-
- if not os.path.isdir(unicode_path):
- raise ValueError(
- "Unicode directory does not exist or is not a directory " + unicode_path)
-
- emoji_filenames = [os.path.join(unicode_path, EMOJI_DATA_FILE),
- os.path.join(unicode_path, EMOJI_ZWJ_FILE),
- os.path.join(unicode_path, EMOJI_SEQ_FILE)]
- for emoji_filename in emoji_filenames:
- if not os.path.isfile(emoji_filename):
- raise ValueError("Unicode emoji data file does not exist: " + emoji_filename)
-
-
-def add_file_to_sha(sha_algo, file_path):
- with open(file_path, 'rb') as input_file:
- for data in iter(lambda: input_file.read(8192), ''):
- sha_algo.update(data)
-
-def create_sha_from_source_files(font_paths):
- """Creates a SHA from the given font files"""
- sha_algo = hashlib.sha256()
- for file_path in font_paths:
- add_file_to_sha(sha_algo, file_path)
- return sha_algo.hexdigest()
-
-
-class EmojiFontCreator(object):
- """Creates the EmojiCompat font"""
-
- def __init__(self, font_path, unicode_path):
- validate_input_files(font_path, unicode_path)
-
- self.font_path = font_path
- self.unicode_path = unicode_path
- self.emoji_data_map = {}
- self.remapped_codepoints = {}
- self.glyph_to_image_metrics_map = {}
- # set default emoji id to start of Supplemental Private Use Area-A
- self.emoji_id = DEFAULT_EMOJI_ID
-
- def update_emoji_data(self, codepoints, glyph_name):
- """Updates the existing EmojiData identified with codepoints. The fields that are set are:
- - emoji_id (if it does not exist)
- - image width/height"""
- key = codepoint_to_string(codepoints)
- if key in self.emoji_data_map:
- # add emoji to final data
- emoji_data = self.emoji_data_map[key]
- emoji_data.update_metrics(self.glyph_to_image_metrics_map[glyph_name])
- if emoji_data.emoji_id == 0:
- emoji_data.emoji_id = self.emoji_id
- self.emoji_id = self.emoji_id + 1
- self.remapped_codepoints[emoji_data.emoji_id] = glyph_name
-
- def read_cbdt(self, ttf):
- """Read image size data from CBDT."""
- cbdt = ttf['CBDT']
- for strike_data in cbdt.strikeData:
- for key, data in strike_data.iteritems():
- data.decompile()
- self.glyph_to_image_metrics_map[key] = data.metrics
-
- def read_cmap12(self, ttf, glyph_to_codepoint_map):
- """Reads single code point emojis that are in cmap12, updates glyph_to_codepoint_map and
- finally clears all elements in CMAP 12"""
- cmap = ttf['cmap']
- for table in cmap.tables:
- if table.format == 12 and table.platformID == 3 and table.platEncID == 10:
- for codepoint, glyph_name in table.cmap.iteritems():
- glyph_to_codepoint_map[glyph_name] = codepoint
- self.update_emoji_data([codepoint], glyph_name)
- return table
- raise ValueError("Font doesn't contain cmap with format:12, platformID:3 and platEncID:10")
-
- def read_gsub(self, ttf, glyph_to_codepoint_map):
- """Reads the emoji sequences defined in GSUB and clear all elements under GSUB"""
- gsub = ttf['GSUB']
- ligature_subtables = []
- context_subtables = []
- # this code is font dependent, implementing all gsub rules is out of scope of EmojiCompat
- # and would be expensive with little value
- for lookup in gsub.table.LookupList.Lookup:
- for subtable in lookup.SubTable:
- if subtable.LookupType == 5:
- context_subtables.append(subtable)
- elif subtable.LookupType == 4:
- ligature_subtables.append(subtable)
-
- for subtable in context_subtables:
- self.add_gsub_context_subtable(subtable, gsub.table.LookupList, glyph_to_codepoint_map)
-
- for subtable in ligature_subtables:
- self.add_gsub_ligature_subtable(subtable, glyph_to_codepoint_map)
-
- def add_gsub_context_subtable(self, subtable, lookup_list, glyph_to_codepoint_map):
- """Add substitutions defined as OpenType Context Substitution"""
- for sub_class_set in subtable.SubClassSet:
- if sub_class_set:
- for sub_class_rule in sub_class_set.SubClassRule:
- # prepare holder for substitution list. each rule will have a list that is added
- # to the subs_list.
- subs_list = len(sub_class_rule.SubstLookupRecord) * [None]
- for record in sub_class_rule.SubstLookupRecord:
- subs_list[record.SequenceIndex] = self.get_substitutions(lookup_list,
- record.LookupListIndex)
- # create combinations or all lists. the combinations will be filtered by
- # emoji_data_map. the first element that contain as a valid glyph will be used
- # as the final glyph
- combinations = list(itertools.product(*subs_list))
- for seq in combinations:
- glyph_names = [x["input"] for x in seq]
- codepoints = [glyph_to_codepoint_map[x] for x in glyph_names]
- outputs = [x["output"] for x in seq if x["output"]]
- nonempty_outputs = filter(lambda x: x.strip() , outputs)
- if len(nonempty_outputs) == 0:
- print("Warning: no output glyph is set for " + str(glyph_names))
- continue
- elif len(nonempty_outputs) > 1:
- print(
- "Warning: multiple glyph is set for "
- + str(glyph_names) + ", will use the first one")
-
- glyph = nonempty_outputs[0]
- self.update_emoji_data(codepoints, glyph)
-
- def get_substitutions(self, lookup_list, index):
- result = []
- for x in lookup_list.Lookup[index].SubTable:
- for input, output in x.mapping.iteritems():
- result.append({"input": input, "output": output})
- return result
-
- def add_gsub_ligature_subtable(self, subtable, glyph_to_codepoint_map):
- for name, ligatures in subtable.ligatures.iteritems():
- for ligature in ligatures:
- glyph_names = [name] + ligature.Component
- codepoints = [glyph_to_codepoint_map[x] for x in glyph_names]
- self.update_emoji_data(codepoints, ligature.LigGlyph)
-
- def write_metadata_json(self, output_json_file_path):
- """Writes the emojis into a json file"""
- output_json = {}
- output_json['version'] = METADATA_VERSION
- output_json['sourceSha'] = create_sha_from_source_files(
- [self.font_path, OUTPUT_META_FILE, FLATBUFFER_SCHEMA])
- output_json['list'] = []
-
- emoji_data_list = sorted(self.emoji_data_map.values(), key=lambda x: x.emoji_id)
-
- total_emoji_count = 0
- for emoji_data in emoji_data_list:
- element = emoji_data.create_json_element()
- output_json['list'].append(element)
- total_emoji_count = total_emoji_count + 1
-
- # write the new json file to be processed by FlatBuffers
- with open(output_json_file_path, 'w') as json_file:
- print(json.dumps(output_json, indent=4, sort_keys=True, separators=(',', ':')),
- file=json_file)
-
- return total_emoji_count
-
- def write_metadata_csv(self):
- """Writes emoji metadata into space separated file"""
- with open(OUTPUT_META_FILE, 'w') as csvfile:
- csvwriter = csv.writer(csvfile, delimiter=' ')
- emoji_data_list = sorted(self.emoji_data_map.values(), key=lambda x: x.emoji_id)
- csvwriter.writerow(['#id', 'sdkAdded', 'compatAdded', 'codepoints'])
- for emoji_data in emoji_data_list:
- csvwriter.writerow(emoji_data.create_txt_row())
-
- def create_font(self):
- """Creates the EmojiCompat font.
- :param font_path: path to Android NotoColorEmoji font
- :param unicode_path: path to directory that contains unicode files
- """
-
- tmp_dir = tempfile.mkdtemp()
-
- # create emoji codepoints to EmojiData map
- self.emoji_data_map = load_emoji_data_map(self.unicode_path)
-
- # read previous metadata file to update id, sdkAdded and compatAdded. emoji id that is
- # returned is either default or 1 greater than the largest id in previous data
- self.emoji_id = load_previous_metadata(self.emoji_data_map)
-
- # recalcTimestamp parameter will keep the modified field same as the original font. Changing
- # the modified field in the font causes the font ttf file to change, which makes it harder
- # to understand if something really changed in the font.
- with contextlib.closing(ttLib.TTFont(self.font_path, recalcTimestamp=False)) as ttf:
- # read image size data
- self.read_cbdt(ttf)
-
- # glyph name to codepoint map
- glyph_to_codepoint_map = {}
-
- # read single codepoint emojis under cmap12 and clear the table contents
- cmap12_table = self.read_cmap12(ttf, glyph_to_codepoint_map)
-
- # read emoji sequences gsub and clear the table contents
- self.read_gsub(ttf, glyph_to_codepoint_map)
-
- # add all new codepoint to glyph mappings
- cmap12_table.cmap.update(self.remapped_codepoints)
-
- # final metadata csv will be used to generate the sha, therefore write it before
- # metadata json is written.
- self.write_metadata_csv()
-
- output_json_file = os.path.join(tmp_dir, OUTPUT_JSON_FILE_NAME)
- flatbuffer_bin_file = os.path.join(tmp_dir, FLATBUFFER_BIN)
- flatbuffer_java_dir = os.path.join(tmp_dir, FLATBUFFER_JAVA_PATH)
-
- total_emoji_count = self.write_metadata_json(output_json_file)
-
- # create the flatbuffers binary and java classes
- sys_command = 'flatc -o {0} -b -j {1} {2}'
- os.system(sys_command.format(tmp_dir, FLATBUFFER_SCHEMA, output_json_file))
-
- # inject metadata binary into font
- inject_meta_into_font(ttf, flatbuffer_bin_file)
-
- # update CBDT and CBLC versions since older android versions cannot read > 2.0
- ttf['CBDT'].version = 2.0
- ttf['CBLC'].version = 2.0
-
- # save the new font
- ttf.save(FONT_PATH)
-
- update_flatbuffer_java_files(flatbuffer_java_dir)
-
- create_test_data(self.unicode_path)
-
- # clear the tmp output directory
- shutil.rmtree(tmp_dir, ignore_errors=True)
-
- print(
- "{0} emojis are written to\n{1}".format(total_emoji_count, FONT_DIR))
-
-
-def print_usage():
- """Prints how to use the script."""
- print("Please specify a path to font and unicode files.\n"
- "usage: createfont.py noto-color-emoji-path unicode-dir-path")
-
-
-if __name__ == '__main__':
- if len(sys.argv) < 3:
- print_usage()
- sys.exit(1)
- EmojiFontCreator(sys.argv[1], sys.argv[2]).create_font()
diff --git a/emoji-compat/data/emoji_metadata.txt b/emoji-compat/data/emoji_metadata.txt
index 13b109d..0f4043d 100644
--- a/emoji-compat/data/emoji_metadata.txt
+++ b/emoji-compat/data/emoji_metadata.txt
@@ -3076,3 +3076,761 @@ F0C36 29 4 1F9CE 1F3FC
F0C37 29 4 1F9CE 1F3FD
F0C38 29 4 1F9CE 1F3FE
F0C39 29 4 1F9CE 1F3FF
+F0C3A 29 5 1F469 1F3FB 200D 1F91D 200D 1F469 1F3FC
+F0C3B 29 5 1F469 1F3FB 200D 1F91D 200D 1F469 1F3FD
+F0C3C 29 5 1F469 1F3FB 200D 1F91D 200D 1F469 1F3FE
+F0C3D 29 5 1F469 1F3FB 200D 1F91D 200D 1F469 1F3FF
+F0C3E 29 5 1F469 1F3FC 200D 1F91D 200D 1F469 1F3FD
+F0C3F 29 5 1F469 1F3FC 200D 1F91D 200D 1F469 1F3FE
+F0C40 29 5 1F469 1F3FC 200D 1F91D 200D 1F469 1F3FF
+F0C41 29 5 1F469 1F3FD 200D 1F91D 200D 1F469 1F3FE
+F0C42 29 5 1F469 1F3FD 200D 1F91D 200D 1F469 1F3FF
+F0C43 29 5 1F469 1F3FE 200D 1F91D 200D 1F469 1F3FF
+F0C44 29 5 1F468 1F3FB 200D 1F91D 200D 1F468 1F3FC
+F0C45 29 5 1F468 1F3FB 200D 1F91D 200D 1F468 1F3FD
+F0C46 29 5 1F468 1F3FB 200D 1F91D 200D 1F468 1F3FE
+F0C47 29 5 1F468 1F3FB 200D 1F91D 200D 1F468 1F3FF
+F0C48 29 5 1F468 1F3FC 200D 1F91D 200D 1F468 1F3FD
+F0C49 29 5 1F468 1F3FC 200D 1F91D 200D 1F468 1F3FE
+F0C4A 29 5 1F468 1F3FC 200D 1F91D 200D 1F468 1F3FF
+F0C4B 29 5 1F468 1F3FD 200D 1F91D 200D 1F468 1F3FE
+F0C4C 29 5 1F468 1F3FD 200D 1F91D 200D 1F468 1F3FF
+F0C4D 29 5 1F468 1F3FE 200D 1F91D 200D 1F468 1F3FF
+F0C4E 29 5 1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FC
+F0C4F 29 5 1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FD
+F0C50 29 5 1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FE
+F0C51 29 5 1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FF
+F0C52 29 5 1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FD
+F0C53 29 5 1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FE
+F0C54 29 5 1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FF
+F0C55 29 5 1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FE
+F0C56 29 5 1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FF
+F0C57 29 5 1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FF
+F0C58 29 5 1F9D1 1F3FB 200D 2695
+F0C59 29 5 1F9D1 1F3FB 200D 2696
+F0C5A 29 5 1F9D1 1F3FB 200D 2708
+F0C5B 29 5 1F9D1 1F3FB 200D 1F33E
+F0C5C 29 5 1F9D1 1F3FB 200D 1F373
+F0C5D 29 5 1F9D1 1F3FB 200D 1F393
+F0C5E 29 5 1F9D1 1F3FB 200D 1F3A4
+F0C5F 29 5 1F9D1 1F3FB 200D 1F3A8
+F0C60 29 5 1F9D1 1F3FB 200D 1F3EB
+F0C61 29 5 1F9D1 1F3FB 200D 1F3ED
+F0C62 29 5 1F9D1 1F3FB 200D 1F4BB
+F0C63 29 5 1F9D1 1F3FB 200D 1F4BC
+F0C64 29 5 1F9D1 1F3FB 200D 1F527
+F0C65 29 5 1F9D1 1F3FB 200D 1F52C
+F0C66 29 5 1F9D1 1F3FB 200D 1F680
+F0C67 29 5 1F9D1 1F3FB 200D 1F692
+F0C68 29 5 1F9D1 1F3FB 200D 1F9AF
+F0C69 29 5 1F9D1 1F3FB 200D 1F9B0
+F0C6A 29 5 1F9D1 1F3FB 200D 1F9B1
+F0C6B 29 5 1F9D1 1F3FB 200D 1F9B2
+F0C6C 29 5 1F9D1 1F3FB 200D 1F9B3
+F0C6D 29 5 1F9D1 1F3FB 200D 1F9BC
+F0C6E 29 5 1F9D1 1F3FB 200D 1F9BD
+F0C6F 29 5 1F9D1 1F3FC 200D 2695
+F0C70 29 5 1F9D1 1F3FC 200D 2696
+F0C71 29 5 1F9D1 1F3FC 200D 2708
+F0C72 29 5 1F9D1 1F3FC 200D 1F33E
+F0C73 29 5 1F9D1 1F3FC 200D 1F373
+F0C74 29 5 1F9D1 1F3FC 200D 1F393
+F0C75 29 5 1F9D1 1F3FC 200D 1F3A4
+F0C76 29 5 1F9D1 1F3FC 200D 1F3A8
+F0C77 29 5 1F9D1 1F3FC 200D 1F3EB
+F0C78 29 5 1F9D1 1F3FC 200D 1F3ED
+F0C79 29 5 1F9D1 1F3FC 200D 1F4BB
+F0C7A 29 5 1F9D1 1F3FC 200D 1F4BC
+F0C7B 29 5 1F9D1 1F3FC 200D 1F527
+F0C7C 29 5 1F9D1 1F3FC 200D 1F52C
+F0C7D 29 5 1F9D1 1F3FC 200D 1F680
+F0C7E 29 5 1F9D1 1F3FC 200D 1F692
+F0C7F 29 5 1F9D1 1F3FC 200D 1F9AF
+F0C80 29 5 1F9D1 1F3FC 200D 1F9B0
+F0C81 29 5 1F9D1 1F3FC 200D 1F9B1
+F0C82 29 5 1F9D1 1F3FC 200D 1F9B2
+F0C83 29 5 1F9D1 1F3FC 200D 1F9B3
+F0C84 29 5 1F9D1 1F3FC 200D 1F9BC
+F0C85 29 5 1F9D1 1F3FC 200D 1F9BD
+F0C86 29 5 1F9D1 1F3FD 200D 2695
+F0C87 29 5 1F9D1 1F3FD 200D 2696
+F0C88 29 5 1F9D1 1F3FD 200D 2708
+F0C89 29 5 1F9D1 1F3FD 200D 1F33E
+F0C8A 29 5 1F9D1 1F3FD 200D 1F373
+F0C8B 29 5 1F9D1 1F3FD 200D 1F393
+F0C8C 29 5 1F9D1 1F3FD 200D 1F3A4
+F0C8D 29 5 1F9D1 1F3FD 200D 1F3A8
+F0C8E 29 5 1F9D1 1F3FD 200D 1F3EB
+F0C8F 29 5 1F9D1 1F3FD 200D 1F3ED
+F0C90 29 5 1F9D1 1F3FD 200D 1F4BB
+F0C91 29 5 1F9D1 1F3FD 200D 1F4BC
+F0C92 29 5 1F9D1 1F3FD 200D 1F527
+F0C93 29 5 1F9D1 1F3FD 200D 1F52C
+F0C94 29 5 1F9D1 1F3FD 200D 1F680
+F0C95 29 5 1F9D1 1F3FD 200D 1F692
+F0C96 29 5 1F9D1 1F3FD 200D 1F9AF
+F0C97 29 5 1F9D1 1F3FD 200D 1F9B0
+F0C98 29 5 1F9D1 1F3FD 200D 1F9B1
+F0C99 29 5 1F9D1 1F3FD 200D 1F9B2
+F0C9A 29 5 1F9D1 1F3FD 200D 1F9B3
+F0C9B 29 5 1F9D1 1F3FD 200D 1F9BC
+F0C9C 29 5 1F9D1 1F3FD 200D 1F9BD
+F0C9D 29 5 1F9D1 1F3FE 200D 2695
+F0C9E 29 5 1F9D1 1F3FE 200D 2696
+F0C9F 29 5 1F9D1 1F3FE 200D 2708
+F0CA0 29 5 1F9D1 1F3FE 200D 1F33E
+F0CA1 29 5 1F9D1 1F3FE 200D 1F373
+F0CA2 29 5 1F9D1 1F3FE 200D 1F393
+F0CA3 29 5 1F9D1 1F3FE 200D 1F3A4
+F0CA4 29 5 1F9D1 1F3FE 200D 1F3A8
+F0CA5 29 5 1F9D1 1F3FE 200D 1F3EB
+F0CA6 29 5 1F9D1 1F3FE 200D 1F3ED
+F0CA7 29 5 1F9D1 1F3FE 200D 1F4BB
+F0CA8 29 5 1F9D1 1F3FE 200D 1F4BC
+F0CA9 29 5 1F9D1 1F3FE 200D 1F527
+F0CAA 29 5 1F9D1 1F3FE 200D 1F52C
+F0CAB 29 5 1F9D1 1F3FE 200D 1F680
+F0CAC 29 5 1F9D1 1F3FE 200D 1F692
+F0CAD 29 5 1F9D1 1F3FE 200D 1F9AF
+F0CAE 29 5 1F9D1 1F3FE 200D 1F9B0
+F0CAF 29 5 1F9D1 1F3FE 200D 1F9B1
+F0CB0 29 5 1F9D1 1F3FE 200D 1F9B2
+F0CB1 29 5 1F9D1 1F3FE 200D 1F9B3
+F0CB2 29 5 1F9D1 1F3FE 200D 1F9BC
+F0CB3 29 5 1F9D1 1F3FE 200D 1F9BD
+F0CB4 29 5 1F9D1 1F3FF 200D 2695
+F0CB5 29 5 1F9D1 1F3FF 200D 2696
+F0CB6 29 5 1F9D1 1F3FF 200D 2708
+F0CB7 29 5 1F9D1 1F3FF 200D 1F33E
+F0CB8 29 5 1F9D1 1F3FF 200D 1F373
+F0CB9 29 5 1F9D1 1F3FF 200D 1F393
+F0CBA 29 5 1F9D1 1F3FF 200D 1F3A4
+F0CBB 29 5 1F9D1 1F3FF 200D 1F3A8
+F0CBC 29 5 1F9D1 1F3FF 200D 1F3EB
+F0CBD 29 5 1F9D1 1F3FF 200D 1F3ED
+F0CBE 29 5 1F9D1 1F3FF 200D 1F4BB
+F0CBF 29 5 1F9D1 1F3FF 200D 1F4BC
+F0CC0 29 5 1F9D1 1F3FF 200D 1F527
+F0CC1 29 5 1F9D1 1F3FF 200D 1F52C
+F0CC2 29 5 1F9D1 1F3FF 200D 1F680
+F0CC3 29 5 1F9D1 1F3FF 200D 1F692
+F0CC4 29 5 1F9D1 1F3FF 200D 1F9AF
+F0CC5 29 5 1F9D1 1F3FF 200D 1F9B0
+F0CC6 29 5 1F9D1 1F3FF 200D 1F9B1
+F0CC7 29 5 1F9D1 1F3FF 200D 1F9B2
+F0CC8 29 5 1F9D1 1F3FF 200D 1F9B3
+F0CC9 29 5 1F9D1 1F3FF 200D 1F9BC
+F0CCA 29 5 1F9D1 1F3FF 200D 1F9BD
+F0CCB 29 5 1F9D1 200D 2695
+F0CCC 29 5 1F9D1 200D 2696
+F0CCD 29 5 1F9D1 200D 2708
+F0CCE 29 5 1F9D1 200D 1F33E
+F0CCF 29 5 1F9D1 200D 1F373
+F0CD0 29 5 1F9D1 200D 1F393
+F0CD1 29 5 1F9D1 200D 1F3A4
+F0CD2 29 5 1F9D1 200D 1F3A8
+F0CD3 29 5 1F9D1 200D 1F3EB
+F0CD4 29 5 1F9D1 200D 1F3ED
+F0CD5 29 5 1F9D1 200D 1F4BB
+F0CD6 29 5 1F9D1 200D 1F4BC
+F0CD7 29 5 1F9D1 200D 1F527
+F0CD8 29 5 1F9D1 200D 1F52C
+F0CD9 29 5 1F9D1 200D 1F680
+F0CDA 29 5 1F9D1 200D 1F692
+F0CDB 29 5 1F9D1 200D 1F9AF
+F0CDC 29 5 1F9D1 200D 1F9B0
+F0CDD 29 5 1F9D1 200D 1F9B1
+F0CDE 29 5 1F9D1 200D 1F9B2
+F0CDF 29 5 1F9D1 200D 1F9B3
+F0CE0 29 5 1F9D1 200D 1F9BC
+F0CE1 29 5 1F9D1 200D 1F9BD
+F0CE2 30 6 26A7
+F0CE3 30 6 1F6D6
+F0CE4 30 6 1F6D7
+F0CE5 30 6 1F6FB
+F0CE6 30 6 1F6FC
+F0CE7 30 6 1F90C
+F0CE8 30 6 1F972
+F0CE9 30 6 1F977
+F0CEA 30 6 1F978
+F0CEB 30 6 1F9A3
+F0CEC 30 6 1F9A4
+F0CED 30 6 1F9AB
+F0CEE 30 6 1F9AC
+F0CEF 30 6 1F9AD
+F0CF0 30 6 1F9CB
+F0CF1 30 6 1FA74
+F0CF2 30 6 1FA83
+F0CF3 30 6 1FA84
+F0CF4 30 6 1FA85
+F0CF5 30 6 1FA86
+F0CF6 30 6 1FA96
+F0CF7 30 6 1FA97
+F0CF8 30 6 1FA98
+F0CF9 30 6 1FA99
+F0CFA 30 6 1FA9A
+F0CFB 30 6 1FA9B
+F0CFC 30 6 1FA9C
+F0CFD 30 6 1FA9D
+F0CFE 30 6 1FA9E
+F0CFF 30 6 1FA9F
+F0D00 30 6 1FAA0
+F0D01 30 6 1FAA1
+F0D02 30 6 1FAA2
+F0D03 30 6 1FAA3
+F0D04 30 6 1FAA4
+F0D05 30 6 1FAA5
+F0D06 30 6 1FAA6
+F0D07 30 6 1FAA7
+F0D08 30 6 1FAA8
+F0D09 30 6 1FAB0
+F0D0A 30 6 1FAB1
+F0D0B 30 6 1FAB2
+F0D0C 30 6 1FAB3
+F0D0D 30 6 1FAB4
+F0D0E 30 6 1FAB5
+F0D0F 30 6 1FAB6
+F0D10 30 6 1FAC0
+F0D11 30 6 1FAC1
+F0D12 30 6 1FAC2
+F0D13 30 6 1FAD0
+F0D14 30 6 1FAD1
+F0D15 30 6 1FAD2
+F0D16 30 6 1FAD3
+F0D17 30 6 1FAD4
+F0D18 30 6 1FAD5
+F0D19 30 6 1FAD6
+F0D1A 30 6 1F3F3 200D 26A7
+F0D1B 30 6 1F408 200D 2B1B
+F0D1C 30 6 1F43B 200D 2744
+F0D1D 30 6 1F468 1F3FB 200D 1F37C
+F0D1E 30 6 1F468 1F3FC 200D 1F37C
+F0D1F 30 6 1F468 1F3FD 200D 1F37C
+F0D20 30 6 1F468 1F3FE 200D 1F37C
+F0D21 30 6 1F468 1F3FF 200D 1F37C
+F0D22 30 6 1F468 200D 1F37C
+F0D23 30 6 1F469 1F3FB 200D 1F37C
+F0D24 30 6 1F469 1F3FC 200D 1F37C
+F0D25 30 6 1F469 1F3FD 200D 1F37C
+F0D26 30 6 1F469 1F3FE 200D 1F37C
+F0D27 30 6 1F469 1F3FF 200D 1F37C
+F0D28 30 6 1F469 200D 1F37C
+F0D29 30 6 1F470 1F3FB 200D 2640
+F0D2A 30 6 1F470 1F3FB 200D 2642
+F0D2B 30 6 1F470 1F3FC 200D 2640
+F0D2C 30 6 1F470 1F3FC 200D 2642
+F0D2D 30 6 1F470 1F3FD 200D 2640
+F0D2E 30 6 1F470 1F3FD 200D 2642
+F0D2F 30 6 1F470 1F3FE 200D 2640
+F0D30 30 6 1F470 1F3FE 200D 2642
+F0D31 30 6 1F470 1F3FF 200D 2640
+F0D32 30 6 1F470 1F3FF 200D 2642
+F0D33 30 6 1F470 200D 2640
+F0D34 30 6 1F470 200D 2642
+F0D35 30 6 1F90C 1F3FB
+F0D36 30 6 1F90C 1F3FC
+F0D37 30 6 1F90C 1F3FD
+F0D38 30 6 1F90C 1F3FE
+F0D39 30 6 1F90C 1F3FF
+F0D3A 30 6 1F935 1F3FB 200D 2640
+F0D3B 30 6 1F935 1F3FB 200D 2642
+F0D3C 30 6 1F935 1F3FC 200D 2640
+F0D3D 30 6 1F935 1F3FC 200D 2642
+F0D3E 30 6 1F935 1F3FD 200D 2640
+F0D3F 30 6 1F935 1F3FD 200D 2642
+F0D40 30 6 1F935 1F3FE 200D 2640
+F0D41 30 6 1F935 1F3FE 200D 2642
+F0D42 30 6 1F935 1F3FF 200D 2640
+F0D43 30 6 1F935 1F3FF 200D 2642
+F0D44 30 6 1F935 200D 2640
+F0D45 30 6 1F935 200D 2642
+F0D46 30 6 1F977 1F3FB
+F0D47 30 6 1F977 1F3FC
+F0D48 30 6 1F977 1F3FD
+F0D49 30 6 1F977 1F3FE
+F0D4A 30 6 1F977 1F3FF
+F0D4B 30 6 1F9D1 1F3FB 200D 1F37C
+F0D4C 30 6 1F9D1 1F3FB 200D 1F384
+F0D4D 30 6 1F9D1 1F3FC 200D 1F37C
+F0D4E 30 6 1F9D1 1F3FC 200D 1F384
+F0D4F 30 6 1F9D1 1F3FD 200D 1F37C
+F0D50 30 6 1F9D1 1F3FD 200D 1F384
+F0D51 30 6 1F9D1 1F3FE 200D 1F37C
+F0D52 30 6 1F9D1 1F3FE 200D 1F384
+F0D53 30 6 1F9D1 1F3FF 200D 1F37C
+F0D54 30 6 1F9D1 1F3FF 200D 1F384
+F0D55 30 6 1F9D1 200D 1F37C
+F0D56 30 6 1F9D1 200D 1F384
+F0D57 30 7 2764 200D 1F525
+F0D58 30 7 2764 200D 1FA79
+F0D59 30 7 1F468 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D5A 30 7 1F468 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D5B 30 7 1F468 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D5C 30 7 1F468 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D5D 30 7 1F468 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D5E 30 7 1F468 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D5F 30 7 1F468 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D60 30 7 1F468 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D61 30 7 1F468 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D62 30 7 1F468 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D63 30 7 1F468 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D64 30 7 1F468 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D65 30 7 1F468 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D66 30 7 1F468 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D67 30 7 1F468 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D68 30 7 1F468 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D69 30 7 1F468 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D6A 30 7 1F468 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D6B 30 7 1F468 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D6C 30 7 1F468 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D6D 30 7 1F468 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D6E 30 7 1F468 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D6F 30 7 1F468 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D70 30 7 1F468 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D71 30 7 1F468 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D72 30 7 1F468 1F3FB 200D 2764 200D 1F468 1F3FB
+F0D73 30 7 1F468 1F3FB 200D 2764 200D 1F468 1F3FC
+F0D74 30 7 1F468 1F3FB 200D 2764 200D 1F468 1F3FD
+F0D75 30 7 1F468 1F3FB 200D 2764 200D 1F468 1F3FE
+F0D76 30 7 1F468 1F3FB 200D 2764 200D 1F468 1F3FF
+F0D77 30 7 1F468 1F3FC 200D 2764 200D 1F468 1F3FB
+F0D78 30 7 1F468 1F3FC 200D 2764 200D 1F468 1F3FC
+F0D79 30 7 1F468 1F3FC 200D 2764 200D 1F468 1F3FD
+F0D7A 30 7 1F468 1F3FC 200D 2764 200D 1F468 1F3FE
+F0D7B 30 7 1F468 1F3FC 200D 2764 200D 1F468 1F3FF
+F0D7C 30 7 1F468 1F3FD 200D 2764 200D 1F468 1F3FB
+F0D7D 30 7 1F468 1F3FD 200D 2764 200D 1F468 1F3FC
+F0D7E 30 7 1F468 1F3FD 200D 2764 200D 1F468 1F3FD
+F0D7F 30 7 1F468 1F3FD 200D 2764 200D 1F468 1F3FE
+F0D80 30 7 1F468 1F3FD 200D 2764 200D 1F468 1F3FF
+F0D81 30 7 1F468 1F3FE 200D 2764 200D 1F468 1F3FB
+F0D82 30 7 1F468 1F3FE 200D 2764 200D 1F468 1F3FC
+F0D83 30 7 1F468 1F3FE 200D 2764 200D 1F468 1F3FD
+F0D84 30 7 1F468 1F3FE 200D 2764 200D 1F468 1F3FE
+F0D85 30 7 1F468 1F3FE 200D 2764 200D 1F468 1F3FF
+F0D86 30 7 1F468 1F3FF 200D 2764 200D 1F468 1F3FB
+F0D87 30 7 1F468 1F3FF 200D 2764 200D 1F468 1F3FC
+F0D88 30 7 1F468 1F3FF 200D 2764 200D 1F468 1F3FD
+F0D89 30 7 1F468 1F3FF 200D 2764 200D 1F468 1F3FE
+F0D8A 30 7 1F468 1F3FF 200D 2764 200D 1F468 1F3FF
+F0D8B 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D8C 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D8D 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D8E 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D8F 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D90 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F469 1F3FB
+F0D91 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F469 1F3FC
+F0D92 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F469 1F3FD
+F0D93 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F469 1F3FE
+F0D94 30 7 1F469 1F3FB 200D 2764 200D 1F48B 200D 1F469 1F3FF
+F0D95 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0D96 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0D97 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0D98 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0D99 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0D9A 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F469 1F3FB
+F0D9B 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F469 1F3FC
+F0D9C 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F469 1F3FD
+F0D9D 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F469 1F3FE
+F0D9E 30 7 1F469 1F3FC 200D 2764 200D 1F48B 200D 1F469 1F3FF
+F0D9F 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0DA0 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0DA1 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0DA2 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0DA3 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0DA4 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F469 1F3FB
+F0DA5 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F469 1F3FC
+F0DA6 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F469 1F3FD
+F0DA7 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F469 1F3FE
+F0DA8 30 7 1F469 1F3FD 200D 2764 200D 1F48B 200D 1F469 1F3FF
+F0DA9 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0DAA 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0DAB 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0DAC 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0DAD 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0DAE 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F469 1F3FB
+F0DAF 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F469 1F3FC
+F0DB0 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F469 1F3FD
+F0DB1 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F469 1F3FE
+F0DB2 30 7 1F469 1F3FE 200D 2764 200D 1F48B 200D 1F469 1F3FF
+F0DB3 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FB
+F0DB4 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FC
+F0DB5 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FD
+F0DB6 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FE
+F0DB7 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F468 1F3FF
+F0DB8 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F469 1F3FB
+F0DB9 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F469 1F3FC
+F0DBA 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F469 1F3FD
+F0DBB 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F469 1F3FE
+F0DBC 30 7 1F469 1F3FF 200D 2764 200D 1F48B 200D 1F469 1F3FF
+F0DBD 30 7 1F469 1F3FB 200D 2764 200D 1F468 1F3FB
+F0DBE 30 7 1F469 1F3FB 200D 2764 200D 1F468 1F3FC
+F0DBF 30 7 1F469 1F3FB 200D 2764 200D 1F468 1F3FD
+F0DC0 30 7 1F469 1F3FB 200D 2764 200D 1F468 1F3FE
+F0DC1 30 7 1F469 1F3FB 200D 2764 200D 1F468 1F3FF
+F0DC2 30 7 1F469 1F3FB 200D 2764 200D 1F469 1F3FB
+F0DC3 30 7 1F469 1F3FB 200D 2764 200D 1F469 1F3FC
+F0DC4 30 7 1F469 1F3FB 200D 2764 200D 1F469 1F3FD
+F0DC5 30 7 1F469 1F3FB 200D 2764 200D 1F469 1F3FE
+F0DC6 30 7 1F469 1F3FB 200D 2764 200D 1F469 1F3FF
+F0DC7 30 7 1F469 1F3FC 200D 2764 200D 1F468 1F3FB
+F0DC8 30 7 1F469 1F3FC 200D 2764 200D 1F468 1F3FC
+F0DC9 30 7 1F469 1F3FC 200D 2764 200D 1F468 1F3FD
+F0DCA 30 7 1F469 1F3FC 200D 2764 200D 1F468 1F3FE
+F0DCB 30 7 1F469 1F3FC 200D 2764 200D 1F468 1F3FF
+F0DCC 30 7 1F469 1F3FC 200D 2764 200D 1F469 1F3FB
+F0DCD 30 7 1F469 1F3FC 200D 2764 200D 1F469 1F3FC
+F0DCE 30 7 1F469 1F3FC 200D 2764 200D 1F469 1F3FD
+F0DCF 30 7 1F469 1F3FC 200D 2764 200D 1F469 1F3FE
+F0DD0 30 7 1F469 1F3FC 200D 2764 200D 1F469 1F3FF
+F0DD1 30 7 1F469 1F3FD 200D 2764 200D 1F468 1F3FB
+F0DD2 30 7 1F469 1F3FD 200D 2764 200D 1F468 1F3FC
+F0DD3 30 7 1F469 1F3FD 200D 2764 200D 1F468 1F3FD
+F0DD4 30 7 1F469 1F3FD 200D 2764 200D 1F468 1F3FE
+F0DD5 30 7 1F469 1F3FD 200D 2764 200D 1F468 1F3FF
+F0DD6 30 7 1F469 1F3FD 200D 2764 200D 1F469 1F3FB
+F0DD7 30 7 1F469 1F3FD 200D 2764 200D 1F469 1F3FC
+F0DD8 30 7 1F469 1F3FD 200D 2764 200D 1F469 1F3FD
+F0DD9 30 7 1F469 1F3FD 200D 2764 200D 1F469 1F3FE
+F0DDA 30 7 1F469 1F3FD 200D 2764 200D 1F469 1F3FF
+F0DDB 30 7 1F469 1F3FE 200D 2764 200D 1F468 1F3FB
+F0DDC 30 7 1F469 1F3FE 200D 2764 200D 1F468 1F3FC
+F0DDD 30 7 1F469 1F3FE 200D 2764 200D 1F468 1F3FD
+F0DDE 30 7 1F469 1F3FE 200D 2764 200D 1F468 1F3FE
+F0DDF 30 7 1F469 1F3FE 200D 2764 200D 1F468 1F3FF
+F0DE0 30 7 1F469 1F3FE 200D 2764 200D 1F469 1F3FB
+F0DE1 30 7 1F469 1F3FE 200D 2764 200D 1F469 1F3FC
+F0DE2 30 7 1F469 1F3FE 200D 2764 200D 1F469 1F3FD
+F0DE3 30 7 1F469 1F3FE 200D 2764 200D 1F469 1F3FE
+F0DE4 30 7 1F469 1F3FE 200D 2764 200D 1F469 1F3FF
+F0DE5 30 7 1F469 1F3FF 200D 2764 200D 1F468 1F3FB
+F0DE6 30 7 1F469 1F3FF 200D 2764 200D 1F468 1F3FC
+F0DE7 30 7 1F469 1F3FF 200D 2764 200D 1F468 1F3FD
+F0DE8 30 7 1F469 1F3FF 200D 2764 200D 1F468 1F3FE
+F0DE9 30 7 1F469 1F3FF 200D 2764 200D 1F468 1F3FF
+F0DEA 30 7 1F469 1F3FF 200D 2764 200D 1F469 1F3FB
+F0DEB 30 7 1F469 1F3FF 200D 2764 200D 1F469 1F3FC
+F0DEC 30 7 1F469 1F3FF 200D 2764 200D 1F469 1F3FD
+F0DED 30 7 1F469 1F3FF 200D 2764 200D 1F469 1F3FE
+F0DEE 30 7 1F469 1F3FF 200D 2764 200D 1F469 1F3FF
+F0DEF 30 7 1F48F 1F3FB
+F0DF0 30 7 1F48F 1F3FC
+F0DF1 30 7 1F48F 1F3FD
+F0DF2 30 7 1F48F 1F3FE
+F0DF3 30 7 1F48F 1F3FF
+F0DF4 30 7 1F491 1F3FB
+F0DF5 30 7 1F491 1F3FC
+F0DF6 30 7 1F491 1F3FD
+F0DF7 30 7 1F491 1F3FE
+F0DF8 30 7 1F491 1F3FF
+F0DF9 30 7 1F62E 200D 1F4A8
+F0DFA 30 7 1F635 200D 1F4AB
+F0DFB 30 7 1F636 200D 1F32B
+F0DFC 30 7 1F9D1 1F3FB 200D 2764 200D 1F48B 200D 1F9D1 1F3FC
+F0DFD 30 7 1F9D1 1F3FB 200D 2764 200D 1F48B 200D 1F9D1 1F3FD
+F0DFE 30 7 1F9D1 1F3FB 200D 2764 200D 1F48B 200D 1F9D1 1F3FE
+F0DFF 30 7 1F9D1 1F3FB 200D 2764 200D 1F48B 200D 1F9D1 1F3FF
+F0E00 30 7 1F9D1 1F3FC 200D 2764 200D 1F48B 200D 1F9D1 1F3FB
+F0E01 30 7 1F9D1 1F3FC 200D 2764 200D 1F48B 200D 1F9D1 1F3FD
+F0E02 30 7 1F9D1 1F3FC 200D 2764 200D 1F48B 200D 1F9D1 1F3FE
+F0E03 30 7 1F9D1 1F3FC 200D 2764 200D 1F48B 200D 1F9D1 1F3FF
+F0E04 30 7 1F9D1 1F3FD 200D 2764 200D 1F48B 200D 1F9D1 1F3FB
+F0E05 30 7 1F9D1 1F3FD 200D 2764 200D 1F48B 200D 1F9D1 1F3FC
+F0E06 30 7 1F9D1 1F3FD 200D 2764 200D 1F48B 200D 1F9D1 1F3FE
+F0E07 30 7 1F9D1 1F3FD 200D 2764 200D 1F48B 200D 1F9D1 1F3FF
+F0E08 30 7 1F9D1 1F3FE 200D 2764 200D 1F48B 200D 1F9D1 1F3FB
+F0E09 30 7 1F9D1 1F3FE 200D 2764 200D 1F48B 200D 1F9D1 1F3FC
+F0E0A 30 7 1F9D1 1F3FE 200D 2764 200D 1F48B 200D 1F9D1 1F3FD
+F0E0B 30 7 1F9D1 1F3FE 200D 2764 200D 1F48B 200D 1F9D1 1F3FF
+F0E0C 30 7 1F9D1 1F3FF 200D 2764 200D 1F48B 200D 1F9D1 1F3FB
+F0E0D 30 7 1F9D1 1F3FF 200D 2764 200D 1F48B 200D 1F9D1 1F3FC
+F0E0E 30 7 1F9D1 1F3FF 200D 2764 200D 1F48B 200D 1F9D1 1F3FD
+F0E0F 30 7 1F9D1 1F3FF 200D 2764 200D 1F48B 200D 1F9D1 1F3FE
+F0E10 30 7 1F9D1 1F3FB 200D 2764 200D 1F9D1 1F3FC
+F0E11 30 7 1F9D1 1F3FB 200D 2764 200D 1F9D1 1F3FD
+F0E12 30 7 1F9D1 1F3FB 200D 2764 200D 1F9D1 1F3FE
+F0E13 30 7 1F9D1 1F3FB 200D 2764 200D 1F9D1 1F3FF
+F0E14 30 7 1F9D1 1F3FC 200D 2764 200D 1F9D1 1F3FB
+F0E15 30 7 1F9D1 1F3FC 200D 2764 200D 1F9D1 1F3FD
+F0E16 30 7 1F9D1 1F3FC 200D 2764 200D 1F9D1 1F3FE
+F0E17 30 7 1F9D1 1F3FC 200D 2764 200D 1F9D1 1F3FF
+F0E18 30 7 1F9D1 1F3FD 200D 2764 200D 1F9D1 1F3FB
+F0E19 30 7 1F9D1 1F3FD 200D 2764 200D 1F9D1 1F3FC
+F0E1A 30 7 1F9D1 1F3FD 200D 2764 200D 1F9D1 1F3FE
+F0E1B 30 7 1F9D1 1F3FD 200D 2764 200D 1F9D1 1F3FF
+F0E1C 30 7 1F9D1 1F3FE 200D 2764 200D 1F9D1 1F3FB
+F0E1D 30 7 1F9D1 1F3FE 200D 2764 200D 1F9D1 1F3FC
+F0E1E 30 7 1F9D1 1F3FE 200D 2764 200D 1F9D1 1F3FD
+F0E1F 30 7 1F9D1 1F3FE 200D 2764 200D 1F9D1 1F3FF
+F0E20 30 7 1F9D1 1F3FF 200D 2764 200D 1F9D1 1F3FB
+F0E21 30 7 1F9D1 1F3FF 200D 2764 200D 1F9D1 1F3FC
+F0E22 30 7 1F9D1 1F3FF 200D 2764 200D 1F9D1 1F3FD
+F0E23 30 7 1F9D1 1F3FF 200D 2764 200D 1F9D1 1F3FE
+F0E24 30 7 1F9D4 1F3FB 200D 2640
+F0E25 30 7 1F9D4 1F3FB 200D 2642
+F0E26 30 7 1F9D4 1F3FC 200D 2640
+F0E27 30 7 1F9D4 1F3FC 200D 2642
+F0E28 30 7 1F9D4 1F3FD 200D 2640
+F0E29 30 7 1F9D4 1F3FD 200D 2642
+F0E2A 30 7 1F9D4 1F3FE 200D 2640
+F0E2B 30 7 1F9D4 1F3FE 200D 2642
+F0E2C 30 7 1F9D4 1F3FF 200D 2640
+F0E2D 30 7 1F9D4 1F3FF 200D 2642
+F0E2E 30 7 1F9D4 200D 2640
+F0E2F 30 7 1F9D4 200D 2642
+F0E30 31 8 1F6DD
+F0E31 31 8 1F6DE
+F0E32 31 8 1F6DF
+F0E33 31 8 1F7F0
+F0E34 31 8 1F979
+F0E35 31 8 1F9CC
+F0E36 31 8 1FA7B
+F0E37 31 8 1FA7C
+F0E38 31 8 1FAA9
+F0E39 31 8 1FAAA
+F0E3A 31 8 1FAAB
+F0E3B 31 8 1FAAC
+F0E3C 31 8 1FAB7
+F0E3D 31 8 1FAB8
+F0E3E 31 8 1FAB9
+F0E3F 31 8 1FABA
+F0E40 31 8 1FAC3
+F0E41 31 8 1FAC4
+F0E42 31 8 1FAC5
+F0E43 31 8 1FAD7
+F0E44 31 8 1FAD8
+F0E45 31 8 1FAD9
+F0E46 31 8 1FAE0
+F0E47 31 8 1FAE1
+F0E48 31 8 1FAE2
+F0E49 31 8 1FAE3
+F0E4A 31 8 1FAE4
+F0E4B 31 8 1FAE5
+F0E4C 31 8 1FAE6
+F0E4D 31 8 1FAE7
+F0E4E 31 8 1FAF0
+F0E4F 31 8 1FAF1
+F0E50 31 8 1FAF2
+F0E51 31 8 1FAF3
+F0E52 31 8 1FAF4
+F0E53 31 8 1FAF5
+F0E54 31 8 1FAF6
+F0E55 31 8 1FAC3 1F3FB
+F0E56 31 8 1FAC3 1F3FC
+F0E57 31 8 1FAC3 1F3FD
+F0E58 31 8 1FAC3 1F3FE
+F0E59 31 8 1FAC3 1F3FF
+F0E5A 31 8 1FAC4 1F3FB
+F0E5B 31 8 1FAC4 1F3FC
+F0E5C 31 8 1FAC4 1F3FD
+F0E5D 31 8 1FAC4 1F3FE
+F0E5E 31 8 1FAC4 1F3FF
+F0E5F 31 8 1FAC5 1F3FB
+F0E60 31 8 1FAC5 1F3FC
+F0E61 31 8 1FAC5 1F3FD
+F0E62 31 8 1FAC5 1F3FE
+F0E63 31 8 1FAC5 1F3FF
+F0E64 31 8 1FAF0 1F3FB
+F0E65 31 8 1FAF0 1F3FC
+F0E66 31 8 1FAF0 1F3FD
+F0E67 31 8 1FAF0 1F3FE
+F0E68 31 8 1FAF0 1F3FF
+F0E69 31 8 1FAF1 1F3FB 200D 1FAF2 1F3FC
+F0E6A 31 8 1FAF1 1F3FB 200D 1FAF2 1F3FD
+F0E6B 31 8 1FAF1 1F3FB 200D 1FAF2 1F3FE
+F0E6C 31 8 1FAF1 1F3FB 200D 1FAF2 1F3FF
+F0E6D 31 8 1FAF1 1F3FC 200D 1FAF2 1F3FB
+F0E6E 31 8 1FAF1 1F3FC 200D 1FAF2 1F3FD
+F0E6F 31 8 1FAF1 1F3FC 200D 1FAF2 1F3FE
+F0E70 31 8 1FAF1 1F3FC 200D 1FAF2 1F3FF
+F0E71 31 8 1FAF1 1F3FD 200D 1FAF2 1F3FB
+F0E72 31 8 1FAF1 1F3FD 200D 1FAF2 1F3FC
+F0E73 31 8 1FAF1 1F3FD 200D 1FAF2 1F3FE
+F0E74 31 8 1FAF1 1F3FD 200D 1FAF2 1F3FF
+F0E75 31 8 1FAF1 1F3FE 200D 1FAF2 1F3FB
+F0E76 31 8 1FAF1 1F3FE 200D 1FAF2 1F3FC
+F0E77 31 8 1FAF1 1F3FE 200D 1FAF2 1F3FD
+F0E78 31 8 1FAF1 1F3FE 200D 1FAF2 1F3FF
+F0E79 31 8 1FAF1 1F3FF 200D 1FAF2 1F3FB
+F0E7A 31 8 1FAF1 1F3FF 200D 1FAF2 1F3FC
+F0E7B 31 8 1FAF1 1F3FF 200D 1FAF2 1F3FD
+F0E7C 31 8 1FAF1 1F3FF 200D 1FAF2 1F3FE
+F0E7D 31 8 1FAF1 1F3FB
+F0E7E 31 8 1FAF1 1F3FC
+F0E7F 31 8 1FAF1 1F3FD
+F0E80 31 8 1FAF1 1F3FE
+F0E81 31 8 1FAF1 1F3FF
+F0E82 31 8 1FAF2 1F3FB
+F0E83 31 8 1FAF2 1F3FC
+F0E84 31 8 1FAF2 1F3FD
+F0E85 31 8 1FAF2 1F3FE
+F0E86 31 8 1FAF2 1F3FF
+F0E87 31 8 1FAF3 1F3FB
+F0E88 31 8 1FAF3 1F3FC
+F0E89 31 8 1FAF3 1F3FD
+F0E8A 31 8 1FAF3 1F3FE
+F0E8B 31 8 1FAF3 1F3FF
+F0E8C 31 8 1FAF4 1F3FB
+F0E8D 31 8 1FAF4 1F3FC
+F0E8E 31 8 1FAF4 1F3FD
+F0E8F 31 8 1FAF4 1F3FE
+F0E90 31 8 1FAF4 1F3FF
+F0E91 31 8 1FAF5 1F3FB
+F0E92 31 8 1FAF5 1F3FC
+F0E93 31 8 1FAF5 1F3FD
+F0E94 31 8 1FAF5 1F3FE
+F0E95 31 8 1FAF5 1F3FF
+F0E96 31 8 1FAF6 1F3FB
+F0E97 31 8 1FAF6 1F3FC
+F0E98 31 8 1FAF6 1F3FD
+F0E99 31 8 1FAF6 1F3FE
+F0E9A 31 8 1FAF6 1F3FF
+F0E9C 1500 9 1F426 200D 2B1B
+F0E9D 1500 9 1F6DC
+F0E9E 1500 9 1FA75
+F0E9F 1500 9 1FA76
+F0EA0 1500 9 1FA77
+F0EA1 1500 9 1FA87
+F0EA2 1500 9 1FA88
+F0EA3 1500 9 1FAAD
+F0EA4 1500 9 1FAAE
+F0EA5 1500 9 1FAAF
+F0EA6 1500 9 1FABB
+F0EA7 1500 9 1FABC
+F0EA8 1500 9 1FABD
+F0EA9 1500 9 1FABF
+F0EAA 1500 9 1FACE
+F0EAB 1500 9 1FACF
+F0EAC 1500 9 1FADA
+F0EAD 1500 9 1FADB
+F0EAE 1500 9 1FAE8
+F0EAF 1500 9 1FAF7
+F0EB0 1500 9 1FAF7 1F3FB
+F0EB1 1500 9 1FAF7 1F3FC
+F0EB2 1500 9 1FAF7 1F3FD
+F0EB3 1500 9 1FAF7 1F3FE
+F0EB4 1500 9 1FAF7 1F3FF
+F0EB5 1500 9 1FAF8
+F0EB6 1500 9 1FAF8 1F3FB
+F0EB7 1500 9 1FAF8 1F3FC
+F0EB8 1500 9 1FAF8 1F3FD
+F0EB9 1500 9 1FAF8 1F3FE
+F0EBA 1500 9 1FAF8 1F3FF
+F0EBC 1510 10 26D3 200D 1F4A5
+F0EBD 1510 10 1F344 200D 1F7EB
+F0EBE 1510 10 1F34B 200D 1F7E9
+F0EBF 1510 10 1F3C3 200D 2640 200D 27A1
+F0EC0 1510 10 1F3C3 200D 2642 200D 27A1
+F0EC1 1510 10 1F3C3 200D 27A1
+F0EC2 1510 10 1F3C3 1F3FB 200D 2640 200D 27A1
+F0EC3 1510 10 1F3C3 1F3FB 200D 2642 200D 27A1
+F0EC4 1510 10 1F3C3 1F3FB 200D 27A1
+F0EC5 1510 10 1F3C3 1F3FC 200D 2640 200D 27A1
+F0EC6 1510 10 1F3C3 1F3FC 200D 2642 200D 27A1
+F0EC7 1510 10 1F3C3 1F3FC 200D 27A1
+F0EC8 1510 10 1F3C3 1F3FD 200D 2640 200D 27A1
+F0EC9 1510 10 1F3C3 1F3FD 200D 2642 200D 27A1
+F0ECA 1510 10 1F3C3 1F3FD 200D 27A1
+F0ECB 1510 10 1F3C3 1F3FE 200D 2640 200D 27A1
+F0ECC 1510 10 1F3C3 1F3FE 200D 2642 200D 27A1
+F0ECD 1510 10 1F3C3 1F3FE 200D 27A1
+F0ECE 1510 10 1F3C3 1F3FF 200D 2640 200D 27A1
+F0ECF 1510 10 1F3C3 1F3FF 200D 2642 200D 27A1
+F0ED0 1510 10 1F3C3 1F3FF 200D 27A1
+F0ED1 1510 10 1F426 200D 1F525
+F0ED2 1510 10 1F468 200D 1F9AF 200D 27A1
+F0ED3 1510 10 1F468 200D 1F9BC 200D 27A1
+F0ED4 1510 10 1F468 200D 1F9BD 200D 27A1
+F0ED5 1510 10 1F468 1F3FB 200D 1F9AF 200D 27A1
+F0ED6 1510 10 1F468 1F3FB 200D 1F9BC 200D 27A1
+F0ED7 1510 10 1F468 1F3FB 200D 1F9BD 200D 27A1
+F0ED8 1510 10 1F468 1F3FC 200D 1F9AF 200D 27A1
+F0ED9 1510 10 1F468 1F3FC 200D 1F9BC 200D 27A1
+F0EDA 1510 10 1F468 1F3FC 200D 1F9BD 200D 27A1
+F0EDB 1510 10 1F468 1F3FD 200D 1F9AF 200D 27A1
+F0EDC 1510 10 1F468 1F3FD 200D 1F9BC 200D 27A1
+F0EDD 1510 10 1F468 1F3FD 200D 1F9BD 200D 27A1
+F0EDE 1510 10 1F468 1F3FE 200D 1F9AF 200D 27A1
+F0EDF 1510 10 1F468 1F3FE 200D 1F9BC 200D 27A1
+F0EE0 1510 10 1F468 1F3FE 200D 1F9BD 200D 27A1
+F0EE1 1510 10 1F468 1F3FF 200D 1F9AF 200D 27A1
+F0EE2 1510 10 1F468 1F3FF 200D 1F9BC 200D 27A1
+F0EE3 1510 10 1F468 1F3FF 200D 1F9BD 200D 27A1
+F0EE4 1510 10 1F469 200D 1F9AF 200D 27A1
+F0EE5 1510 10 1F469 200D 1F9BC 200D 27A1
+F0EE6 1510 10 1F469 200D 1F9BD 200D 27A1
+F0EE7 1510 10 1F469 1F3FB 200D 1F9AF 200D 27A1
+F0EE8 1510 10 1F469 1F3FB 200D 1F9BC 200D 27A1
+F0EE9 1510 10 1F469 1F3FB 200D 1F9BD 200D 27A1
+F0EEA 1510 10 1F469 1F3FC 200D 1F9AF 200D 27A1
+F0EEB 1510 10 1F469 1F3FC 200D 1F9BC 200D 27A1
+F0EEC 1510 10 1F469 1F3FC 200D 1F9BD 200D 27A1
+F0EED 1510 10 1F469 1F3FD 200D 1F9AF 200D 27A1
+F0EEE 1510 10 1F469 1F3FD 200D 1F9BC 200D 27A1
+F0EEF 1510 10 1F469 1F3FD 200D 1F9BD 200D 27A1
+F0EF0 1510 10 1F469 1F3FE 200D 1F9AF 200D 27A1
+F0EF1 1510 10 1F469 1F3FE 200D 1F9BC 200D 27A1
+F0EF2 1510 10 1F469 1F3FE 200D 1F9BD 200D 27A1
+F0EF3 1510 10 1F469 1F3FF 200D 1F9AF 200D 27A1
+F0EF4 1510 10 1F469 1F3FF 200D 1F9BC 200D 27A1
+F0EF5 1510 10 1F469 1F3FF 200D 1F9BD 200D 27A1
+F0EF6 1510 10 1F642 200D 2194
+F0EF7 1510 10 1F642 200D 2195
+F0EF8 1510 10 1F6B6 200D 2640 200D 27A1
+F0EF9 1510 10 1F6B6 200D 2642 200D 27A1
+F0EFA 1510 10 1F6B6 200D 27A1
+F0EFB 1510 10 1F6B6 1F3FB 200D 2640 200D 27A1
+F0EFC 1510 10 1F6B6 1F3FB 200D 2642 200D 27A1
+F0EFD 1510 10 1F6B6 1F3FB 200D 27A1
+F0EFE 1510 10 1F6B6 1F3FC 200D 2640 200D 27A1
+F0EFF 1510 10 1F6B6 1F3FC 200D 2642 200D 27A1
+F0F00 1510 10 1F6B6 1F3FC 200D 27A1
+F0F01 1510 10 1F6B6 1F3FD 200D 2640 200D 27A1
+F0F02 1510 10 1F6B6 1F3FD 200D 2642 200D 27A1
+F0F03 1510 10 1F6B6 1F3FD 200D 27A1
+F0F04 1510 10 1F6B6 1F3FE 200D 2640 200D 27A1
+F0F05 1510 10 1F6B6 1F3FE 200D 2642 200D 27A1
+F0F06 1510 10 1F6B6 1F3FE 200D 27A1
+F0F07 1510 10 1F6B6 1F3FF 200D 2640 200D 27A1
+F0F08 1510 10 1F6B6 1F3FF 200D 2642 200D 27A1
+F0F09 1510 10 1F6B6 1F3FF 200D 27A1
+F0F0A 1510 10 1F9CE 200D 2640 200D 27A1
+F0F0B 1510 10 1F9CE 200D 2642 200D 27A1
+F0F0C 1510 10 1F9CE 200D 27A1
+F0F0D 1510 10 1F9CE 1F3FB 200D 2640 200D 27A1
+F0F0E 1510 10 1F9CE 1F3FB 200D 2642 200D 27A1
+F0F0F 1510 10 1F9CE 1F3FB 200D 27A1
+F0F10 1510 10 1F9CE 1F3FC 200D 2640 200D 27A1
+F0F11 1510 10 1F9CE 1F3FC 200D 2642 200D 27A1
+F0F12 1510 10 1F9CE 1F3FC 200D 27A1
+F0F13 1510 10 1F9CE 1F3FD 200D 2640 200D 27A1
+F0F14 1510 10 1F9CE 1F3FD 200D 2642 200D 27A1
+F0F15 1510 10 1F9CE 1F3FD 200D 27A1
+F0F16 1510 10 1F9CE 1F3FE 200D 2640 200D 27A1
+F0F17 1510 10 1F9CE 1F3FE 200D 2642 200D 27A1
+F0F18 1510 10 1F9CE 1F3FE 200D 27A1
+F0F19 1510 10 1F9CE 1F3FF 200D 2640 200D 27A1
+F0F1A 1510 10 1F9CE 1F3FF 200D 2642 200D 27A1
+F0F1B 1510 10 1F9CE 1F3FF 200D 27A1
+F0F1C 1510 10 1F9D1 200D 1F9AF 200D 27A1
+F0F1D 1510 10 1F9D1 200D 1F9BC 200D 27A1
+F0F1E 1510 10 1F9D1 200D 1F9BD 200D 27A1
+F0F1F 1510 10 1F9D1 200D 1F9D1 200D 1F9D2
+F0F20 1510 10 1F9D1 200D 1F9D1 200D 1F9D2 200D 1F9D2
+F0F21 1510 10 1F9D1 200D 1F9D2
+F0F22 1510 10 1F9D1 200D 1F9D2 200D 1F9D2
+F0F23 1510 10 1F9D1 1F3FB 200D 1F9AF 200D 27A1
+F0F24 1510 10 1F9D1 1F3FB 200D 1F9BC 200D 27A1
+F0F25 1510 10 1F9D1 1F3FB 200D 1F9BD 200D 27A1
+F0F26 1510 10 1F9D1 1F3FC 200D 1F9AF 200D 27A1
+F0F27 1510 10 1F9D1 1F3FC 200D 1F9BC 200D 27A1
+F0F28 1510 10 1F9D1 1F3FC 200D 1F9BD 200D 27A1
+F0F29 1510 10 1F9D1 1F3FD 200D 1F9AF 200D 27A1
+F0F2A 1510 10 1F9D1 1F3FD 200D 1F9BC 200D 27A1
+F0F2B 1510 10 1F9D1 1F3FD 200D 1F9BD 200D 27A1
+F0F2C 1510 10 1F9D1 1F3FE 200D 1F9AF 200D 27A1
+F0F2D 1510 10 1F9D1 1F3FE 200D 1F9BC 200D 27A1
+F0F2E 1510 10 1F9D1 1F3FE 200D 1F9BD 200D 27A1
+F0F2F 1510 10 1F9D1 1F3FF 200D 1F9AF 200D 27A1
+F0F30 1510 10 1F9D1 1F3FF 200D 1F9BC 200D 27A1
+F0F31 1510 10 1F9D1 1F3FF 200D 1F9BD 200D 27A1
diff --git a/emoji-compat/fetch.sh b/emoji-compat/fetch.sh
new file mode 100755
index 0000000..d35127a
--- /dev/null
+++ b/emoji-compat/fetch.sh
@@ -0,0 +1,118 @@
+#!/usr/bin/env bash
+
+# Copyright (C) 2022 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.
+
+# Helper script for fetching new emoji compat fonts from github source
+# of truth
+
+# This script is very basic, please extend or replace to handle your
+# needs (e.g. pulling specific commits, releases, branches) as needed.
+
+#set -o xtrace
+set +e
+
+METADATA_GIT="https://github.com/googlefonts/emojicompat.git"
+FONT_GIT="https://github.com/googlefonts/noto-emoji.git"
+
+SCRIPT_DIR=$(readlink -f $(dirname -- "$0"))
+TMP_DIR=$(mktemp -d)
+
+GIT_VERSION=$(git --version)
+if [ $? -ne 0 ]; then
+ echo -e "ERROR: git not found"
+ exit 1
+fi
+
+TTX_VERSION=$(ttx --version)
+
+if [ $? -ne 0 ]; then
+ echo "ERROR ttx required to check font"
+ echo -e "\t python3 -m venv venv"
+ echo -e "\t source venv/bin/activate"
+ echo -e "\t pip install fonttools"
+ exit 127
+fi
+
+echo "METADATA: $METADATA_GIT"
+echo "FONT: $FONT_GIT"
+echo "Updating in: $SCRIPT_DIR"
+
+# confirm directory is clean
+pushd $SCRIPT_DIR > /dev/null
+UNCOMMITED_CHANGES=$(git status --porcelain)
+popd > /dev/null
+if [[ "$UNCOMMITED_CHANGES" ]]; then
+ echo "$UNCOMMITED_CHANGES"
+ read -p "Uncommited changes. Continue? [y/N]:" uncommited
+ if [[ ! $uncommited =~ ^[Yy] ]]; then
+ exit 3
+ fi
+fi
+
+function confirm_git_commit() {
+ pushd $TMP_DIR/$1 > /dev/null
+ RESULT=$(git log -1)
+ echo "$RESULT"
+ read -p "Continue for repo $1? [y/N]: " yn
+ if [[ ! $yn =~ ^[Yy] ]]; then
+ exit 2
+ fi
+ popd > /dev/null
+}
+
+pushd $TMP_DIR > /dev/null
+
+git clone --quiet --depth 1 --branch main $METADATA_GIT
+confirm_git_commit "emojicompat"
+METADATA_FILE="./emojicompat/src/emojicompat/emoji_metadata.txt"
+# adjust newlines to avoid giant diffs
+cat $METADATA_FILE | awk 'sub("$", "\r")' > emoji_metadata.txt
+
+# pull the font
+git clone --quiet --depth 1 --branch main $FONT_GIT
+confirm_git_commit "noto-emoji"
+cp ./noto-emoji/fonts/NotoColorEmoji-emojicompat.ttf ./NewFont.ttf
+
+ttx -o NewFont.ttx NewFont.ttf 2> /dev/null
+grep -q 'header version="2.0"' NewFont.ttx
+
+if [ $? -ne 0 ]; then
+ echo -e "WRONG HEADER VERSION IN FONT FILE (breaks API23)"
+ echo -e "Expected 'header version=\"2.0\""
+ echo -e "Found: "
+ grep 'header version' NewFont.ttx
+ exit 128
+fi
+
+# concat new codepoints to emojis.txt
+NEW_LINES=$(comm -23 emoji_metadata.txt $SCRIPT_DIR/data/emoji_metadata.txt)
+NEW_CODEPOINTS=$(echo "$NEW_LINES" | cut -d" " -f4-100 | sed 's/\r//')
+
+if [[ "$NEW_CODEPOINTS" ]]; then
+ echo "$NEW_CODEPOINTS"
+ read -p "New codpoints found in metadata. Append emojis.txt? [y/N]:" emojiAppend
+ if [[ "$emojiAppend" =~ ^[Yy] ]]; then
+ echo "$NEW_CODEPOINTS" >> $SCRIPT_DIR/supported-emojis/emojis.txt
+ echo "Updated ${SCRIPT_DIR}/supported-emojis/emojis.txt"
+ fi
+fi
+
+cp emoji_metadata.txt $SCRIPT_DIR/data/emoji_metadata.txt
+echo "Updated ${SCRIPT_DIR}/data/emoji_metadata.txt"
+cp NewFont.ttf $SCRIPT_DIR/font/NotoColorEmojiCompat.ttf
+echo "Updated ${SCRIPT_DIR}/font/NotoColorEmojiCompat.ttf"
+
+popd > /dev/null
+rm -rf $TMP_DIR
diff --git a/emoji-compat/font/NotoColorEmojiCompat.ttf b/emoji-compat/font/NotoColorEmojiCompat.ttf
index 4cfa68b..faf337e 100644
--- a/emoji-compat/font/NotoColorEmojiCompat.ttf
+++ b/emoji-compat/font/NotoColorEmojiCompat.ttf
Binary files differ
diff --git a/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java b/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java
deleted file mode 100644
index 49a1e2b..0000000
--- a/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataItem.java
+++ /dev/null
@@ -1,160 +0,0 @@
-// CHECKSTYLE:OFF Generated code
-/*
- * Copyright (C) 2017 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 androidx.text.emoji.flatbuffer;
-
-import com.google.flatbuffers.FlatBufferBuilder;
-import com.google.flatbuffers.Table;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Automatically generated by the FlatBuffers compiler, do not modify.
- */
-@SuppressWarnings("unused")
-public final class MetadataItem extends Table {
- public static MetadataItem getRootAsMetadataItem(ByteBuffer _bb) {
- return getRootAsMetadataItem(_bb, new MetadataItem());
- }
-
- public static MetadataItem getRootAsMetadataItem(ByteBuffer _bb, MetadataItem obj) {
- _bb.order(ByteOrder.LITTLE_ENDIAN);
- return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));
- }
-
- public void __init(int _i, ByteBuffer _bb) {
- bb_pos = _i;
- bb = _bb;
- }
-
- public MetadataItem __assign(int _i, ByteBuffer _bb) {
- __init(_i, _bb);
- return this;
- }
-
- public int id() {
- int o = __offset(4);
- return o != 0 ? bb.getInt(o + bb_pos) : 0;
- }
-
- public boolean emojiStyle() {
- int o = __offset(6);
- return o != 0 ? 0 != bb.get(o + bb_pos) : false;
- }
-
- public short sdkAdded() {
- int o = __offset(8);
- return o != 0 ? bb.getShort(o + bb_pos) : 0;
- }
-
- public short compatAdded() {
- int o = __offset(10);
- return o != 0 ? bb.getShort(o + bb_pos) : 0;
- }
-
- public short width() {
- int o = __offset(12);
- return o != 0 ? bb.getShort(o + bb_pos) : 0;
- }
-
- public short height() {
- int o = __offset(14);
- return o != 0 ? bb.getShort(o + bb_pos) : 0;
- }
-
- public int codepoints(int j) {
- int o = __offset(16);
- return o != 0 ? bb.getInt(__vector(o) + j * 4) : 0;
- }
-
- public int codepointsLength() {
- int o = __offset(16);
- return o != 0 ? __vector_len(o) : 0;
- }
-
- public ByteBuffer codepointsAsByteBuffer() {
- return __vector_as_bytebuffer(16, 4);
- }
-
- public static int createMetadataItem(FlatBufferBuilder builder,
- int id,
- boolean emojiStyle,
- short sdkAdded,
- short compatAdded,
- short width,
- short height,
- int codepointsOffset) {
- builder.startObject(7);
- MetadataItem.addCodepoints(builder, codepointsOffset);
- MetadataItem.addId(builder, id);
- MetadataItem.addHeight(builder, height);
- MetadataItem.addWidth(builder, width);
- MetadataItem.addCompatAdded(builder, compatAdded);
- MetadataItem.addSdkAdded(builder, sdkAdded);
- MetadataItem.addEmojiStyle(builder, emojiStyle);
- return MetadataItem.endMetadataItem(builder);
- }
-
- public static void startMetadataItem(FlatBufferBuilder builder) {
- builder.startObject(7);
- }
-
- public static void addId(FlatBufferBuilder builder, int id) {
- builder.addInt(0, id, 0);
- }
-
- public static void addEmojiStyle(FlatBufferBuilder builder, boolean emojiStyle) {
- builder.addBoolean(1, emojiStyle, false);
- }
-
- public static void addSdkAdded(FlatBufferBuilder builder, short sdkAdded) {
- builder.addShort(2, sdkAdded, 0);
- }
-
- public static void addCompatAdded(FlatBufferBuilder builder, short compatAdded) {
- builder.addShort(3, compatAdded, 0);
- }
-
- public static void addWidth(FlatBufferBuilder builder, short width) {
- builder.addShort(4, width, 0);
- }
-
- public static void addHeight(FlatBufferBuilder builder, short height) {
- builder.addShort(5, height, 0);
- }
-
- public static void addCodepoints(FlatBufferBuilder builder, int codepointsOffset) {
- builder.addOffset(6, codepointsOffset, 0);
- }
-
- public static int createCodepointsVector(FlatBufferBuilder builder, int[] data) {
- builder.startVector(4, data.length, 4);
- for (int i = data.length - 1; i >= 0; i--) builder.addInt(data[i]);
- return builder.endVector();
- }
-
- public static void startCodepointsVector(FlatBufferBuilder builder, int numElems) {
- builder.startVector(4, numElems, 4);
- }
-
- public static int endMetadataItem(FlatBufferBuilder builder) {
- int o = builder.endObject();
- return o;
- }
-}
-
diff --git a/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataList.java b/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataList.java
deleted file mode 100644
index 97b12a4..0000000
--- a/emoji-compat/src/java/androidx/text/emoji/flatbuffer/MetadataList.java
+++ /dev/null
@@ -1,124 +0,0 @@
-// CHECKSTYLE:OFF Generated code
-/*
- * Copyright (C) 2017 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 androidx.text.emoji.flatbuffer;
-
-import com.google.flatbuffers.FlatBufferBuilder;
-import com.google.flatbuffers.Table;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-/**
- * Automatically generated by the FlatBuffers compiler, do not modify.
- */
-@SuppressWarnings("unused")
-public final class MetadataList extends Table {
- public static MetadataList getRootAsMetadataList(ByteBuffer _bb) {
- return getRootAsMetadataList(_bb, new MetadataList());
- }
-
- public static MetadataList getRootAsMetadataList(ByteBuffer _bb, MetadataList obj) {
- _bb.order(ByteOrder.LITTLE_ENDIAN);
- return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb));
- }
-
- public void __init(int _i, ByteBuffer _bb) {
- bb_pos = _i;
- bb = _bb;
- }
-
- public MetadataList __assign(int _i, ByteBuffer _bb) {
- __init(_i, _bb);
- return this;
- }
-
- public int version() {
- int o = __offset(4);
- return o != 0 ? bb.getInt(o + bb_pos) : 0;
- }
-
- public MetadataItem list(int j) {
- return list(new MetadataItem(), j);
- }
-
- public MetadataItem list(MetadataItem obj, int j) {
- int o = __offset(6);
- return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null;
- }
-
- public int listLength() {
- int o = __offset(6);
- return o != 0 ? __vector_len(o) : 0;
- }
-
- public String sourceSha() {
- int o = __offset(8);
- return o != 0 ? __string(o + bb_pos) : null;
- }
-
- public ByteBuffer sourceShaAsByteBuffer() {
- return __vector_as_bytebuffer(8, 1);
- }
-
- public static int createMetadataList(FlatBufferBuilder builder,
- int version,
- int listOffset,
- int sourceShaOffset) {
- builder.startObject(3);
- MetadataList.addSourceSha(builder, sourceShaOffset);
- MetadataList.addList(builder, listOffset);
- MetadataList.addVersion(builder, version);
- return MetadataList.endMetadataList(builder);
- }
-
- public static void startMetadataList(FlatBufferBuilder builder) {
- builder.startObject(3);
- }
-
- public static void addVersion(FlatBufferBuilder builder, int version) {
- builder.addInt(0, version, 0);
- }
-
- public static void addList(FlatBufferBuilder builder, int listOffset) {
- builder.addOffset(1, listOffset, 0);
- }
-
- public static int createListVector(FlatBufferBuilder builder, int[] data) {
- builder.startVector(4, data.length, 4);
- for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]);
- return builder.endVector();
- }
-
- public static void startListVector(FlatBufferBuilder builder, int numElems) {
- builder.startVector(4, numElems, 4);
- }
-
- public static void addSourceSha(FlatBufferBuilder builder, int sourceShaOffset) {
- builder.addOffset(2, sourceShaOffset, 0);
- }
-
- public static int endMetadataList(FlatBufferBuilder builder) {
- int o = builder.endObject();
- return o;
- }
-
- public static void finishMetadataListBuffer(FlatBufferBuilder builder, int offset) {
- builder.finish(offset);
- }
-}
-
diff --git a/emoji-compat/supported-emojis/emojis.txt b/emoji-compat/supported-emojis/emojis.txt
index 18c2667..2e9c804 100644
--- a/emoji-compat/supported-emojis/emojis.txt
+++ b/emoji-compat/supported-emojis/emojis.txt
@@ -670,6 +670,7 @@
1F3F0
1F3F3 FE0F
1F3F3 FE0F 200D 1F308
+1F3F3 FE0F 200D 26A7 FE0F
1F3F4
1F3F4 200D 2620 FE0F
1F3F4 E0067 E0062 E0065 E006E E0067 E007F
@@ -694,6 +695,7 @@
1F406
1F407
1F408
+1F408 200D 2B1B
1F408 FE0F
1F409
1F40A
@@ -750,6 +752,7 @@
1F439
1F43A
1F43B
+1F43B 200D 2744 FE0F
1F43C
1F43D
1F43E
@@ -882,6 +885,7 @@
1F468 1F3FB
1F468 1F3FB 200D 1F33E
1F468 1F3FB 200D 1F373
+1F468 1F3FB 200D 1F37C
1F468 1F3FB 200D 1F393
1F468 1F3FB 200D 1F3A4
1F468 1F3FB 200D 1F3A8
@@ -893,6 +897,10 @@
1F468 1F3FB 200D 1F52C
1F468 1F3FB 200D 1F680
1F468 1F3FB 200D 1F692
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FC
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FD
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FE
+1F468 1F3FB 200D 1F91D 200D 1F468 1F3FF
1F468 1F3FB 200D 1F9AF
1F468 1F3FB 200D 1F9B0
1F468 1F3FB 200D 1F9B1
@@ -903,9 +911,20 @@
1F468 1F3FB 200D 2695 FE0F
1F468 1F3FB 200D 2696 FE0F
1F468 1F3FB 200D 2708 FE0F
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FB
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FC
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FD
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FE
+1F468 1F3FB 200D 2764 FE0F 200D 1F468 1F3FF
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F468 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
1F468 1F3FC
1F468 1F3FC 200D 1F33E
1F468 1F3FC 200D 1F373
+1F468 1F3FC 200D 1F37C
1F468 1F3FC 200D 1F393
1F468 1F3FC 200D 1F3A4
1F468 1F3FC 200D 1F3A8
@@ -918,6 +937,9 @@
1F468 1F3FC 200D 1F680
1F468 1F3FC 200D 1F692
1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FD
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FE
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FF
1F468 1F3FC 200D 1F9AF
1F468 1F3FC 200D 1F9B0
1F468 1F3FC 200D 1F9B1
@@ -928,9 +950,20 @@
1F468 1F3FC 200D 2695 FE0F
1F468 1F3FC 200D 2696 FE0F
1F468 1F3FC 200D 2708 FE0F
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FB
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FC
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FD
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FE
+1F468 1F3FC 200D 2764 FE0F 200D 1F468 1F3FF
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F468 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
1F468 1F3FD
1F468 1F3FD 200D 1F33E
1F468 1F3FD 200D 1F373
+1F468 1F3FD 200D 1F37C
1F468 1F3FD 200D 1F393
1F468 1F3FD 200D 1F3A4
1F468 1F3FD 200D 1F3A8
@@ -944,6 +977,8 @@
1F468 1F3FD 200D 1F692
1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB
1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FE
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FF
1F468 1F3FD 200D 1F9AF
1F468 1F3FD 200D 1F9B0
1F468 1F3FD 200D 1F9B1
@@ -954,9 +989,20 @@
1F468 1F3FD 200D 2695 FE0F
1F468 1F3FD 200D 2696 FE0F
1F468 1F3FD 200D 2708 FE0F
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FB
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FC
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FD
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FE
+1F468 1F3FD 200D 2764 FE0F 200D 1F468 1F3FF
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F468 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
1F468 1F3FE
1F468 1F3FE 200D 1F33E
1F468 1F3FE 200D 1F373
+1F468 1F3FE 200D 1F37C
1F468 1F3FE 200D 1F393
1F468 1F3FE 200D 1F3A4
1F468 1F3FE 200D 1F3A8
@@ -971,6 +1017,7 @@
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FF
1F468 1F3FE 200D 1F9AF
1F468 1F3FE 200D 1F9B0
1F468 1F3FE 200D 1F9B1
@@ -981,9 +1028,20 @@
1F468 1F3FE 200D 2695 FE0F
1F468 1F3FE 200D 2696 FE0F
1F468 1F3FE 200D 2708 FE0F
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FB
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FC
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FD
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FE
+1F468 1F3FE 200D 2764 FE0F 200D 1F468 1F3FF
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F468 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
1F468 1F3FF
1F468 1F3FF 200D 1F33E
1F468 1F3FF 200D 1F373
+1F468 1F3FF 200D 1F37C
1F468 1F3FF 200D 1F393
1F468 1F3FF 200D 1F3A4
1F468 1F3FF 200D 1F3A8
@@ -1009,8 +1067,19 @@
1F468 1F3FF 200D 2695 FE0F
1F468 1F3FF 200D 2696 FE0F
1F468 1F3FF 200D 2708 FE0F
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FB
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FC
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FD
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FE
+1F468 1F3FF 200D 2764 FE0F 200D 1F468 1F3FF
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F468 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
1F468 200D 1F33E
1F468 200D 1F373
+1F468 200D 1F37C
1F468 200D 1F393
1F468 200D 1F3A4
1F468 200D 1F3A8
@@ -1053,6 +1122,7 @@
1F469 1F3FB
1F469 1F3FB 200D 1F33E
1F469 1F3FB 200D 1F373
+1F469 1F3FB 200D 1F37C
1F469 1F3FB 200D 1F393
1F469 1F3FB 200D 1F3A4
1F469 1F3FB 200D 1F3A8
@@ -1068,6 +1138,10 @@
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FC
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FD
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FE
+1F469 1F3FB 200D 1F91D 200D 1F469 1F3FF
1F469 1F3FB 200D 1F9AF
1F469 1F3FB 200D 1F9B0
1F469 1F3FB 200D 1F9B1
@@ -1078,9 +1152,30 @@
1F469 1F3FB 200D 2695 FE0F
1F469 1F3FB 200D 2696 FE0F
1F469 1F3FB 200D 2708 FE0F
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FB
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FC
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FD
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FE
+1F469 1F3FB 200D 2764 FE0F 200D 1F468 1F3FF
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FB
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FC
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FD
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FE
+1F469 1F3FB 200D 2764 FE0F 200D 1F469 1F3FF
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE
+1F469 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF
1F469 1F3FC
1F469 1F3FC 200D 1F33E
1F469 1F3FC 200D 1F373
+1F469 1F3FC 200D 1F37C
1F469 1F3FC 200D 1F393
1F469 1F3FC 200D 1F3A4
1F469 1F3FC 200D 1F3A8
@@ -1097,6 +1192,9 @@
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF
1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FD
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FE
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FF
1F469 1F3FC 200D 1F9AF
1F469 1F3FC 200D 1F9B0
1F469 1F3FC 200D 1F9B1
@@ -1107,9 +1205,30 @@
1F469 1F3FC 200D 2695 FE0F
1F469 1F3FC 200D 2696 FE0F
1F469 1F3FC 200D 2708 FE0F
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FB
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FC
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FD
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FE
+1F469 1F3FC 200D 2764 FE0F 200D 1F468 1F3FF
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FB
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FC
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FD
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FE
+1F469 1F3FC 200D 2764 FE0F 200D 1F469 1F3FF
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE
+1F469 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF
1F469 1F3FD
1F469 1F3FD 200D 1F33E
1F469 1F3FD 200D 1F373
+1F469 1F3FD 200D 1F37C
1F469 1F3FD 200D 1F393
1F469 1F3FD 200D 1F3A4
1F469 1F3FD 200D 1F3A8
@@ -1127,6 +1246,8 @@
1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF
1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB
1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FE
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FF
1F469 1F3FD 200D 1F9AF
1F469 1F3FD 200D 1F9B0
1F469 1F3FD 200D 1F9B1
@@ -1137,9 +1258,30 @@
1F469 1F3FD 200D 2695 FE0F
1F469 1F3FD 200D 2696 FE0F
1F469 1F3FD 200D 2708 FE0F
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FB
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FC
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FD
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FE
+1F469 1F3FD 200D 2764 FE0F 200D 1F468 1F3FF
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FB
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FC
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FD
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FE
+1F469 1F3FD 200D 2764 FE0F 200D 1F469 1F3FF
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE
+1F469 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF
1F469 1F3FE
1F469 1F3FE 200D 1F33E
1F469 1F3FE 200D 1F373
+1F469 1F3FE 200D 1F37C
1F469 1F3FE 200D 1F393
1F469 1F3FE 200D 1F3A4
1F469 1F3FE 200D 1F3A8
@@ -1158,6 +1300,7 @@
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FF
1F469 1F3FE 200D 1F9AF
1F469 1F3FE 200D 1F9B0
1F469 1F3FE 200D 1F9B1
@@ -1168,9 +1311,30 @@
1F469 1F3FE 200D 2695 FE0F
1F469 1F3FE 200D 2696 FE0F
1F469 1F3FE 200D 2708 FE0F
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FB
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FC
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FD
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FE
+1F469 1F3FE 200D 2764 FE0F 200D 1F468 1F3FF
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FB
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FC
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FD
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FE
+1F469 1F3FE 200D 2764 FE0F 200D 1F469 1F3FF
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE
+1F469 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF
1F469 1F3FF
1F469 1F3FF 200D 1F33E
1F469 1F3FF 200D 1F373
+1F469 1F3FF 200D 1F37C
1F469 1F3FF 200D 1F393
1F469 1F3FF 200D 1F3A4
1F469 1F3FF 200D 1F3A8
@@ -1200,8 +1364,29 @@
1F469 1F3FF 200D 2695 FE0F
1F469 1F3FF 200D 2696 FE0F
1F469 1F3FF 200D 2708 FE0F
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FB
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FC
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FD
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FE
+1F469 1F3FF 200D 2764 FE0F 200D 1F468 1F3FF
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FB
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FC
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FD
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FE
+1F469 1F3FF 200D 2764 FE0F 200D 1F469 1F3FF
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FB
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FC
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FD
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FE
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F468 1F3FF
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FB
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FC
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FD
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FE
+1F469 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F469 1F3FF
1F469 200D 1F33E
1F469 200D 1F373
+1F469 200D 1F37C
1F469 200D 1F393
1F469 200D 1F3A4
1F469 200D 1F3A8
@@ -1280,10 +1465,22 @@
1F46F 200D 2642 FE0F
1F470
1F470 1F3FB
+1F470 1F3FB 200D 2640 FE0F
+1F470 1F3FB 200D 2642 FE0F
1F470 1F3FC
+1F470 1F3FC 200D 2640 FE0F
+1F470 1F3FC 200D 2642 FE0F
1F470 1F3FD
+1F470 1F3FD 200D 2640 FE0F
+1F470 1F3FD 200D 2642 FE0F
1F470 1F3FE
+1F470 1F3FE 200D 2640 FE0F
+1F470 1F3FE 200D 2642 FE0F
1F470 1F3FF
+1F470 1F3FF 200D 2640 FE0F
+1F470 1F3FF 200D 2642 FE0F
+1F470 200D 2640 FE0F
+1F470 200D 2642 FE0F
1F471
1F471 1F3FB
1F471 1F3FB 200D 2640 FE0F
@@ -1475,8 +1672,18 @@
1F48D
1F48E
1F48F
+1F48F 1F3FB
+1F48F 1F3FC
+1F48F 1F3FD
+1F48F 1F3FE
+1F48F 1F3FF
1F490
1F491
+1F491 1F3FB
+1F491 1F3FC
+1F491 1F3FD
+1F491 1F3FE
+1F491 1F3FF
1F492
1F493
1F494
@@ -1864,6 +2071,7 @@
1F62C
1F62D
1F62E
+1F62E 200D 1F4A8
1F62F
1F630
1F631
@@ -1871,7 +2079,9 @@
1F633
1F634
1F635
+1F635 200D 1F4AB
1F636
+1F636 200D 1F32B FE0F
1F637
1F638
1F639
@@ -2176,6 +2386,11 @@
1F6D1
1F6D2
1F6D5
+1F6D6
+1F6D7
+1F6DD
+1F6DE
+1F6DF
1F6E0 FE0F
1F6E1 FE0F
1F6E2 FE0F
@@ -2194,6 +2409,8 @@
1F6F8
1F6F9
1F6FA
+1F6FB
+1F6FC
1F7E0
1F7E1
1F7E2
@@ -2206,6 +2423,13 @@
1F7E9
1F7EA
1F7EB
+1F7F0
+1F90C
+1F90C 1F3FB
+1F90C 1F3FC
+1F90C 1F3FD
+1F90C 1F3FE
+1F90C 1F3FF
1F90D
1F90E
1F90F
@@ -2335,10 +2559,22 @@
1F934 1F3FF
1F935
1F935 1F3FB
+1F935 1F3FB 200D 2640 FE0F
+1F935 1F3FB 200D 2642 FE0F
1F935 1F3FC
+1F935 1F3FC 200D 2640 FE0F
+1F935 1F3FC 200D 2642 FE0F
1F935 1F3FD
+1F935 1F3FD 200D 2640 FE0F
+1F935 1F3FD 200D 2642 FE0F
1F935 1F3FE
+1F935 1F3FE 200D 2640 FE0F
+1F935 1F3FE 200D 2642 FE0F
1F935 1F3FF
+1F935 1F3FF 200D 2640 FE0F
+1F935 1F3FF 200D 2642 FE0F
+1F935 200D 2640 FE0F
+1F935 200D 2642 FE0F
1F936
1F936 1F3FB
1F936 1F3FC
@@ -2504,10 +2740,19 @@
1F96F
1F970
1F971
+1F972
1F973
1F974
1F975
1F976
+1F977
+1F977 1F3FB
+1F977 1F3FC
+1F977 1F3FD
+1F977 1F3FE
+1F977 1F3FF
+1F978
+1F979
1F97A
1F97B
1F97C
@@ -2549,12 +2794,17 @@
1F9A0
1F9A1
1F9A2
+1F9A3
+1F9A4
1F9A5
1F9A6
1F9A7
1F9A8
1F9A9
1F9AA
+1F9AB
+1F9AC
+1F9AD
1F9AE
1F9AF
1F9B0
@@ -2633,6 +2883,8 @@
1F9C8
1F9C9
1F9CA
+1F9CB
+1F9CC
1F9CD
1F9CD 1F3FB
1F9CD 1F3FB 200D 2640 FE0F
@@ -2690,26 +2942,226 @@
1F9D0
1F9D1
1F9D1 1F3FB
+1F9D1 1F3FB 200D 1F33E
+1F9D1 1F3FB 200D 1F373
+1F9D1 1F3FB 200D 1F37C
+1F9D1 1F3FB 200D 1F384
+1F9D1 1F3FB 200D 1F393
+1F9D1 1F3FB 200D 1F3A4
+1F9D1 1F3FB 200D 1F3A8
+1F9D1 1F3FB 200D 1F3EB
+1F9D1 1F3FB 200D 1F3ED
+1F9D1 1F3FB 200D 1F4BB
+1F9D1 1F3FB 200D 1F4BC
+1F9D1 1F3FB 200D 1F527
+1F9D1 1F3FB 200D 1F52C
+1F9D1 1F3FB 200D 1F680
+1F9D1 1F3FB 200D 1F692
1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FC
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FD
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FE
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FF
+1F9D1 1F3FB 200D 1F9AF
+1F9D1 1F3FB 200D 1F9B0
+1F9D1 1F3FB 200D 1F9B1
+1F9D1 1F3FB 200D 1F9B2
+1F9D1 1F3FB 200D 1F9B3
+1F9D1 1F3FB 200D 1F9BC
+1F9D1 1F3FB 200D 1F9BD
+1F9D1 1F3FB 200D 2695 FE0F
+1F9D1 1F3FB 200D 2696 FE0F
+1F9D1 1F3FB 200D 2708 FE0F
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FC
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FD
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FE
+1F9D1 1F3FB 200D 2764 FE0F 200D 1F9D1 1F3FF
1F9D1 1F3FC
+1F9D1 1F3FC 200D 1F33E
+1F9D1 1F3FC 200D 1F373
+1F9D1 1F3FC 200D 1F37C
+1F9D1 1F3FC 200D 1F384
+1F9D1 1F3FC 200D 1F393
+1F9D1 1F3FC 200D 1F3A4
+1F9D1 1F3FC 200D 1F3A8
+1F9D1 1F3FC 200D 1F3EB
+1F9D1 1F3FC 200D 1F3ED
+1F9D1 1F3FC 200D 1F4BB
+1F9D1 1F3FC 200D 1F4BC
+1F9D1 1F3FC 200D 1F527
+1F9D1 1F3FC 200D 1F52C
+1F9D1 1F3FC 200D 1F680
+1F9D1 1F3FC 200D 1F692
1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB
1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FD
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FE
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FF
+1F9D1 1F3FC 200D 1F9AF
+1F9D1 1F3FC 200D 1F9B0
+1F9D1 1F3FC 200D 1F9B1
+1F9D1 1F3FC 200D 1F9B2
+1F9D1 1F3FC 200D 1F9B3
+1F9D1 1F3FC 200D 1F9BC
+1F9D1 1F3FC 200D 1F9BD
+1F9D1 1F3FC 200D 2695 FE0F
+1F9D1 1F3FC 200D 2696 FE0F
+1F9D1 1F3FC 200D 2708 FE0F
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FB
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FD
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FE
+1F9D1 1F3FC 200D 2764 FE0F 200D 1F9D1 1F3FF
1F9D1 1F3FD
+1F9D1 1F3FD 200D 1F33E
+1F9D1 1F3FD 200D 1F373
+1F9D1 1F3FD 200D 1F37C
+1F9D1 1F3FD 200D 1F384
+1F9D1 1F3FD 200D 1F393
+1F9D1 1F3FD 200D 1F3A4
+1F9D1 1F3FD 200D 1F3A8
+1F9D1 1F3FD 200D 1F3EB
+1F9D1 1F3FD 200D 1F3ED
+1F9D1 1F3FD 200D 1F4BB
+1F9D1 1F3FD 200D 1F4BC
+1F9D1 1F3FD 200D 1F527
+1F9D1 1F3FD 200D 1F52C
+1F9D1 1F3FD 200D 1F680
+1F9D1 1F3FD 200D 1F692
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FE
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FF
+1F9D1 1F3FD 200D 1F9AF
+1F9D1 1F3FD 200D 1F9B0
+1F9D1 1F3FD 200D 1F9B1
+1F9D1 1F3FD 200D 1F9B2
+1F9D1 1F3FD 200D 1F9B3
+1F9D1 1F3FD 200D 1F9BC
+1F9D1 1F3FD 200D 1F9BD
+1F9D1 1F3FD 200D 2695 FE0F
+1F9D1 1F3FD 200D 2696 FE0F
+1F9D1 1F3FD 200D 2708 FE0F
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FB
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FC
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FE
+1F9D1 1F3FD 200D 2764 FE0F 200D 1F9D1 1F3FF
1F9D1 1F3FE
+1F9D1 1F3FE 200D 1F33E
+1F9D1 1F3FE 200D 1F373
+1F9D1 1F3FE 200D 1F37C
+1F9D1 1F3FE 200D 1F384
+1F9D1 1F3FE 200D 1F393
+1F9D1 1F3FE 200D 1F3A4
+1F9D1 1F3FE 200D 1F3A8
+1F9D1 1F3FE 200D 1F3EB
+1F9D1 1F3FE 200D 1F3ED
+1F9D1 1F3FE 200D 1F4BB
+1F9D1 1F3FE 200D 1F4BC
+1F9D1 1F3FE 200D 1F527
+1F9D1 1F3FE 200D 1F52C
+1F9D1 1F3FE 200D 1F680
+1F9D1 1F3FE 200D 1F692
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FF
+1F9D1 1F3FE 200D 1F9AF
+1F9D1 1F3FE 200D 1F9B0
+1F9D1 1F3FE 200D 1F9B1
+1F9D1 1F3FE 200D 1F9B2
+1F9D1 1F3FE 200D 1F9B3
+1F9D1 1F3FE 200D 1F9BC
+1F9D1 1F3FE 200D 1F9BD
+1F9D1 1F3FE 200D 2695 FE0F
+1F9D1 1F3FE 200D 2696 FE0F
+1F9D1 1F3FE 200D 2708 FE0F
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FF
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FB
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FC
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FD
+1F9D1 1F3FE 200D 2764 FE0F 200D 1F9D1 1F3FF
1F9D1 1F3FF
+1F9D1 1F3FF 200D 1F33E
+1F9D1 1F3FF 200D 1F373
+1F9D1 1F3FF 200D 1F37C
+1F9D1 1F3FF 200D 1F384
+1F9D1 1F3FF 200D 1F393
+1F9D1 1F3FF 200D 1F3A4
+1F9D1 1F3FF 200D 1F3A8
+1F9D1 1F3FF 200D 1F3EB
+1F9D1 1F3FF 200D 1F3ED
+1F9D1 1F3FF 200D 1F4BB
+1F9D1 1F3FF 200D 1F4BC
+1F9D1 1F3FF 200D 1F527
+1F9D1 1F3FF 200D 1F52C
+1F9D1 1F3FF 200D 1F680
+1F9D1 1F3FF 200D 1F692
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF
+1F9D1 1F3FF 200D 1F9AF
+1F9D1 1F3FF 200D 1F9B0
+1F9D1 1F3FF 200D 1F9B1
+1F9D1 1F3FF 200D 1F9B2
+1F9D1 1F3FF 200D 1F9B3
+1F9D1 1F3FF 200D 1F9BC
+1F9D1 1F3FF 200D 1F9BD
+1F9D1 1F3FF 200D 2695 FE0F
+1F9D1 1F3FF 200D 2696 FE0F
+1F9D1 1F3FF 200D 2708 FE0F
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FB
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FC
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FD
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F48B 200D 1F9D1 1F3FE
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FB
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FC
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FD
+1F9D1 1F3FF 200D 2764 FE0F 200D 1F9D1 1F3FE
+1F9D1 200D 1F33E
+1F9D1 200D 1F373
+1F9D1 200D 1F37C
+1F9D1 200D 1F384
+1F9D1 200D 1F393
+1F9D1 200D 1F3A4
+1F9D1 200D 1F3A8
+1F9D1 200D 1F3EB
+1F9D1 200D 1F3ED
+1F9D1 200D 1F4BB
+1F9D1 200D 1F4BC
+1F9D1 200D 1F527
+1F9D1 200D 1F52C
+1F9D1 200D 1F680
+1F9D1 200D 1F692
1F9D1 200D 1F91D 200D 1F9D1
+1F9D1 200D 1F9AF
+1F9D1 200D 1F9B0
+1F9D1 200D 1F9B1
+1F9D1 200D 1F9B2
+1F9D1 200D 1F9B3
+1F9D1 200D 1F9BC
+1F9D1 200D 1F9BD
+1F9D1 200D 2695 FE0F
+1F9D1 200D 2696 FE0F
+1F9D1 200D 2708 FE0F
1F9D2
1F9D2 1F3FB
1F9D2 1F3FC
@@ -2724,10 +3176,22 @@
1F9D3 1F3FF
1F9D4
1F9D4 1F3FB
+1F9D4 1F3FB 200D 2640 FE0F
+1F9D4 1F3FB 200D 2642 FE0F
1F9D4 1F3FC
+1F9D4 1F3FC 200D 2640 FE0F
+1F9D4 1F3FC 200D 2642 FE0F
1F9D4 1F3FD
+1F9D4 1F3FD 200D 2640 FE0F
+1F9D4 1F3FD 200D 2642 FE0F
1F9D4 1F3FE
+1F9D4 1F3FE 200D 2640 FE0F
+1F9D4 1F3FE 200D 2642 FE0F
1F9D4 1F3FF
+1F9D4 1F3FF 200D 2640 FE0F
+1F9D4 1F3FF 200D 2642 FE0F
+1F9D4 200D 2640 FE0F
+1F9D4 200D 2642 FE0F
1F9D5
1F9D5 1F3FB
1F9D5 1F3FC
@@ -2920,18 +3384,160 @@
1FA71
1FA72
1FA73
+1FA74
1FA78
1FA79
1FA7A
+1FA7B
+1FA7C
1FA80
1FA81
1FA82
+1FA83
+1FA84
+1FA85
+1FA86
1FA90
1FA91
1FA92
1FA93
1FA94
1FA95
+1FA96
+1FA97
+1FA98
+1FA99
+1FA9A
+1FA9B
+1FA9C
+1FA9D
+1FA9E
+1FA9F
+1FAA0
+1FAA1
+1FAA2
+1FAA3
+1FAA4
+1FAA5
+1FAA6
+1FAA7
+1FAA8
+1FAA9
+1FAAA
+1FAAB
+1FAAC
+1FAB0
+1FAB1
+1FAB2
+1FAB3
+1FAB4
+1FAB5
+1FAB6
+1FAB7
+1FAB8
+1FAB9
+1FABA
+1FAC0
+1FAC1
+1FAC2
+1FAC3
+1FAC3 1F3FB
+1FAC3 1F3FC
+1FAC3 1F3FD
+1FAC3 1F3FE
+1FAC3 1F3FF
+1FAC4
+1FAC4 1F3FB
+1FAC4 1F3FC
+1FAC4 1F3FD
+1FAC4 1F3FE
+1FAC4 1F3FF
+1FAC5
+1FAC5 1F3FB
+1FAC5 1F3FC
+1FAC5 1F3FD
+1FAC5 1F3FE
+1FAC5 1F3FF
+1FAD0
+1FAD1
+1FAD2
+1FAD3
+1FAD4
+1FAD5
+1FAD6
+1FAD7
+1FAD8
+1FAD9
+1FAE0
+1FAE1
+1FAE2
+1FAE3
+1FAE4
+1FAE5
+1FAE6
+1FAE7
+1FAF0
+1FAF0 1F3FB
+1FAF0 1F3FC
+1FAF0 1F3FD
+1FAF0 1F3FE
+1FAF0 1F3FF
+1FAF1
+1FAF1 1F3FB
+1FAF1 1F3FB 200D 1FAF2 1F3FC
+1FAF1 1F3FB 200D 1FAF2 1F3FD
+1FAF1 1F3FB 200D 1FAF2 1F3FE
+1FAF1 1F3FB 200D 1FAF2 1F3FF
+1FAF1 1F3FC
+1FAF1 1F3FC 200D 1FAF2 1F3FB
+1FAF1 1F3FC 200D 1FAF2 1F3FD
+1FAF1 1F3FC 200D 1FAF2 1F3FE
+1FAF1 1F3FC 200D 1FAF2 1F3FF
+1FAF1 1F3FD
+1FAF1 1F3FD 200D 1FAF2 1F3FB
+1FAF1 1F3FD 200D 1FAF2 1F3FC
+1FAF1 1F3FD 200D 1FAF2 1F3FE
+1FAF1 1F3FD 200D 1FAF2 1F3FF
+1FAF1 1F3FE
+1FAF1 1F3FE 200D 1FAF2 1F3FB
+1FAF1 1F3FE 200D 1FAF2 1F3FC
+1FAF1 1F3FE 200D 1FAF2 1F3FD
+1FAF1 1F3FE 200D 1FAF2 1F3FF
+1FAF1 1F3FF
+1FAF1 1F3FF 200D 1FAF2 1F3FB
+1FAF1 1F3FF 200D 1FAF2 1F3FC
+1FAF1 1F3FF 200D 1FAF2 1F3FD
+1FAF1 1F3FF 200D 1FAF2 1F3FE
+1FAF2
+1FAF2 1F3FB
+1FAF2 1F3FC
+1FAF2 1F3FD
+1FAF2 1F3FE
+1FAF2 1F3FF
+1FAF3
+1FAF3 1F3FB
+1FAF3 1F3FC
+1FAF3 1F3FD
+1FAF3 1F3FE
+1FAF3 1F3FF
+1FAF4
+1FAF4 1F3FB
+1FAF4 1F3FC
+1FAF4 1F3FD
+1FAF4 1F3FE
+1FAF4 1F3FF
+1FAF5
+1FAF5 1F3FB
+1FAF5 1F3FC
+1FAF5 1F3FD
+1FAF5 1F3FE
+1FAF5 1F3FF
+1FAF6
+1FAF6 1F3FB
+1FAF6 1F3FC
+1FAF6 1F3FD
+1FAF6 1F3FE
+1FAF6 1F3FF
203C FE0F
2049 FE0F
2122 FE0F
@@ -3066,6 +3672,7 @@
26A0 FE0F
26A1
26A1 FE0F
+26A7 FE0F
26AA
26AA FE0F
26AB
@@ -3175,6 +3782,8 @@
2763 FE0F
2764
2764 FE0F
+2764 FE0F 200D 1F525
+2764 FE0F 200D 1FA79
2795
2796
2797
@@ -3222,3 +3831,152 @@
39 FE0F 20E3
A9 FE0F
AE FE0F
+1F426 200D 2B1B
+1F6DC
+1FA75
+1FA76
+1FA77
+1FA87
+1FA88
+1FAAD
+1FAAE
+1FAAF
+1FABB
+1FABC
+1FABD
+1FABF
+1FACE
+1FACF
+1FADA
+1FADB
+1FAE8
+1FAF7
+1FAF7 1F3FB
+1FAF7 1F3FC
+1FAF7 1F3FD
+1FAF7 1F3FE
+1FAF7 1F3FF
+1FAF8
+1FAF8 1F3FB
+1FAF8 1F3FC
+1FAF8 1F3FD
+1FAF8 1F3FE
+1FAF8 1F3FF
+26D3 200D 1F4A5
+1F344 200D 1F7EB
+1F34B 200D 1F7E9
+1F3C3 200D 2640 200D 27A1
+1F3C3 200D 2642 200D 27A1
+1F3C3 200D 27A1
+1F3C3 1F3FB 200D 2640 200D 27A1
+1F3C3 1F3FB 200D 2642 200D 27A1
+1F3C3 1F3FB 200D 27A1
+1F3C3 1F3FC 200D 2640 200D 27A1
+1F3C3 1F3FC 200D 2642 200D 27A1
+1F3C3 1F3FC 200D 27A1
+1F3C3 1F3FD 200D 2640 200D 27A1
+1F3C3 1F3FD 200D 2642 200D 27A1
+1F3C3 1F3FD 200D 27A1
+1F3C3 1F3FE 200D 2640 200D 27A1
+1F3C3 1F3FE 200D 2642 200D 27A1
+1F3C3 1F3FE 200D 27A1
+1F3C3 1F3FF 200D 2640 200D 27A1
+1F3C3 1F3FF 200D 2642 200D 27A1
+1F3C3 1F3FF 200D 27A1
+1F426 200D 1F525
+1F468 200D 1F9AF 200D 27A1
+1F468 200D 1F9BC 200D 27A1
+1F468 200D 1F9BD 200D 27A1
+1F468 1F3FB 200D 1F9AF 200D 27A1
+1F468 1F3FB 200D 1F9BC 200D 27A1
+1F468 1F3FB 200D 1F9BD 200D 27A1
+1F468 1F3FC 200D 1F9AF 200D 27A1
+1F468 1F3FC 200D 1F9BC 200D 27A1
+1F468 1F3FC 200D 1F9BD 200D 27A1
+1F468 1F3FD 200D 1F9AF 200D 27A1
+1F468 1F3FD 200D 1F9BC 200D 27A1
+1F468 1F3FD 200D 1F9BD 200D 27A1
+1F468 1F3FE 200D 1F9AF 200D 27A1
+1F468 1F3FE 200D 1F9BC 200D 27A1
+1F468 1F3FE 200D 1F9BD 200D 27A1
+1F468 1F3FF 200D 1F9AF 200D 27A1
+1F468 1F3FF 200D 1F9BC 200D 27A1
+1F468 1F3FF 200D 1F9BD 200D 27A1
+1F469 200D 1F9AF 200D 27A1
+1F469 200D 1F9BC 200D 27A1
+1F469 200D 1F9BD 200D 27A1
+1F469 1F3FB 200D 1F9AF 200D 27A1
+1F469 1F3FB 200D 1F9BC 200D 27A1
+1F469 1F3FB 200D 1F9BD 200D 27A1
+1F469 1F3FC 200D 1F9AF 200D 27A1
+1F469 1F3FC 200D 1F9BC 200D 27A1
+1F469 1F3FC 200D 1F9BD 200D 27A1
+1F469 1F3FD 200D 1F9AF 200D 27A1
+1F469 1F3FD 200D 1F9BC 200D 27A1
+1F469 1F3FD 200D 1F9BD 200D 27A1
+1F469 1F3FE 200D 1F9AF 200D 27A1
+1F469 1F3FE 200D 1F9BC 200D 27A1
+1F469 1F3FE 200D 1F9BD 200D 27A1
+1F469 1F3FF 200D 1F9AF 200D 27A1
+1F469 1F3FF 200D 1F9BC 200D 27A1
+1F469 1F3FF 200D 1F9BD 200D 27A1
+1F642 200D 2194
+1F642 200D 2195
+1F6B6 200D 2640 200D 27A1
+1F6B6 200D 2642 200D 27A1
+1F6B6 200D 27A1
+1F6B6 1F3FB 200D 2640 200D 27A1
+1F6B6 1F3FB 200D 2642 200D 27A1
+1F6B6 1F3FB 200D 27A1
+1F6B6 1F3FC 200D 2640 200D 27A1
+1F6B6 1F3FC 200D 2642 200D 27A1
+1F6B6 1F3FC 200D 27A1
+1F6B6 1F3FD 200D 2640 200D 27A1
+1F6B6 1F3FD 200D 2642 200D 27A1
+1F6B6 1F3FD 200D 27A1
+1F6B6 1F3FE 200D 2640 200D 27A1
+1F6B6 1F3FE 200D 2642 200D 27A1
+1F6B6 1F3FE 200D 27A1
+1F6B6 1F3FF 200D 2640 200D 27A1
+1F6B6 1F3FF 200D 2642 200D 27A1
+1F6B6 1F3FF 200D 27A1
+1F9CE 200D 2640 200D 27A1
+1F9CE 200D 2642 200D 27A1
+1F9CE 200D 27A1
+1F9CE 1F3FB 200D 2640 200D 27A1
+1F9CE 1F3FB 200D 2642 200D 27A1
+1F9CE 1F3FB 200D 27A1
+1F9CE 1F3FC 200D 2640 200D 27A1
+1F9CE 1F3FC 200D 2642 200D 27A1
+1F9CE 1F3FC 200D 27A1
+1F9CE 1F3FD 200D 2640 200D 27A1
+1F9CE 1F3FD 200D 2642 200D 27A1
+1F9CE 1F3FD 200D 27A1
+1F9CE 1F3FE 200D 2640 200D 27A1
+1F9CE 1F3FE 200D 2642 200D 27A1
+1F9CE 1F3FE 200D 27A1
+1F9CE 1F3FF 200D 2640 200D 27A1
+1F9CE 1F3FF 200D 2642 200D 27A1
+1F9CE 1F3FF 200D 27A1
+1F9D1 200D 1F9AF 200D 27A1
+1F9D1 200D 1F9BC 200D 27A1
+1F9D1 200D 1F9BD 200D 27A1
+1F9D1 200D 1F9D1 200D 1F9D2
+1F9D1 200D 1F9D1 200D 1F9D2 200D 1F9D2
+1F9D1 200D 1F9D2
+1F9D1 200D 1F9D2 200D 1F9D2
+1F9D1 1F3FB 200D 1F9AF 200D 27A1
+1F9D1 1F3FB 200D 1F9BC 200D 27A1
+1F9D1 1F3FB 200D 1F9BD 200D 27A1
+1F9D1 1F3FC 200D 1F9AF 200D 27A1
+1F9D1 1F3FC 200D 1F9BC 200D 27A1
+1F9D1 1F3FC 200D 1F9BD 200D 27A1
+1F9D1 1F3FD 200D 1F9AF 200D 27A1
+1F9D1 1F3FD 200D 1F9BC 200D 27A1
+1F9D1 1F3FD 200D 1F9BD 200D 27A1
+1F9D1 1F3FE 200D 1F9AF 200D 27A1
+1F9D1 1F3FE 200D 1F9BC 200D 27A1
+1F9D1 1F3FE 200D 1F9BD 200D 27A1
+1F9D1 1F3FF 200D 1F9AF 200D 27A1
+1F9D1 1F3FF 200D 1F9BC 200D 27A1
+1F9D1 1F3FF 200D 1F9BD 200D 27A1
diff --git a/emoji/NotoColorEmoji.ttf b/emoji/NotoColorEmoji.ttf
index 3c2688f..98fadf4 100644
--- a/emoji/NotoColorEmoji.ttf
+++ b/emoji/NotoColorEmoji.ttf
Binary files differ
diff --git a/fonts.mk b/fonts.mk
index fee43e2..13bfbfb 100644
--- a/fonts.mk
+++ b/fonts.mk
@@ -22,7 +22,7 @@ PRODUCT_PACKAGES := \
NotoNaskhArabic-Regular.ttf \
NotoNaskhArabicUI-Bold.ttf \
NotoNaskhArabicUI-Regular.ttf \
- NotoSansAdlam-Regular.ttf \
+ NotoSansAdlam-VF.ttf \
NotoSansAhom-Regular.otf \
NotoSansAnatolianHieroglyphs-Regular.otf \
NotoSansArmenian-Bold.otf \
@@ -64,19 +64,19 @@ PRODUCT_PACKAGES := \
NotoSansElbasan-Regular.otf \
NotoSansEthiopic-Bold.ttf \
NotoSansEthiopic-Regular.ttf \
- NotoSansGeorgian-Bold.otf \
- NotoSansGeorgian-Medium.otf \
- NotoSansGeorgian-Regular.otf \
+ NotoSansGeorgian-VF.ttf \
NotoSansGlagolitic-Regular.ttf \
NotoSansGothic-Regular.ttf \
NotoSansGujarati-Bold.ttf \
NotoSansGujarati-Regular.ttf \
NotoSansGujaratiUI-Bold.ttf \
NotoSansGujaratiUI-Regular.ttf \
+ NotoSansGunjalaGondi-Regular.otf \
NotoSansGurmukhi-Bold.ttf \
NotoSansGurmukhi-Regular.ttf \
NotoSansGurmukhiUI-Bold.ttf \
NotoSansGurmukhiUI-Regular.ttf \
+ NotoSansHanifiRohingya-Regular.otf \
NotoSansHanunoo-Regular.ttf \
NotoSansHatran-Regular.otf \
NotoSansHebrew-Bold.ttf \
@@ -84,7 +84,7 @@ PRODUCT_PACKAGES := \
NotoSansImperialAramaic-Regular.ttf \
NotoSansInscriptionalPahlavi-Regular.ttf \
NotoSansInscriptionalParthian-Regular.ttf \
- NotoSansJavanese-Regular.ttf \
+ NotoSansJavanese-Regular.otf \
NotoSansKaithi-Regular.ttf \
NotoSansKannada-Bold.ttf \
NotoSansKannada-Regular.ttf \
@@ -95,6 +95,7 @@ PRODUCT_PACKAGES := \
NotoSansKhmer-VF.ttf \
NotoSansKhmerUI-Bold.ttf \
NotoSansKhmerUI-Regular.ttf \
+ NotoSansKhojki-Regular.otf \
NotoSansLao-Bold.ttf \
NotoSansLao-Regular.ttf \
NotoSansLaoUI-Bold.ttf \
@@ -115,6 +116,7 @@ PRODUCT_PACKAGES := \
NotoSansMandaic-Regular.ttf \
NotoSansManichaean-Regular.otf \
NotoSansMarchen-Regular.otf \
+ NotoSansMasaramGondi-Regular.otf \
NotoSansMeeteiMayek-Regular.ttf \
NotoSansMeroitic-Regular.otf \
NotoSansMiao-Regular.otf \
@@ -193,9 +195,11 @@ PRODUCT_PACKAGES := \
NotoSansThaiUI-Regular.ttf \
NotoSansTibetan-Bold.ttf \
NotoSansTibetan-Regular.ttf \
- NotoSansTifinagh-Regular.ttf \
+ NotoSansTifinagh-Regular.otf \
NotoSansUgaritic-Regular.ttf \
NotoSansVai-Regular.ttf \
+ NotoSansWancho-Regular.otf \
+ NotoSansWarangCiti-Regular.otf \
NotoSansYi-Regular.ttf \
NotoSerif-Bold.ttf \
NotoSerif-BoldItalic.ttf \
@@ -210,8 +214,7 @@ PRODUCT_PACKAGES := \
NotoSerifDevanagari-Regular.ttf \
NotoSerifEthiopic-Bold.otf \
NotoSerifEthiopic-Regular.otf \
- NotoSerifGeorgian-Bold.otf \
- NotoSerifGeorgian-Regular.otf \
+ NotoSerifGeorgian-VF.ttf \
NotoSerifGujarati-Bold.ttf \
NotoSerifGujarati-Regular.ttf \
NotoSerifGurmukhi-Bold.otf \
diff --git a/other/Android.bp b/other/Android.bp
index d439501..7c2cd2b 100644
--- a/other/Android.bp
+++ b/other/Android.bp
@@ -33,8 +33,8 @@ prebuilt_font {
}
prebuilt_font {
- name: "NotoSansAdlam-Regular.ttf",
- src: "NotoSansAdlam-Regular.ttf",
+ name: "NotoSansAdlam-VF.ttf",
+ src: "NotoSansAdlam-VF.ttf",
}
prebuilt_font {
@@ -268,8 +268,8 @@ prebuilt_font {
}
prebuilt_font {
- name: "NotoSansJavanese-Regular.ttf",
- src: "NotoSansJavanese-Regular.ttf",
+ name: "NotoSansJavanese-Regular.otf",
+ src: "NotoSansJavanese-Regular.otf",
}
prebuilt_font {
@@ -778,11 +778,6 @@ prebuilt_font {
}
prebuilt_font {
- name: "NotoSansTifinagh-Regular.ttf",
- src: "NotoSansTifinagh-Regular.ttf",
-}
-
-prebuilt_font {
name: "NotoSansUgaritic-Regular.ttf",
src: "NotoSansUgaritic-Regular.ttf",
}
@@ -863,18 +858,8 @@ prebuilt_font {
}
prebuilt_font {
- name: "NotoSansGeorgian-Regular.otf",
- src: "NotoSansGeorgian-Regular.otf",
-}
-
-prebuilt_font {
- name: "NotoSansGeorgian-Bold.otf",
- src: "NotoSansGeorgian-Bold.otf",
-}
-
-prebuilt_font {
- name: "NotoSansGeorgian-Medium.otf",
- src: "NotoSansGeorgian-Medium.otf",
+ name: "NotoSansGeorgian-VF.ttf",
+ src: "NotoSansGeorgian-VF.ttf",
}
prebuilt_font {
@@ -923,6 +908,41 @@ prebuilt_font {
}
prebuilt_font {
+ name: "NotoSansGunjalaGondi-Regular.otf",
+ src: "NotoSansGunjalaGondi-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansHanifiRohingya-Regular.otf",
+ src: "NotoSansHanifiRohingya-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansKhojki-Regular.otf",
+ src: "NotoSansKhojki-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansMasaramGondi-Regular.otf",
+ src: "NotoSansMasaramGondi-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansTifinagh-Regular.otf",
+ src: "NotoSansTifinagh-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansWancho-Regular.otf",
+ src: "NotoSansWancho-Regular.otf",
+}
+
+prebuilt_font {
+ name: "NotoSansWarangCiti-Regular.otf",
+ src: "NotoSansWarangCiti-Regular.otf",
+}
+
+prebuilt_font {
name: "NotoSerifArmenian-Regular.otf",
src: "NotoSerifArmenian-Regular.otf",
}
@@ -958,13 +978,8 @@ prebuilt_font {
}
prebuilt_font {
- name: "NotoSerifGeorgian-Bold.otf",
- src: "NotoSerifGeorgian-Bold.otf",
-}
-
-prebuilt_font {
- name: "NotoSerifGeorgian-Regular.otf",
- src: "NotoSerifGeorgian-Regular.otf",
+ name: "NotoSerifGeorgian-VF.ttf",
+ src: "NotoSerifGeorgian-VF.ttf",
}
prebuilt_font {
diff --git a/other/NotoSansAdlam-Regular.ttf b/other/NotoSansAdlam-Regular.ttf
deleted file mode 100644
index 20ea4ba..0000000
--- a/other/NotoSansAdlam-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansAdlam-VF.ttf b/other/NotoSansAdlam-VF.ttf
new file mode 100644
index 0000000..a1c9159
--- /dev/null
+++ b/other/NotoSansAdlam-VF.ttf
Binary files differ
diff --git a/other/NotoSansGeorgian-Bold.otf b/other/NotoSansGeorgian-Bold.otf
deleted file mode 100644
index 086bd40..0000000
--- a/other/NotoSansGeorgian-Bold.otf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansGeorgian-Medium.otf b/other/NotoSansGeorgian-Medium.otf
deleted file mode 100644
index 15e5eb6..0000000
--- a/other/NotoSansGeorgian-Medium.otf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansGeorgian-Regular.otf b/other/NotoSansGeorgian-Regular.otf
deleted file mode 100644
index e59f368..0000000
--- a/other/NotoSansGeorgian-Regular.otf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansGeorgian-VF.ttf b/other/NotoSansGeorgian-VF.ttf
new file mode 100644
index 0000000..25df7f1
--- /dev/null
+++ b/other/NotoSansGeorgian-VF.ttf
Binary files differ
diff --git a/other/NotoSansGunjalaGondi-Regular.otf b/other/NotoSansGunjalaGondi-Regular.otf
new file mode 100644
index 0000000..4cc0fa3
--- /dev/null
+++ b/other/NotoSansGunjalaGondi-Regular.otf
Binary files differ
diff --git a/other/NotoSansHanifiRohingya-Regular.otf b/other/NotoSansHanifiRohingya-Regular.otf
new file mode 100644
index 0000000..f3dc231
--- /dev/null
+++ b/other/NotoSansHanifiRohingya-Regular.otf
Binary files differ
diff --git a/other/NotoSansJavanese-Regular.otf b/other/NotoSansJavanese-Regular.otf
new file mode 100644
index 0000000..e1aa665
--- /dev/null
+++ b/other/NotoSansJavanese-Regular.otf
Binary files differ
diff --git a/other/NotoSansJavanese-Regular.ttf b/other/NotoSansJavanese-Regular.ttf
deleted file mode 100644
index 2a855ed..0000000
--- a/other/NotoSansJavanese-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansKhojki-Regular.otf b/other/NotoSansKhojki-Regular.otf
new file mode 100644
index 0000000..99146ac
--- /dev/null
+++ b/other/NotoSansKhojki-Regular.otf
Binary files differ
diff --git a/other/NotoSansMasaramGondi-Regular.otf b/other/NotoSansMasaramGondi-Regular.otf
new file mode 100644
index 0000000..8833d01
--- /dev/null
+++ b/other/NotoSansMasaramGondi-Regular.otf
Binary files differ
diff --git a/other/NotoSansTifinagh-Regular.otf b/other/NotoSansTifinagh-Regular.otf
new file mode 100644
index 0000000..c8b87c8
--- /dev/null
+++ b/other/NotoSansTifinagh-Regular.otf
Binary files differ
diff --git a/other/NotoSansTifinagh-Regular.ttf b/other/NotoSansTifinagh-Regular.ttf
deleted file mode 100644
index 252a0dc..0000000
--- a/other/NotoSansTifinagh-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSansWancho-Regular.otf b/other/NotoSansWancho-Regular.otf
new file mode 100644
index 0000000..af941de
--- /dev/null
+++ b/other/NotoSansWancho-Regular.otf
Binary files differ
diff --git a/other/NotoSansWarangCiti-Regular.otf b/other/NotoSansWarangCiti-Regular.otf
new file mode 100644
index 0000000..5da59fe
--- /dev/null
+++ b/other/NotoSansWarangCiti-Regular.otf
Binary files differ
diff --git a/other/NotoSerifGeorgian-Bold.otf b/other/NotoSerifGeorgian-Bold.otf
deleted file mode 100644
index 1c2c01f..0000000
--- a/other/NotoSerifGeorgian-Bold.otf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSerifGeorgian-Regular.otf b/other/NotoSerifGeorgian-Regular.otf
deleted file mode 100644
index f0186e6..0000000
--- a/other/NotoSerifGeorgian-Regular.otf
+++ /dev/null
Binary files differ
diff --git a/other/NotoSerifGeorgian-VF.ttf b/other/NotoSerifGeorgian-VF.ttf
new file mode 100644
index 0000000..29b0eb8
--- /dev/null
+++ b/other/NotoSerifGeorgian-VF.ttf
Binary files differ