On Fri, 2025-02-14 at 09:02 +0100, Peter Eisentraut wrote:
> This all looks quite reasonable to me.  The code could obviously use
> a 
> bit closer inspection, but the way you've structured it looked quite 
> okay to me.

Attached a version that rebases both patches. In my patch, I added a
report_status().

Note that the Unicode update has a few test diffs for NORMALIZE(),
please check to see if the tests themselves need an update.

Regards,
        Jeff Davis

From 41f75a242122fd5d9bd5fada24d97293a340f5fb Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 11 Nov 2024 07:21:48 +0100
Subject: [PATCH v2 1/2] Update Unicode data to Unicode 16.0.0

---
 src/Makefile.global.in                        |   2 +-
 src/common/unicode/meson.build                |   2 +-
 src/include/common/unicode_case_table.h       |  56 +-
 src/include/common/unicode_category_table.h   | 184 +++-
 .../common/unicode_east_asian_fw_table.h      |  20 +-
 src/include/common/unicode_nonspacing_table.h |  18 +-
 src/include/common/unicode_norm_table.h       | 884 ++++++++++--------
 src/include/common/unicode_version.h          |   2 +-
 src/test/regress/expected/unicode.out         |   6 +-
 9 files changed, 729 insertions(+), 445 deletions(-)

diff --git a/src/Makefile.global.in b/src/Makefile.global.in
index bbe11e75bf0..ebf2dd02eeb 100644
--- a/src/Makefile.global.in
+++ b/src/Makefile.global.in
@@ -357,7 +357,7 @@ DOWNLOAD = wget -O $@ --no-use-server-timestamps
 # Pick a release from here: <https://www.unicode.org/Public/>.  Note
 # that the most recent release listed there is often a pre-release;
 # don't pick that one, except for testing.
-UNICODE_VERSION = 15.1.0
+UNICODE_VERSION = 16.0.0
 
 # Pick a release from here: <http://cldr.unicode.org/index/downloads>
 CLDR_VERSION = 45
diff --git a/src/common/unicode/meson.build b/src/common/unicode/meson.build
index b98940de279..c6a4715ccc5 100644
--- a/src/common/unicode/meson.build
+++ b/src/common/unicode/meson.build
@@ -1,6 +1,6 @@
 # Copyright (c) 2022-2025, PostgreSQL Global Development Group
 
-UNICODE_VERSION = '15.1.0'
+UNICODE_VERSION = '16.0.0'
 
 unicode_data = {}
 unicode_baseurl = 'https://www.unicode.org/Public/@0@/ucd/@1@'
diff --git a/src/include/common/unicode_case_table.h b/src/include/common/unicode_case_table.h
index 7ad284913d7..56493cc4463 100644
--- a/src/include/common/unicode_case_table.h
+++ b/src/include/common/unicode_case_table.h
@@ -174,7 +174,7 @@ static const pg_special_case special_case[106] =
  * Case mapping table. Dense for codepoints < 0x80 (enabling fast lookup),
  * sparse for higher codepoints (requiring scan or binary search).
  */
-static const pg_case_map case_map[3003] =
+static const pg_case_map case_map[3057] =
 {
 	/* begin dense entries for codepoints < 0x80 */
 	{0x000000, {[CaseLower] = 0x000000,[CaseTitle] = 0x000000,[CaseUpper] = 0x000000,[CaseFold] = 0x000000}, NULL},
@@ -523,6 +523,7 @@ static const pg_case_map case_map[3003] =
 	{0x000198, {[CaseLower] = 0x000199,[CaseTitle] = 0x000198,[CaseUpper] = 0x000198,[CaseFold] = 0x000199}, NULL},
 	{0x000199, {[CaseLower] = 0x000199,[CaseTitle] = 0x000198,[CaseUpper] = 0x000198,[CaseFold] = 0x000199}, NULL},
 	{0x00019a, {[CaseLower] = 0x00019a,[CaseTitle] = 0x00023d,[CaseUpper] = 0x00023d,[CaseFold] = 0x00019a}, NULL},
+	{0x00019b, {[CaseLower] = 0x00019b,[CaseTitle] = 0x00a7dc,[CaseUpper] = 0x00a7dc,[CaseFold] = 0x00019b}, NULL},
 	{0x00019c, {[CaseLower] = 0x00026f,[CaseTitle] = 0x00019c,[CaseUpper] = 0x00019c,[CaseFold] = 0x00026f}, NULL},
 	{0x00019d, {[CaseLower] = 0x000272,[CaseTitle] = 0x00019d,[CaseUpper] = 0x00019d,[CaseFold] = 0x000272}, NULL},
 	{0x00019e, {[CaseLower] = 0x00019e,[CaseTitle] = 0x000220,[CaseUpper] = 0x000220,[CaseFold] = 0x00019e}, NULL},
@@ -700,6 +701,7 @@ static const pg_case_map case_map[3003] =
 	{0x000260, {[CaseLower] = 0x000260,[CaseTitle] = 0x000193,[CaseUpper] = 0x000193,[CaseFold] = 0x000260}, NULL},
 	{0x000261, {[CaseLower] = 0x000261,[CaseTitle] = 0x00a7ac,[CaseUpper] = 0x00a7ac,[CaseFold] = 0x000261}, NULL},
 	{0x000263, {[CaseLower] = 0x000263,[CaseTitle] = 0x000194,[CaseUpper] = 0x000194,[CaseFold] = 0x000263}, NULL},
+	{0x000264, {[CaseLower] = 0x000264,[CaseTitle] = 0x00a7cb,[CaseUpper] = 0x00a7cb,[CaseFold] = 0x000264}, NULL},
 	{0x000265, {[CaseLower] = 0x000265,[CaseTitle] = 0x00a78d,[CaseUpper] = 0x00a78d,[CaseFold] = 0x000265}, NULL},
 	{0x000266, {[CaseLower] = 0x000266,[CaseTitle] = 0x00a7aa,[CaseUpper] = 0x00a7aa,[CaseFold] = 0x000266}, NULL},
 	{0x000268, {[CaseLower] = 0x000268,[CaseTitle] = 0x000197,[CaseUpper] = 0x000197,[CaseFold] = 0x000268}, NULL},
@@ -1408,6 +1410,8 @@ static const pg_case_map case_map[3003] =
 	{0x001c86, {[CaseLower] = 0x001c86,[CaseTitle] = 0x00042a,[CaseUpper] = 0x00042a,[CaseFold] = 0x00044a}, NULL},
 	{0x001c87, {[CaseLower] = 0x001c87,[CaseTitle] = 0x000462,[CaseUpper] = 0x000462,[CaseFold] = 0x000463}, NULL},
 	{0x001c88, {[CaseLower] = 0x001c88,[CaseTitle] = 0x00a64a,[CaseUpper] = 0x00a64a,[CaseFold] = 0x00a64b}, NULL},
+	{0x001c89, {[CaseLower] = 0x001c8a,[CaseTitle] = 0x001c89,[CaseUpper] = 0x001c89,[CaseFold] = 0x001c8a}, NULL},
+	{0x001c8a, {[CaseLower] = 0x001c8a,[CaseTitle] = 0x001c89,[CaseUpper] = 0x001c89,[CaseFold] = 0x001c8a}, NULL},
 	{0x001c90, {[CaseLower] = 0x0010d0,[CaseTitle] = 0x001c90,[CaseUpper] = 0x001c90,[CaseFold] = 0x0010d0}, NULL},
 	{0x001c91, {[CaseLower] = 0x0010d1,[CaseTitle] = 0x001c91,[CaseUpper] = 0x001c91,[CaseFold] = 0x0010d1}, NULL},
 	{0x001c92, {[CaseLower] = 0x0010d2,[CaseTitle] = 0x001c92,[CaseUpper] = 0x001c92,[CaseFold] = 0x0010d2}, NULL},
@@ -2509,12 +2513,18 @@ static const pg_case_map case_map[3003] =
 	{0x00a7c8, {[CaseLower] = 0x00a7c8,[CaseTitle] = 0x00a7c7,[CaseUpper] = 0x00a7c7,[CaseFold] = 0x00a7c8}, NULL},
 	{0x00a7c9, {[CaseLower] = 0x00a7ca,[CaseTitle] = 0x00a7c9,[CaseUpper] = 0x00a7c9,[CaseFold] = 0x00a7ca}, NULL},
 	{0x00a7ca, {[CaseLower] = 0x00a7ca,[CaseTitle] = 0x00a7c9,[CaseUpper] = 0x00a7c9,[CaseFold] = 0x00a7ca}, NULL},
+	{0x00a7cb, {[CaseLower] = 0x000264,[CaseTitle] = 0x00a7cb,[CaseUpper] = 0x00a7cb,[CaseFold] = 0x000264}, NULL},
+	{0x00a7cc, {[CaseLower] = 0x00a7cd,[CaseTitle] = 0x00a7cc,[CaseUpper] = 0x00a7cc,[CaseFold] = 0x00a7cd}, NULL},
+	{0x00a7cd, {[CaseLower] = 0x00a7cd,[CaseTitle] = 0x00a7cc,[CaseUpper] = 0x00a7cc,[CaseFold] = 0x00a7cd}, NULL},
 	{0x00a7d0, {[CaseLower] = 0x00a7d1,[CaseTitle] = 0x00a7d0,[CaseUpper] = 0x00a7d0,[CaseFold] = 0x00a7d1}, NULL},
 	{0x00a7d1, {[CaseLower] = 0x00a7d1,[CaseTitle] = 0x00a7d0,[CaseUpper] = 0x00a7d0,[CaseFold] = 0x00a7d1}, NULL},
 	{0x00a7d6, {[CaseLower] = 0x00a7d7,[CaseTitle] = 0x00a7d6,[CaseUpper] = 0x00a7d6,[CaseFold] = 0x00a7d7}, NULL},
 	{0x00a7d7, {[CaseLower] = 0x00a7d7,[CaseTitle] = 0x00a7d6,[CaseUpper] = 0x00a7d6,[CaseFold] = 0x00a7d7}, NULL},
 	{0x00a7d8, {[CaseLower] = 0x00a7d9,[CaseTitle] = 0x00a7d8,[CaseUpper] = 0x00a7d8,[CaseFold] = 0x00a7d9}, NULL},
 	{0x00a7d9, {[CaseLower] = 0x00a7d9,[CaseTitle] = 0x00a7d8,[CaseUpper] = 0x00a7d8,[CaseFold] = 0x00a7d9}, NULL},
+	{0x00a7da, {[CaseLower] = 0x00a7db,[CaseTitle] = 0x00a7da,[CaseUpper] = 0x00a7da,[CaseFold] = 0x00a7db}, NULL},
+	{0x00a7db, {[CaseLower] = 0x00a7db,[CaseTitle] = 0x00a7da,[CaseUpper] = 0x00a7da,[CaseFold] = 0x00a7db}, NULL},
+	{0x00a7dc, {[CaseLower] = 0x00019b,[CaseTitle] = 0x00a7dc,[CaseUpper] = 0x00a7dc,[CaseFold] = 0x00019b}, NULL},
 	{0x00a7f5, {[CaseLower] = 0x00a7f6,[CaseTitle] = 0x00a7f5,[CaseUpper] = 0x00a7f5,[CaseFold] = 0x00a7f6}, NULL},
 	{0x00a7f6, {[CaseLower] = 0x00a7f6,[CaseTitle] = 0x00a7f5,[CaseUpper] = 0x00a7f5,[CaseFold] = 0x00a7f6}, NULL},
 	{0x00ab53, {[CaseLower] = 0x00ab53,[CaseTitle] = 0x00a7b3,[CaseUpper] = 0x00a7b3,[CaseFold] = 0x00ab53}, NULL},
@@ -2986,6 +2996,50 @@ static const pg_case_map case_map[3003] =
 	{0x010cf0, {[CaseLower] = 0x010cf0,[CaseTitle] = 0x010cb0,[CaseUpper] = 0x010cb0,[CaseFold] = 0x010cf0}, NULL},
 	{0x010cf1, {[CaseLower] = 0x010cf1,[CaseTitle] = 0x010cb1,[CaseUpper] = 0x010cb1,[CaseFold] = 0x010cf1}, NULL},
 	{0x010cf2, {[CaseLower] = 0x010cf2,[CaseTitle] = 0x010cb2,[CaseUpper] = 0x010cb2,[CaseFold] = 0x010cf2}, NULL},
+	{0x010d50, {[CaseLower] = 0x010d70,[CaseTitle] = 0x010d50,[CaseUpper] = 0x010d50,[CaseFold] = 0x010d70}, NULL},
+	{0x010d51, {[CaseLower] = 0x010d71,[CaseTitle] = 0x010d51,[CaseUpper] = 0x010d51,[CaseFold] = 0x010d71}, NULL},
+	{0x010d52, {[CaseLower] = 0x010d72,[CaseTitle] = 0x010d52,[CaseUpper] = 0x010d52,[CaseFold] = 0x010d72}, NULL},
+	{0x010d53, {[CaseLower] = 0x010d73,[CaseTitle] = 0x010d53,[CaseUpper] = 0x010d53,[CaseFold] = 0x010d73}, NULL},
+	{0x010d54, {[CaseLower] = 0x010d74,[CaseTitle] = 0x010d54,[CaseUpper] = 0x010d54,[CaseFold] = 0x010d74}, NULL},
+	{0x010d55, {[CaseLower] = 0x010d75,[CaseTitle] = 0x010d55,[CaseUpper] = 0x010d55,[CaseFold] = 0x010d75}, NULL},
+	{0x010d56, {[CaseLower] = 0x010d76,[CaseTitle] = 0x010d56,[CaseUpper] = 0x010d56,[CaseFold] = 0x010d76}, NULL},
+	{0x010d57, {[CaseLower] = 0x010d77,[CaseTitle] = 0x010d57,[CaseUpper] = 0x010d57,[CaseFold] = 0x010d77}, NULL},
+	{0x010d58, {[CaseLower] = 0x010d78,[CaseTitle] = 0x010d58,[CaseUpper] = 0x010d58,[CaseFold] = 0x010d78}, NULL},
+	{0x010d59, {[CaseLower] = 0x010d79,[CaseTitle] = 0x010d59,[CaseUpper] = 0x010d59,[CaseFold] = 0x010d79}, NULL},
+	{0x010d5a, {[CaseLower] = 0x010d7a,[CaseTitle] = 0x010d5a,[CaseUpper] = 0x010d5a,[CaseFold] = 0x010d7a}, NULL},
+	{0x010d5b, {[CaseLower] = 0x010d7b,[CaseTitle] = 0x010d5b,[CaseUpper] = 0x010d5b,[CaseFold] = 0x010d7b}, NULL},
+	{0x010d5c, {[CaseLower] = 0x010d7c,[CaseTitle] = 0x010d5c,[CaseUpper] = 0x010d5c,[CaseFold] = 0x010d7c}, NULL},
+	{0x010d5d, {[CaseLower] = 0x010d7d,[CaseTitle] = 0x010d5d,[CaseUpper] = 0x010d5d,[CaseFold] = 0x010d7d}, NULL},
+	{0x010d5e, {[CaseLower] = 0x010d7e,[CaseTitle] = 0x010d5e,[CaseUpper] = 0x010d5e,[CaseFold] = 0x010d7e}, NULL},
+	{0x010d5f, {[CaseLower] = 0x010d7f,[CaseTitle] = 0x010d5f,[CaseUpper] = 0x010d5f,[CaseFold] = 0x010d7f}, NULL},
+	{0x010d60, {[CaseLower] = 0x010d80,[CaseTitle] = 0x010d60,[CaseUpper] = 0x010d60,[CaseFold] = 0x010d80}, NULL},
+	{0x010d61, {[CaseLower] = 0x010d81,[CaseTitle] = 0x010d61,[CaseUpper] = 0x010d61,[CaseFold] = 0x010d81}, NULL},
+	{0x010d62, {[CaseLower] = 0x010d82,[CaseTitle] = 0x010d62,[CaseUpper] = 0x010d62,[CaseFold] = 0x010d82}, NULL},
+	{0x010d63, {[CaseLower] = 0x010d83,[CaseTitle] = 0x010d63,[CaseUpper] = 0x010d63,[CaseFold] = 0x010d83}, NULL},
+	{0x010d64, {[CaseLower] = 0x010d84,[CaseTitle] = 0x010d64,[CaseUpper] = 0x010d64,[CaseFold] = 0x010d84}, NULL},
+	{0x010d65, {[CaseLower] = 0x010d85,[CaseTitle] = 0x010d65,[CaseUpper] = 0x010d65,[CaseFold] = 0x010d85}, NULL},
+	{0x010d70, {[CaseLower] = 0x010d70,[CaseTitle] = 0x010d50,[CaseUpper] = 0x010d50,[CaseFold] = 0x010d70}, NULL},
+	{0x010d71, {[CaseLower] = 0x010d71,[CaseTitle] = 0x010d51,[CaseUpper] = 0x010d51,[CaseFold] = 0x010d71}, NULL},
+	{0x010d72, {[CaseLower] = 0x010d72,[CaseTitle] = 0x010d52,[CaseUpper] = 0x010d52,[CaseFold] = 0x010d72}, NULL},
+	{0x010d73, {[CaseLower] = 0x010d73,[CaseTitle] = 0x010d53,[CaseUpper] = 0x010d53,[CaseFold] = 0x010d73}, NULL},
+	{0x010d74, {[CaseLower] = 0x010d74,[CaseTitle] = 0x010d54,[CaseUpper] = 0x010d54,[CaseFold] = 0x010d74}, NULL},
+	{0x010d75, {[CaseLower] = 0x010d75,[CaseTitle] = 0x010d55,[CaseUpper] = 0x010d55,[CaseFold] = 0x010d75}, NULL},
+	{0x010d76, {[CaseLower] = 0x010d76,[CaseTitle] = 0x010d56,[CaseUpper] = 0x010d56,[CaseFold] = 0x010d76}, NULL},
+	{0x010d77, {[CaseLower] = 0x010d77,[CaseTitle] = 0x010d57,[CaseUpper] = 0x010d57,[CaseFold] = 0x010d77}, NULL},
+	{0x010d78, {[CaseLower] = 0x010d78,[CaseTitle] = 0x010d58,[CaseUpper] = 0x010d58,[CaseFold] = 0x010d78}, NULL},
+	{0x010d79, {[CaseLower] = 0x010d79,[CaseTitle] = 0x010d59,[CaseUpper] = 0x010d59,[CaseFold] = 0x010d79}, NULL},
+	{0x010d7a, {[CaseLower] = 0x010d7a,[CaseTitle] = 0x010d5a,[CaseUpper] = 0x010d5a,[CaseFold] = 0x010d7a}, NULL},
+	{0x010d7b, {[CaseLower] = 0x010d7b,[CaseTitle] = 0x010d5b,[CaseUpper] = 0x010d5b,[CaseFold] = 0x010d7b}, NULL},
+	{0x010d7c, {[CaseLower] = 0x010d7c,[CaseTitle] = 0x010d5c,[CaseUpper] = 0x010d5c,[CaseFold] = 0x010d7c}, NULL},
+	{0x010d7d, {[CaseLower] = 0x010d7d,[CaseTitle] = 0x010d5d,[CaseUpper] = 0x010d5d,[CaseFold] = 0x010d7d}, NULL},
+	{0x010d7e, {[CaseLower] = 0x010d7e,[CaseTitle] = 0x010d5e,[CaseUpper] = 0x010d5e,[CaseFold] = 0x010d7e}, NULL},
+	{0x010d7f, {[CaseLower] = 0x010d7f,[CaseTitle] = 0x010d5f,[CaseUpper] = 0x010d5f,[CaseFold] = 0x010d7f}, NULL},
+	{0x010d80, {[CaseLower] = 0x010d80,[CaseTitle] = 0x010d60,[CaseUpper] = 0x010d60,[CaseFold] = 0x010d80}, NULL},
+	{0x010d81, {[CaseLower] = 0x010d81,[CaseTitle] = 0x010d61,[CaseUpper] = 0x010d61,[CaseFold] = 0x010d81}, NULL},
+	{0x010d82, {[CaseLower] = 0x010d82,[CaseTitle] = 0x010d62,[CaseUpper] = 0x010d62,[CaseFold] = 0x010d82}, NULL},
+	{0x010d83, {[CaseLower] = 0x010d83,[CaseTitle] = 0x010d63,[CaseUpper] = 0x010d63,[CaseFold] = 0x010d83}, NULL},
+	{0x010d84, {[CaseLower] = 0x010d84,[CaseTitle] = 0x010d64,[CaseUpper] = 0x010d64,[CaseFold] = 0x010d84}, NULL},
+	{0x010d85, {[CaseLower] = 0x010d85,[CaseTitle] = 0x010d65,[CaseUpper] = 0x010d65,[CaseFold] = 0x010d85}, NULL},
 	{0x0118a0, {[CaseLower] = 0x0118c0,[CaseTitle] = 0x0118a0,[CaseUpper] = 0x0118a0,[CaseFold] = 0x0118c0}, NULL},
 	{0x0118a1, {[CaseLower] = 0x0118c1,[CaseTitle] = 0x0118a1,[CaseUpper] = 0x0118a1,[CaseFold] = 0x0118c1}, NULL},
 	{0x0118a2, {[CaseLower] = 0x0118c2,[CaseTitle] = 0x0118a2,[CaseUpper] = 0x0118a2,[CaseFold] = 0x0118c2}, NULL},
diff --git a/src/include/common/unicode_category_table.h b/src/include/common/unicode_category_table.h
index d3f468a1ebc..95a1c65da7e 100644
--- a/src/include/common/unicode_category_table.h
+++ b/src/include/common/unicode_category_table.h
@@ -696,7 +696,7 @@ static const pg_unicode_properties unicode_opt_ascii[128] =
 };
 
 /* table of Unicode codepoint ranges and their categories */
-static const pg_category_range unicode_categories[3302] =
+static const pg_category_range unicode_categories[3368] =
 {
 	{0x000000, 0x00001f, PG_U_CONTROL},
 	{0x000020, 0x000020, PG_U_SPACE_SEPARATOR},
@@ -1408,7 +1408,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x000888, 0x000888, PG_U_MODIFIER_SYMBOL},
 	{0x000889, 0x00088e, PG_U_OTHER_LETTER},
 	{0x000890, 0x000891, PG_U_FORMAT},
-	{0x000898, 0x00089f, PG_U_NONSPACING_MARK},
+	{0x000897, 0x00089f, PG_U_NONSPACING_MARK},
 	{0x0008a0, 0x0008c8, PG_U_OTHER_LETTER},
 	{0x0008c9, 0x0008c9, PG_U_MODIFIER_LETTER},
 	{0x0008ca, 0x0008e1, PG_U_NONSPACING_MARK},
@@ -1887,12 +1887,13 @@ static const pg_category_range unicode_categories[3302] =
 	{0x001b42, 0x001b42, PG_U_NONSPACING_MARK},
 	{0x001b43, 0x001b44, PG_U_SPACING_MARK},
 	{0x001b45, 0x001b4c, PG_U_OTHER_LETTER},
+	{0x001b4e, 0x001b4f, PG_U_OTHER_PUNCTUATION},
 	{0x001b50, 0x001b59, PG_U_DECIMAL_NUMBER},
 	{0x001b5a, 0x001b60, PG_U_OTHER_PUNCTUATION},
 	{0x001b61, 0x001b6a, PG_U_OTHER_SYMBOL},
 	{0x001b6b, 0x001b73, PG_U_NONSPACING_MARK},
 	{0x001b74, 0x001b7c, PG_U_OTHER_SYMBOL},
-	{0x001b7d, 0x001b7e, PG_U_OTHER_PUNCTUATION},
+	{0x001b7d, 0x001b7f, PG_U_OTHER_PUNCTUATION},
 	{0x001b80, 0x001b81, PG_U_NONSPACING_MARK},
 	{0x001b82, 0x001b82, PG_U_SPACING_MARK},
 	{0x001b83, 0x001ba0, PG_U_OTHER_LETTER},
@@ -1927,6 +1928,8 @@ static const pg_category_range unicode_categories[3302] =
 	{0x001c78, 0x001c7d, PG_U_MODIFIER_LETTER},
 	{0x001c7e, 0x001c7f, PG_U_OTHER_PUNCTUATION},
 	{0x001c80, 0x001c88, PG_U_LOWERCASE_LETTER},
+	{0x001c89, 0x001c89, PG_U_UPPERCASE_LETTER},
+	{0x001c8a, 0x001c8a, PG_U_LOWERCASE_LETTER},
 	{0x001c90, 0x001cba, PG_U_UPPERCASE_LETTER},
 	{0x001cbd, 0x001cbf, PG_U_UPPERCASE_LETTER},
 	{0x001cc0, 0x001cc7, PG_U_OTHER_PUNCTUATION},
@@ -2378,7 +2381,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x00239b, 0x0023b3, PG_U_MATH_SYMBOL},
 	{0x0023b4, 0x0023db, PG_U_OTHER_SYMBOL},
 	{0x0023dc, 0x0023e1, PG_U_MATH_SYMBOL},
-	{0x0023e2, 0x002426, PG_U_OTHER_SYMBOL},
+	{0x0023e2, 0x002429, PG_U_OTHER_SYMBOL},
 	{0x002440, 0x00244a, PG_U_OTHER_SYMBOL},
 	{0x002460, 0x00249b, PG_U_OTHER_NUMBER},
 	{0x00249c, 0x0024e9, PG_U_OTHER_SYMBOL},
@@ -2719,7 +2722,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x003192, 0x003195, PG_U_OTHER_NUMBER},
 	{0x003196, 0x00319f, PG_U_OTHER_SYMBOL},
 	{0x0031a0, 0x0031bf, PG_U_OTHER_LETTER},
-	{0x0031c0, 0x0031e3, PG_U_OTHER_SYMBOL},
+	{0x0031c0, 0x0031e5, PG_U_OTHER_SYMBOL},
 	{0x0031ef, 0x0031ef, PG_U_OTHER_SYMBOL},
 	{0x0031f0, 0x0031ff, PG_U_OTHER_LETTER},
 	{0x003200, 0x00321e, PG_U_OTHER_SYMBOL},
@@ -2983,6 +2986,8 @@ static const pg_category_range unicode_categories[3302] =
 	{0x00a7c8, 0x00a7c8, PG_U_LOWERCASE_LETTER},
 	{0x00a7c9, 0x00a7c9, PG_U_UPPERCASE_LETTER},
 	{0x00a7ca, 0x00a7ca, PG_U_LOWERCASE_LETTER},
+	{0x00a7cb, 0x00a7cc, PG_U_UPPERCASE_LETTER},
+	{0x00a7cd, 0x00a7cd, PG_U_LOWERCASE_LETTER},
 	{0x00a7d0, 0x00a7d0, PG_U_UPPERCASE_LETTER},
 	{0x00a7d1, 0x00a7d1, PG_U_LOWERCASE_LETTER},
 	{0x00a7d3, 0x00a7d3, PG_U_LOWERCASE_LETTER},
@@ -2991,6 +2996,9 @@ static const pg_category_range unicode_categories[3302] =
 	{0x00a7d7, 0x00a7d7, PG_U_LOWERCASE_LETTER},
 	{0x00a7d8, 0x00a7d8, PG_U_UPPERCASE_LETTER},
 	{0x00a7d9, 0x00a7d9, PG_U_LOWERCASE_LETTER},
+	{0x00a7da, 0x00a7da, PG_U_UPPERCASE_LETTER},
+	{0x00a7db, 0x00a7db, PG_U_LOWERCASE_LETTER},
+	{0x00a7dc, 0x00a7dc, PG_U_UPPERCASE_LETTER},
 	{0x00a7f2, 0x00a7f4, PG_U_MODIFIER_LETTER},
 	{0x00a7f5, 0x00a7f5, PG_U_UPPERCASE_LETTER},
 	{0x00a7f6, 0x00a7f6, PG_U_LOWERCASE_LETTER},
@@ -3306,6 +3314,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x0105a3, 0x0105b1, PG_U_LOWERCASE_LETTER},
 	{0x0105b3, 0x0105b9, PG_U_LOWERCASE_LETTER},
 	{0x0105bb, 0x0105bc, PG_U_LOWERCASE_LETTER},
+	{0x0105c0, 0x0105f3, PG_U_OTHER_LETTER},
 	{0x010600, 0x010736, PG_U_OTHER_LETTER},
 	{0x010740, 0x010755, PG_U_OTHER_LETTER},
 	{0x010760, 0x010767, PG_U_OTHER_LETTER},
@@ -3376,12 +3385,23 @@ static const pg_category_range unicode_categories[3302] =
 	{0x010d00, 0x010d23, PG_U_OTHER_LETTER},
 	{0x010d24, 0x010d27, PG_U_NONSPACING_MARK},
 	{0x010d30, 0x010d39, PG_U_DECIMAL_NUMBER},
+	{0x010d40, 0x010d49, PG_U_DECIMAL_NUMBER},
+	{0x010d4a, 0x010d4d, PG_U_OTHER_LETTER},
+	{0x010d4e, 0x010d4e, PG_U_MODIFIER_LETTER},
+	{0x010d4f, 0x010d4f, PG_U_OTHER_LETTER},
+	{0x010d50, 0x010d65, PG_U_UPPERCASE_LETTER},
+	{0x010d69, 0x010d6d, PG_U_NONSPACING_MARK},
+	{0x010d6e, 0x010d6e, PG_U_DASH_PUNCTUATION},
+	{0x010d6f, 0x010d6f, PG_U_MODIFIER_LETTER},
+	{0x010d70, 0x010d85, PG_U_LOWERCASE_LETTER},
+	{0x010d8e, 0x010d8f, PG_U_MATH_SYMBOL},
 	{0x010e60, 0x010e7e, PG_U_OTHER_NUMBER},
 	{0x010e80, 0x010ea9, PG_U_OTHER_LETTER},
 	{0x010eab, 0x010eac, PG_U_NONSPACING_MARK},
 	{0x010ead, 0x010ead, PG_U_DASH_PUNCTUATION},
 	{0x010eb0, 0x010eb1, PG_U_OTHER_LETTER},
-	{0x010efd, 0x010eff, PG_U_NONSPACING_MARK},
+	{0x010ec2, 0x010ec4, PG_U_OTHER_LETTER},
+	{0x010efc, 0x010eff, PG_U_NONSPACING_MARK},
 	{0x010f00, 0x010f1c, PG_U_OTHER_LETTER},
 	{0x010f1d, 0x010f26, PG_U_OTHER_NUMBER},
 	{0x010f27, 0x010f27, PG_U_OTHER_LETTER},
@@ -3497,6 +3517,26 @@ static const pg_category_range unicode_categories[3302] =
 	{0x011362, 0x011363, PG_U_SPACING_MARK},
 	{0x011366, 0x01136c, PG_U_NONSPACING_MARK},
 	{0x011370, 0x011374, PG_U_NONSPACING_MARK},
+	{0x011380, 0x011389, PG_U_OTHER_LETTER},
+	{0x01138b, 0x01138b, PG_U_OTHER_LETTER},
+	{0x01138e, 0x01138e, PG_U_OTHER_LETTER},
+	{0x011390, 0x0113b5, PG_U_OTHER_LETTER},
+	{0x0113b7, 0x0113b7, PG_U_OTHER_LETTER},
+	{0x0113b8, 0x0113ba, PG_U_SPACING_MARK},
+	{0x0113bb, 0x0113c0, PG_U_NONSPACING_MARK},
+	{0x0113c2, 0x0113c2, PG_U_SPACING_MARK},
+	{0x0113c5, 0x0113c5, PG_U_SPACING_MARK},
+	{0x0113c7, 0x0113ca, PG_U_SPACING_MARK},
+	{0x0113cc, 0x0113cd, PG_U_SPACING_MARK},
+	{0x0113ce, 0x0113ce, PG_U_NONSPACING_MARK},
+	{0x0113cf, 0x0113cf, PG_U_SPACING_MARK},
+	{0x0113d0, 0x0113d0, PG_U_NONSPACING_MARK},
+	{0x0113d1, 0x0113d1, PG_U_OTHER_LETTER},
+	{0x0113d2, 0x0113d2, PG_U_NONSPACING_MARK},
+	{0x0113d3, 0x0113d3, PG_U_OTHER_LETTER},
+	{0x0113d4, 0x0113d5, PG_U_OTHER_PUNCTUATION},
+	{0x0113d7, 0x0113d8, PG_U_OTHER_PUNCTUATION},
+	{0x0113e1, 0x0113e2, PG_U_NONSPACING_MARK},
 	{0x011400, 0x011434, PG_U_OTHER_LETTER},
 	{0x011435, 0x011437, PG_U_SPACING_MARK},
 	{0x011438, 0x01143f, PG_U_NONSPACING_MARK},
@@ -3556,8 +3596,11 @@ static const pg_category_range unicode_categories[3302] =
 	{0x0116b8, 0x0116b8, PG_U_OTHER_LETTER},
 	{0x0116b9, 0x0116b9, PG_U_OTHER_PUNCTUATION},
 	{0x0116c0, 0x0116c9, PG_U_DECIMAL_NUMBER},
+	{0x0116d0, 0x0116e3, PG_U_DECIMAL_NUMBER},
 	{0x011700, 0x01171a, PG_U_OTHER_LETTER},
-	{0x01171d, 0x01171f, PG_U_NONSPACING_MARK},
+	{0x01171d, 0x01171d, PG_U_NONSPACING_MARK},
+	{0x01171e, 0x01171e, PG_U_SPACING_MARK},
+	{0x01171f, 0x01171f, PG_U_NONSPACING_MARK},
 	{0x011720, 0x011721, PG_U_SPACING_MARK},
 	{0x011722, 0x011725, PG_U_NONSPACING_MARK},
 	{0x011726, 0x011726, PG_U_SPACING_MARK},
@@ -3627,6 +3670,9 @@ static const pg_category_range unicode_categories[3302] =
 	{0x011a9e, 0x011aa2, PG_U_OTHER_PUNCTUATION},
 	{0x011ab0, 0x011af8, PG_U_OTHER_LETTER},
 	{0x011b00, 0x011b09, PG_U_OTHER_PUNCTUATION},
+	{0x011bc0, 0x011be0, PG_U_OTHER_LETTER},
+	{0x011be1, 0x011be1, PG_U_OTHER_PUNCTUATION},
+	{0x011bf0, 0x011bf9, PG_U_DECIMAL_NUMBER},
 	{0x011c00, 0x011c08, PG_U_OTHER_LETTER},
 	{0x011c0a, 0x011c2e, PG_U_OTHER_LETTER},
 	{0x011c2f, 0x011c2f, PG_U_SPACING_MARK},
@@ -3685,6 +3731,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x011f42, 0x011f42, PG_U_NONSPACING_MARK},
 	{0x011f43, 0x011f4f, PG_U_OTHER_PUNCTUATION},
 	{0x011f50, 0x011f59, PG_U_DECIMAL_NUMBER},
+	{0x011f5a, 0x011f5a, PG_U_NONSPACING_MARK},
 	{0x011fb0, 0x011fb0, PG_U_OTHER_LETTER},
 	{0x011fc0, 0x011fd4, PG_U_OTHER_NUMBER},
 	{0x011fd5, 0x011fdc, PG_U_OTHER_SYMBOL},
@@ -3702,7 +3749,13 @@ static const pg_category_range unicode_categories[3302] =
 	{0x013440, 0x013440, PG_U_NONSPACING_MARK},
 	{0x013441, 0x013446, PG_U_OTHER_LETTER},
 	{0x013447, 0x013455, PG_U_NONSPACING_MARK},
+	{0x013460, 0x0143fa, PG_U_OTHER_LETTER},
 	{0x014400, 0x014646, PG_U_OTHER_LETTER},
+	{0x016100, 0x01611d, PG_U_OTHER_LETTER},
+	{0x01611e, 0x016129, PG_U_NONSPACING_MARK},
+	{0x01612a, 0x01612c, PG_U_SPACING_MARK},
+	{0x01612d, 0x01612f, PG_U_NONSPACING_MARK},
+	{0x016130, 0x016139, PG_U_DECIMAL_NUMBER},
 	{0x016800, 0x016a38, PG_U_OTHER_LETTER},
 	{0x016a40, 0x016a5e, PG_U_OTHER_LETTER},
 	{0x016a60, 0x016a69, PG_U_DECIMAL_NUMBER},
@@ -3723,6 +3776,11 @@ static const pg_category_range unicode_categories[3302] =
 	{0x016b5b, 0x016b61, PG_U_OTHER_NUMBER},
 	{0x016b63, 0x016b77, PG_U_OTHER_LETTER},
 	{0x016b7d, 0x016b8f, PG_U_OTHER_LETTER},
+	{0x016d40, 0x016d42, PG_U_MODIFIER_LETTER},
+	{0x016d43, 0x016d6a, PG_U_OTHER_LETTER},
+	{0x016d6b, 0x016d6c, PG_U_MODIFIER_LETTER},
+	{0x016d6d, 0x016d6f, PG_U_OTHER_PUNCTUATION},
+	{0x016d70, 0x016d79, PG_U_DECIMAL_NUMBER},
 	{0x016e40, 0x016e5f, PG_U_UPPERCASE_LETTER},
 	{0x016e60, 0x016e7f, PG_U_LOWERCASE_LETTER},
 	{0x016e80, 0x016e96, PG_U_OTHER_NUMBER},
@@ -3740,7 +3798,7 @@ static const pg_category_range unicode_categories[3302] =
 	{0x016ff0, 0x016ff1, PG_U_SPACING_MARK},
 	{0x017000, 0x0187f7, PG_U_OTHER_LETTER},
 	{0x018800, 0x018cd5, PG_U_OTHER_LETTER},
-	{0x018d00, 0x018d08, PG_U_OTHER_LETTER},
+	{0x018cff, 0x018d08, PG_U_OTHER_LETTER},
 	{0x01aff0, 0x01aff3, PG_U_MODIFIER_LETTER},
 	{0x01aff5, 0x01affb, PG_U_MODIFIER_LETTER},
 	{0x01affd, 0x01affe, PG_U_MODIFIER_LETTER},
@@ -3758,6 +3816,9 @@ static const pg_category_range unicode_categories[3302] =
 	{0x01bc9d, 0x01bc9e, PG_U_NONSPACING_MARK},
 	{0x01bc9f, 0x01bc9f, PG_U_OTHER_PUNCTUATION},
 	{0x01bca0, 0x01bca3, PG_U_FORMAT},
+	{0x01cc00, 0x01ccef, PG_U_OTHER_SYMBOL},
+	{0x01ccf0, 0x01ccf9, PG_U_DECIMAL_NUMBER},
+	{0x01cd00, 0x01ceb3, PG_U_OTHER_SYMBOL},
 	{0x01cf00, 0x01cf2d, PG_U_NONSPACING_MARK},
 	{0x01cf30, 0x01cf46, PG_U_NONSPACING_MARK},
 	{0x01cf50, 0x01cfc3, PG_U_OTHER_SYMBOL},
@@ -3891,6 +3952,11 @@ static const pg_category_range unicode_categories[3302] =
 	{0x01e4eb, 0x01e4eb, PG_U_MODIFIER_LETTER},
 	{0x01e4ec, 0x01e4ef, PG_U_NONSPACING_MARK},
 	{0x01e4f0, 0x01e4f9, PG_U_DECIMAL_NUMBER},
+	{0x01e5d0, 0x01e5ed, PG_U_OTHER_LETTER},
+	{0x01e5ee, 0x01e5ef, PG_U_NONSPACING_MARK},
+	{0x01e5f0, 0x01e5f0, PG_U_OTHER_LETTER},
+	{0x01e5f1, 0x01e5fa, PG_U_DECIMAL_NUMBER},
+	{0x01e5ff, 0x01e5ff, PG_U_OTHER_PUNCTUATION},
 	{0x01e7e0, 0x01e7e6, PG_U_OTHER_LETTER},
 	{0x01e7e8, 0x01e7eb, PG_U_OTHER_LETTER},
 	{0x01e7ed, 0x01e7ee, PG_U_OTHER_LETTER},
@@ -3973,18 +4039,18 @@ static const pg_category_range unicode_categories[3302] =
 	{0x01f850, 0x01f859, PG_U_OTHER_SYMBOL},
 	{0x01f860, 0x01f887, PG_U_OTHER_SYMBOL},
 	{0x01f890, 0x01f8ad, PG_U_OTHER_SYMBOL},
-	{0x01f8b0, 0x01f8b1, PG_U_OTHER_SYMBOL},
+	{0x01f8b0, 0x01f8bb, PG_U_OTHER_SYMBOL},
+	{0x01f8c0, 0x01f8c1, PG_U_OTHER_SYMBOL},
 	{0x01f900, 0x01fa53, PG_U_OTHER_SYMBOL},
 	{0x01fa60, 0x01fa6d, PG_U_OTHER_SYMBOL},
 	{0x01fa70, 0x01fa7c, PG_U_OTHER_SYMBOL},
-	{0x01fa80, 0x01fa88, PG_U_OTHER_SYMBOL},
-	{0x01fa90, 0x01fabd, PG_U_OTHER_SYMBOL},
-	{0x01fabf, 0x01fac5, PG_U_OTHER_SYMBOL},
-	{0x01face, 0x01fadb, PG_U_OTHER_SYMBOL},
-	{0x01fae0, 0x01fae8, PG_U_OTHER_SYMBOL},
+	{0x01fa80, 0x01fa89, PG_U_OTHER_SYMBOL},
+	{0x01fa8f, 0x01fac6, PG_U_OTHER_SYMBOL},
+	{0x01face, 0x01fadc, PG_U_OTHER_SYMBOL},
+	{0x01fadf, 0x01fae9, PG_U_OTHER_SYMBOL},
 	{0x01faf0, 0x01faf8, PG_U_OTHER_SYMBOL},
 	{0x01fb00, 0x01fb92, PG_U_OTHER_SYMBOL},
-	{0x01fb94, 0x01fbca, PG_U_OTHER_SYMBOL},
+	{0x01fb94, 0x01fbef, PG_U_OTHER_SYMBOL},
 	{0x01fbf0, 0x01fbf9, PG_U_DECIMAL_NUMBER},
 	{0x020000, 0x02a6df, PG_U_OTHER_LETTER},
 	{0x02a700, 0x02b739, PG_U_OTHER_LETTER},
@@ -4003,7 +4069,7 @@ static const pg_category_range unicode_categories[3302] =
 };
 
 /* table of Unicode codepoint ranges of Alphabetic characters */
-static const pg_unicode_range unicode_alphabetic[1141] =
+static const pg_unicode_range unicode_alphabetic[1179] =
 {
 	{0x000041, 0x00005a},
 	{0x000061, 0x00007a},
@@ -4025,6 +4091,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x0002ec, 0x0002ec},
 	{0x0002ee, 0x0002ee},
 	{0x000345, 0x000345},
+	{0x000363, 0x00036f},
 	{0x000370, 0x000373},
 	{0x000374, 0x000374},
 	{0x000376, 0x000377},
@@ -4088,6 +4155,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x000860, 0x00086a},
 	{0x000870, 0x000887},
 	{0x000889, 0x00088e},
+	{0x000897, 0x000897},
 	{0x0008a0, 0x0008c8},
 	{0x0008c9, 0x0008c9},
 	{0x0008d4, 0x0008df},
@@ -4455,7 +4523,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x001c4d, 0x001c4f},
 	{0x001c5a, 0x001c77},
 	{0x001c78, 0x001c7d},
-	{0x001c80, 0x001c88},
+	{0x001c80, 0x001c8a},
 	{0x001c90, 0x001cba},
 	{0x001cbd, 0x001cbf},
 	{0x001ce9, 0x001cec},
@@ -4468,7 +4536,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x001d78, 0x001d78},
 	{0x001d79, 0x001d9a},
 	{0x001d9b, 0x001dbf},
-	{0x001de7, 0x001df4},
+	{0x001dd3, 0x001df4},
 	{0x001e00, 0x001f15},
 	{0x001f18, 0x001f1d},
 	{0x001f20, 0x001f45},
@@ -4575,10 +4643,10 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x00a788, 0x00a788},
 	{0x00a78b, 0x00a78e},
 	{0x00a78f, 0x00a78f},
-	{0x00a790, 0x00a7ca},
+	{0x00a790, 0x00a7cd},
 	{0x00a7d0, 0x00a7d1},
 	{0x00a7d3, 0x00a7d3},
-	{0x00a7d5, 0x00a7d9},
+	{0x00a7d5, 0x00a7dc},
 	{0x00a7f2, 0x00a7f4},
 	{0x00a7f5, 0x00a7f6},
 	{0x00a7f7, 0x00a7f7},
@@ -4743,6 +4811,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x0105a3, 0x0105b1},
 	{0x0105b3, 0x0105b9},
 	{0x0105bb, 0x0105bc},
+	{0x0105c0, 0x0105f3},
 	{0x010600, 0x010736},
 	{0x010740, 0x010755},
 	{0x010760, 0x010767},
@@ -4783,9 +4852,18 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x010cc0, 0x010cf2},
 	{0x010d00, 0x010d23},
 	{0x010d24, 0x010d27},
+	{0x010d4a, 0x010d4d},
+	{0x010d4e, 0x010d4e},
+	{0x010d4f, 0x010d4f},
+	{0x010d50, 0x010d65},
+	{0x010d69, 0x010d69},
+	{0x010d6f, 0x010d6f},
+	{0x010d70, 0x010d85},
 	{0x010e80, 0x010ea9},
 	{0x010eab, 0x010eac},
 	{0x010eb0, 0x010eb1},
+	{0x010ec2, 0x010ec4},
+	{0x010efc, 0x010efc},
 	{0x010f00, 0x010f1c},
 	{0x010f27, 0x010f27},
 	{0x010f30, 0x010f45},
@@ -4866,6 +4944,19 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x011357, 0x011357},
 	{0x01135d, 0x011361},
 	{0x011362, 0x011363},
+	{0x011380, 0x011389},
+	{0x01138b, 0x01138b},
+	{0x01138e, 0x01138e},
+	{0x011390, 0x0113b5},
+	{0x0113b7, 0x0113b7},
+	{0x0113b8, 0x0113ba},
+	{0x0113bb, 0x0113c0},
+	{0x0113c2, 0x0113c2},
+	{0x0113c5, 0x0113c5},
+	{0x0113c7, 0x0113ca},
+	{0x0113cc, 0x0113cd},
+	{0x0113d1, 0x0113d1},
+	{0x0113d3, 0x0113d3},
 	{0x011400, 0x011434},
 	{0x011435, 0x011437},
 	{0x011438, 0x01143f},
@@ -4908,7 +4999,9 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x0116b0, 0x0116b5},
 	{0x0116b8, 0x0116b8},
 	{0x011700, 0x01171a},
-	{0x01171d, 0x01171f},
+	{0x01171d, 0x01171d},
+	{0x01171e, 0x01171e},
+	{0x01171f, 0x01171f},
 	{0x011720, 0x011721},
 	{0x011722, 0x011725},
 	{0x011726, 0x011726},
@@ -4956,6 +5049,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x011a97, 0x011a97},
 	{0x011a9d, 0x011a9d},
 	{0x011ab0, 0x011af8},
+	{0x011bc0, 0x011be0},
 	{0x011c00, 0x011c08},
 	{0x011c0a, 0x011c2e},
 	{0x011c2f, 0x011c2f},
@@ -5009,7 +5103,12 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x012f90, 0x012ff0},
 	{0x013000, 0x01342f},
 	{0x013441, 0x013446},
+	{0x013460, 0x0143fa},
 	{0x014400, 0x014646},
+	{0x016100, 0x01611d},
+	{0x01611e, 0x016129},
+	{0x01612a, 0x01612c},
+	{0x01612d, 0x01612e},
 	{0x016800, 0x016a38},
 	{0x016a40, 0x016a5e},
 	{0x016a70, 0x016abe},
@@ -5018,6 +5117,9 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x016b40, 0x016b43},
 	{0x016b63, 0x016b77},
 	{0x016b7d, 0x016b8f},
+	{0x016d40, 0x016d42},
+	{0x016d43, 0x016d6a},
+	{0x016d6b, 0x016d6c},
 	{0x016e40, 0x016e7f},
 	{0x016f00, 0x016f4a},
 	{0x016f4f, 0x016f4f},
@@ -5030,7 +5132,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x016ff0, 0x016ff1},
 	{0x017000, 0x0187f7},
 	{0x018800, 0x018cd5},
-	{0x018d00, 0x018d08},
+	{0x018cff, 0x018d08},
 	{0x01aff0, 0x01aff3},
 	{0x01aff5, 0x01affb},
 	{0x01affd, 0x01affe},
@@ -5093,6 +5195,8 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 	{0x01e2c0, 0x01e2eb},
 	{0x01e4d0, 0x01e4ea},
 	{0x01e4eb, 0x01e4eb},
+	{0x01e5d0, 0x01e5ed},
+	{0x01e5f0, 0x01e5f0},
 	{0x01e7e0, 0x01e7e6},
 	{0x01e7e8, 0x01e7eb},
 	{0x01e7ed, 0x01e7ee},
@@ -5149,7 +5253,7 @@ static const pg_unicode_range unicode_alphabetic[1141] =
 };
 
 /* table of Unicode codepoint ranges of Lowercase characters */
-static const pg_unicode_range unicode_lowercase[686] =
+static const pg_unicode_range unicode_lowercase[690] =
 {
 	{0x000061, 0x00007a},
 	{0x0000aa, 0x0000aa},
@@ -5433,6 +5537,7 @@ static const pg_unicode_range unicode_lowercase[686] =
 	{0x0010fd, 0x0010ff},
 	{0x0013f8, 0x0013fd},
 	{0x001c80, 0x001c88},
+	{0x001c8a, 0x001c8a},
 	{0x001d00, 0x001d2b},
 	{0x001d2c, 0x001d6a},
 	{0x001d6b, 0x001d77},
@@ -5774,11 +5879,13 @@ static const pg_unicode_range unicode_lowercase[686] =
 	{0x00a7c3, 0x00a7c3},
 	{0x00a7c8, 0x00a7c8},
 	{0x00a7ca, 0x00a7ca},
+	{0x00a7cd, 0x00a7cd},
 	{0x00a7d1, 0x00a7d1},
 	{0x00a7d3, 0x00a7d3},
 	{0x00a7d5, 0x00a7d5},
 	{0x00a7d7, 0x00a7d7},
 	{0x00a7d9, 0x00a7d9},
+	{0x00a7db, 0x00a7db},
 	{0x00a7f2, 0x00a7f4},
 	{0x00a7f6, 0x00a7f6},
 	{0x00a7f8, 0x00a7f9},
@@ -5802,6 +5909,7 @@ static const pg_unicode_range unicode_lowercase[686] =
 	{0x010787, 0x0107b0},
 	{0x0107b2, 0x0107ba},
 	{0x010cc0, 0x010cf2},
+	{0x010d70, 0x010d85},
 	{0x0118c0, 0x0118df},
 	{0x016e60, 0x016e7f},
 	{0x01d41a, 0x01d433},
@@ -5840,7 +5948,7 @@ static const pg_unicode_range unicode_lowercase[686] =
 };
 
 /* table of Unicode codepoint ranges of Uppercase characters */
-static const pg_unicode_range unicode_uppercase[651] =
+static const pg_unicode_range unicode_uppercase[656] =
 {
 	{0x000041, 0x00005a},
 	{0x0000c0, 0x0000d6},
@@ -6118,6 +6226,7 @@ static const pg_unicode_range unicode_uppercase[651] =
 	{0x0010c7, 0x0010c7},
 	{0x0010cd, 0x0010cd},
 	{0x0013a0, 0x0013f5},
+	{0x001c89, 0x001c89},
 	{0x001c90, 0x001cba},
 	{0x001cbd, 0x001cbf},
 	{0x001e00, 0x001e00},
@@ -6444,9 +6553,12 @@ static const pg_unicode_range unicode_uppercase[651] =
 	{0x00a7c2, 0x00a7c2},
 	{0x00a7c4, 0x00a7c7},
 	{0x00a7c9, 0x00a7c9},
+	{0x00a7cb, 0x00a7cc},
 	{0x00a7d0, 0x00a7d0},
 	{0x00a7d6, 0x00a7d6},
 	{0x00a7d8, 0x00a7d8},
+	{0x00a7da, 0x00a7da},
+	{0x00a7dc, 0x00a7dc},
 	{0x00a7f5, 0x00a7f5},
 	{0x00ff21, 0x00ff3a},
 	{0x010400, 0x010427},
@@ -6456,6 +6568,7 @@ static const pg_unicode_range unicode_uppercase[651] =
 	{0x01058c, 0x010592},
 	{0x010594, 0x010595},
 	{0x010c80, 0x010cb2},
+	{0x010d50, 0x010d65},
 	{0x0118a0, 0x0118bf},
 	{0x016e40, 0x016e5f},
 	{0x01d400, 0x01d419},
@@ -6496,7 +6609,7 @@ static const pg_unicode_range unicode_uppercase[651] =
 };
 
 /* table of Unicode codepoint ranges of Case_Ignorable characters */
-static const pg_unicode_range unicode_case_ignorable[491] =
+static const pg_unicode_range unicode_case_ignorable[506] =
 {
 	{0x000027, 0x000027},
 	{0x00002e, 0x00002e},
@@ -6565,7 +6678,7 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x000859, 0x00085b},
 	{0x000888, 0x000888},
 	{0x000890, 0x000891},
-	{0x000898, 0x00089f},
+	{0x000897, 0x00089f},
 	{0x0008c9, 0x0008c9},
 	{0x0008ca, 0x0008e1},
 	{0x0008e2, 0x0008e2},
@@ -6846,8 +6959,11 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x010a3f, 0x010a3f},
 	{0x010ae5, 0x010ae6},
 	{0x010d24, 0x010d27},
+	{0x010d4e, 0x010d4e},
+	{0x010d69, 0x010d6d},
+	{0x010d6f, 0x010d6f},
 	{0x010eab, 0x010eac},
-	{0x010efd, 0x010eff},
+	{0x010efc, 0x010eff},
 	{0x010f46, 0x010f50},
 	{0x010f82, 0x010f85},
 	{0x011001, 0x011001},
@@ -6880,6 +6996,11 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x011340, 0x011340},
 	{0x011366, 0x01136c},
 	{0x011370, 0x011374},
+	{0x0113bb, 0x0113c0},
+	{0x0113ce, 0x0113ce},
+	{0x0113d0, 0x0113d0},
+	{0x0113d2, 0x0113d2},
+	{0x0113e1, 0x0113e2},
 	{0x011438, 0x01143f},
 	{0x011442, 0x011444},
 	{0x011446, 0x011446},
@@ -6899,7 +7020,8 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x0116ad, 0x0116ad},
 	{0x0116b0, 0x0116b5},
 	{0x0116b7, 0x0116b7},
-	{0x01171d, 0x01171f},
+	{0x01171d, 0x01171d},
+	{0x01171f, 0x01171f},
 	{0x011722, 0x011725},
 	{0x011727, 0x01172b},
 	{0x01182f, 0x011837},
@@ -6938,12 +7060,17 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x011f36, 0x011f3a},
 	{0x011f40, 0x011f40},
 	{0x011f42, 0x011f42},
+	{0x011f5a, 0x011f5a},
 	{0x013430, 0x01343f},
 	{0x013440, 0x013440},
 	{0x013447, 0x013455},
+	{0x01611e, 0x016129},
+	{0x01612d, 0x01612f},
 	{0x016af0, 0x016af4},
 	{0x016b30, 0x016b36},
 	{0x016b40, 0x016b43},
+	{0x016d40, 0x016d42},
+	{0x016d6b, 0x016d6c},
 	{0x016f4f, 0x016f4f},
 	{0x016f8f, 0x016f92},
 	{0x016f93, 0x016f9f},
@@ -6982,6 +7109,7 @@ static const pg_unicode_range unicode_case_ignorable[491] =
 	{0x01e2ec, 0x01e2ef},
 	{0x01e4eb, 0x01e4eb},
 	{0x01e4ec, 0x01e4ef},
+	{0x01e5ee, 0x01e5ef},
 	{0x01e8d0, 0x01e8d6},
 	{0x01e944, 0x01e94a},
 	{0x01e94b, 0x01e94b},
diff --git a/src/include/common/unicode_east_asian_fw_table.h b/src/include/common/unicode_east_asian_fw_table.h
index dcd1f136eb7..db8bd0ad897 100644
--- a/src/include/common/unicode_east_asian_fw_table.h
+++ b/src/include/common/unicode_east_asian_fw_table.h
@@ -9,8 +9,10 @@ static const struct mbinterval east_asian_fw[] = {
 	{0x23F3, 0x23F3},
 	{0x25FD, 0x25FE},
 	{0x2614, 0x2615},
+	{0x2630, 0x2637},
 	{0x2648, 0x2653},
 	{0x267F, 0x267F},
+	{0x268A, 0x268F},
 	{0x2693, 0x2693},
 	{0x26A1, 0x26A1},
 	{0x26AA, 0x26AB},
@@ -44,11 +46,10 @@ static const struct mbinterval east_asian_fw[] = {
 	{0x3099, 0x30FF},
 	{0x3105, 0x312F},
 	{0x3131, 0x318E},
-	{0x3190, 0x31E3},
+	{0x3190, 0x31E5},
 	{0x31EF, 0x321E},
 	{0x3220, 0x3247},
-	{0x3250, 0x4DBF},
-	{0x4E00, 0xA48C},
+	{0x3250, 0xA48C},
 	{0xA490, 0xA4C6},
 	{0xA960, 0xA97C},
 	{0xAC00, 0xD7A3},
@@ -63,7 +64,7 @@ static const struct mbinterval east_asian_fw[] = {
 	{0x16FF0, 0x16FF1},
 	{0x17000, 0x187F7},
 	{0x18800, 0x18CD5},
-	{0x18D00, 0x18D08},
+	{0x18CFF, 0x18D08},
 	{0x1AFF0, 0x1AFF3},
 	{0x1AFF5, 0x1AFFB},
 	{0x1AFFD, 0x1AFFE},
@@ -73,6 +74,8 @@ static const struct mbinterval east_asian_fw[] = {
 	{0x1B155, 0x1B155},
 	{0x1B164, 0x1B167},
 	{0x1B170, 0x1B2FB},
+	{0x1D300, 0x1D356},
+	{0x1D360, 0x1D376},
 	{0x1F004, 0x1F004},
 	{0x1F0CF, 0x1F0CF},
 	{0x1F18E, 0x1F18E},
@@ -113,11 +116,10 @@ static const struct mbinterval east_asian_fw[] = {
 	{0x1F93C, 0x1F945},
 	{0x1F947, 0x1F9FF},
 	{0x1FA70, 0x1FA7C},
-	{0x1FA80, 0x1FA88},
-	{0x1FA90, 0x1FABD},
-	{0x1FABF, 0x1FAC5},
-	{0x1FACE, 0x1FADB},
-	{0x1FAE0, 0x1FAE8},
+	{0x1FA80, 0x1FA89},
+	{0x1FA8F, 0x1FAC6},
+	{0x1FACE, 0x1FADC},
+	{0x1FADF, 0x1FAE9},
 	{0x1FAF0, 0x1FAF8},
 	{0x20000, 0x2FFFD},
 	{0x30000, 0x3FFFD},
diff --git a/src/include/common/unicode_nonspacing_table.h b/src/include/common/unicode_nonspacing_table.h
index 8d00e127fcd..d67f5b3f281 100644
--- a/src/include/common/unicode_nonspacing_table.h
+++ b/src/include/common/unicode_nonspacing_table.h
@@ -210,8 +210,9 @@ static const struct mbinterval nonspacing[] = {
 	{0x10A38, 0x10A3F},
 	{0x10AE5, 0x10AE6},
 	{0x10D24, 0x10D27},
+	{0x10D69, 0x10D6D},
 	{0x10EAB, 0x10EAC},
-	{0x10EFD, 0x10EFF},
+	{0x10EFC, 0x10EFF},
 	{0x10F46, 0x10F50},
 	{0x10F82, 0x10F85},
 	{0x11001, 0x11001},
@@ -242,6 +243,11 @@ static const struct mbinterval nonspacing[] = {
 	{0x1133B, 0x1133C},
 	{0x11340, 0x11340},
 	{0x11366, 0x11374},
+	{0x113BB, 0x113C0},
+	{0x113CE, 0x113CE},
+	{0x113D0, 0x113D0},
+	{0x113D2, 0x113D2},
+	{0x113E1, 0x113E2},
 	{0x11438, 0x1143F},
 	{0x11442, 0x11444},
 	{0x11446, 0x11446},
@@ -261,7 +267,8 @@ static const struct mbinterval nonspacing[] = {
 	{0x116AD, 0x116AD},
 	{0x116B0, 0x116B5},
 	{0x116B7, 0x116B7},
-	{0x1171D, 0x1171F},
+	{0x1171D, 0x1171D},
+	{0x1171F, 0x1171F},
 	{0x11722, 0x11725},
 	{0x11727, 0x1172B},
 	{0x1182F, 0x11837},
@@ -295,15 +302,19 @@ static const struct mbinterval nonspacing[] = {
 	{0x11F36, 0x11F3A},
 	{0x11F40, 0x11F40},
 	{0x11F42, 0x11F42},
+	{0x11F5A, 0x11F5A},
 	{0x13430, 0x13440},
 	{0x13447, 0x13455},
+	{0x1611E, 0x16129},
+	{0x1612D, 0x1612F},
 	{0x16AF0, 0x16AF4},
 	{0x16B30, 0x16B36},
 	{0x16F4F, 0x16F4F},
 	{0x16F8F, 0x16F92},
 	{0x16FE4, 0x16FE4},
 	{0x1BC9D, 0x1BC9E},
-	{0x1BCA0, 0x1CF46},
+	{0x1BCA0, 0x1BCA3},
+	{0x1CF00, 0x1CF46},
 	{0x1D167, 0x1D169},
 	{0x1D173, 0x1D182},
 	{0x1D185, 0x1D18B},
@@ -320,6 +331,7 @@ static const struct mbinterval nonspacing[] = {
 	{0x1E2AE, 0x1E2AE},
 	{0x1E2EC, 0x1E2EF},
 	{0x1E4EC, 0x1E4EF},
+	{0x1E5EE, 0x1E5EF},
 	{0x1E8D0, 0x1E8D6},
 	{0x1E944, 0x1E94A},
 	{0xE0001, 0xE01EF},
diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h
index 7aff822b7cd..6c983135996 100644
--- a/src/include/common/unicode_norm_table.h
+++ b/src/include/common/unicode_norm_table.h
@@ -36,7 +36,7 @@ typedef struct
 #define DECOMPOSITION_IS_COMPAT(x) (((x)->dec_size_flags & DECOMP_COMPAT) != 0)
 
 /* Table of Unicode codepoints and their decompositions */
-static const pg_unicode_decomposition UnicodeDecompMain[6775] =
+static const pg_unicode_decomposition UnicodeDecompMain[6843] =
 {
 	{0x00A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0020},
 	{0x00A8, 0, 2 | DECOMP_COMPAT, 0},
@@ -727,6 +727,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x0859, 220, 0, 0},
 	{0x085A, 220, 0, 0},
 	{0x085B, 220, 0, 0},
+	{0x0897, 230, 0, 0},
 	{0x0898, 230, 0, 0},
 	{0x0899, 220, 0, 0},
 	{0x089A, 220, 0, 0},
@@ -4636,6 +4637,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x10378, 230, 0, 0},
 	{0x10379, 230, 0, 0},
 	{0x1037A, 230, 0, 0},
+	{0x105C9, 0, 2, 4776},
+	{0x105E4, 0, 2, 4778},
 	{0x10781, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02D0},
 	{0x10782, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02D1},
 	{0x10783, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00E6},
@@ -4662,18 +4665,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x10799, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02AA},
 	{0x1079A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x02AB},
 	{0x1079B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026C},
-	{0x1079C, 0, 1 | DECOMP_COMPAT, 4776},
+	{0x1079C, 0, 1 | DECOMP_COMPAT, 4780},
 	{0x1079D, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0xA78E},
 	{0x1079E, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x026E},
-	{0x1079F, 0, 1 | DECOMP_COMPAT, 4777},
+	{0x1079F, 0, 1 | DECOMP_COMPAT, 4781},
 	{0x107A0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x028E},
-	{0x107A1, 0, 1 | DECOMP_COMPAT, 4778},
+	{0x107A1, 0, 1 | DECOMP_COMPAT, 4782},
 	{0x107A2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x00F8},
 	{0x107A3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0276},
 	{0x107A4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0277},
 	{0x107A5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0071},
 	{0x107A6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027A},
-	{0x107A7, 0, 1 | DECOMP_COMPAT, 4779},
+	{0x107A7, 0, 1 | DECOMP_COMPAT, 4783},
 	{0x107A8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027D},
 	{0x107A9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x027E},
 	{0x107AA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0280},
@@ -4690,8 +4693,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x107B6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C0},
 	{0x107B7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C1},
 	{0x107B8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x01C2},
-	{0x107B9, 0, 1 | DECOMP_COMPAT, 4780},
-	{0x107BA, 0, 1 | DECOMP_COMPAT, 4781},
+	{0x107B9, 0, 1 | DECOMP_COMPAT, 4784},
+	{0x107BA, 0, 1 | DECOMP_COMPAT, 4785},
 	{0x10A0D, 220, 0, 0},
 	{0x10A0F, 230, 0, 0},
 	{0x10A38, 230, 0, 0},
@@ -4704,6 +4707,11 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x10D25, 230, 0, 0},
 	{0x10D26, 230, 0, 0},
 	{0x10D27, 230, 0, 0},
+	{0x10D69, 230, 0, 0},
+	{0x10D6A, 230, 0, 0},
+	{0x10D6B, 230, 0, 0},
+	{0x10D6C, 230, 0, 0},
+	{0x10D6D, 230, 0, 0},
 	{0x10EAB, 230, 0, 0},
 	{0x10EAC, 230, 0, 0},
 	{0x10EFD, 220, 0, 0},
@@ -4727,16 +4735,16 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x11046, 9, 0, 0},
 	{0x11070, 9, 0, 0},
 	{0x1107F, 9, 0, 0},
-	{0x1109A, 0, 2, 4782},
-	{0x1109C, 0, 2, 4784},
-	{0x110AB, 0, 2, 4786},
+	{0x1109A, 0, 2, 4786},
+	{0x1109C, 0, 2, 4788},
+	{0x110AB, 0, 2, 4790},
 	{0x110B9, 9, 0, 0},
 	{0x110BA, 7, 0, 0},
 	{0x11100, 230, 0, 0},
 	{0x11101, 230, 0, 0},
 	{0x11102, 230, 0, 0},
-	{0x1112E, 0, 2, 4788},
-	{0x1112F, 0, 2, 4790},
+	{0x1112E, 0, 2, 4792},
+	{0x1112F, 0, 2, 4794},
 	{0x11133, 9, 0, 0},
 	{0x11134, 9, 0, 0},
 	{0x11173, 7, 0, 0},
@@ -4748,8 +4756,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x112EA, 9, 0, 0},
 	{0x1133B, 7, 0, 0},
 	{0x1133C, 7, 0, 0},
-	{0x1134B, 0, 2, 4792},
-	{0x1134C, 0, 2, 4794},
+	{0x1134B, 0, 2, 4796},
+	{0x1134C, 0, 2, 4798},
 	{0x1134D, 9, 0, 0},
 	{0x11366, 230, 0, 0},
 	{0x11367, 230, 0, 0},
@@ -4763,16 +4771,26 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x11372, 230, 0, 0},
 	{0x11373, 230, 0, 0},
 	{0x11374, 230, 0, 0},
+	{0x11383, 0, 2, 4800},
+	{0x11385, 0, 2, 4802},
+	{0x1138E, 0, 2, 4804},
+	{0x11391, 0, 2, 4806},
+	{0x113C5, 0, 2, 4808},
+	{0x113C7, 0, 2, 4810},
+	{0x113C8, 0, 2, 4812},
+	{0x113CE, 9, 0, 0},
+	{0x113CF, 9, 0, 0},
+	{0x113D0, 9, 0, 0},
 	{0x11442, 9, 0, 0},
 	{0x11446, 7, 0, 0},
 	{0x1145E, 230, 0, 0},
-	{0x114BB, 0, 2, 4796},
-	{0x114BC, 0, 2, 4798},
-	{0x114BE, 0, 2, 4800},
+	{0x114BB, 0, 2, 4814},
+	{0x114BC, 0, 2, 4816},
+	{0x114BE, 0, 2, 4818},
 	{0x114C2, 9, 0, 0},
 	{0x114C3, 7, 0, 0},
-	{0x115BA, 0, 2, 4802},
-	{0x115BB, 0, 2, 4804},
+	{0x115BA, 0, 2, 4820},
+	{0x115BB, 0, 2, 4822},
 	{0x115BF, 9, 0, 0},
 	{0x115C0, 7, 0, 0},
 	{0x1163F, 9, 0, 0},
@@ -4781,7 +4799,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1172B, 9, 0, 0},
 	{0x11839, 9, 0, 0},
 	{0x1183A, 7, 0, 0},
-	{0x11938, 0, 2, 4806},
+	{0x11938, 0, 2, 4824},
 	{0x1193D, 9, 0, 0},
 	{0x1193E, 9, 0, 0},
 	{0x11943, 7, 0, 0},
@@ -4796,6 +4814,15 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x11D97, 9, 0, 0},
 	{0x11F41, 9, 0, 0},
 	{0x11F42, 9, 0, 0},
+	{0x16121, 0, 2, 4826},
+	{0x16122, 0, 2, 4828},
+	{0x16123, 0, 2, 4830},
+	{0x16124, 0, 2, 4832},
+	{0x16125, 0, 2, 4834},
+	{0x16126, 0, 2, 4836},
+	{0x16127, 0, 2, 4838},
+	{0x16128, 0, 2, 4840},
+	{0x1612F, 9, 0, 0},
 	{0x16AF0, 1, 0, 0},
 	{0x16AF1, 1, 0, 0},
 	{0x16AF2, 1, 0, 0},
@@ -4808,16 +4835,55 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x16B34, 230, 0, 0},
 	{0x16B35, 230, 0, 0},
 	{0x16B36, 230, 0, 0},
+	{0x16D68, 0, 2, 4842},
+	{0x16D69, 0, 2, 4844},
+	{0x16D6A, 0, 2, 4846},
 	{0x16FF0, 6, 0, 0},
 	{0x16FF1, 6, 0, 0},
 	{0x1BC9E, 1, 0, 0},
-	{0x1D15E, 0, 2 | DECOMP_NO_COMPOSE, 4808},	/* in exclusion list */
-	{0x1D15F, 0, 2 | DECOMP_NO_COMPOSE, 4810},	/* in exclusion list */
-	{0x1D160, 0, 2 | DECOMP_NO_COMPOSE, 4812},	/* in exclusion list */
-	{0x1D161, 0, 2 | DECOMP_NO_COMPOSE, 4814},	/* in exclusion list */
-	{0x1D162, 0, 2 | DECOMP_NO_COMPOSE, 4816},	/* in exclusion list */
-	{0x1D163, 0, 2 | DECOMP_NO_COMPOSE, 4818},	/* in exclusion list */
-	{0x1D164, 0, 2 | DECOMP_NO_COMPOSE, 4820},	/* in exclusion list */
+	{0x1CCD6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0041},
+	{0x1CCD7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0042},
+	{0x1CCD8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043},
+	{0x1CCD9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0044},
+	{0x1CCDA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0045},
+	{0x1CCDB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0046},
+	{0x1CCDC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0047},
+	{0x1CCDD, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0048},
+	{0x1CCDE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0049},
+	{0x1CCDF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004A},
+	{0x1CCE0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004B},
+	{0x1CCE1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004C},
+	{0x1CCE2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004D},
+	{0x1CCE3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004E},
+	{0x1CCE4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x004F},
+	{0x1CCE5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0050},
+	{0x1CCE6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0051},
+	{0x1CCE7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0052},
+	{0x1CCE8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0053},
+	{0x1CCE9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0054},
+	{0x1CCEA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0055},
+	{0x1CCEB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0056},
+	{0x1CCEC, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0057},
+	{0x1CCED, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0058},
+	{0x1CCEE, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0059},
+	{0x1CCEF, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x005A},
+	{0x1CCF0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0030},
+	{0x1CCF1, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0031},
+	{0x1CCF2, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0032},
+	{0x1CCF3, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0033},
+	{0x1CCF4, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0034},
+	{0x1CCF5, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0035},
+	{0x1CCF6, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0036},
+	{0x1CCF7, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0037},
+	{0x1CCF8, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0038},
+	{0x1CCF9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0039},
+	{0x1D15E, 0, 2 | DECOMP_NO_COMPOSE, 4848},	/* in exclusion list */
+	{0x1D15F, 0, 2 | DECOMP_NO_COMPOSE, 4850},	/* in exclusion list */
+	{0x1D160, 0, 2 | DECOMP_NO_COMPOSE, 4852},	/* in exclusion list */
+	{0x1D161, 0, 2 | DECOMP_NO_COMPOSE, 4854},	/* in exclusion list */
+	{0x1D162, 0, 2 | DECOMP_NO_COMPOSE, 4856},	/* in exclusion list */
+	{0x1D163, 0, 2 | DECOMP_NO_COMPOSE, 4858},	/* in exclusion list */
+	{0x1D164, 0, 2 | DECOMP_NO_COMPOSE, 4860},	/* in exclusion list */
 	{0x1D165, 216, 0, 0},
 	{0x1D166, 216, 0, 0},
 	{0x1D167, 1, 0, 0},
@@ -4848,12 +4914,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1D1AB, 230, 0, 0},
 	{0x1D1AC, 230, 0, 0},
 	{0x1D1AD, 230, 0, 0},
-	{0x1D1BB, 0, 2 | DECOMP_NO_COMPOSE, 4822},	/* in exclusion list */
-	{0x1D1BC, 0, 2 | DECOMP_NO_COMPOSE, 4824},	/* in exclusion list */
-	{0x1D1BD, 0, 2 | DECOMP_NO_COMPOSE, 4826},	/* in exclusion list */
-	{0x1D1BE, 0, 2 | DECOMP_NO_COMPOSE, 4828},	/* in exclusion list */
-	{0x1D1BF, 0, 2 | DECOMP_NO_COMPOSE, 4830},	/* in exclusion list */
-	{0x1D1C0, 0, 2 | DECOMP_NO_COMPOSE, 4832},	/* in exclusion list */
+	{0x1D1BB, 0, 2 | DECOMP_NO_COMPOSE, 4862},	/* in exclusion list */
+	{0x1D1BC, 0, 2 | DECOMP_NO_COMPOSE, 4864},	/* in exclusion list */
+	{0x1D1BD, 0, 2 | DECOMP_NO_COMPOSE, 4866},	/* in exclusion list */
+	{0x1D1BE, 0, 2 | DECOMP_NO_COMPOSE, 4868},	/* in exclusion list */
+	{0x1D1BF, 0, 2 | DECOMP_NO_COMPOSE, 4870},	/* in exclusion list */
+	{0x1D1C0, 0, 2 | DECOMP_NO_COMPOSE, 4872},	/* in exclusion list */
 	{0x1D242, 230, 0, 0},
 	{0x1D243, 230, 0, 0},
 	{0x1D244, 230, 0, 0},
@@ -5970,6 +6036,8 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1E4ED, 232, 0, 0},
 	{0x1E4EE, 220, 0, 0},
 	{0x1E4EF, 230, 0, 0},
+	{0x1E5EE, 230, 0, 0},
+	{0x1E5EF, 220, 0, 0},
 	{0x1E8D0, 220, 0, 0},
 	{0x1E8D1, 220, 0, 0},
 	{0x1E8D2, 220, 0, 0},
@@ -6125,48 +6193,48 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1EEB9, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0636},
 	{0x1EEBA, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0638},
 	{0x1EEBB, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x063A},
-	{0x1F100, 0, 2 | DECOMP_COMPAT, 4834},
-	{0x1F101, 0, 2 | DECOMP_COMPAT, 4836},
-	{0x1F102, 0, 2 | DECOMP_COMPAT, 4838},
-	{0x1F103, 0, 2 | DECOMP_COMPAT, 4840},
-	{0x1F104, 0, 2 | DECOMP_COMPAT, 4842},
-	{0x1F105, 0, 2 | DECOMP_COMPAT, 4844},
-	{0x1F106, 0, 2 | DECOMP_COMPAT, 4846},
-	{0x1F107, 0, 2 | DECOMP_COMPAT, 4848},
-	{0x1F108, 0, 2 | DECOMP_COMPAT, 4850},
-	{0x1F109, 0, 2 | DECOMP_COMPAT, 4852},
-	{0x1F10A, 0, 2 | DECOMP_COMPAT, 4854},
-	{0x1F110, 0, 3 | DECOMP_COMPAT, 4856},
-	{0x1F111, 0, 3 | DECOMP_COMPAT, 4859},
-	{0x1F112, 0, 3 | DECOMP_COMPAT, 4862},
-	{0x1F113, 0, 3 | DECOMP_COMPAT, 4865},
-	{0x1F114, 0, 3 | DECOMP_COMPAT, 4868},
-	{0x1F115, 0, 3 | DECOMP_COMPAT, 4871},
-	{0x1F116, 0, 3 | DECOMP_COMPAT, 4874},
-	{0x1F117, 0, 3 | DECOMP_COMPAT, 4877},
-	{0x1F118, 0, 3 | DECOMP_COMPAT, 4880},
-	{0x1F119, 0, 3 | DECOMP_COMPAT, 4883},
-	{0x1F11A, 0, 3 | DECOMP_COMPAT, 4886},
-	{0x1F11B, 0, 3 | DECOMP_COMPAT, 4889},
-	{0x1F11C, 0, 3 | DECOMP_COMPAT, 4892},
-	{0x1F11D, 0, 3 | DECOMP_COMPAT, 4895},
-	{0x1F11E, 0, 3 | DECOMP_COMPAT, 4898},
-	{0x1F11F, 0, 3 | DECOMP_COMPAT, 4901},
-	{0x1F120, 0, 3 | DECOMP_COMPAT, 4904},
-	{0x1F121, 0, 3 | DECOMP_COMPAT, 4907},
-	{0x1F122, 0, 3 | DECOMP_COMPAT, 4910},
-	{0x1F123, 0, 3 | DECOMP_COMPAT, 4913},
-	{0x1F124, 0, 3 | DECOMP_COMPAT, 4916},
-	{0x1F125, 0, 3 | DECOMP_COMPAT, 4919},
-	{0x1F126, 0, 3 | DECOMP_COMPAT, 4922},
-	{0x1F127, 0, 3 | DECOMP_COMPAT, 4925},
-	{0x1F128, 0, 3 | DECOMP_COMPAT, 4928},
-	{0x1F129, 0, 3 | DECOMP_COMPAT, 4931},
-	{0x1F12A, 0, 3 | DECOMP_COMPAT, 4934},
+	{0x1F100, 0, 2 | DECOMP_COMPAT, 4874},
+	{0x1F101, 0, 2 | DECOMP_COMPAT, 4876},
+	{0x1F102, 0, 2 | DECOMP_COMPAT, 4878},
+	{0x1F103, 0, 2 | DECOMP_COMPAT, 4880},
+	{0x1F104, 0, 2 | DECOMP_COMPAT, 4882},
+	{0x1F105, 0, 2 | DECOMP_COMPAT, 4884},
+	{0x1F106, 0, 2 | DECOMP_COMPAT, 4886},
+	{0x1F107, 0, 2 | DECOMP_COMPAT, 4888},
+	{0x1F108, 0, 2 | DECOMP_COMPAT, 4890},
+	{0x1F109, 0, 2 | DECOMP_COMPAT, 4892},
+	{0x1F10A, 0, 2 | DECOMP_COMPAT, 4894},
+	{0x1F110, 0, 3 | DECOMP_COMPAT, 4896},
+	{0x1F111, 0, 3 | DECOMP_COMPAT, 4899},
+	{0x1F112, 0, 3 | DECOMP_COMPAT, 4902},
+	{0x1F113, 0, 3 | DECOMP_COMPAT, 4905},
+	{0x1F114, 0, 3 | DECOMP_COMPAT, 4908},
+	{0x1F115, 0, 3 | DECOMP_COMPAT, 4911},
+	{0x1F116, 0, 3 | DECOMP_COMPAT, 4914},
+	{0x1F117, 0, 3 | DECOMP_COMPAT, 4917},
+	{0x1F118, 0, 3 | DECOMP_COMPAT, 4920},
+	{0x1F119, 0, 3 | DECOMP_COMPAT, 4923},
+	{0x1F11A, 0, 3 | DECOMP_COMPAT, 4926},
+	{0x1F11B, 0, 3 | DECOMP_COMPAT, 4929},
+	{0x1F11C, 0, 3 | DECOMP_COMPAT, 4932},
+	{0x1F11D, 0, 3 | DECOMP_COMPAT, 4935},
+	{0x1F11E, 0, 3 | DECOMP_COMPAT, 4938},
+	{0x1F11F, 0, 3 | DECOMP_COMPAT, 4941},
+	{0x1F120, 0, 3 | DECOMP_COMPAT, 4944},
+	{0x1F121, 0, 3 | DECOMP_COMPAT, 4947},
+	{0x1F122, 0, 3 | DECOMP_COMPAT, 4950},
+	{0x1F123, 0, 3 | DECOMP_COMPAT, 4953},
+	{0x1F124, 0, 3 | DECOMP_COMPAT, 4956},
+	{0x1F125, 0, 3 | DECOMP_COMPAT, 4959},
+	{0x1F126, 0, 3 | DECOMP_COMPAT, 4962},
+	{0x1F127, 0, 3 | DECOMP_COMPAT, 4965},
+	{0x1F128, 0, 3 | DECOMP_COMPAT, 4968},
+	{0x1F129, 0, 3 | DECOMP_COMPAT, 4971},
+	{0x1F12A, 0, 3 | DECOMP_COMPAT, 4974},
 	{0x1F12B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043},
 	{0x1F12C, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0052},
-	{0x1F12D, 0, 2 | DECOMP_COMPAT, 4937},
-	{0x1F12E, 0, 2 | DECOMP_COMPAT, 4939},
+	{0x1F12D, 0, 2 | DECOMP_COMPAT, 4977},
+	{0x1F12E, 0, 2 | DECOMP_COMPAT, 4979},
 	{0x1F130, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0041},
 	{0x1F131, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0042},
 	{0x1F132, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0043},
@@ -6193,18 +6261,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1F147, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0058},
 	{0x1F148, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0059},
 	{0x1F149, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x005A},
-	{0x1F14A, 0, 2 | DECOMP_COMPAT, 4941},
-	{0x1F14B, 0, 2 | DECOMP_COMPAT, 4943},
-	{0x1F14C, 0, 2 | DECOMP_COMPAT, 4945},
-	{0x1F14D, 0, 2 | DECOMP_COMPAT, 4947},
-	{0x1F14E, 0, 3 | DECOMP_COMPAT, 4949},
-	{0x1F14F, 0, 2 | DECOMP_COMPAT, 4952},
-	{0x1F16A, 0, 2 | DECOMP_COMPAT, 4954},
-	{0x1F16B, 0, 2 | DECOMP_COMPAT, 4956},
-	{0x1F16C, 0, 2 | DECOMP_COMPAT, 4958},
-	{0x1F190, 0, 2 | DECOMP_COMPAT, 4960},
-	{0x1F200, 0, 2 | DECOMP_COMPAT, 4962},
-	{0x1F201, 0, 2 | DECOMP_COMPAT, 4964},
+	{0x1F14A, 0, 2 | DECOMP_COMPAT, 4981},
+	{0x1F14B, 0, 2 | DECOMP_COMPAT, 4983},
+	{0x1F14C, 0, 2 | DECOMP_COMPAT, 4985},
+	{0x1F14D, 0, 2 | DECOMP_COMPAT, 4987},
+	{0x1F14E, 0, 3 | DECOMP_COMPAT, 4989},
+	{0x1F14F, 0, 2 | DECOMP_COMPAT, 4992},
+	{0x1F16A, 0, 2 | DECOMP_COMPAT, 4994},
+	{0x1F16B, 0, 2 | DECOMP_COMPAT, 4996},
+	{0x1F16C, 0, 2 | DECOMP_COMPAT, 4998},
+	{0x1F190, 0, 2 | DECOMP_COMPAT, 5000},
+	{0x1F200, 0, 2 | DECOMP_COMPAT, 5002},
+	{0x1F201, 0, 2 | DECOMP_COMPAT, 5004},
 	{0x1F202, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x30B5},
 	{0x1F210, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x624B},
 	{0x1F211, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5B57},
@@ -6250,15 +6318,15 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x1F239, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5272},
 	{0x1F23A, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x55B6},
 	{0x1F23B, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x914D},
-	{0x1F240, 0, 3 | DECOMP_COMPAT, 4966},
-	{0x1F241, 0, 3 | DECOMP_COMPAT, 4969},
-	{0x1F242, 0, 3 | DECOMP_COMPAT, 4972},
-	{0x1F243, 0, 3 | DECOMP_COMPAT, 4975},
-	{0x1F244, 0, 3 | DECOMP_COMPAT, 4978},
-	{0x1F245, 0, 3 | DECOMP_COMPAT, 4981},
-	{0x1F246, 0, 3 | DECOMP_COMPAT, 4984},
-	{0x1F247, 0, 3 | DECOMP_COMPAT, 4987},
-	{0x1F248, 0, 3 | DECOMP_COMPAT, 4990},
+	{0x1F240, 0, 3 | DECOMP_COMPAT, 5006},
+	{0x1F241, 0, 3 | DECOMP_COMPAT, 5009},
+	{0x1F242, 0, 3 | DECOMP_COMPAT, 5012},
+	{0x1F243, 0, 3 | DECOMP_COMPAT, 5015},
+	{0x1F244, 0, 3 | DECOMP_COMPAT, 5018},
+	{0x1F245, 0, 3 | DECOMP_COMPAT, 5021},
+	{0x1F246, 0, 3 | DECOMP_COMPAT, 5024},
+	{0x1F247, 0, 3 | DECOMP_COMPAT, 5027},
+	{0x1F248, 0, 3 | DECOMP_COMPAT, 5030},
 	{0x1F250, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x5F97},
 	{0x1F251, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x53EF},
 	{0x1FBF0, 0, 1 | DECOMP_COMPAT | DECOMP_INLINE, 0x0030},
@@ -6274,7 +6342,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F800, 0, 1 | DECOMP_INLINE, 0x4E3D},
 	{0x2F801, 0, 1 | DECOMP_INLINE, 0x4E38},
 	{0x2F802, 0, 1 | DECOMP_INLINE, 0x4E41},
-	{0x2F803, 0, 1, 4993},
+	{0x2F803, 0, 1, 5033},
 	{0x2F804, 0, 1 | DECOMP_INLINE, 0x4F60},
 	{0x2F805, 0, 1 | DECOMP_INLINE, 0x4FAE},
 	{0x2F806, 0, 1 | DECOMP_INLINE, 0x4FBB},
@@ -6284,22 +6352,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F80A, 0, 1 | DECOMP_INLINE, 0x50E7},
 	{0x2F80B, 0, 1 | DECOMP_INLINE, 0x50CF},
 	{0x2F80C, 0, 1 | DECOMP_INLINE, 0x349E},
-	{0x2F80D, 0, 1, 4994},
+	{0x2F80D, 0, 1, 5034},
 	{0x2F80E, 0, 1 | DECOMP_INLINE, 0x514D},
 	{0x2F80F, 0, 1 | DECOMP_INLINE, 0x5154},
 	{0x2F810, 0, 1 | DECOMP_INLINE, 0x5164},
 	{0x2F811, 0, 1 | DECOMP_INLINE, 0x5177},
-	{0x2F812, 0, 1, 4995},
+	{0x2F812, 0, 1, 5035},
 	{0x2F813, 0, 1 | DECOMP_INLINE, 0x34B9},
 	{0x2F814, 0, 1 | DECOMP_INLINE, 0x5167},
 	{0x2F815, 0, 1 | DECOMP_INLINE, 0x518D},
-	{0x2F816, 0, 1, 4996},
+	{0x2F816, 0, 1, 5036},
 	{0x2F817, 0, 1 | DECOMP_INLINE, 0x5197},
 	{0x2F818, 0, 1 | DECOMP_INLINE, 0x51A4},
 	{0x2F819, 0, 1 | DECOMP_INLINE, 0x4ECC},
 	{0x2F81A, 0, 1 | DECOMP_INLINE, 0x51AC},
 	{0x2F81B, 0, 1 | DECOMP_INLINE, 0x51B5},
-	{0x2F81C, 0, 1, 4997},
+	{0x2F81C, 0, 1, 5037},
 	{0x2F81D, 0, 1 | DECOMP_INLINE, 0x51F5},
 	{0x2F81E, 0, 1 | DECOMP_INLINE, 0x5203},
 	{0x2F81F, 0, 1 | DECOMP_INLINE, 0x34DF},
@@ -6323,11 +6391,11 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F831, 0, 1 | DECOMP_INLINE, 0x537F},
 	{0x2F832, 0, 1 | DECOMP_INLINE, 0x537F},
 	{0x2F833, 0, 1 | DECOMP_INLINE, 0x537F},
-	{0x2F834, 0, 1, 4998},
+	{0x2F834, 0, 1, 5038},
 	{0x2F835, 0, 1 | DECOMP_INLINE, 0x7070},
 	{0x2F836, 0, 1 | DECOMP_INLINE, 0x53CA},
 	{0x2F837, 0, 1 | DECOMP_INLINE, 0x53DF},
-	{0x2F838, 0, 1, 4999},
+	{0x2F838, 0, 1, 5039},
 	{0x2F839, 0, 1 | DECOMP_INLINE, 0x53EB},
 	{0x2F83A, 0, 1 | DECOMP_INLINE, 0x53F1},
 	{0x2F83B, 0, 1 | DECOMP_INLINE, 0x5406},
@@ -6360,15 +6428,15 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F856, 0, 1 | DECOMP_INLINE, 0x5832},
 	{0x2F857, 0, 1 | DECOMP_INLINE, 0x5831},
 	{0x2F858, 0, 1 | DECOMP_INLINE, 0x58AC},
-	{0x2F859, 0, 1, 5000},
+	{0x2F859, 0, 1, 5040},
 	{0x2F85A, 0, 1 | DECOMP_INLINE, 0x58F2},
 	{0x2F85B, 0, 1 | DECOMP_INLINE, 0x58F7},
 	{0x2F85C, 0, 1 | DECOMP_INLINE, 0x5906},
 	{0x2F85D, 0, 1 | DECOMP_INLINE, 0x591A},
 	{0x2F85E, 0, 1 | DECOMP_INLINE, 0x5922},
 	{0x2F85F, 0, 1 | DECOMP_INLINE, 0x5962},
-	{0x2F860, 0, 1, 5001},
-	{0x2F861, 0, 1, 5002},
+	{0x2F860, 0, 1, 5041},
+	{0x2F861, 0, 1, 5042},
 	{0x2F862, 0, 1 | DECOMP_INLINE, 0x59EC},
 	{0x2F863, 0, 1 | DECOMP_INLINE, 0x5A1B},
 	{0x2F864, 0, 1 | DECOMP_INLINE, 0x5A27},
@@ -6379,12 +6447,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F869, 0, 1 | DECOMP_INLINE, 0x5B08},
 	{0x2F86A, 0, 1 | DECOMP_INLINE, 0x5B3E},
 	{0x2F86B, 0, 1 | DECOMP_INLINE, 0x5B3E},
-	{0x2F86C, 0, 1, 5003},
+	{0x2F86C, 0, 1, 5043},
 	{0x2F86D, 0, 1 | DECOMP_INLINE, 0x5BC3},
 	{0x2F86E, 0, 1 | DECOMP_INLINE, 0x5BD8},
 	{0x2F86F, 0, 1 | DECOMP_INLINE, 0x5BE7},
 	{0x2F870, 0, 1 | DECOMP_INLINE, 0x5BF3},
-	{0x2F871, 0, 1, 5004},
+	{0x2F871, 0, 1, 5044},
 	{0x2F872, 0, 1 | DECOMP_INLINE, 0x5BFF},
 	{0x2F873, 0, 1 | DECOMP_INLINE, 0x5C06},
 	{0x2F874, 0, 1 | DECOMP_INLINE, 0x5F53},
@@ -6394,9 +6462,9 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F878, 0, 1 | DECOMP_INLINE, 0x5C6E},
 	{0x2F879, 0, 1 | DECOMP_INLINE, 0x5CC0},
 	{0x2F87A, 0, 1 | DECOMP_INLINE, 0x5C8D},
-	{0x2F87B, 0, 1, 5005},
+	{0x2F87B, 0, 1, 5045},
 	{0x2F87C, 0, 1 | DECOMP_INLINE, 0x5D43},
-	{0x2F87D, 0, 1, 5006},
+	{0x2F87D, 0, 1, 5046},
 	{0x2F87E, 0, 1 | DECOMP_INLINE, 0x5D6E},
 	{0x2F87F, 0, 1 | DECOMP_INLINE, 0x5D6B},
 	{0x2F880, 0, 1 | DECOMP_INLINE, 0x5D7C},
@@ -6408,22 +6476,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F886, 0, 1 | DECOMP_INLINE, 0x5E3D},
 	{0x2F887, 0, 1 | DECOMP_INLINE, 0x5E69},
 	{0x2F888, 0, 1 | DECOMP_INLINE, 0x3862},
-	{0x2F889, 0, 1, 5007},
+	{0x2F889, 0, 1, 5047},
 	{0x2F88A, 0, 1 | DECOMP_INLINE, 0x387C},
 	{0x2F88B, 0, 1 | DECOMP_INLINE, 0x5EB0},
 	{0x2F88C, 0, 1 | DECOMP_INLINE, 0x5EB3},
 	{0x2F88D, 0, 1 | DECOMP_INLINE, 0x5EB6},
 	{0x2F88E, 0, 1 | DECOMP_INLINE, 0x5ECA},
-	{0x2F88F, 0, 1, 5008},
+	{0x2F88F, 0, 1, 5048},
 	{0x2F890, 0, 1 | DECOMP_INLINE, 0x5EFE},
-	{0x2F891, 0, 1, 5009},
-	{0x2F892, 0, 1, 5010},
+	{0x2F891, 0, 1, 5049},
+	{0x2F892, 0, 1, 5050},
 	{0x2F893, 0, 1 | DECOMP_INLINE, 0x8201},
 	{0x2F894, 0, 1 | DECOMP_INLINE, 0x5F22},
 	{0x2F895, 0, 1 | DECOMP_INLINE, 0x5F22},
 	{0x2F896, 0, 1 | DECOMP_INLINE, 0x38C7},
-	{0x2F897, 0, 1, 5011},
-	{0x2F898, 0, 1, 5012},
+	{0x2F897, 0, 1, 5051},
+	{0x2F898, 0, 1, 5052},
 	{0x2F899, 0, 1 | DECOMP_INLINE, 0x5F62},
 	{0x2F89A, 0, 1 | DECOMP_INLINE, 0x5F6B},
 	{0x2F89B, 0, 1 | DECOMP_INLINE, 0x38E3},
@@ -6435,7 +6503,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F8A1, 0, 1 | DECOMP_INLINE, 0x393A},
 	{0x2F8A2, 0, 1 | DECOMP_INLINE, 0x391C},
 	{0x2F8A3, 0, 1 | DECOMP_INLINE, 0x6094},
-	{0x2F8A4, 0, 1, 5013},
+	{0x2F8A4, 0, 1, 5053},
 	{0x2F8A5, 0, 1 | DECOMP_INLINE, 0x60C7},
 	{0x2F8A6, 0, 1 | DECOMP_INLINE, 0x6148},
 	{0x2F8A7, 0, 1 | DECOMP_INLINE, 0x614C},
@@ -6455,13 +6523,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F8B5, 0, 1 | DECOMP_INLINE, 0x62B1},
 	{0x2F8B6, 0, 1 | DECOMP_INLINE, 0x62D4},
 	{0x2F8B7, 0, 1 | DECOMP_INLINE, 0x6350},
-	{0x2F8B8, 0, 1, 5014},
+	{0x2F8B8, 0, 1, 5054},
 	{0x2F8B9, 0, 1 | DECOMP_INLINE, 0x633D},
 	{0x2F8BA, 0, 1 | DECOMP_INLINE, 0x62FC},
 	{0x2F8BB, 0, 1 | DECOMP_INLINE, 0x6368},
 	{0x2F8BC, 0, 1 | DECOMP_INLINE, 0x6383},
 	{0x2F8BD, 0, 1 | DECOMP_INLINE, 0x63E4},
-	{0x2F8BE, 0, 1, 5015},
+	{0x2F8BE, 0, 1, 5055},
 	{0x2F8BF, 0, 1 | DECOMP_INLINE, 0x6422},
 	{0x2F8C0, 0, 1 | DECOMP_INLINE, 0x63C5},
 	{0x2F8C1, 0, 1 | DECOMP_INLINE, 0x63A9},
@@ -6473,7 +6541,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F8C7, 0, 1 | DECOMP_INLINE, 0x3A6C},
 	{0x2F8C8, 0, 1 | DECOMP_INLINE, 0x654F},
 	{0x2F8C9, 0, 1 | DECOMP_INLINE, 0x656C},
-	{0x2F8CA, 0, 1, 5016},
+	{0x2F8CA, 0, 1, 5056},
 	{0x2F8CB, 0, 1 | DECOMP_INLINE, 0x65E3},
 	{0x2F8CC, 0, 1 | DECOMP_INLINE, 0x66F8},
 	{0x2F8CD, 0, 1 | DECOMP_INLINE, 0x6649},
@@ -6492,13 +6560,13 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F8DA, 0, 1 | DECOMP_INLINE, 0x6721},
 	{0x2F8DB, 0, 1 | DECOMP_INLINE, 0x675E},
 	{0x2F8DC, 0, 1 | DECOMP_INLINE, 0x6753},
-	{0x2F8DD, 0, 1, 5017},
+	{0x2F8DD, 0, 1, 5057},
 	{0x2F8DE, 0, 1 | DECOMP_INLINE, 0x3B49},
 	{0x2F8DF, 0, 1 | DECOMP_INLINE, 0x67FA},
 	{0x2F8E0, 0, 1 | DECOMP_INLINE, 0x6785},
 	{0x2F8E1, 0, 1 | DECOMP_INLINE, 0x6852},
 	{0x2F8E2, 0, 1 | DECOMP_INLINE, 0x6885},
-	{0x2F8E3, 0, 1, 5018},
+	{0x2F8E3, 0, 1, 5058},
 	{0x2F8E4, 0, 1 | DECOMP_INLINE, 0x688E},
 	{0x2F8E5, 0, 1 | DECOMP_INLINE, 0x681F},
 	{0x2F8E6, 0, 1 | DECOMP_INLINE, 0x6914},
@@ -6507,22 +6575,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F8E9, 0, 1 | DECOMP_INLINE, 0x69A3},
 	{0x2F8EA, 0, 1 | DECOMP_INLINE, 0x69EA},
 	{0x2F8EB, 0, 1 | DECOMP_INLINE, 0x6AA8},
-	{0x2F8EC, 0, 1, 5019},
+	{0x2F8EC, 0, 1, 5059},
 	{0x2F8ED, 0, 1 | DECOMP_INLINE, 0x6ADB},
 	{0x2F8EE, 0, 1 | DECOMP_INLINE, 0x3C18},
 	{0x2F8EF, 0, 1 | DECOMP_INLINE, 0x6B21},
-	{0x2F8F0, 0, 1, 5020},
+	{0x2F8F0, 0, 1, 5060},
 	{0x2F8F1, 0, 1 | DECOMP_INLINE, 0x6B54},
 	{0x2F8F2, 0, 1 | DECOMP_INLINE, 0x3C4E},
 	{0x2F8F3, 0, 1 | DECOMP_INLINE, 0x6B72},
 	{0x2F8F4, 0, 1 | DECOMP_INLINE, 0x6B9F},
 	{0x2F8F5, 0, 1 | DECOMP_INLINE, 0x6BBA},
 	{0x2F8F6, 0, 1 | DECOMP_INLINE, 0x6BBB},
-	{0x2F8F7, 0, 1, 5021},
-	{0x2F8F8, 0, 1, 5022},
-	{0x2F8F9, 0, 1, 5023},
+	{0x2F8F7, 0, 1, 5061},
+	{0x2F8F8, 0, 1, 5062},
+	{0x2F8F9, 0, 1, 5063},
 	{0x2F8FA, 0, 1 | DECOMP_INLINE, 0x6C4E},
-	{0x2F8FB, 0, 1, 5024},
+	{0x2F8FB, 0, 1, 5064},
 	{0x2F8FC, 0, 1 | DECOMP_INLINE, 0x6CBF},
 	{0x2F8FD, 0, 1 | DECOMP_INLINE, 0x6CCD},
 	{0x2F8FE, 0, 1 | DECOMP_INLINE, 0x6C67},
@@ -6533,18 +6601,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F903, 0, 1 | DECOMP_INLINE, 0x6D69},
 	{0x2F904, 0, 1 | DECOMP_INLINE, 0x6D78},
 	{0x2F905, 0, 1 | DECOMP_INLINE, 0x6D85},
-	{0x2F906, 0, 1, 5025},
+	{0x2F906, 0, 1, 5065},
 	{0x2F907, 0, 1 | DECOMP_INLINE, 0x6D34},
 	{0x2F908, 0, 1 | DECOMP_INLINE, 0x6E2F},
 	{0x2F909, 0, 1 | DECOMP_INLINE, 0x6E6E},
 	{0x2F90A, 0, 1 | DECOMP_INLINE, 0x3D33},
 	{0x2F90B, 0, 1 | DECOMP_INLINE, 0x6ECB},
 	{0x2F90C, 0, 1 | DECOMP_INLINE, 0x6EC7},
-	{0x2F90D, 0, 1, 5026},
+	{0x2F90D, 0, 1, 5066},
 	{0x2F90E, 0, 1 | DECOMP_INLINE, 0x6DF9},
 	{0x2F90F, 0, 1 | DECOMP_INLINE, 0x6F6E},
-	{0x2F910, 0, 1, 5027},
-	{0x2F911, 0, 1, 5028},
+	{0x2F910, 0, 1, 5067},
+	{0x2F911, 0, 1, 5068},
 	{0x2F912, 0, 1 | DECOMP_INLINE, 0x6FC6},
 	{0x2F913, 0, 1 | DECOMP_INLINE, 0x7039},
 	{0x2F914, 0, 1 | DECOMP_INLINE, 0x701E},
@@ -6554,19 +6622,19 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F918, 0, 1 | DECOMP_INLINE, 0x707D},
 	{0x2F919, 0, 1 | DECOMP_INLINE, 0x7077},
 	{0x2F91A, 0, 1 | DECOMP_INLINE, 0x70AD},
-	{0x2F91B, 0, 1, 5029},
+	{0x2F91B, 0, 1, 5069},
 	{0x2F91C, 0, 1 | DECOMP_INLINE, 0x7145},
-	{0x2F91D, 0, 1, 5030},
+	{0x2F91D, 0, 1, 5070},
 	{0x2F91E, 0, 1 | DECOMP_INLINE, 0x719C},
-	{0x2F91F, 0, 1, 5031},
+	{0x2F91F, 0, 1, 5071},
 	{0x2F920, 0, 1 | DECOMP_INLINE, 0x7228},
 	{0x2F921, 0, 1 | DECOMP_INLINE, 0x7235},
 	{0x2F922, 0, 1 | DECOMP_INLINE, 0x7250},
-	{0x2F923, 0, 1, 5032},
+	{0x2F923, 0, 1, 5072},
 	{0x2F924, 0, 1 | DECOMP_INLINE, 0x7280},
 	{0x2F925, 0, 1 | DECOMP_INLINE, 0x7295},
-	{0x2F926, 0, 1, 5033},
-	{0x2F927, 0, 1, 5034},
+	{0x2F926, 0, 1, 5073},
+	{0x2F927, 0, 1, 5074},
 	{0x2F928, 0, 1 | DECOMP_INLINE, 0x737A},
 	{0x2F929, 0, 1 | DECOMP_INLINE, 0x738B},
 	{0x2F92A, 0, 1 | DECOMP_INLINE, 0x3EAC},
@@ -6580,22 +6648,22 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F932, 0, 1 | DECOMP_INLINE, 0x74CA},
 	{0x2F933, 0, 1 | DECOMP_INLINE, 0x3F1B},
 	{0x2F934, 0, 1 | DECOMP_INLINE, 0x7524},
-	{0x2F935, 0, 1, 5035},
+	{0x2F935, 0, 1, 5075},
 	{0x2F936, 0, 1 | DECOMP_INLINE, 0x753E},
-	{0x2F937, 0, 1, 5036},
+	{0x2F937, 0, 1, 5076},
 	{0x2F938, 0, 1 | DECOMP_INLINE, 0x7570},
-	{0x2F939, 0, 1, 5037},
+	{0x2F939, 0, 1, 5077},
 	{0x2F93A, 0, 1 | DECOMP_INLINE, 0x7610},
-	{0x2F93B, 0, 1, 5038},
-	{0x2F93C, 0, 1, 5039},
-	{0x2F93D, 0, 1, 5040},
+	{0x2F93B, 0, 1, 5078},
+	{0x2F93C, 0, 1, 5079},
+	{0x2F93D, 0, 1, 5080},
 	{0x2F93E, 0, 1 | DECOMP_INLINE, 0x3FFC},
 	{0x2F93F, 0, 1 | DECOMP_INLINE, 0x4008},
 	{0x2F940, 0, 1 | DECOMP_INLINE, 0x76F4},
-	{0x2F941, 0, 1, 5041},
-	{0x2F942, 0, 1, 5042},
-	{0x2F943, 0, 1, 5043},
-	{0x2F944, 0, 1, 5044},
+	{0x2F941, 0, 1, 5081},
+	{0x2F942, 0, 1, 5082},
+	{0x2F943, 0, 1, 5083},
+	{0x2F944, 0, 1, 5084},
 	{0x2F945, 0, 1 | DECOMP_INLINE, 0x771E},
 	{0x2F946, 0, 1 | DECOMP_INLINE, 0x771F},
 	{0x2F947, 0, 1 | DECOMP_INLINE, 0x771F},
@@ -6604,68 +6672,68 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F94A, 0, 1 | DECOMP_INLINE, 0x778B},
 	{0x2F94B, 0, 1 | DECOMP_INLINE, 0x4046},
 	{0x2F94C, 0, 1 | DECOMP_INLINE, 0x4096},
-	{0x2F94D, 0, 1, 5045},
+	{0x2F94D, 0, 1, 5085},
 	{0x2F94E, 0, 1 | DECOMP_INLINE, 0x784E},
 	{0x2F94F, 0, 1 | DECOMP_INLINE, 0x788C},
 	{0x2F950, 0, 1 | DECOMP_INLINE, 0x78CC},
 	{0x2F951, 0, 1 | DECOMP_INLINE, 0x40E3},
-	{0x2F952, 0, 1, 5046},
+	{0x2F952, 0, 1, 5086},
 	{0x2F953, 0, 1 | DECOMP_INLINE, 0x7956},
-	{0x2F954, 0, 1, 5047},
-	{0x2F955, 0, 1, 5048},
+	{0x2F954, 0, 1, 5087},
+	{0x2F955, 0, 1, 5088},
 	{0x2F956, 0, 1 | DECOMP_INLINE, 0x798F},
 	{0x2F957, 0, 1 | DECOMP_INLINE, 0x79EB},
 	{0x2F958, 0, 1 | DECOMP_INLINE, 0x412F},
 	{0x2F959, 0, 1 | DECOMP_INLINE, 0x7A40},
 	{0x2F95A, 0, 1 | DECOMP_INLINE, 0x7A4A},
 	{0x2F95B, 0, 1 | DECOMP_INLINE, 0x7A4F},
-	{0x2F95C, 0, 1, 5049},
-	{0x2F95D, 0, 1, 5050},
-	{0x2F95E, 0, 1, 5051},
+	{0x2F95C, 0, 1, 5089},
+	{0x2F95D, 0, 1, 5090},
+	{0x2F95E, 0, 1, 5091},
 	{0x2F95F, 0, 1 | DECOMP_INLINE, 0x7AEE},
 	{0x2F960, 0, 1 | DECOMP_INLINE, 0x4202},
-	{0x2F961, 0, 1, 5052},
+	{0x2F961, 0, 1, 5092},
 	{0x2F962, 0, 1 | DECOMP_INLINE, 0x7BC6},
 	{0x2F963, 0, 1 | DECOMP_INLINE, 0x7BC9},
 	{0x2F964, 0, 1 | DECOMP_INLINE, 0x4227},
-	{0x2F965, 0, 1, 5053},
+	{0x2F965, 0, 1, 5093},
 	{0x2F966, 0, 1 | DECOMP_INLINE, 0x7CD2},
 	{0x2F967, 0, 1 | DECOMP_INLINE, 0x42A0},
 	{0x2F968, 0, 1 | DECOMP_INLINE, 0x7CE8},
 	{0x2F969, 0, 1 | DECOMP_INLINE, 0x7CE3},
 	{0x2F96A, 0, 1 | DECOMP_INLINE, 0x7D00},
-	{0x2F96B, 0, 1, 5054},
+	{0x2F96B, 0, 1, 5094},
 	{0x2F96C, 0, 1 | DECOMP_INLINE, 0x7D63},
 	{0x2F96D, 0, 1 | DECOMP_INLINE, 0x4301},
 	{0x2F96E, 0, 1 | DECOMP_INLINE, 0x7DC7},
 	{0x2F96F, 0, 1 | DECOMP_INLINE, 0x7E02},
 	{0x2F970, 0, 1 | DECOMP_INLINE, 0x7E45},
 	{0x2F971, 0, 1 | DECOMP_INLINE, 0x4334},
-	{0x2F972, 0, 1, 5055},
-	{0x2F973, 0, 1, 5056},
+	{0x2F972, 0, 1, 5095},
+	{0x2F973, 0, 1, 5096},
 	{0x2F974, 0, 1 | DECOMP_INLINE, 0x4359},
-	{0x2F975, 0, 1, 5057},
+	{0x2F975, 0, 1, 5097},
 	{0x2F976, 0, 1 | DECOMP_INLINE, 0x7F7A},
-	{0x2F977, 0, 1, 5058},
+	{0x2F977, 0, 1, 5098},
 	{0x2F978, 0, 1 | DECOMP_INLINE, 0x7F95},
 	{0x2F979, 0, 1 | DECOMP_INLINE, 0x7FFA},
 	{0x2F97A, 0, 1 | DECOMP_INLINE, 0x8005},
-	{0x2F97B, 0, 1, 5059},
-	{0x2F97C, 0, 1, 5060},
+	{0x2F97B, 0, 1, 5099},
+	{0x2F97C, 0, 1, 5100},
 	{0x2F97D, 0, 1 | DECOMP_INLINE, 0x8060},
-	{0x2F97E, 0, 1, 5061},
+	{0x2F97E, 0, 1, 5101},
 	{0x2F97F, 0, 1 | DECOMP_INLINE, 0x8070},
-	{0x2F980, 0, 1, 5062},
+	{0x2F980, 0, 1, 5102},
 	{0x2F981, 0, 1 | DECOMP_INLINE, 0x43D5},
 	{0x2F982, 0, 1 | DECOMP_INLINE, 0x80B2},
 	{0x2F983, 0, 1 | DECOMP_INLINE, 0x8103},
 	{0x2F984, 0, 1 | DECOMP_INLINE, 0x440B},
 	{0x2F985, 0, 1 | DECOMP_INLINE, 0x813E},
 	{0x2F986, 0, 1 | DECOMP_INLINE, 0x5AB5},
-	{0x2F987, 0, 1, 5063},
-	{0x2F988, 0, 1, 5064},
-	{0x2F989, 0, 1, 5065},
-	{0x2F98A, 0, 1, 5066},
+	{0x2F987, 0, 1, 5103},
+	{0x2F988, 0, 1, 5104},
+	{0x2F989, 0, 1, 5105},
+	{0x2F98A, 0, 1, 5106},
 	{0x2F98B, 0, 1 | DECOMP_INLINE, 0x8201},
 	{0x2F98C, 0, 1 | DECOMP_INLINE, 0x8204},
 	{0x2F98D, 0, 1 | DECOMP_INLINE, 0x8F9E},
@@ -6678,7 +6746,7 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F994, 0, 1 | DECOMP_INLINE, 0x82B3},
 	{0x2F995, 0, 1 | DECOMP_INLINE, 0x82BD},
 	{0x2F996, 0, 1 | DECOMP_INLINE, 0x82E6},
-	{0x2F997, 0, 1, 5067},
+	{0x2F997, 0, 1, 5107},
 	{0x2F998, 0, 1 | DECOMP_INLINE, 0x82E5},
 	{0x2F999, 0, 1 | DECOMP_INLINE, 0x831D},
 	{0x2F99A, 0, 1 | DECOMP_INLINE, 0x8363},
@@ -6691,20 +6759,20 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F9A1, 0, 1 | DECOMP_INLINE, 0x83CA},
 	{0x2F9A2, 0, 1 | DECOMP_INLINE, 0x83CC},
 	{0x2F9A3, 0, 1 | DECOMP_INLINE, 0x83DC},
-	{0x2F9A4, 0, 1, 5068},
-	{0x2F9A5, 0, 1, 5069},
-	{0x2F9A6, 0, 1, 5070},
+	{0x2F9A4, 0, 1, 5108},
+	{0x2F9A5, 0, 1, 5109},
+	{0x2F9A6, 0, 1, 5110},
 	{0x2F9A7, 0, 1 | DECOMP_INLINE, 0x452B},
 	{0x2F9A8, 0, 1 | DECOMP_INLINE, 0x84F1},
 	{0x2F9A9, 0, 1 | DECOMP_INLINE, 0x84F3},
 	{0x2F9AA, 0, 1 | DECOMP_INLINE, 0x8516},
-	{0x2F9AB, 0, 1, 5071},
+	{0x2F9AB, 0, 1, 5111},
 	{0x2F9AC, 0, 1 | DECOMP_INLINE, 0x8564},
-	{0x2F9AD, 0, 1, 5072},
+	{0x2F9AD, 0, 1, 5112},
 	{0x2F9AE, 0, 1 | DECOMP_INLINE, 0x455D},
 	{0x2F9AF, 0, 1 | DECOMP_INLINE, 0x4561},
-	{0x2F9B0, 0, 1, 5073},
-	{0x2F9B1, 0, 1, 5074},
+	{0x2F9B0, 0, 1, 5113},
+	{0x2F9B1, 0, 1, 5114},
 	{0x2F9B2, 0, 1 | DECOMP_INLINE, 0x456B},
 	{0x2F9B3, 0, 1 | DECOMP_INLINE, 0x8650},
 	{0x2F9B4, 0, 1 | DECOMP_INLINE, 0x865C},
@@ -6724,39 +6792,39 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F9C2, 0, 1 | DECOMP_INLINE, 0x45F9},
 	{0x2F9C3, 0, 1 | DECOMP_INLINE, 0x8860},
 	{0x2F9C4, 0, 1 | DECOMP_INLINE, 0x8863},
-	{0x2F9C5, 0, 1, 5075},
+	{0x2F9C5, 0, 1, 5115},
 	{0x2F9C6, 0, 1 | DECOMP_INLINE, 0x88D7},
 	{0x2F9C7, 0, 1 | DECOMP_INLINE, 0x88DE},
 	{0x2F9C8, 0, 1 | DECOMP_INLINE, 0x4635},
 	{0x2F9C9, 0, 1 | DECOMP_INLINE, 0x88FA},
 	{0x2F9CA, 0, 1 | DECOMP_INLINE, 0x34BB},
-	{0x2F9CB, 0, 1, 5076},
-	{0x2F9CC, 0, 1, 5077},
+	{0x2F9CB, 0, 1, 5116},
+	{0x2F9CC, 0, 1, 5117},
 	{0x2F9CD, 0, 1 | DECOMP_INLINE, 0x46BE},
 	{0x2F9CE, 0, 1 | DECOMP_INLINE, 0x46C7},
 	{0x2F9CF, 0, 1 | DECOMP_INLINE, 0x8AA0},
 	{0x2F9D0, 0, 1 | DECOMP_INLINE, 0x8AED},
 	{0x2F9D1, 0, 1 | DECOMP_INLINE, 0x8B8A},
 	{0x2F9D2, 0, 1 | DECOMP_INLINE, 0x8C55},
-	{0x2F9D3, 0, 1, 5078},
+	{0x2F9D3, 0, 1, 5118},
 	{0x2F9D4, 0, 1 | DECOMP_INLINE, 0x8CAB},
 	{0x2F9D5, 0, 1 | DECOMP_INLINE, 0x8CC1},
 	{0x2F9D6, 0, 1 | DECOMP_INLINE, 0x8D1B},
 	{0x2F9D7, 0, 1 | DECOMP_INLINE, 0x8D77},
-	{0x2F9D8, 0, 1, 5079},
-	{0x2F9D9, 0, 1, 5080},
+	{0x2F9D8, 0, 1, 5119},
+	{0x2F9D9, 0, 1, 5120},
 	{0x2F9DA, 0, 1 | DECOMP_INLINE, 0x8DCB},
 	{0x2F9DB, 0, 1 | DECOMP_INLINE, 0x8DBC},
 	{0x2F9DC, 0, 1 | DECOMP_INLINE, 0x8DF0},
-	{0x2F9DD, 0, 1, 5081},
+	{0x2F9DD, 0, 1, 5121},
 	{0x2F9DE, 0, 1 | DECOMP_INLINE, 0x8ED4},
 	{0x2F9DF, 0, 1 | DECOMP_INLINE, 0x8F38},
-	{0x2F9E0, 0, 1, 5082},
-	{0x2F9E1, 0, 1, 5083},
+	{0x2F9E0, 0, 1, 5122},
+	{0x2F9E1, 0, 1, 5123},
 	{0x2F9E2, 0, 1 | DECOMP_INLINE, 0x9094},
 	{0x2F9E3, 0, 1 | DECOMP_INLINE, 0x90F1},
 	{0x2F9E4, 0, 1 | DECOMP_INLINE, 0x9111},
-	{0x2F9E5, 0, 1, 5084},
+	{0x2F9E5, 0, 1, 5124},
 	{0x2F9E6, 0, 1 | DECOMP_INLINE, 0x911B},
 	{0x2F9E7, 0, 1 | DECOMP_INLINE, 0x9238},
 	{0x2F9E8, 0, 1 | DECOMP_INLINE, 0x92D7},
@@ -6764,27 +6832,27 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2F9EA, 0, 1 | DECOMP_INLINE, 0x927C},
 	{0x2F9EB, 0, 1 | DECOMP_INLINE, 0x93F9},
 	{0x2F9EC, 0, 1 | DECOMP_INLINE, 0x9415},
-	{0x2F9ED, 0, 1, 5085},
+	{0x2F9ED, 0, 1, 5125},
 	{0x2F9EE, 0, 1 | DECOMP_INLINE, 0x958B},
 	{0x2F9EF, 0, 1 | DECOMP_INLINE, 0x4995},
 	{0x2F9F0, 0, 1 | DECOMP_INLINE, 0x95B7},
-	{0x2F9F1, 0, 1, 5086},
+	{0x2F9F1, 0, 1, 5126},
 	{0x2F9F2, 0, 1 | DECOMP_INLINE, 0x49E6},
 	{0x2F9F3, 0, 1 | DECOMP_INLINE, 0x96C3},
 	{0x2F9F4, 0, 1 | DECOMP_INLINE, 0x5DB2},
 	{0x2F9F5, 0, 1 | DECOMP_INLINE, 0x9723},
-	{0x2F9F6, 0, 1, 5087},
-	{0x2F9F7, 0, 1, 5088},
+	{0x2F9F6, 0, 1, 5127},
+	{0x2F9F7, 0, 1, 5128},
 	{0x2F9F8, 0, 1 | DECOMP_INLINE, 0x4A6E},
 	{0x2F9F9, 0, 1 | DECOMP_INLINE, 0x4A76},
 	{0x2F9FA, 0, 1 | DECOMP_INLINE, 0x97E0},
-	{0x2F9FB, 0, 1, 5089},
+	{0x2F9FB, 0, 1, 5129},
 	{0x2F9FC, 0, 1 | DECOMP_INLINE, 0x4AB2},
-	{0x2F9FD, 0, 1, 5090},
+	{0x2F9FD, 0, 1, 5130},
 	{0x2F9FE, 0, 1 | DECOMP_INLINE, 0x980B},
 	{0x2F9FF, 0, 1 | DECOMP_INLINE, 0x980B},
 	{0x2FA00, 0, 1 | DECOMP_INLINE, 0x9829},
-	{0x2FA01, 0, 1, 5091},
+	{0x2FA01, 0, 1, 5131},
 	{0x2FA02, 0, 1 | DECOMP_INLINE, 0x98E2},
 	{0x2FA03, 0, 1 | DECOMP_INLINE, 0x4B33},
 	{0x2FA04, 0, 1 | DECOMP_INLINE, 0x9929},
@@ -6792,18 +6860,18 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2FA06, 0, 1 | DECOMP_INLINE, 0x99C2},
 	{0x2FA07, 0, 1 | DECOMP_INLINE, 0x99FE},
 	{0x2FA08, 0, 1 | DECOMP_INLINE, 0x4BCE},
-	{0x2FA09, 0, 1, 5092},
+	{0x2FA09, 0, 1, 5132},
 	{0x2FA0A, 0, 1 | DECOMP_INLINE, 0x9B12},
 	{0x2FA0B, 0, 1 | DECOMP_INLINE, 0x9C40},
 	{0x2FA0C, 0, 1 | DECOMP_INLINE, 0x9CFD},
 	{0x2FA0D, 0, 1 | DECOMP_INLINE, 0x4CCE},
 	{0x2FA0E, 0, 1 | DECOMP_INLINE, 0x4CED},
 	{0x2FA0F, 0, 1 | DECOMP_INLINE, 0x9D67},
-	{0x2FA10, 0, 1, 5093},
+	{0x2FA10, 0, 1, 5133},
 	{0x2FA11, 0, 1 | DECOMP_INLINE, 0x4CF8},
-	{0x2FA12, 0, 1, 5094},
-	{0x2FA13, 0, 1, 5095},
-	{0x2FA14, 0, 1, 5096},
+	{0x2FA12, 0, 1, 5134},
+	{0x2FA13, 0, 1, 5135},
+	{0x2FA14, 0, 1, 5136},
 	{0x2FA15, 0, 1 | DECOMP_INLINE, 0x9EBB},
 	{0x2FA16, 0, 1 | DECOMP_INLINE, 0x4D56},
 	{0x2FA17, 0, 1 | DECOMP_INLINE, 0x9EF9},
@@ -6812,12 +6880,12 @@ static const pg_unicode_decomposition UnicodeDecompMain[6775] =
 	{0x2FA1A, 0, 1 | DECOMP_INLINE, 0x9F0F},
 	{0x2FA1B, 0, 1 | DECOMP_INLINE, 0x9F16},
 	{0x2FA1C, 0, 1 | DECOMP_INLINE, 0x9F3B},
-	{0x2FA1D, 0, 1, 5097}
+	{0x2FA1D, 0, 1, 5137}
 
 };
 
 /* codepoints array  */
-static const uint32 UnicodeDecomp_codepoints[5098] =
+static const uint32 UnicodeDecomp_codepoints[5138] =
 {
 	 /* 0 */ 0x0020, 0x0308,
 	 /* 2 */ 0x0020, 0x0304,
@@ -8913,202 +8981,222 @@ static const uint32 UnicodeDecomp_codepoints[5098] =
 	 /* 4770 */ 0x0644, 0x0625,
 	 /* 4772 */ 0x0644, 0x0627,
 	 /* 4774 */ 0x0644, 0x0627,
-	 /* 4776 */ 0x1DF04,
-	 /* 4777 */ 0x1DF05,
-	 /* 4778 */ 0x1DF06,
-	 /* 4779 */ 0x1DF08,
-	 /* 4780 */ 0x1DF0A,
-	 /* 4781 */ 0x1DF1E,
-	 /* 4782 */ 0x11099, 0x110BA,
-	 /* 4784 */ 0x1109B, 0x110BA,
-	 /* 4786 */ 0x110A5, 0x110BA,
-	 /* 4788 */ 0x11131, 0x11127,
-	 /* 4790 */ 0x11132, 0x11127,
-	 /* 4792 */ 0x11347, 0x1133E,
-	 /* 4794 */ 0x11347, 0x11357,
-	 /* 4796 */ 0x114B9, 0x114BA,
-	 /* 4798 */ 0x114B9, 0x114B0,
-	 /* 4800 */ 0x114B9, 0x114BD,
-	 /* 4802 */ 0x115B8, 0x115AF,
-	 /* 4804 */ 0x115B9, 0x115AF,
-	 /* 4806 */ 0x11935, 0x11930,
-	 /* 4808 */ 0x1D157, 0x1D165,
-	 /* 4810 */ 0x1D158, 0x1D165,
-	 /* 4812 */ 0x1D15F, 0x1D16E,
-	 /* 4814 */ 0x1D15F, 0x1D16F,
-	 /* 4816 */ 0x1D15F, 0x1D170,
-	 /* 4818 */ 0x1D15F, 0x1D171,
-	 /* 4820 */ 0x1D15F, 0x1D172,
-	 /* 4822 */ 0x1D1B9, 0x1D165,
-	 /* 4824 */ 0x1D1BA, 0x1D165,
-	 /* 4826 */ 0x1D1BB, 0x1D16E,
-	 /* 4828 */ 0x1D1BC, 0x1D16E,
-	 /* 4830 */ 0x1D1BB, 0x1D16F,
-	 /* 4832 */ 0x1D1BC, 0x1D16F,
-	 /* 4834 */ 0x0030, 0x002E,
-	 /* 4836 */ 0x0030, 0x002C,
-	 /* 4838 */ 0x0031, 0x002C,
-	 /* 4840 */ 0x0032, 0x002C,
-	 /* 4842 */ 0x0033, 0x002C,
-	 /* 4844 */ 0x0034, 0x002C,
-	 /* 4846 */ 0x0035, 0x002C,
-	 /* 4848 */ 0x0036, 0x002C,
-	 /* 4850 */ 0x0037, 0x002C,
-	 /* 4852 */ 0x0038, 0x002C,
-	 /* 4854 */ 0x0039, 0x002C,
-	 /* 4856 */ 0x0028, 0x0041, 0x0029,
-	 /* 4859 */ 0x0028, 0x0042, 0x0029,
-	 /* 4862 */ 0x0028, 0x0043, 0x0029,
-	 /* 4865 */ 0x0028, 0x0044, 0x0029,
-	 /* 4868 */ 0x0028, 0x0045, 0x0029,
-	 /* 4871 */ 0x0028, 0x0046, 0x0029,
-	 /* 4874 */ 0x0028, 0x0047, 0x0029,
-	 /* 4877 */ 0x0028, 0x0048, 0x0029,
-	 /* 4880 */ 0x0028, 0x0049, 0x0029,
-	 /* 4883 */ 0x0028, 0x004A, 0x0029,
-	 /* 4886 */ 0x0028, 0x004B, 0x0029,
-	 /* 4889 */ 0x0028, 0x004C, 0x0029,
-	 /* 4892 */ 0x0028, 0x004D, 0x0029,
-	 /* 4895 */ 0x0028, 0x004E, 0x0029,
-	 /* 4898 */ 0x0028, 0x004F, 0x0029,
-	 /* 4901 */ 0x0028, 0x0050, 0x0029,
-	 /* 4904 */ 0x0028, 0x0051, 0x0029,
-	 /* 4907 */ 0x0028, 0x0052, 0x0029,
-	 /* 4910 */ 0x0028, 0x0053, 0x0029,
-	 /* 4913 */ 0x0028, 0x0054, 0x0029,
-	 /* 4916 */ 0x0028, 0x0055, 0x0029,
-	 /* 4919 */ 0x0028, 0x0056, 0x0029,
-	 /* 4922 */ 0x0028, 0x0057, 0x0029,
-	 /* 4925 */ 0x0028, 0x0058, 0x0029,
-	 /* 4928 */ 0x0028, 0x0059, 0x0029,
-	 /* 4931 */ 0x0028, 0x005A, 0x0029,
-	 /* 4934 */ 0x3014, 0x0053, 0x3015,
-	 /* 4937 */ 0x0043, 0x0044,
-	 /* 4939 */ 0x0057, 0x005A,
-	 /* 4941 */ 0x0048, 0x0056,
-	 /* 4943 */ 0x004D, 0x0056,
-	 /* 4945 */ 0x0053, 0x0044,
-	 /* 4947 */ 0x0053, 0x0053,
-	 /* 4949 */ 0x0050, 0x0050, 0x0056,
-	 /* 4952 */ 0x0057, 0x0043,
-	 /* 4954 */ 0x004D, 0x0043,
-	 /* 4956 */ 0x004D, 0x0044,
-	 /* 4958 */ 0x004D, 0x0052,
-	 /* 4960 */ 0x0044, 0x004A,
-	 /* 4962 */ 0x307B, 0x304B,
-	 /* 4964 */ 0x30B3, 0x30B3,
-	 /* 4966 */ 0x3014, 0x672C, 0x3015,
-	 /* 4969 */ 0x3014, 0x4E09, 0x3015,
-	 /* 4972 */ 0x3014, 0x4E8C, 0x3015,
-	 /* 4975 */ 0x3014, 0x5B89, 0x3015,
-	 /* 4978 */ 0x3014, 0x70B9, 0x3015,
-	 /* 4981 */ 0x3014, 0x6253, 0x3015,
-	 /* 4984 */ 0x3014, 0x76D7, 0x3015,
-	 /* 4987 */ 0x3014, 0x52DD, 0x3015,
-	 /* 4990 */ 0x3014, 0x6557, 0x3015,
-	 /* 4993 */ 0x20122,
-	 /* 4994 */ 0x2063A,
-	 /* 4995 */ 0x2051C,
-	 /* 4996 */ 0x2054B,
-	 /* 4997 */ 0x291DF,
-	 /* 4998 */ 0x20A2C,
-	 /* 4999 */ 0x20B63,
-	 /* 5000 */ 0x214E4,
-	 /* 5001 */ 0x216A8,
-	 /* 5002 */ 0x216EA,
-	 /* 5003 */ 0x219C8,
-	 /* 5004 */ 0x21B18,
-	 /* 5005 */ 0x21DE4,
-	 /* 5006 */ 0x21DE6,
-	 /* 5007 */ 0x22183,
-	 /* 5008 */ 0x2A392,
-	 /* 5009 */ 0x22331,
-	 /* 5010 */ 0x22331,
-	 /* 5011 */ 0x232B8,
-	 /* 5012 */ 0x261DA,
-	 /* 5013 */ 0x226D4,
-	 /* 5014 */ 0x22B0C,
-	 /* 5015 */ 0x22BF1,
-	 /* 5016 */ 0x2300A,
-	 /* 5017 */ 0x233C3,
-	 /* 5018 */ 0x2346D,
-	 /* 5019 */ 0x236A3,
-	 /* 5020 */ 0x238A7,
-	 /* 5021 */ 0x23A8D,
-	 /* 5022 */ 0x21D0B,
-	 /* 5023 */ 0x23AFA,
-	 /* 5024 */ 0x23CBC,
-	 /* 5025 */ 0x23D1E,
-	 /* 5026 */ 0x23ED1,
-	 /* 5027 */ 0x23F5E,
-	 /* 5028 */ 0x23F8E,
-	 /* 5029 */ 0x20525,
-	 /* 5030 */ 0x24263,
-	 /* 5031 */ 0x243AB,
-	 /* 5032 */ 0x24608,
-	 /* 5033 */ 0x24735,
-	 /* 5034 */ 0x24814,
-	 /* 5035 */ 0x24C36,
-	 /* 5036 */ 0x24C92,
-	 /* 5037 */ 0x2219F,
-	 /* 5038 */ 0x24FA1,
-	 /* 5039 */ 0x24FB8,
-	 /* 5040 */ 0x25044,
-	 /* 5041 */ 0x250F3,
-	 /* 5042 */ 0x250F2,
-	 /* 5043 */ 0x25119,
-	 /* 5044 */ 0x25133,
-	 /* 5045 */ 0x2541D,
-	 /* 5046 */ 0x25626,
-	 /* 5047 */ 0x2569A,
-	 /* 5048 */ 0x256C5,
-	 /* 5049 */ 0x2597C,
-	 /* 5050 */ 0x25AA7,
-	 /* 5051 */ 0x25AA7,
-	 /* 5052 */ 0x25BAB,
-	 /* 5053 */ 0x25C80,
-	 /* 5054 */ 0x25F86,
-	 /* 5055 */ 0x26228,
-	 /* 5056 */ 0x26247,
-	 /* 5057 */ 0x262D9,
-	 /* 5058 */ 0x2633E,
-	 /* 5059 */ 0x264DA,
-	 /* 5060 */ 0x26523,
-	 /* 5061 */ 0x265A8,
-	 /* 5062 */ 0x2335F,
-	 /* 5063 */ 0x267A7,
-	 /* 5064 */ 0x267B5,
-	 /* 5065 */ 0x23393,
-	 /* 5066 */ 0x2339C,
-	 /* 5067 */ 0x26B3C,
-	 /* 5068 */ 0x26C36,
-	 /* 5069 */ 0x26D6B,
-	 /* 5070 */ 0x26CD5,
-	 /* 5071 */ 0x273CA,
-	 /* 5072 */ 0x26F2C,
-	 /* 5073 */ 0x26FB1,
-	 /* 5074 */ 0x270D2,
-	 /* 5075 */ 0x27667,
-	 /* 5076 */ 0x278AE,
-	 /* 5077 */ 0x27966,
-	 /* 5078 */ 0x27CA8,
-	 /* 5079 */ 0x27F2F,
-	 /* 5080 */ 0x20804,
-	 /* 5081 */ 0x208DE,
-	 /* 5082 */ 0x285D2,
-	 /* 5083 */ 0x285ED,
-	 /* 5084 */ 0x2872E,
-	 /* 5085 */ 0x28BFA,
-	 /* 5086 */ 0x28D77,
-	 /* 5087 */ 0x29145,
-	 /* 5088 */ 0x2921A,
-	 /* 5089 */ 0x2940A,
-	 /* 5090 */ 0x29496,
-	 /* 5091 */ 0x295B6,
-	 /* 5092 */ 0x29B30,
-	 /* 5093 */ 0x2A0CE,
-	 /* 5094 */ 0x2A105,
-	 /* 5095 */ 0x2A20E,
-	 /* 5096 */ 0x2A291,
-	 /* 5097 */ 0x2A600
+	 /* 4776 */ 0x105D2, 0x0307,
+	 /* 4778 */ 0x105DA, 0x0307,
+	 /* 4780 */ 0x1DF04,
+	 /* 4781 */ 0x1DF05,
+	 /* 4782 */ 0x1DF06,
+	 /* 4783 */ 0x1DF08,
+	 /* 4784 */ 0x1DF0A,
+	 /* 4785 */ 0x1DF1E,
+	 /* 4786 */ 0x11099, 0x110BA,
+	 /* 4788 */ 0x1109B, 0x110BA,
+	 /* 4790 */ 0x110A5, 0x110BA,
+	 /* 4792 */ 0x11131, 0x11127,
+	 /* 4794 */ 0x11132, 0x11127,
+	 /* 4796 */ 0x11347, 0x1133E,
+	 /* 4798 */ 0x11347, 0x11357,
+	 /* 4800 */ 0x11382, 0x113C9,
+	 /* 4802 */ 0x11384, 0x113BB,
+	 /* 4804 */ 0x1138B, 0x113C2,
+	 /* 4806 */ 0x11390, 0x113C9,
+	 /* 4808 */ 0x113C2, 0x113C2,
+	 /* 4810 */ 0x113C2, 0x113B8,
+	 /* 4812 */ 0x113C2, 0x113C9,
+	 /* 4814 */ 0x114B9, 0x114BA,
+	 /* 4816 */ 0x114B9, 0x114B0,
+	 /* 4818 */ 0x114B9, 0x114BD,
+	 /* 4820 */ 0x115B8, 0x115AF,
+	 /* 4822 */ 0x115B9, 0x115AF,
+	 /* 4824 */ 0x11935, 0x11930,
+	 /* 4826 */ 0x1611E, 0x1611E,
+	 /* 4828 */ 0x1611E, 0x16129,
+	 /* 4830 */ 0x1611E, 0x1611F,
+	 /* 4832 */ 0x16129, 0x1611F,
+	 /* 4834 */ 0x1611E, 0x16120,
+	 /* 4836 */ 0x16121, 0x1611F,
+	 /* 4838 */ 0x16122, 0x1611F,
+	 /* 4840 */ 0x16121, 0x16120,
+	 /* 4842 */ 0x16D67, 0x16D67,
+	 /* 4844 */ 0x16D63, 0x16D67,
+	 /* 4846 */ 0x16D69, 0x16D67,
+	 /* 4848 */ 0x1D157, 0x1D165,
+	 /* 4850 */ 0x1D158, 0x1D165,
+	 /* 4852 */ 0x1D15F, 0x1D16E,
+	 /* 4854 */ 0x1D15F, 0x1D16F,
+	 /* 4856 */ 0x1D15F, 0x1D170,
+	 /* 4858 */ 0x1D15F, 0x1D171,
+	 /* 4860 */ 0x1D15F, 0x1D172,
+	 /* 4862 */ 0x1D1B9, 0x1D165,
+	 /* 4864 */ 0x1D1BA, 0x1D165,
+	 /* 4866 */ 0x1D1BB, 0x1D16E,
+	 /* 4868 */ 0x1D1BC, 0x1D16E,
+	 /* 4870 */ 0x1D1BB, 0x1D16F,
+	 /* 4872 */ 0x1D1BC, 0x1D16F,
+	 /* 4874 */ 0x0030, 0x002E,
+	 /* 4876 */ 0x0030, 0x002C,
+	 /* 4878 */ 0x0031, 0x002C,
+	 /* 4880 */ 0x0032, 0x002C,
+	 /* 4882 */ 0x0033, 0x002C,
+	 /* 4884 */ 0x0034, 0x002C,
+	 /* 4886 */ 0x0035, 0x002C,
+	 /* 4888 */ 0x0036, 0x002C,
+	 /* 4890 */ 0x0037, 0x002C,
+	 /* 4892 */ 0x0038, 0x002C,
+	 /* 4894 */ 0x0039, 0x002C,
+	 /* 4896 */ 0x0028, 0x0041, 0x0029,
+	 /* 4899 */ 0x0028, 0x0042, 0x0029,
+	 /* 4902 */ 0x0028, 0x0043, 0x0029,
+	 /* 4905 */ 0x0028, 0x0044, 0x0029,
+	 /* 4908 */ 0x0028, 0x0045, 0x0029,
+	 /* 4911 */ 0x0028, 0x0046, 0x0029,
+	 /* 4914 */ 0x0028, 0x0047, 0x0029,
+	 /* 4917 */ 0x0028, 0x0048, 0x0029,
+	 /* 4920 */ 0x0028, 0x0049, 0x0029,
+	 /* 4923 */ 0x0028, 0x004A, 0x0029,
+	 /* 4926 */ 0x0028, 0x004B, 0x0029,
+	 /* 4929 */ 0x0028, 0x004C, 0x0029,
+	 /* 4932 */ 0x0028, 0x004D, 0x0029,
+	 /* 4935 */ 0x0028, 0x004E, 0x0029,
+	 /* 4938 */ 0x0028, 0x004F, 0x0029,
+	 /* 4941 */ 0x0028, 0x0050, 0x0029,
+	 /* 4944 */ 0x0028, 0x0051, 0x0029,
+	 /* 4947 */ 0x0028, 0x0052, 0x0029,
+	 /* 4950 */ 0x0028, 0x0053, 0x0029,
+	 /* 4953 */ 0x0028, 0x0054, 0x0029,
+	 /* 4956 */ 0x0028, 0x0055, 0x0029,
+	 /* 4959 */ 0x0028, 0x0056, 0x0029,
+	 /* 4962 */ 0x0028, 0x0057, 0x0029,
+	 /* 4965 */ 0x0028, 0x0058, 0x0029,
+	 /* 4968 */ 0x0028, 0x0059, 0x0029,
+	 /* 4971 */ 0x0028, 0x005A, 0x0029,
+	 /* 4974 */ 0x3014, 0x0053, 0x3015,
+	 /* 4977 */ 0x0043, 0x0044,
+	 /* 4979 */ 0x0057, 0x005A,
+	 /* 4981 */ 0x0048, 0x0056,
+	 /* 4983 */ 0x004D, 0x0056,
+	 /* 4985 */ 0x0053, 0x0044,
+	 /* 4987 */ 0x0053, 0x0053,
+	 /* 4989 */ 0x0050, 0x0050, 0x0056,
+	 /* 4992 */ 0x0057, 0x0043,
+	 /* 4994 */ 0x004D, 0x0043,
+	 /* 4996 */ 0x004D, 0x0044,
+	 /* 4998 */ 0x004D, 0x0052,
+	 /* 5000 */ 0x0044, 0x004A,
+	 /* 5002 */ 0x307B, 0x304B,
+	 /* 5004 */ 0x30B3, 0x30B3,
+	 /* 5006 */ 0x3014, 0x672C, 0x3015,
+	 /* 5009 */ 0x3014, 0x4E09, 0x3015,
+	 /* 5012 */ 0x3014, 0x4E8C, 0x3015,
+	 /* 5015 */ 0x3014, 0x5B89, 0x3015,
+	 /* 5018 */ 0x3014, 0x70B9, 0x3015,
+	 /* 5021 */ 0x3014, 0x6253, 0x3015,
+	 /* 5024 */ 0x3014, 0x76D7, 0x3015,
+	 /* 5027 */ 0x3014, 0x52DD, 0x3015,
+	 /* 5030 */ 0x3014, 0x6557, 0x3015,
+	 /* 5033 */ 0x20122,
+	 /* 5034 */ 0x2063A,
+	 /* 5035 */ 0x2051C,
+	 /* 5036 */ 0x2054B,
+	 /* 5037 */ 0x291DF,
+	 /* 5038 */ 0x20A2C,
+	 /* 5039 */ 0x20B63,
+	 /* 5040 */ 0x214E4,
+	 /* 5041 */ 0x216A8,
+	 /* 5042 */ 0x216EA,
+	 /* 5043 */ 0x219C8,
+	 /* 5044 */ 0x21B18,
+	 /* 5045 */ 0x21DE4,
+	 /* 5046 */ 0x21DE6,
+	 /* 5047 */ 0x22183,
+	 /* 5048 */ 0x2A392,
+	 /* 5049 */ 0x22331,
+	 /* 5050 */ 0x22331,
+	 /* 5051 */ 0x232B8,
+	 /* 5052 */ 0x261DA,
+	 /* 5053 */ 0x226D4,
+	 /* 5054 */ 0x22B0C,
+	 /* 5055 */ 0x22BF1,
+	 /* 5056 */ 0x2300A,
+	 /* 5057 */ 0x233C3,
+	 /* 5058 */ 0x2346D,
+	 /* 5059 */ 0x236A3,
+	 /* 5060 */ 0x238A7,
+	 /* 5061 */ 0x23A8D,
+	 /* 5062 */ 0x21D0B,
+	 /* 5063 */ 0x23AFA,
+	 /* 5064 */ 0x23CBC,
+	 /* 5065 */ 0x23D1E,
+	 /* 5066 */ 0x23ED1,
+	 /* 5067 */ 0x23F5E,
+	 /* 5068 */ 0x23F8E,
+	 /* 5069 */ 0x20525,
+	 /* 5070 */ 0x24263,
+	 /* 5071 */ 0x243AB,
+	 /* 5072 */ 0x24608,
+	 /* 5073 */ 0x24735,
+	 /* 5074 */ 0x24814,
+	 /* 5075 */ 0x24C36,
+	 /* 5076 */ 0x24C92,
+	 /* 5077 */ 0x2219F,
+	 /* 5078 */ 0x24FA1,
+	 /* 5079 */ 0x24FB8,
+	 /* 5080 */ 0x25044,
+	 /* 5081 */ 0x250F3,
+	 /* 5082 */ 0x250F2,
+	 /* 5083 */ 0x25119,
+	 /* 5084 */ 0x25133,
+	 /* 5085 */ 0x2541D,
+	 /* 5086 */ 0x25626,
+	 /* 5087 */ 0x2569A,
+	 /* 5088 */ 0x256C5,
+	 /* 5089 */ 0x2597C,
+	 /* 5090 */ 0x25AA7,
+	 /* 5091 */ 0x25AA7,
+	 /* 5092 */ 0x25BAB,
+	 /* 5093 */ 0x25C80,
+	 /* 5094 */ 0x25F86,
+	 /* 5095 */ 0x26228,
+	 /* 5096 */ 0x26247,
+	 /* 5097 */ 0x262D9,
+	 /* 5098 */ 0x2633E,
+	 /* 5099 */ 0x264DA,
+	 /* 5100 */ 0x26523,
+	 /* 5101 */ 0x265A8,
+	 /* 5102 */ 0x2335F,
+	 /* 5103 */ 0x267A7,
+	 /* 5104 */ 0x267B5,
+	 /* 5105 */ 0x23393,
+	 /* 5106 */ 0x2339C,
+	 /* 5107 */ 0x26B3C,
+	 /* 5108 */ 0x26C36,
+	 /* 5109 */ 0x26D6B,
+	 /* 5110 */ 0x26CD5,
+	 /* 5111 */ 0x273CA,
+	 /* 5112 */ 0x26F2C,
+	 /* 5113 */ 0x26FB1,
+	 /* 5114 */ 0x270D2,
+	 /* 5115 */ 0x27667,
+	 /* 5116 */ 0x278AE,
+	 /* 5117 */ 0x27966,
+	 /* 5118 */ 0x27CA8,
+	 /* 5119 */ 0x27F2F,
+	 /* 5120 */ 0x20804,
+	 /* 5121 */ 0x208DE,
+	 /* 5122 */ 0x285D2,
+	 /* 5123 */ 0x285ED,
+	 /* 5124 */ 0x2872E,
+	 /* 5125 */ 0x28BFA,
+	 /* 5126 */ 0x28D77,
+	 /* 5127 */ 0x29145,
+	 /* 5128 */ 0x2921A,
+	 /* 5129 */ 0x2940A,
+	 /* 5130 */ 0x29496,
+	 /* 5131 */ 0x295B6,
+	 /* 5132 */ 0x29B30,
+	 /* 5133 */ 0x2A0CE,
+	 /* 5134 */ 0x2A105,
+	 /* 5135 */ 0x2A20E,
+	 /* 5136 */ 0x2A291,
+	 /* 5137 */ 0x2A600
 };
diff --git a/src/include/common/unicode_version.h b/src/include/common/unicode_version.h
index bf1f64b95b1..5f6a00ba1ea 100644
--- a/src/include/common/unicode_version.h
+++ b/src/include/common/unicode_version.h
@@ -11,4 +11,4 @@
  *-------------------------------------------------------------------------
  */
 
-#define PG_UNICODE_VERSION		"15.1"
+#define PG_UNICODE_VERSION		"16.0"
diff --git a/src/test/regress/expected/unicode.out b/src/test/regress/expected/unicode.out
index 1e06de22649..2faa4c64bea 100644
--- a/src/test/regress/expected/unicode.out
+++ b/src/test/regress/expected/unicode.out
@@ -59,13 +59,13 @@ SELECT normalize(U&'\00E4\24D1c', NFD) = U&'\0061\0308\24D1c' COLLATE "C" AS tes
 SELECT normalize(U&'\0061\0308\24D1c', NFKC) = U&'\00E4bc' COLLATE "C" AS test_nfkc;
  test_nfkc 
 -----------
- t
+ f
 (1 row)
 
 SELECT normalize(U&'\00E4\24D1c', NFKD) = U&'\0061\0308bc' COLLATE "C" AS test_nfkd;
  test_nfkd 
 -----------
- t
+ f
 (1 row)
 
 SELECT "normalize"('abc', 'def');  -- run-time error
@@ -99,7 +99,7 @@ ORDER BY num;
    1 | äbc | t   | f   | t    | f
    2 | äbc | f   | t   | f    | t
    3 | äⓑc | t   | f   | f    | f
-   4 | äⓑc | f   | t   | f    | f
+   4 | äⓑc | f   | t   | f    | t
    5 |     | t   | t   | t    | t
 (5 rows)
 
-- 
2.34.1

From 5dfd89abcb4538ca8ead83c8bbff98b5dae10240 Mon Sep 17 00:00:00 2001
From: Jeff Davis <j...@j-davis.com>
Date: Mon, 3 Feb 2025 13:02:37 -0800
Subject: [PATCH v2 2/2] Add pg_upgrade check for Unicode-dependent relations.

---
 src/bin/pg_upgrade/check.c | 180 +++++++++++++++++++++++++++++++++++++
 1 file changed, 180 insertions(+)

diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c
index 7ca1d8fffc9..25b4c025aa5 100644
--- a/src/bin/pg_upgrade/check.c
+++ b/src/bin/pg_upgrade/check.c
@@ -13,6 +13,7 @@
 #include "catalog/pg_class_d.h"
 #include "fe_utils/string_utils.h"
 #include "pg_upgrade.h"
+#include "common/unicode_version.h"
 
 static void check_new_cluster_is_empty(void);
 static void check_is_install_user(ClusterInfo *cluster);
@@ -25,6 +26,7 @@ static void check_for_tables_with_oids(ClusterInfo *cluster);
 static void check_for_pg_role_prefix(ClusterInfo *cluster);
 static void check_for_new_tablespace_dir(void);
 static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster);
+static void check_for_unicode_update(ClusterInfo *cluster);
 static void check_new_cluster_logical_replication_slots(void);
 static void check_new_cluster_subscription_configuration(void);
 static void check_old_cluster_for_valid_slots(void);
@@ -633,6 +635,12 @@ check_and_dump_old_cluster(void)
 
 	check_for_data_types_usage(&old_cluster);
 
+	/*
+	 * Unicode updates can affect some objects that use expressions with
+	 * functions dependent on Unicode.
+	 */
+	check_for_unicode_update(&old_cluster);
+
 	/*
 	 * PG 14 changed the function signature of encoding conversion functions.
 	 * Conversions from older versions cannot be upgraded automatically
@@ -1740,6 +1748,178 @@ check_for_user_defined_encoding_conversions(ClusterInfo *cluster)
 		check_ok();
 }
 
+/*
+ * Callback function for processing results of query for
+ * check_for_unicode_update()'s UpgradeTask.  If the query returned any rows
+ * (i.e., the check failed), write the details to the report file.
+ */
+static void
+process_unicode_update(DbInfo *dbinfo, PGresult *res, void *arg)
+{
+	UpgradeTaskReport *report = (UpgradeTaskReport *) arg;
+	int			ntups = PQntuples(res);
+	int			i_reloid = PQfnumber(res, "reloid");
+	int			i_nspname = PQfnumber(res, "nspname");
+	int			i_relname = PQfnumber(res, "relname");
+
+	if (ntups == 0)
+		return;
+
+	if (report->file == NULL &&
+		(report->file = fopen_priv(report->path, "w")) == NULL)
+		pg_fatal("could not open file \"%s\": %m", report->path);
+
+	fprintf(report->file, "In database: %s\n", dbinfo->db_name);
+
+	for (int rowno = 0; rowno < ntups; rowno++)
+		fprintf(report->file, "  (oid=%s) %s.%s\n",
+				PQgetvalue(res, rowno, i_reloid),
+				PQgetvalue(res, rowno, i_nspname),
+				PQgetvalue(res, rowno, i_relname));
+}
+
+/*
+ * Check if the Unicode version built into Postgres changed between the old
+ * cluster and the new cluster.
+ */
+static bool
+unicode_version_changed(ClusterInfo *cluster)
+{
+	PGconn	   *conn_template1 = connectToServer(cluster, "template1");
+	PGresult   *res;
+	char	   *old_unicode_version;
+	bool		unicode_updated;
+
+	res = executeQueryOrDie(conn_template1, "SELECT unicode_version()");
+	old_unicode_version = PQgetvalue(res, 0, 0);
+	unicode_updated = (strcmp(old_unicode_version, PG_UNICODE_VERSION) != 0);
+
+	PQclear(res);
+	PQfinish(conn_template1);
+
+	return unicode_updated;
+}
+
+/*
+ * check_for_unicode_update()
+ *
+ * Check if the version of Unicode in the old server and the new server
+ * differ. If so, check for indexes, partitioned tables, or constraints that
+ * use expressions with functions dependent on Unicode behavior.
+ */
+static void
+check_for_unicode_update(ClusterInfo *cluster)
+{
+	UpgradeTaskReport report;
+	UpgradeTask *task = upgrade_task_create();
+	const char *query;
+
+	/*
+	 * The builtin provider did not exist prior to version 17. While there are
+	 * still problems that could potentially be caught from earlier versions,
+	 * such as an index on NORMALIZE(), we don't check for that here.
+	 */
+	if (GET_MAJOR_VERSION(cluster->major_version) < 1700)
+		return;
+
+	prep_status("Checking for objects affected by Unicode update");
+
+	if (!unicode_version_changed(cluster))
+	{
+		check_ok();
+		return;
+	}
+
+	report.file = NULL;
+	snprintf(report.path, sizeof(report.path), "%s/%s",
+			 log_opts.basedir,
+			 "unicode_dependent_rels.txt");
+
+	query =
+	/* collations that use built-in Unicode for character semantics */
+		"WITH collations(collid) AS ( "
+		"  SELECT oid FROM pg_collation "
+		"  WHERE collprovider='b' AND colllocale IN ('C.UTF-8','PG_UNICODE_FAST') "
+	/* include default collation, if appropriate */
+		"  UNION "
+		"  SELECT 'pg_catalog.default'::regcollation FROM pg_database "
+		"  WHERE datname = current_database() AND "
+		"  datlocprovider='b' AND datlocale IN ('C.UTF-8','PG_UNICODE_FAST') "
+		"), "
+	/* functions that use built-in Unicode */
+		"functions(procid) AS ( "
+		"  SELECT proc.oid FROM pg_proc proc "
+		"  WHERE proname IN ('normalize','unicode_assigned','unicode_version','is_normalized') AND "
+		"        pronamespace='pg_catalog'::regnamespace "
+		"), "
+	/* operators that use the input collation for character semantics */
+		"coll_operators(operid, procid, collid) AS ( "
+		"  SELECT oper.oid, oper.oprcode, collid FROM pg_operator oper, collations "
+		"  WHERE oprname IN ('~', '~*', '!~', '!~*', '~~*', '!~~*') AND "
+		"        oprnamespace='pg_catalog'::regnamespace AND "
+		"        oprright='text'::regtype "
+		"), "
+	/* functions that use the input collation for character semantics */
+		"coll_functions(procid, collid) AS ( "
+		"  SELECT proc.oid, collid FROM pg_proc proc, collations "
+		"  WHERE proname IN ('lower','initcap','upper') AND "
+		"        pronamespace='pg_catalog'::regnamespace AND "
+		"        proargtypes[0] = 'text'::regtype "
+	/* include functions behind the operators listed above */
+		"  UNION "
+		"  SELECT procid, collid FROM coll_operators "
+		"), "
+
+	/*
+	 * Generate patterns to search a pg_node_tree for the above functions and
+	 * operators.
+	 */
+		"patterns(p) AS ( "
+		"  SELECT '{FUNCEXPR :funcid ' || procid::text || '[ }]' FROM functions "
+		"  UNION "
+		"  SELECT '{OPEXPR :opno ' || operid::text || ' (:\\w+ \\w+ )*' || "
+		"         ':inputcollid ' || collid::text || '[ }]' FROM coll_operators "
+		"  UNION "
+		"  SELECT '{FUNCEXPR :funcid ' || procid::text || ' (:\\w+ \\w+ )*' || "
+		"         ':inputcollid ' || collid::text || '[ }]' FROM coll_functions "
+		") "
+
+	/*
+	 * Match the patterns against expressions used for relation contents.
+	 */
+		"SELECT reloid, relkind, nspname, relname "
+		"  FROM ( "
+		"    SELECT conrelid "
+		"    FROM pg_constraint, patterns WHERE conbin::text ~ p "
+		"  UNION "
+		"    SELECT indexrelid "
+		"    FROM pg_index, patterns WHERE indexprs::text ~ p OR indpred::text ~ p "
+		"  UNION "
+		"    SELECT partrelid "
+		"    FROM pg_partitioned_table, patterns WHERE partexprs::text ~ p "
+		"  ) s(reloid), pg_class c, pg_namespace n, pg_database d "
+		"  WHERE s.reloid = c.oid AND c.relnamespace = n.oid AND "
+		"        d.datname = current_database() AND "
+		"        d.encoding = pg_char_to_encoding('UTF8');";
+
+	upgrade_task_add_step(task, query,
+						  process_unicode_update,
+						  true, &report);
+	upgrade_task_run(task, cluster);
+	upgrade_task_free(task);
+
+	if (report.file)
+	{
+		fclose(report.file);
+		report_status(PG_WARNING, "warning");
+		pg_log(PG_WARNING, "Your installation contains relations that may be affected by a new version of Unicode.\n"
+			   "A list of potentially-affected relations is in the file:\n"
+			   "    %s", report.path);
+	}
+	else
+		check_ok();
+}
+
 /*
  * check_new_cluster_logical_replication_slots()
  *
-- 
2.34.1

Reply via email to