texlive[63452] Build/source/libs/icu: icu 71.1

commits+karl at tug.org commits+karl at tug.org
Tue May 31 03:17:17 CEST 2022


Revision: 63452
          http://tug.org/svn/texlive?view=revision&revision=63452
Author:   karl
Date:     2022-05-31 03:17:15 +0200 (Tue, 31 May 2022)
Log Message:
-----------
icu 71.1

Modified Paths:
--------------
    trunk/Build/source/libs/icu/ChangeLog
    trunk/Build/source/libs/icu/TLpatches/ChangeLog
    trunk/Build/source/libs/icu/TLpatches/TL-Changes
    trunk/Build/source/libs/icu/TLpatches/patch-01-configure-gcc
    trunk/Build/source/libs/icu/TLpatches/patch-12-mingw
    trunk/Build/source/libs/icu/TLpatches/patch-13-STATIC_PREFIX
    trunk/Build/source/libs/icu/TLpatches/patch-19-netbsd
    trunk/Build/source/libs/icu/configure
    trunk/Build/source/libs/icu/icu-src/APIChangeReport.html
    trunk/Build/source/libs/icu/icu-src/APIChangeReport.md
    trunk/Build/source/libs/icu/icu-src/LICENSE
    trunk/Build/source/libs/icu/icu-src/source/common/brkeng.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/brkeng.h
    trunk/Build/source/libs/icu/icu-src/source/common/brkiter.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/common.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/common/dictbe.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/dictbe.h
    trunk/Build/source/libs/icu/icu-src/source/common/localematcher.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/locid.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.h
    trunk/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/rbbi.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/serv.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/servls.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/servnotf.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/ubrk.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/ucase.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/ucase.h
    trunk/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/ucnv.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/ucurr.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/uloc.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/urename.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/uset.h
    trunk/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h
    trunk/Build/source/libs/icu/icu-src/source/common/unistr.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/uposixdefs.h
    trunk/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/uvector.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/uvector.h
    trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp
    trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.h
    trunk/Build/source/libs/icu/icu-src/source/configure
    trunk/Build/source/libs/icu/icu-src/source/configure.ac
    trunk/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt
    trunk/Build/source/libs/icu/icu-src/source/data/makedata.mak
    trunk/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak
    trunk/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/i18n/measunit_extra.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt_impl.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/rbt_set.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/region.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/region_impl.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/ucol.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/udatpg.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/units_converter.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/units_router.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.h
    trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp
    trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.h
    trunk/Build/source/libs/icu/icu-src/source/io/io.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/io/sprintf.cpp
    trunk/Build/source/libs/icu/icu-src/source/io/ustdio.cpp
    trunk/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/samples/Makefile.in
    trunk/Build/source/libs/icu/icu-src/source/samples/case/ucase.c
    trunk/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/coll/coll.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/datecal/cal.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.cpp
    trunk/Build/source/libs/icu/icu-src/source/samples/readme.txt
    trunk/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.cpp
    trunk/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.h
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ucsdetst.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/udatpg_test.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c
    trunk/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c
    trunk/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.h
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/icusvtst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/lstmbetst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.h
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/units_test.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c
    trunk/Build/source/libs/icu/icu-src/source/test/perf/Makefile.in
    trunk/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.cpp
    trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/Makefile.in
    trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.h
    trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt
    trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt
    trunk/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt
    trunk/Build/source/libs/icu/icu-src/source/test/testdata/root.txt
    trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/uperf.cpp
    trunk/Build/source/libs/icu/icu-src/source/tools/icuexportdata/icuexportdata.cpp
    trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp
    trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj
    trunk/Build/source/libs/icu/icu-src/source/tools/tzcode/icuregions
    trunk/Build/source/libs/icu/version.ac

Added Paths:
-----------
    trunk/Build/source/libs/icu/icu-src/source/common/BUILD.bazel
    trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/
    trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/
    trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/
    trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldml.dtd
    trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldmlICU.dtd
    trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat
    trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD.bazel
    trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD.bazel
    trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unounclass.h
    trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/Makefile
    trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/Makefile
    trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/Makefile
    trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD.bazel
    trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD.bazel
    trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD.bazel

Removed Paths:
-------------
    trunk/Build/source/libs/icu/TLpatches/patch-02-configure-solaris
    trunk/Build/source/libs/icu/TLpatches/patch-15-pow
    trunk/Build/source/libs/icu/icu-src/source/common/BUILD
    trunk/Build/source/libs/icu/icu-src/source/data/in/icudt70l.dat
    trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD
    trunk/Build/source/libs/icu/icu-src/source/data/unidata/ucdterms.txt
    trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD
    trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD
    trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD
    trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD

Modified: trunk/Build/source/libs/icu/ChangeLog
===================================================================
--- trunk/Build/source/libs/icu/ChangeLog	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/ChangeLog	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,3 +1,7 @@
+2022-05-30  Karl Berry  <karl at freefriends.org>
+
+	* Import icu-71.1.
+
 2022-01-16  Karl Berry  <karl at freefriends.org>
 
 	* Import icu-70.1, undoing the std::max_align_t hack since we have

Modified: trunk/Build/source/libs/icu/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/ChangeLog	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/ChangeLog	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,3 +1,10 @@
+2022-05-30  Karl Berry  <karl at freefriends.org>
+
+	* Update for icu-71.1.
+	* patch-02-configure-solaris: remove, applied upstream.
+	* patch-15-pow: remove, applied upstream.
+	Other patches did not need changes, apart from re-diffing.
+
 2022-01-26  Mojca Miklavec  <mojca.miklavec.lists at gmail.com>
 
 	* patch-10-ES: remove, applied upstream

Modified: trunk/Build/source/libs/icu/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/TL-Changes	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/TL-Changes	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,7 +1,7 @@
 Changes applied to the icu tree as obtained from:
+   github.com/unicode-org/icu/releases/download/release-71-1/icu4c-71_1-src.tgz
+        and icu4c-71_1-data.zip
    github.com/unicode-org/icu/releases/download/release-70-1/icu4c-70_1-src.tgz
-   github.com/unicode-org/icu/releases/download/release-68-2/icu4c-68_2-src.tgz
-        and icu4c-68_2-data.zip
             icu4c-70_1-data.zip
 
 cd $Build/source/libs/icu       # for whatever $Build directory
@@ -28,12 +28,12 @@
 
 # patch --backup -p0 for all ../TLpatches/patch-* files.
 # Save original (since not committed yet)
-# and diff after each to update patch-* file.
+# and diff -u2 after each to update patch-* file.
 # Don't lose our leading comments.
 
-# autoreconf in the TL directory (Build/source/libs/icu); don't run
-# autoreconf in the icu-src/source/ directory, it fails due to missing
-# pkg-config prerequisites. (Thus we patch configure, not just
+# autoreconf in the TL directory (Build/source/libs/icu); 
+# don't run autoreconf in the icu-src/source/ directory, it fails due to
+# missing pkg-config prerequisites. (Thus we patch configure, not just
 # configure.ac; not worth more effort for our small change of preferring gcc.)
 # 
 # rebuild; must rerun configure (not just config.status),
@@ -43,7 +43,7 @@
 # Assuming all seems ok, reduce size of source/data/in/icudt*.dat
 # to decrease data segment size, e.g., for old BSD.  First, check
 # that we successfully built the full .dat:
-ver=70
+ver=71
 srcdat=$Build/source/libs/icu/icu-src/source/data/in/icudt${ver}l.dat 
 cd $Work/libs/icu/icu-build/data/out/build/icudt${ver}l
 indat=../../tmp/icudt${ver}l.dat

Modified: trunk/Build/source/libs/icu/TLpatches/patch-01-configure-gcc
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-01-configure-gcc	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-01-configure-gcc	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,8 +1,8 @@
 	For TL, we do not want to prefer clang(++) for ICU
 	when the whole rest of the tree prefers gcc.
 
---- source/configure~	2021-10-28 09:04:57.000000000 -0700
-+++ source/configure	2022-01-16 14:43:05.441342307 -0800
+--- source/configure~	2022-04-07 15:41:55.000000000 -0700
++++ source/configure	2022-05-30 13:20:19.130618230 -0700
 @@ -2925,5 +2925,5 @@
  ac_compiler_gnu=$ac_cv_c_compiler_gnu
  if test -n "$ac_tool_prefix"; then

Deleted: trunk/Build/source/libs/icu/TLpatches/patch-02-configure-solaris
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-02-configure-solaris	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-02-configure-solaris	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,22 +0,0 @@
-	https://unicode-org.atlassian.net/browse/ICU-13543 (fixed upstream in 71.1)
-
-	Do not disable C++11 on Solaris, since we don't use the Sun compiler.
-
---- source/configure~	2022-01-16 14:43:05.441342307 -0800
-+++ source/configure	2022-01-16 14:44:14.808693105 -0800
-@@ -6161,9 +6161,10 @@
-             CXXFLAGS="$OLD_CXXFLAGS"
-         fi
--        case "${host}" in
--        *-*-solaris*)
--            CXXFLAGS="$OLD_CXXFLAGS"
--            ;;
--        esac
-+# TL: why? http://bugs.icu-project.org/trac/ticket/13543
-+#        case "${host}" in
-+#        *-*-solaris*)
-+#            CXXFLAGS="$OLD_CXXFLAGS"
-+#            ;;
-+#        esac
-     fi
- fi

Modified: trunk/Build/source/libs/icu/TLpatches/patch-12-mingw
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-12-mingw	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-12-mingw	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,7 +1,7 @@
 	We don't want this for TeX Live cross compilation.
 
---- source/config/mh-mingw~	2021-10-28 09:04:57.000000000 -0700
-+++ source/config/mh-mingw	2022-01-16 14:45:28.817000693 -0800
+--- source/config/mh-mingw~	2022-04-07 15:41:55.000000000 -0700
++++ source/config/mh-mingw	2022-05-30 13:23:15.072518726 -0700
 @@ -76,25 +76,7 @@
  STATIC_O = ao
  

Modified: trunk/Build/source/libs/icu/TLpatches/patch-13-STATIC_PREFIX
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-13-STATIC_PREFIX	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-13-STATIC_PREFIX	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,7 +1,7 @@
 	No `s' for STATIC_PREFIX.
 
---- source/config/Makefile.inc.in~	2021-10-28 09:04:57.000000000 -0700
-+++ source/config/Makefile.inc.in	2022-01-16 14:46:07.352640250 -0800
+--- source/config/Makefile.inc.in~	2022-04-07 15:41:55.000000000 -0700
++++ source/config/Makefile.inc.in	2022-05-30 13:23:53.633058660 -0700
 @@ -47,5 +47,5 @@
  
  # Static library prefix and file extension
@@ -9,8 +9,8 @@
 +STATIC_PREFIX =
  LIBSICU = lib$(STATIC_PREFIX)$(ICUPREFIX)
  A = a
---- source/icudefs.mk.in~	2021-10-28 09:04:57.000000000 -0700
-+++ source/icudefs.mk.in	2022-01-16 14:46:07.352640250 -0800
+--- source/icudefs.mk.in~	2022-04-07 15:41:55.000000000 -0700
++++ source/icudefs.mk.in	2022-05-30 13:23:53.633058660 -0700
 @@ -214,5 +214,5 @@
  ## If we can't use the shared libraries, use the static libraries
  ifneq ($(ENABLE_SHARED),YES)

Deleted: trunk/Build/source/libs/icu/TLpatches/patch-15-pow
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-15-pow	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-15-pow	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,44 +0,0 @@
-	https://unicode-org.atlassian.net/browse/ICU-21896 (fixed upstream in 71.1)
-
-	Else Solaris gets
-libs/icu/icu-src/source/i18n/plurrule.cpp:1884:90:
-error: call of overloaded 'pow(int, const int32_t&)' is ambiguous
-	per https://tug.org/pipermail/tlbuild/2022q1/005020.html.
-
---- plurrule.cpp	(revision 61625)
-+++ plurrule.cpp	(working copy)
-@@ -1628,7 +1628,7 @@
-     init(n, v, f, e);
-     // check values. TODO make into unit test.
-     //            
--    //            long visiblePower = (int) Math.pow(10, v);
-+    //            long visiblePower = (int) Math.pow(10.0, v);
-     //            if (decimalDigits > visiblePower) {
-     //                throw new IllegalArgumentException();
-     //            }
-@@ -1881,7 +1881,7 @@
- 
- double FixedDecimal::getPluralOperand(PluralOperand operand) const {
-     switch(operand) {
--        case PLURAL_OPERAND_N: return (exponent == 0 ? source : source * pow(10, exponent));
-+        case PLURAL_OPERAND_N: return (exponent == 0 ? source : source * pow(10.0, exponent));
-         case PLURAL_OPERAND_I: return (double) longValue();
-         case PLURAL_OPERAND_F: return static_cast<double>(decimalDigits);
-         case PLURAL_OPERAND_T: return static_cast<double>(decimalDigitsWithoutTrailingZeros);
-@@ -1932,14 +1932,14 @@
- }
- 
- double FixedDecimal::doubleValue() const {
--    return (isNegative ? -source : source) * pow(10, exponent);
-+    return (isNegative ? -source : source) * pow(10.0, exponent);
- }
- 
- int64_t FixedDecimal::longValue() const {
-     if (exponent == 0) {
-         return intValue;
-     } else {
--        return (long) (pow(10, exponent) * intValue);
-+        return (long) (pow(10.0, exponent) * intValue);
-     }
- }
- 

Modified: trunk/Build/source/libs/icu/TLpatches/patch-19-netbsd
===================================================================
--- trunk/Build/source/libs/icu/TLpatches/patch-19-netbsd	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/TLpatches/patch-19-netbsd	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2,9 +2,9 @@
 	From: Marc Baudoin <babafou at babafou.eu.org>
 	tlbuild
 
---- source/common/uposixdefs.h~	2022-01-16 14:46:51.036231730 -0800
-+++ source/common/uposixdefs.h	2022-01-16 14:47:26.072904130 -0800
-@@ -78,3 +78,7 @@
+--- source/common/uposixdefs.h~	2022-04-07 15:41:55.000000000 -0700
++++ source/common/uposixdefs.h	2022-05-30 13:25:39.198799302 -0700
+@@ -75,3 +75,7 @@
  #endif
  
 +#if defined(__cplusplus) && defined(__NetBSD__)

Modified: trunk/Build/source/libs/icu/configure
===================================================================
--- trunk/Build/source/libs/icu/configure	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/configure	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for icu (TeX Live) 70.1.
+# Generated by GNU Autoconf 2.71 for icu (TeX Live) 71.1.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -610,8 +610,8 @@
 # Identity of this package.
 PACKAGE_NAME='icu (TeX Live)'
 PACKAGE_TARNAME='icu--tex-live-'
-PACKAGE_VERSION='70.1'
-PACKAGE_STRING='icu (TeX Live) 70.1'
+PACKAGE_VERSION='71.1'
+PACKAGE_STRING='icu (TeX Live) 71.1'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -1301,7 +1301,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures icu (TeX Live) 70.1 to adapt to many kinds of systems.
+\`configure' configures icu (TeX Live) 71.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1372,7 +1372,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of icu (TeX Live) 70.1:";;
+     short | recursive ) echo "Configuration of icu (TeX Live) 71.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1471,7 +1471,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-icu (TeX Live) configure 70.1
+icu (TeX Live) configure 71.1
 generated by GNU Autoconf 2.71
 
 Copyright (C) 2021 Free Software Foundation, Inc.
@@ -1633,7 +1633,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by icu (TeX Live) $as_me 70.1, which was
+It was created by icu (TeX Live) $as_me 71.1, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   $ $0$ac_configure_args_raw
@@ -4383,7 +4383,7 @@
 
 # Define the identity of the package.
  PACKAGE='icu--tex-live-'
- VERSION='70.1'
+ VERSION='71.1'
 
 
 printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -5893,7 +5893,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by icu (TeX Live) $as_me 70.1, which was
+This file was extended by icu (TeX Live) $as_me 71.1, which was
 generated by GNU Autoconf 2.71.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -5952,7 +5952,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config='$ac_cs_config_escaped'
 ac_cs_version="\\
-icu (TeX Live) config.status 70.1
+icu (TeX Live) config.status 71.1
 configured by $0, generated by GNU Autoconf 2.71,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/icu/icu-src/APIChangeReport.html
===================================================================
--- trunk/Build/source/libs/icu/icu-src/APIChangeReport.html	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/APIChangeReport.html	2022-05-31 01:17:15 UTC (rev 63452)
@@ -5,31 +5,31 @@
 	-->
 <head>
 <META http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>ICU4C API Comparison: ICU 69 with ICU 70</title>
+<title>ICU4C API Comparison: ICU 70 with ICU 71</title>
 <link type="text/css" href="icu4c.css" rel="stylesheet">
 </head>
 <body>
 <a name="#_top"></a>
-<h1>ICU4C API Comparison: ICU 69 with ICU 70</h1>
+<h1>ICU4C API Comparison: ICU 70 with ICU 71</h1>
 <div id="toc">
 <ul>
 <li>
-<a href="#removed">Removed from ICU 69</a>
+<a href="#removed">Removed from ICU 70</a>
 </li>
 <li>
-<a href="#deprecated">Deprecated or Obsoleted in ICU 70</a>
+<a href="#deprecated">Deprecated or Obsoleted in ICU 71</a>
 </li>
 <li>
-<a href="#changed">Changed in  ICU 70</a>
+<a href="#changed">Changed in  ICU 71</a>
 </li>
 <li>
-<a href="#promoted">Promoted to stable in ICU 70</a>
+<a href="#promoted">Promoted to stable in ICU 71</a>
 </li>
 <li>
-<a href="#added">Added in ICU 70</a>
+<a href="#added">Added in ICU 71</a>
 </li>
 <li>
-<a href="#other">Other existing drafts in ICU 70</a>
+<a href="#other">Other existing drafts in ICU 71</a>
 </li>
 <li>
 <a href="#simplifications">Signature Simplifications</a>
@@ -38,40 +38,36 @@
 <hr>
 </div>
 <a name="removed"></a>
-<h2>Removed from ICU 69</h2>
+<h2>Removed from ICU 70</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
-<tr class="row1">
-<td class="file">tmutfmt.h</td><td class="proto">bool icu::TimeUnitFormat::operator!=(const Format&) const</td><td class="">Deprecated<br>ICU 53</td><td>(missing)<br>
-<span class=""><span></span></span></td>
-</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="deprecated"></a>
-<h2>Deprecated or Obsoleted in ICU 70</h2>
+<h2>Deprecated or Obsoleted in ICU 71</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration()</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">const char* icu::number::FormattedNumber::getGender(UErrorCode&) const</td><td class="">Internal<br>ICU 69</td><td>Deprecated<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(const char*)</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
+<td class="file">ucnv.h</td><td class="proto">UConverter* ucnv_safeClone(const UConverter*, void*, int32_t*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>Deprecated<br>
+<span class="verchange"><span>ICU 71</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(int32_t)</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
+<td class="file">ucol.h</td><td class="proto">UCollator* ucol_safeClone(const UCollator*, void*, int32_t*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>Deprecated<br>
+<span class="verchange"><span>ICU 71</span></span></td>
 </tr>
 </table>
 <P></P>
@@ -78,775 +74,376 @@
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="changed"></a>
-<h2>Changed in  ICU 70 (old, new)</h2>
+<h2>Changed in  ICU 71 (old, new)</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">dtitvfmt.h</td><td class="proto">UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">basictz.h</td><td class="proto">void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">dtitvfmt.h</td><td class="proto">void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">localematcher.h</td><td class="proto">Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto">UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">localematcher.h</td><td class="proto">Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">localematcher.h</td><td class="proto">bool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getCandela()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoon()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoonImperial()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">numberformatter.h</td><td class="proto">const char* icu::number::FormattedNumber::getGender(UErrorCode&) const</td><td class="">Internal<br>ICU 69</td><td>Deprecated<br>
+<span class=""><span></span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDot()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">rbtz.h</td><td class="proto">void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDram()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">simpletz.h</td><td class="proto">void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDrop()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getEarthRadius()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getGrain()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getJigger()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getLumen()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPinch()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getQuartImperial()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto">void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucnv.h</td><td class="proto">UConverter* ucnv_safeClone(const UConverter*, void*, int32_t*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>Deprecated<br>
+<span class="verchange"><span>ICU 71</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucol.h</td><td class="proto">UCollator* ucol_safeClone(const UCollator*, void*, int32_t*, UErrorCode*)</td><td class="stabchange">Stable<br>ICU 2.0</td><td>Deprecated<br>
+<span class="verchange"><span>ICU 71</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uniset.h</td><td class="proto">UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto">std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const&</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&&</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementRange(USet*, UChar32, UChar32)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">numberrangeformatter.h</td><td class="proto">std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_removeAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_retainAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration()</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
+<td class="file">uset.h</td><td class="proto">void uset_retainString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(const char*)</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
+<td class="file">vtzone.h</td><td class="proto">void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
-<tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(int32_t)</td><td class="stabchange">Stable<br>ICU 2.4</td><td>Deprecated<br>
-<span class="verchange"><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">ucurr.h</td><td class="proto"><tt>enum</tt> UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">ucurr.h</td><td class="proto"><tt>enum</tt> UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">udateintervalformat.h</td><td class="proto">UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">udateintervalformat.h</td><td class="proto">void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto">int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UFormattedNumberRange* unumrf_openResult(UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_close(UNumberRangeFormatter*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_closeResult(UFormattedNumberRange*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">upluralrules.h</td><td class="proto">int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="promoted"></a>
-<h2>Promoted to stable in ICU 70</h2>
+<h2>Promoted to stable in ICU 71</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">dtitvfmt.h</td><td class="proto">UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">basictz.h</td><td class="proto">void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">dtitvfmt.h</td><td class="proto">void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">localematcher.h</td><td class="proto">Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto">UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">localematcher.h</td><td class="proto">Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">localematcher.h</td><td class="proto">bool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getCandela()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoon()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoonImperial()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">rbtz.h</td><td class="proto">void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDot()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">simpletz.h</td><td class="proto">void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDram()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getDrop()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getEarthRadius()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getGrain()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getJigger()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getLumen()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getPinch()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getQuartImperial()</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucal.h</td><td class="proto">void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucnv.h</td><td class="proto">UConverter* ucnv_clone(const UConverter*, UErrorCode*)</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 71</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 71.">(Born Stable)</b></td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">ucol.h</td><td class="proto">UCollator* ucol_clone(const UCollator*, UErrorCode*)</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 71</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 71.">(Born Stable)</b></td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uniset.h</td><td class="proto">UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto">std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const&</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementRange(USet*, UChar32, UChar32)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&&</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_complementString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_removeAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">numberrangeformatter.h</td><td class="proto">std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_retainAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row1">
-<td class="file">plurrule.h</td><td class="proto">UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
+<td class="file">uset.h</td><td class="proto">void uset_retainString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
+<td class="file">vtzone.h</td><td class="proto">void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 69</td>
 </tr>
-<tr class="row1">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRawOffset(int32_t, UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRegion(const char*, UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ARABIC_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_CYPRO_MINOAN</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ETHIOPIC_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_F</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_G</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_OLD_UYGHUR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_TANGSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_TOTO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_VITHKUQI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ZNAMENNY_MUSICAL_NOTATION</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_THIN_YEH</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_VERTICAL_TAIL</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">ucurr.h</td><td class="proto"><tt>enum</tt> UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">ucurr.h</td><td class="proto"><tt>enum</tt> UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">udateintervalformat.h</td><td class="proto">UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">udateintervalformat.h</td><td class="proto">void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto">int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UFormattedNumberRange* unumrf_openResult(UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_close(UNumberRangeFormatter*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_closeResult(UFormattedNumberRange*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberrangeformatter.h</td><td class="proto">void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row0">
-<td class="file">upluralrules.h</td><td class="proto">int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*)</td><td class="" colspan="2" align="center">Draft→Stable<br>ICU 68</td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_CYPRO_MINOAN</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_OLD_UYGHUR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_TANGSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_TOTO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_VITHKUQI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">utypes.h</td><td class="proto"><tt>enum</tt> UErrorCode::U_INPUT_TOO_LONG_ERROR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 68</span></span></td>
-</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="added"></a>
-<h2>Added in ICU 70</h2>
+<h2>Added in ICU 71</h2>
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">dcfmtsym.h</td><td class="proto"><tt>enum</tt>  							icu::DecimalFormatSymbols::ENumberFormatSymbol::kApproximatelySignSymbol</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span></span></span></td>
+<td class="file">dtptngen.h</td><td class="proto">const UnicodeString& icu::DateTimePatternGenerator::getDateTimeFormat(UDateFormatStyle, UErrorCode&) const</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getItem()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
+<td class="file">dtptngen.h</td><td class="proto">void icu::DateTimePatternGenerator::setDateTimeFormat(UDateFormatStyle, const UnicodeString&, UErrorCode&)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getKilowattHourPer100Kilometer()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto">NounClass icu::number::FormattedNumber::getNounClass(UErrorCode&) const</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createItem(UErrorCode&)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
+<td class="file">numberformatter.h</td><td class="proto"><tt>static</tt> IncrementPrecision icu::number::Precision::incrementExact(uint64_t, int16_t)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode&)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
+<td class="file">ucnv.h</td><td class="proto">UConverter* ucnv_clone(const UConverter*, UErrorCode*)</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 71</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 71.">(Born Stable)</b></td>
 </tr>
 <tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">const DecimalFormatSymbols* icu::number::LocalizedNumberFormatter::getDecimalFormatSymbols() const</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span></span></span></td>
+<td class="file">ucol.h</td><td class="proto">UCollator* ucol_clone(const UCollator*, UErrorCode*)</td><td class="">(missing)</td><td>Stable<br>
+<span class=""><span>ICU 71</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 71.">(Born Stable)</b></td>
 </tr>
 <tr class="row1">
-<td class="file">numberrangeformatter.h</td><td class="proto">icu::number::FormattedNumberRange::FormattedNumberRange()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
+<td class="file">udatpg.h</td><td class="proto">const UChar* udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator*, UDateFormatStyle, int32_t*, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
+<td class="file">udatpg.h</td><td class="proto">void udatpg_setDateTimeFormatForStyle(UDateTimePatternGenerator*, UDateFormatStyle, const UChar*, int32_t, UErrorCode*)</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
 <tr class="row1">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRawOffset(int32_t, UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
+<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatFields::UNUM_APPROXIMATELY_SIGN_FIELD</td><td class="">(missing)</td><td>Draft<br>
+<span class=""><span>ICU 71</span></span></td>
 </tr>
-<tr class="row0">
-<td class="file">timezone.h</td><td class="proto"><tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRegion(const char*, UErrorCode&)</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto">bool u_stringHasBinaryProperty(const UChar*, int32_t, UProperty)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ARABIC_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_CYPRO_MINOAN</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ETHIOPIC_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_B</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_F</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_G</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_OLD_UYGHUR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_TANGSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_TOTO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_VITHKUQI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UBlockCode::UBLOCK_ZNAMENNY_MUSICAL_NOTATION</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_THIN_YEH</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UJoiningGroup::U_JG_VERTICAL_TAIL</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_BASIC_EMOJI</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_EMOJI_KEYCAP_SEQUENCE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_FLAG_SEQUENCE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_TAG_SEQUENCE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_ZWJ_SEQUENCE</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatSymbolType::UDAT_NARROW_QUARTERS</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatSymbolType::UDAT_STANDALONE_NARROW_QUARTERS</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uniset.h</td><td class="proto">bool icu::UnicodeSet::hasStrings() const</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatSymbol::UNUM_APPROXIMATELY_SIGN_SYMBOL</td><td class="">(missing)</td><td>Internal<br>
-<span class=""><span></span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_CYPRO_MINOAN</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_OLD_UYGHUR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_TANGSA</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_TOTO</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row1">
-<td class="file">uscript.h</td><td class="proto"><tt>enum</tt> UScriptCode::USCRIPT_VITHKUQI</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 70</span></span></td><td class="bornstable"><b class="bigwarn" title="A new API was introduced as stable in ICU 70.">(Born Stable)</b></td>
-</tr>
-<tr class="row0">
-<td class="file">uset.h</td><td class="proto">bool uset_hasStrings(const USet*)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">uset.h</td><td class="proto">int32_t uset_getRangeCount(const USet*)</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row0">
-<td class="file">usetiter.h</td><td class="proto">UnicodeSetIterator& icu::UnicodeSetIterator::skipToStrings()</td><td class="">(missing)</td><td>Draft<br>
-<span class=""><span>ICU 70</span></span></td>
-</tr>
-<tr class="row1">
-<td class="file">utypes.h</td><td class="proto"><tt>enum</tt> UErrorCode::U_INPUT_TOO_LONG_ERROR</td><td class="">(missing)</td><td>Stable<br>
-<span class=""><span>ICU 68</span></span></td>
-</tr>
 </table>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <a name="other"></a>
-<h2>Other existing drafts in ICU 70</h2>
+<h2>Other existing drafts in ICU 71</h2>
 <div class="other">
 <table BORDER="1" class="genTable">
 <THEAD>
 <tr>
-<th>File</th><th>API</th><th>ICU 69</th><th>ICU 70</th>
+<th>File</th><th>API</th><th>ICU 70</th><th>ICU 71</th>
 </tr>
 </THEAD>
 <tr class="row1">
-<td class="file">basictz.h</td><td class="proto">void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
 <td class="file">measfmt.h</td><td class="proto">void icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 53</td>
 </tr>
-<tr class="row1">
-<td class="file">measunit.h</td><td class="proto">MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto">UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getItem()</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter()</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit icu::MeasureUnit::getKilowattHourPer100Kilometer()</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createItem(UErrorCode&)</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">measunit.h</td><td class="proto"><tt>static</tt> MeasureUnit* icu::MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode&)</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">numberformatter.h</td><td class="proto">Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">numberrangeformatter.h</td><td class="proto">icu::number::FormattedNumberRange::FormattedNumberRange()</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">rbtz.h</td><td class="proto">void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto">bool u_stringHasBinaryProperty(const UChar*, int32_t, UProperty)</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">simpletz.h</td><td class="proto">void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_BASIC_EMOJI</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">ubrk.h</td><td class="proto">UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_EMOJI_KEYCAP_SEQUENCE</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_FLAG_SEQUENCE</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_TAG_SEQUENCE</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_ZWJ_SEQUENCE</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uchar.h</td><td class="proto"><tt>enum</tt> UProperty::UCHAR_RGI_EMOJI</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">ucal.h</td><td class="proto"><tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatSymbolType::UDAT_NARROW_QUARTERS</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">ucal.h</td><td class="proto">void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">udat.h</td><td class="proto"><tt>enum</tt> UDateFormatSymbolType::UDAT_STANDALONE_NARROW_QUARTERS</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
 <td class="file">uformattedvalue.h</td><td class="proto"><tt>enum</tt> UFieldCategory::UFIELD_CATEGORY_NUMBER_RANGE_SPAN</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
 </tr>
 <tr class="row0">
-<td class="file">uniset.h</td><td class="proto">UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uniset.h</td><td class="proto">bool icu::UnicodeSet::hasStrings() const</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row1">
-<td class="file">unum.h</td><td class="proto"><tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row1">
-<td class="file">unumberformatter.h</td><td class="proto"><tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
 <td class="file">uregex.h</td><td class="proto"><tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ</td><td class="" colspan="2" align="center">Draft<br>ICU 2.4</td>
 </tr>
-<tr class="row1">
-<td class="file">uset.h</td><td class="proto">void uset_complementAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
 <tr class="row0">
-<td class="file">uset.h</td><td class="proto">void uset_complementRange(USet*, UChar32, UChar32)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uset.h</td><td class="proto">bool uset_hasStrings(const USet*)</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row1">
-<td class="file">uset.h</td><td class="proto">void uset_complementString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">uset.h</td><td class="proto">int32_t uset_getRangeCount(const USet*)</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
 <tr class="row0">
-<td class="file">uset.h</td><td class="proto">void uset_removeAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
+<td class="file">usetiter.h</td><td class="proto">UnicodeSetIterator& icu::UnicodeSetIterator::skipToStrings()</td><td class="" colspan="2" align="center">Draft<br>ICU 70</td>
 </tr>
-<tr class="row1">
-<td class="file">uset.h</td><td class="proto">void uset_retainAllCodePoints(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row0">
-<td class="file">uset.h</td><td class="proto">void uset_retainString(USet*, const UChar*, int32_t)</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
-<tr class="row1">
-<td class="file">vtzone.h</td><td class="proto">void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const</td><td class="" colspan="2" align="center">Draft<br>ICU 69</td>
-</tr>
 </table>
 </div>
 <P></P>
@@ -857,502 +454,13 @@
 <i>This section shows cases where the signature was "simplified" for the sake of comparison. The simplified form is in bold, followed by
     	all possible variations in "original" form.</i>
 <div class="other">
-<ul>
-<li>
-<b>UClassID icu::BreakIterator::getDynamicClassID() const</b>
-<br>UClassID icu::BreakIterator::getDynamicClassID() const override=0<br>UClassID icu::BreakIterator::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::Calendar::getDynamicClassID() const</b>
-<br>UClassID icu::Calendar::getDynamicClassID() const override=0<br>UClassID icu::Calendar::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::Collator::getDynamicClassID() const</b>
-<br>UClassID icu::Collator::getDynamicClassID() const override=0<br>UClassID icu::Collator::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::ForwardCharacterIterator::getDynamicClassID() const</b>
-<br>UClassID icu::ForwardCharacterIterator::getDynamicClassID() const override=0<br>UClassID icu::ForwardCharacterIterator::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::NumberFormat::getDynamicClassID() const</b>
-<br>UClassID icu::NumberFormat::getDynamicClassID() const override=0<br>UClassID icu::NumberFormat::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::TimeZone::getDynamicClassID() const</b>
-<br>UClassID icu::TimeZone::getDynamicClassID() const override=0<br>UClassID icu::TimeZone::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::Transliterator::getDynamicClassID() const</b>
-<br>UClassID icu::Transliterator::getDynamicClassID() const override=0<br>UClassID icu::Transliterator::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UClassID icu::UnicodeFunctor::getDynamicClassID() const</b>
-<br>UClassID icu::UnicodeFunctor::getDynamicClassID() const override=0<br>UClassID icu::UnicodeFunctor::getDynamicClassID() const=0<br>
-</li>
-<li>
-<b>UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, bool)</b>
-<br>UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, UBool)<br>UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, UBool) override<br>
-</li>
-<li>
-<b>UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, bool)</b>
-<br>UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, UBool)<br>UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, UBool) override<br>
-</li>
-<li>
-<b>UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, bool escapeUnprintable=) const</b>
-<br>UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, UBool escapeUnprintable=) const<br>UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, UBool escapeUnprintable=) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const<br>UBool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const<br>UBool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const<br>UBool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const<br>bool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const</b>
-<br>UBool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const<br>bool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::BreakIterator::operator==(const BreakIterator&) const</b>
-<br>UBool icu::BreakIterator::operator==(const BreakIterator&) const=0<br>bool icu::BreakIterator::operator==(const BreakIterator&) const=0<br>
-</li>
-<li>
-<b>bool icu::ChoiceFormat::operator==(const Format&) const</b>
-<br>UBool icu::ChoiceFormat::operator==(const Format&) const<br>bool icu::ChoiceFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::DateFormat::operator==(const Format&) const</b>
-<br>UBool icu::DateFormat::operator==(const Format&) const<br>bool icu::DateFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::DateIntervalFormat::operator==(const Format&) const</b>
-<br>UBool icu::DateIntervalFormat::operator==(const Format&) const<br>bool icu::DateIntervalFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::DecimalFormat::operator==(const Format&) const</b>
-<br>UBool icu::DecimalFormat::operator==(const Format&) const U_OVERRIDE<br>bool icu::DecimalFormat::operator==(const Format&) const U_OVERRIDE<br>
-</li>
-<li>
-<b>bool icu::Format::operator==(const Format&) const</b>
-<br>UBool icu::Format::operator==(const Format&) const=0<br>bool icu::Format::operator==(const Format&) const=0<br>
-</li>
-<li>
-<b>bool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const</b>
-<br>UBool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const=0<br>bool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const=0<br>
-</li>
-<li>
-<b>bool icu::GregorianCalendar::haveDefaultCentury() const</b>
-<br>UBool icu::GregorianCalendar::haveDefaultCentury() const<br>UBool icu::GregorianCalendar::haveDefaultCentury() const override<br>
-</li>
-<li>
-<b>bool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const</b>
-<br>UBool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const<br>UBool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const override<br>
-</li>
-<li>
-<b>bool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const</b>
-<br>UBool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const<br>UBool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const<br>UBool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const<br>UBool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const</b>
-<br>UBool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const<br>UBool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const</b>
-<br>UBool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const<br>bool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const</b>
-<br>UBool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const<br>bool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::MeasureFormat::operator==(const Format&) const</b>
-<br>UBool icu::MeasureFormat::operator==(const Format&) const<br>bool icu::MeasureFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::MessageFormat::operator==(const Format&) const</b>
-<br>UBool icu::MessageFormat::operator==(const Format&) const<br>bool icu::MessageFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::NumberFormat::operator==(const Format&) const</b>
-<br>UBool icu::NumberFormat::operator==(const Format&) const<br>bool icu::NumberFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::PluralFormat::operator==(const Format&) const</b>
-<br>UBool icu::PluralFormat::operator==(const Format&) const<br>bool icu::PluralFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedBreakIterator::isBoundary(int32_t)</b>
-<br>UBool icu::RuleBasedBreakIterator::isBoundary(int32_t)<br>UBool icu::RuleBasedBreakIterator::isBoundary(int32_t) override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const</b>
-<br>UBool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const<br>bool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedCollator::operator==(const Collator&) const</b>
-<br>UBool icu::RuleBasedCollator::operator==(const Collator&) const<br>bool icu::RuleBasedCollator::operator==(const Collator&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedNumberFormat::isLenient() const</b>
-<br>UBool icu::RuleBasedNumberFormat::isLenient() const<br>UBool icu::RuleBasedNumberFormat::isLenient() const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedNumberFormat::operator==(const Format&) const</b>
-<br>UBool icu::RuleBasedNumberFormat::operator==(const Format&) const<br>bool icu::RuleBasedNumberFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::RuleBasedTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::RuleBasedTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::RuleBasedTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::RuleBasedTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const</b>
-<br>UBool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const<br>UBool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const</b>
-<br>UBool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const<br>UBool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::operator==(const TimeZone&) const</b>
-<br>UBool icu::RuleBasedTimeZone::operator==(const TimeZone&) const<br>bool icu::RuleBasedTimeZone::operator==(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::RuleBasedTimeZone::useDaylightTime() const</b>
-<br>UBool icu::RuleBasedTimeZone::useDaylightTime() const<br>UBool icu::RuleBasedTimeZone::useDaylightTime() const override<br>
-</li>
-<li>
-<b>bool icu::SelectFormat::operator==(const Format&) const</b>
-<br>UBool icu::SelectFormat::operator==(const Format&) const<br>bool icu::SelectFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleDateFormat::operator==(const Format&) const</b>
-<br>UBool icu::SimpleDateFormat::operator==(const Format&) const<br>bool icu::SimpleDateFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleNumberFormatFactory::visible() const</b>
-<br>UBool icu::SimpleNumberFormatFactory::visible() const<br>UBool icu::SimpleNumberFormatFactory::visible() const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::SimpleTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::SimpleTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::SimpleTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::SimpleTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const</b>
-<br>UBool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const<br>UBool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const</b>
-<br>UBool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const<br>UBool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::operator==(const TimeZone&) const</b>
-<br>UBool icu::SimpleTimeZone::operator==(const TimeZone&) const<br>bool icu::SimpleTimeZone::operator==(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::SimpleTimeZone::useDaylightTime() const</b>
-<br>UBool icu::SimpleTimeZone::useDaylightTime() const<br>UBool icu::SimpleTimeZone::useDaylightTime() const override<br>
-</li>
-<li>
-<b>bool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const</b>
-<br>UBool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const<br>bool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const override<br>
-</li>
-<li>
-<b>bool icu::StringSearch::operator==(const SearchIterator&) const</b>
-<br>UBool icu::StringSearch::operator==(const SearchIterator&) const<br>bool icu::StringSearch::operator==(const SearchIterator&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const<br>UBool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const<br>UBool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const<br>UBool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const<br>UBool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const<br>bool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const</b>
-<br>UBool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const<br>bool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeZoneFormat::operator==(const Format&) const</b>
-<br>UBool icu::TimeZoneFormat::operator==(const Format&) const<br>bool icu::TimeZoneFormat::operator==(const Format&) const override<br>
-</li>
-<li>
-<b>bool icu::TimeZoneNames::operator==(const TimeZoneNames&) const</b>
-<br>UBool icu::TimeZoneNames::operator==(const TimeZoneNames&) const=0<br>bool icu::TimeZoneNames::operator==(const TimeZoneNames&) const=0<br>
-</li>
-<li>
-<b>bool icu::UCharCharacterIterator::hasNext()</b>
-<br>UBool icu::UCharCharacterIterator::hasNext()<br>UBool icu::UCharCharacterIterator::hasNext() override<br>
-</li>
-<li>
-<b>bool icu::UCharCharacterIterator::hasPrevious()</b>
-<br>UBool icu::UCharCharacterIterator::hasPrevious()<br>UBool icu::UCharCharacterIterator::hasPrevious() override<br>
-</li>
-<li>
-<b>bool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const</b>
-<br>UBool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const<br>bool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const override<br>
-</li>
-<li>
-<b>bool icu::UnicodeSet::contains(UChar32) const</b>
-<br>UBool icu::UnicodeSet::contains(UChar32) const<br>UBool icu::UnicodeSet::contains(UChar32) const override<br>
-</li>
-<li>
-<b>bool icu::UnicodeString::hasMetaData() const</b>
-<br>UBool icu::UnicodeString::hasMetaData() const<br>UBool icu::UnicodeString::hasMetaData() const override<br>
-</li>
-<li>
-<b>bool icu::UnicodeStringAppendable::appendCodePoint(UChar32)</b>
-<br>UBool icu::UnicodeStringAppendable::appendCodePoint(UChar32)<br>UBool icu::UnicodeStringAppendable::appendCodePoint(UChar32) override<br>
-</li>
-<li>
-<b>bool icu::UnicodeStringAppendable::appendCodeUnit(char16_t)</b>
-<br>UBool icu::UnicodeStringAppendable::appendCodeUnit(char16_t)<br>UBool icu::UnicodeStringAppendable::appendCodeUnit(char16_t) override<br>
-</li>
-<li>
-<b>bool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t)</b>
-<br>UBool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t)<br>UBool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t) override<br>
-</li>
-<li>
-<b>bool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t)</b>
-<br>UBool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t)<br>UBool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t) override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::VTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::VTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const</b>
-<br>UBool icu::VTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const<br>UBool icu::VTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::hasSameRules(const TimeZone&) const</b>
-<br>UBool icu::VTimeZone::hasSameRules(const TimeZone&) const<br>UBool icu::VTimeZone::hasSameRules(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const</b>
-<br>UBool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const<br>UBool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::operator==(const TimeZone&) const</b>
-<br>UBool icu::VTimeZone::operator==(const TimeZone&) const<br>bool icu::VTimeZone::operator==(const TimeZone&) const override<br>
-</li>
-<li>
-<b>bool icu::VTimeZone::useDaylightTime() const</b>
-<br>UBool icu::VTimeZone::useDaylightTime() const<br>UBool icu::VTimeZone::useDaylightTime() const override<br>
-</li>
-<li>
-<b>void icu::RuleBasedNumberFormat::setLenient(bool)</b>
-<br>void icu::RuleBasedNumberFormat::setLenient(UBool)<br>void icu::RuleBasedNumberFormat::setLenient(UBool) override<br>
-</li>
-<li>
-<b>void icu::RuleBasedTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const</b>
-<br>void icu::RuleBasedTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const<br>void icu::RuleBasedTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override<br>
-</li>
-<li>
-<b>void icu::SimpleTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const</b>
-<br>void icu::SimpleTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const<br>void icu::SimpleTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override<br>
-</li>
-<li>
-<b>void icu::VTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const</b>
-<br>void icu::VTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const<br>void icu::VTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override<br>
-</li>
-<li>
-<b>void* icu::AnnualTimeZoneRule::clone() const</b>
-<br>AnnualTimeZoneRule* icu::AnnualTimeZoneRule::clone() const<br>AnnualTimeZoneRule* icu::AnnualTimeZoneRule::clone() const override<br>
-</li>
-<li>
-<b>void* icu::BasicTimeZone::clone() const</b>
-<br>BasicTimeZone* icu::BasicTimeZone::clone() const override=0<br>BasicTimeZone* icu::BasicTimeZone::clone() const=0<br>
-</li>
-<li>
-<b>void* icu::ChoiceFormat::clone() const</b>
-<br>ChoiceFormat* icu::ChoiceFormat::clone() const<br>ChoiceFormat* icu::ChoiceFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::CurrencyAmount::clone() const</b>
-<br>CurrencyAmount* icu::CurrencyAmount::clone() const<br>CurrencyAmount* icu::CurrencyAmount::clone() const override<br>
-</li>
-<li>
-<b>void* icu::CurrencyUnit::clone() const</b>
-<br>CurrencyUnit* icu::CurrencyUnit::clone() const<br>CurrencyUnit* icu::CurrencyUnit::clone() const override<br>
-</li>
-<li>
-<b>void* icu::DateFormat::clone() const</b>
-<br>DateFormat* icu::DateFormat::clone() const override=0<br>DateFormat* icu::DateFormat::clone() const=0<br>
-</li>
-<li>
-<b>void* icu::DateIntervalFormat::clone() const</b>
-<br>DateIntervalFormat* icu::DateIntervalFormat::clone() const<br>DateIntervalFormat* icu::DateIntervalFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::GregorianCalendar::clone() const</b>
-<br>GregorianCalendar* icu::GregorianCalendar::clone() const<br>GregorianCalendar* icu::GregorianCalendar::clone() const override<br>
-</li>
-<li>
-<b>void* icu::InitialTimeZoneRule::clone() const</b>
-<br>InitialTimeZoneRule* icu::InitialTimeZoneRule::clone() const<br>InitialTimeZoneRule* icu::InitialTimeZoneRule::clone() const override<br>
-</li>
-<li>
-<b>void* icu::MeasureFormat::clone() const</b>
-<br>MeasureFormat* icu::MeasureFormat::clone() const<br>MeasureFormat* icu::MeasureFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::MessageFormat::clone() const</b>
-<br>MessageFormat* icu::MessageFormat::clone() const<br>MessageFormat* icu::MessageFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::NumberFormat::clone() const</b>
-<br>NumberFormat* icu::NumberFormat::clone() const override=0<br>NumberFormat* icu::NumberFormat::clone() const=0<br>
-</li>
-<li>
-<b>void* icu::PluralFormat::clone() const</b>
-<br>PluralFormat* icu::PluralFormat::clone() const<br>PluralFormat* icu::PluralFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::RuleBasedBreakIterator::clone() const</b>
-<br>RuleBasedBreakIterator* icu::RuleBasedBreakIterator::clone() const<br>RuleBasedBreakIterator* icu::RuleBasedBreakIterator::clone() const override<br>
-</li>
-<li>
-<b>void* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&)</b>
-<br>RuleBasedBreakIterator* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&)<br>RuleBasedBreakIterator* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&) override<br>
-</li>
-<li>
-<b>void* icu::RuleBasedCollator::clone() const</b>
-<br>RuleBasedCollator* icu::RuleBasedCollator::clone() const<br>RuleBasedCollator* icu::RuleBasedCollator::clone() const override<br>
-</li>
-<li>
-<b>void* icu::RuleBasedNumberFormat::clone() const</b>
-<br>RuleBasedNumberFormat* icu::RuleBasedNumberFormat::clone() const<br>RuleBasedNumberFormat* icu::RuleBasedNumberFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::RuleBasedTimeZone::clone() const</b>
-<br>RuleBasedTimeZone* icu::RuleBasedTimeZone::clone() const<br>RuleBasedTimeZone* icu::RuleBasedTimeZone::clone() const override<br>
-</li>
-<li>
-<b>void* icu::SelectFormat::clone() const</b>
-<br>SelectFormat* icu::SelectFormat::clone() const<br>SelectFormat* icu::SelectFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::SimpleDateFormat::clone() const</b>
-<br>SimpleDateFormat* icu::SimpleDateFormat::clone() const<br>SimpleDateFormat* icu::SimpleDateFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::SimpleTimeZone::clone() const</b>
-<br>SimpleTimeZone* icu::SimpleTimeZone::clone() const<br>SimpleTimeZone* icu::SimpleTimeZone::clone() const override<br>
-</li>
-<li>
-<b>void* icu::StringCharacterIterator::clone() const</b>
-<br>StringCharacterIterator* icu::StringCharacterIterator::clone() const<br>StringCharacterIterator* icu::StringCharacterIterator::clone() const override<br>
-</li>
-<li>
-<b>void* icu::StringSearch::safeClone() const</b>
-<br>StringSearch* icu::StringSearch::safeClone() const<br>StringSearch* icu::StringSearch::safeClone() const override<br>
-</li>
-<li>
-<b>void* icu::TimeArrayTimeZoneRule::clone() const</b>
-<br>TimeArrayTimeZoneRule* icu::TimeArrayTimeZoneRule::clone() const<br>TimeArrayTimeZoneRule* icu::TimeArrayTimeZoneRule::clone() const override<br>
-</li>
-<li>
-<b>void* icu::TimeUnit::clone() const</b>
-<br>TimeUnit* icu::TimeUnit::clone() const<br>TimeUnit* icu::TimeUnit::clone() const override<br>
-</li>
-<li>
-<b>void* icu::TimeUnitAmount::clone() const</b>
-<br>TimeUnitAmount* icu::TimeUnitAmount::clone() const<br>TimeUnitAmount* icu::TimeUnitAmount::clone() const override<br>
-</li>
-<li>
-<b>void* icu::TimeUnitFormat::clone() const</b>
-<br>TimeUnitFormat* icu::TimeUnitFormat::clone() const<br>TimeUnitFormat* icu::TimeUnitFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::TimeZoneFormat::clone() const</b>
-<br>TimeZoneFormat* icu::TimeZoneFormat::clone() const<br>TimeZoneFormat* icu::TimeZoneFormat::clone() const override<br>
-</li>
-<li>
-<b>void* icu::UCharCharacterIterator::clone() const</b>
-<br>UCharCharacterIterator* icu::UCharCharacterIterator::clone() const<br>UCharCharacterIterator* icu::UCharCharacterIterator::clone() const override<br>
-</li>
-<li>
-<b>void* icu::UnicodeFilter::clone() const</b>
-<br>UnicodeFilter* icu::UnicodeFilter::clone() const override=0<br>UnicodeFilter* icu::UnicodeFilter::clone() const=0<br>
-</li>
-<li>
-<b>void* icu::UnicodeSet::clone() const</b>
-<br>UnicodeSet* icu::UnicodeSet::clone() const<br>UnicodeSet* icu::UnicodeSet::clone() const override<br>
-</li>
-<li>
-<b>void* icu::UnicodeString::clone() const</b>
-<br>UnicodeString* icu::UnicodeString::clone() const<br>UnicodeString* icu::UnicodeString::clone() const override<br>
-</li>
-<li>
-<b>void* icu::VTimeZone::clone() const</b>
-<br>VTimeZone* icu::VTimeZone::clone() const<br>VTimeZone* icu::VTimeZone::clone() const override<br>
-</li>
-</ul>
+<ul></ul>
 </div>
 <P></P>
 <a href="#_top">(jump back to top)</a>
 <hr>
 <p>
-<i><font size="-1">Contents generated by StableAPI tool on Wed Sep 29 11:59:05 PDT 2021<br>
+<i><font size="-1">Contents generated by StableAPI tool on Thu Mar 10 11:12:56 PST 2022<br>
         Copyright © 2017 and later: Unicode, Inc. and others.<br>
         License & terms of use: http://www.unicode.org/copyright.html
     </font></i>

Modified: trunk/Build/source/libs/icu/icu-src/APIChangeReport.md
===================================================================
--- trunk/Build/source/libs/icu/icu-src/APIChangeReport.md	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/APIChangeReport.md	2022-05-31 01:17:15 UTC (rev 63452)
@@ -5,283 +5,168 @@
  License & terms of use: http://www.unicode.org/copyright.html
 -->
 
-# ICU4C API Comparison: ICU 69 with ICU 70
+# ICU4C API Comparison: ICU 70 with ICU 71
 
 > _Note_ Markdown format of this document is new for ICU 65.
 
-- [Removed from ICU 69](#removed)
-- [Deprecated or Obsoleted in ICU 70](#deprecated)
-- [Changed in  ICU 70](#changed)
-- [Promoted to stable in ICU 70](#promoted)
-- [Added in ICU 70](#added)
-- [Other existing drafts in ICU 70](#other)
+- [Removed from ICU 70](#removed)
+- [Deprecated or Obsoleted in ICU 71](#deprecated)
+- [Changed in  ICU 71](#changed)
+- [Promoted to stable in ICU 71](#promoted)
+- [Added in ICU 71](#added)
+- [Other existing drafts in ICU 71](#other)
 - [Signature Simplifications](#simplifications)
 
 ## Removed
 
-Removed from ICU 69
+Removed from ICU 70
   
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| tmutfmt.h | bool icu::TimeUnitFormat::operator!=(const Format&) const |  DeprecatedICU 53 | (missing)
 
 ## Deprecated
 
-Deprecated or Obsoleted in ICU 70
+Deprecated or Obsoleted in ICU 71
   
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration() |  StableICU 2.4 | DeprecatedICU 70
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(const char*) |  StableICU 2.4 | DeprecatedICU 70
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(int32_t) |  StableICU 2.4 | DeprecatedICU 70
+| numberformatter.h | const char* icu::number::FormattedNumber::getGender(UErrorCode&) const |  InternalICU 69 | Deprecated
+| ucnv.h | UConverter* ucnv_safeClone(const UConverter*, void*, int32_t*, UErrorCode*) |  StableICU 2.0 | DeprecatedICU 71
+| ucol.h | UCollator* ucol_safeClone(const UCollator*, void*, int32_t*, UErrorCode*) |  StableICU 2.0 | DeprecatedICU 71
 
 ## Changed
 
-Changed in  ICU 70 (old, new)
+Changed in  ICU 71 (old, new)
 
 
   
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| dtitvfmt.h | UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const |  Draft→StableICU 68
-| dtitvfmt.h | void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&) |  Draft→StableICU 68
-| localematcher.h | Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&) |  Draft→StableICU 68
-| localematcher.h | Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale() |  Draft→StableICU 68
-| localematcher.h | bool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getCandela() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoon() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoonImperial() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDot() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDram() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDrop() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getEarthRadius() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getGrain() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getJigger() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getLumen() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getPinch() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getQuartImperial() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const |  Draft→StableICU 68
-| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const& |  Draft→StableICU 68
-| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&& |  Draft→StableICU 68
-| numberformatter.h | MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const |  Draft→StableICU 68
-| numberrangeformatter.h | std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const |  Draft→StableICU 68
-| plurrule.h | UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const |  Draft→StableICU 68
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration() |  StableICU 2.4 | DeprecatedICU 70
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(const char*) |  StableICU 2.4 | DeprecatedICU 70
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(int32_t) |  StableICU 2.4 | DeprecatedICU 70
-| ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME |  Draft→StableICU 68
-| ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME |  Draft→StableICU 68
-| udateintervalformat.h | UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*) |  Draft→StableICU 68
-| udateintervalformat.h | void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*) |  Draft→StableICU 68
-| unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO |  Draft→StableICU 68
-| unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2 |  Draft→StableICU 68
-| unumberformatter.h | <tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL |  Draft→StableICU 68
-| unumberformatter.h | <tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT |  Draft→StableICU 68
-| unumberformatter.h | int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UFormattedNumberRange* unumrf_openResult(UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_close(UNumberRangeFormatter*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_closeResult(UFormattedNumberRange*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| upluralrules.h | int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*) |  Draft→StableICU 68
+| basictz.h | void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter() |  Draft→StableICU 69
+| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&) |  Draft→StableICU 69
+| numberformatter.h | Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const |  Draft→StableICU 69
+| numberformatter.h | Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const |  Draft→StableICU 69
+| numberformatter.h | const char* icu::number::FormattedNumber::getGender(UErrorCode&) const |  InternalICU 69 | Deprecated
+| rbtz.h | void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| simpletz.h | void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| ubrk.h | UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*) |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER |  Draft→StableICU 69
+| ucal.h | void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*) |  Draft→StableICU 69
+| ucnv.h | UConverter* ucnv_safeClone(const UConverter*, void*, int32_t*, UErrorCode*) |  StableICU 2.0 | DeprecatedICU 71
+| ucol.h | UCollator* ucol_safeClone(const UCollator*, void*, int32_t*, UErrorCode*) |  StableICU 2.0 | DeprecatedICU 71
+| uniset.h | UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&) |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE |  Draft→StableICU 69
+| uset.h | void uset_complementAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_complementRange(USet*, UChar32, UChar32) |  Draft→StableICU 69
+| uset.h | void uset_complementString(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_removeAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_retainAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_retainString(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| vtzone.h | void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
 
 ## Promoted
 
-Promoted to stable in ICU 70
+Promoted to stable in ICU 71
   
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| dtitvfmt.h | UDisplayContext icu::DateIntervalFormat::getContext(UDisplayContextType, UErrorCode&) const |  Draft→StableICU 68
-| dtitvfmt.h | void icu::DateIntervalFormat::setContext(UDisplayContext, UErrorCode&) |  Draft→StableICU 68
-| localematcher.h | Builder& icu::LocaleMatcher::Builder::setMaxDistance(const Locale&, const Locale&) |  Draft→StableICU 68
-| localematcher.h | Builder& icu::LocaleMatcher::Builder::setNoDefaultLocale() |  Draft→StableICU 68
-| localematcher.h | bool icu::LocaleMatcher::isMatch(const Locale&, const Locale&, UErrorCode&) const |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getCandela() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoon() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDessertSpoonImperial() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDot() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDram() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getDrop() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getEarthRadius() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getGrain() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getJigger() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getLumen() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getPinch() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getQuartImperial() |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createCandela(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoon(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDessertSpoonImperial(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDot(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDram(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createDrop(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createEarthRadius(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createGrain(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createJigger(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createLumen(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createPinch(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createQuartImperial(UErrorCode&) |  Draft→StableICU 68
-| measunit.h | std::pair< LocalArray< MeasureUnit >, int32_t > icu::MeasureUnit::splitToSingleUnits(UErrorCode&) const |  Draft→StableICU 68
-| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece) const& |  Draft→StableICU 68
-| numberformatter.h | Derived icu::number::NumberFormatterSettings< Derived >::usage(StringPiece)&& |  Draft→StableICU 68
-| numberformatter.h | MeasureUnit icu::number::FormattedNumber::getOutputUnit(UErrorCode&) const |  Draft→StableICU 68
-| numberrangeformatter.h | std::pair< StringClass, StringClass > icu::number::FormattedNumberRange::getDecimalNumbers(UErrorCode&) const |  Draft→StableICU 68
-| plurrule.h | UnicodeString icu::PluralRules::select(const number::FormattedNumberRange&, UErrorCode&) const |  Draft→StableICU 68
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRawOffset(int32_t, UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRegion(const char*, UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ARABIC_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_CYPRO_MINOAN |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ETHIOPIC_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_F |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_G |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_OLD_UYGHUR |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TANGSA |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TOTO |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_VITHKUQI |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ZNAMENNY_MUSICAL_NOTATION |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_THIN_YEH |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_VERTICAL_TAIL |  (missing) | StableICU 70| *(Born Stable)* |
-| ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_FORMAL_SYMBOL_NAME |  Draft→StableICU 68
-| ucurr.h | <tt>enum</tt> UCurrNameStyle::UCURR_VARIANT_SYMBOL_NAME |  Draft→StableICU 68
-| udateintervalformat.h | UDisplayContext udtitvfmt_getContext(const UDateIntervalFormat*, UDisplayContextType, UErrorCode*) |  Draft→StableICU 68
-| udateintervalformat.h | void udtitvfmt_setContext(UDateIntervalFormat*, UDisplayContext, UErrorCode*) |  Draft→StableICU 68
-| unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_AUTO |  Draft→StableICU 68
-| unum.h | <tt>enum</tt> UNumberFormatMinimumGroupingDigits::UNUM_MINIMUM_GROUPING_DIGITS_MIN2 |  Draft→StableICU 68
-| unumberformatter.h | <tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_FORMAL |  Draft→StableICU 68
-| unumberformatter.h | <tt>enum</tt> UNumberUnitWidth::UNUM_UNIT_WIDTH_VARIANT |  Draft→StableICU 68
-| unumberformatter.h | int32_t unumf_resultToDecimalNumber(const UFormattedNumber*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UFormattedNumberRange* unumrf_openResult(UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UNumberRangeFormatter* unumrf_openForSkeletonWithCollapseAndIdentityFallback(const UChar*, int32_t, UNumberRangeCollapse, UNumberRangeIdentityFallback, const char*, UParseError*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | UNumberRangeIdentityResult unumrf_resultGetIdentityResult(const UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | const UFormattedValue* unumrf_resultAsValue(const UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | int32_t unumrf_resultGetFirstDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | int32_t unumrf_resultGetSecondDecimalNumber(const UFormattedNumberRange*, char*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_close(UNumberRangeFormatter*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_closeResult(UFormattedNumberRange*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_formatDecimalRange(const UNumberRangeFormatter*, const char*, int32_t, const char*, int32_t, UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| unumberrangeformatter.h | void unumrf_formatDoubleRange(const UNumberRangeFormatter*, double, double, UFormattedNumberRange*, UErrorCode*) |  Draft→StableICU 68
-| upluralrules.h | int32_t uplrules_selectForRange(const UPluralRules*, const struct UFormattedNumberRange*, UChar*, int32_t, UErrorCode*) |  Draft→StableICU 68
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_CYPRO_MINOAN |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_OLD_UYGHUR |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TANGSA |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TOTO |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_VITHKUQI |  (missing) | StableICU 70| *(Born Stable)* |
-| utypes.h | <tt>enum</tt> UErrorCode::U_INPUT_TOO_LONG_ERROR |  (missing) | StableICU 68
+| basictz.h | void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const |  Draft→StableICU 69
+| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter() |  Draft→StableICU 69
+| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&) |  Draft→StableICU 69
+| numberformatter.h | Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const |  Draft→StableICU 69
+| numberformatter.h | Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const |  Draft→StableICU 69
+| rbtz.h | void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| simpletz.h | void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
+| ubrk.h | UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*) |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER |  Draft→StableICU 69
+| ucal.h | <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER |  Draft→StableICU 69
+| ucal.h | void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*) |  Draft→StableICU 69
+| ucnv.h | UConverter* ucnv_clone(const UConverter*, UErrorCode*) |  (missing) | StableICU 71| *(Born Stable)* |
+| ucol.h | UCollator* ucol_clone(const UCollator*, UErrorCode*) |  (missing) | StableICU 71| *(Born Stable)* |
+| uniset.h | UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&) |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR |  Draft→StableICU 69
+| unum.h | <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO |  Draft→StableICU 69
+| unumberformatter.h | <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE |  Draft→StableICU 69
+| uset.h | void uset_complementAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_complementRange(USet*, UChar32, UChar32) |  Draft→StableICU 69
+| uset.h | void uset_complementString(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_removeAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_retainAllCodePoints(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| uset.h | void uset_retainString(USet*, const UChar*, int32_t) |  Draft→StableICU 69
+| vtzone.h | void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const |  Draft→StableICU 69
 
 ## Added
 
-Added in ICU 70
+Added in ICU 71
   
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| dcfmtsym.h | <tt>enum</tt>  							icu::DecimalFormatSymbols::ENumberFormatSymbol::kApproximatelySignSymbol |  (missing) | Internal
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getItem() |  (missing) | DraftICU 70
-| measunit.h | <tt>static</tt> MeasureUnit icu::MeasureUnit::getKilowattHourPer100Kilometer() |  (missing) | DraftICU 70
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createItem(UErrorCode&) |  (missing) | DraftICU 70
-| measunit.h | <tt>static</tt> MeasureUnit* icu::MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode&) |  (missing) | DraftICU 70
-| numberformatter.h | const DecimalFormatSymbols* icu::number::LocalizedNumberFormatter::getDecimalFormatSymbols() const |  (missing) | Internal
-| numberrangeformatter.h | icu::number::FormattedNumberRange::FormattedNumberRange() |  (missing) | DraftICU 70
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumeration(UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRawOffset(int32_t, UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| timezone.h | <tt>static</tt> StringEnumeration* icu::TimeZone::createEnumerationForRegion(const char*, UErrorCode&) |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | bool u_stringHasBinaryProperty(const UChar*, int32_t, UProperty) |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ARABIC_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_CYPRO_MINOAN |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ETHIOPIC_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_KANA_EXTENDED_B |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_F |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_LATIN_EXTENDED_G |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_OLD_UYGHUR |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TANGSA |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_TOTO |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_A |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_VITHKUQI |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UBlockCode::UBLOCK_ZNAMENNY_MUSICAL_NOTATION |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_THIN_YEH |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UJoiningGroup::U_JG_VERTICAL_TAIL |  (missing) | StableICU 70| *(Born Stable)* |
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_BASIC_EMOJI |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_EMOJI_KEYCAP_SEQUENCE |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_FLAG_SEQUENCE |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_TAG_SEQUENCE |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_ZWJ_SEQUENCE |  (missing) | DraftICU 70
-| uchar.h | <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI |  (missing) | DraftICU 70
-| udat.h | <tt>enum</tt> UDateFormatSymbolType::UDAT_NARROW_QUARTERS |  (missing) | DraftICU 70
-| udat.h | <tt>enum</tt> UDateFormatSymbolType::UDAT_STANDALONE_NARROW_QUARTERS |  (missing) | DraftICU 70
-| uniset.h | bool icu::UnicodeSet::hasStrings() const |  (missing) | DraftICU 70
-| unum.h | <tt>enum</tt> UNumberFormatSymbol::UNUM_APPROXIMATELY_SIGN_SYMBOL |  (missing) | Internal
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_CYPRO_MINOAN |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_OLD_UYGHUR |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TANGSA |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_TOTO |  (missing) | StableICU 70| *(Born Stable)* |
-| uscript.h | <tt>enum</tt> UScriptCode::USCRIPT_VITHKUQI |  (missing) | StableICU 70| *(Born Stable)* |
-| uset.h | bool uset_hasStrings(const USet*) |  (missing) | DraftICU 70
-| uset.h | int32_t uset_getRangeCount(const USet*) |  (missing) | DraftICU 70
-| usetiter.h | UnicodeSetIterator& icu::UnicodeSetIterator::skipToStrings() |  (missing) | DraftICU 70
-| utypes.h | <tt>enum</tt> UErrorCode::U_INPUT_TOO_LONG_ERROR |  (missing) | StableICU 68
+| dtptngen.h | const UnicodeString& icu::DateTimePatternGenerator::getDateTimeFormat(UDateFormatStyle, UErrorCode&) const |  (missing) | DraftICU 71
+| dtptngen.h | void icu::DateTimePatternGenerator::setDateTimeFormat(UDateFormatStyle, const UnicodeString&, UErrorCode&) |  (missing) | DraftICU 71
+| numberformatter.h | NounClass icu::number::FormattedNumber::getNounClass(UErrorCode&) const |  (missing) | DraftICU 71
+| numberformatter.h | <tt>static</tt> IncrementPrecision icu::number::Precision::incrementExact(uint64_t, int16_t) |  (missing) | DraftICU 71
+| ucnv.h | UConverter* ucnv_clone(const UConverter*, UErrorCode*) |  (missing) | StableICU 71| *(Born Stable)* |
+| ucol.h | UCollator* ucol_clone(const UCollator*, UErrorCode*) |  (missing) | StableICU 71| *(Born Stable)* |
+| udatpg.h | const UChar* udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator*, UDateFormatStyle, int32_t*, UErrorCode*) |  (missing) | DraftICU 71
+| udatpg.h | void udatpg_setDateTimeFormatForStyle(UDateTimePatternGenerator*, UDateFormatStyle, const UChar*, int32_t, UErrorCode*) |  (missing) | DraftICU 71
+| unum.h | <tt>enum</tt> UNumberFormatFields::UNUM_APPROXIMATELY_SIGN_FIELD |  (missing) | DraftICU 71
 
 ## Other
 
-Other existing drafts in ICU 70
+Other existing drafts in ICU 71
 
-| File | API | ICU 69 | ICU 70 |
+| File | API | ICU 70 | ICU 71 |
 |---|---|---|---|
-| basictz.h |  void icu::BasicTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const | DraftICU 69 | 
 | measfmt.h |  void icu::MeasureFormat::parseObject(const UnicodeString&, Formattable&, ParsePosition&) const | DraftICU 53 | 
-| measunit.h |  MeasureUnit icu::MeasureUnit::withPrefix(UMeasurePrefix, UErrorCode&) const | DraftICU 69 | 
-| measunit.h |  UMeasurePrefix icu::MeasureUnit::getPrefix(UErrorCode&) const | DraftICU 69 | 
-| measunit.h |  <tt>static</tt> MeasureUnit icu::MeasureUnit::getMilligramOfglucosePerDeciliter() | DraftICU 69 | 
-| measunit.h |  <tt>static</tt> MeasureUnit* icu::MeasureUnit::createMilligramOfglucosePerDeciliter(UErrorCode&) | DraftICU 69 | 
-| numberformatter.h |  Precision icu::number::FractionPrecision::withSignificantDigits(int32_t, int32_t, UNumberRoundingPriority) const | DraftICU 69 | 
-| numberformatter.h |  Precision icu::number::Precision::trailingZeroDisplay(UNumberTrailingZeroDisplay) const | DraftICU 69 | 
-| rbtz.h |  void icu::RuleBasedTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const | DraftICU 69 | 
-| simpletz.h |  void icu::SimpleTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const | DraftICU 69 | 
-| ubrk.h |  UBreakIterator* ubrk_clone(const UBreakIterator*, UErrorCode*) | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_FORMER | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_DAYLIGHT_LATTER | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_FORMER | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_LATTER | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_FORMER | DraftICU 69 | 
-| ucal.h |  <tt>enum</tt> UTimeZoneLocalOption::UCAL_TZ_LOCAL_STANDARD_LATTER | DraftICU 69 | 
-| ucal.h |  void ucal_getTimeZoneOffsetFromLocal(const UCalendar*, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t*, int32_t*, UErrorCode*) | DraftICU 69 | 
+| measunit.h |  <tt>static</tt> MeasureUnit icu::MeasureUnit::getItem() | DraftICU 70 | 
+| measunit.h |  <tt>static</tt> MeasureUnit icu::MeasureUnit::getKilowattHourPer100Kilometer() | DraftICU 70 | 
+| measunit.h |  <tt>static</tt> MeasureUnit* icu::MeasureUnit::createItem(UErrorCode&) | DraftICU 70 | 
+| measunit.h |  <tt>static</tt> MeasureUnit* icu::MeasureUnit::createKilowattHourPer100Kilometer(UErrorCode&) | DraftICU 70 | 
+| numberrangeformatter.h |  icu::number::FormattedNumberRange::FormattedNumberRange() | DraftICU 70 | 
+| uchar.h |  bool u_stringHasBinaryProperty(const UChar*, int32_t, UProperty) | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_BASIC_EMOJI | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_EMOJI_KEYCAP_SEQUENCE | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_FLAG_SEQUENCE | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_TAG_SEQUENCE | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI_ZWJ_SEQUENCE | DraftICU 70 | 
+| uchar.h |  <tt>enum</tt> UProperty::UCHAR_RGI_EMOJI | DraftICU 70 | 
+| udat.h |  <tt>enum</tt> UDateFormatSymbolType::UDAT_NARROW_QUARTERS | DraftICU 70 | 
+| udat.h |  <tt>enum</tt> UDateFormatSymbolType::UDAT_STANDALONE_NARROW_QUARTERS | DraftICU 70 | 
 | uformattedvalue.h |  <tt>enum</tt> UFieldCategory::UFIELD_CATEGORY_NUMBER_RANGE_SPAN | DraftICU 69 | 
-| uniset.h |  UnicodeSet& icu::UnicodeSet::retain(const UnicodeString&) | DraftICU 69 | 
-| unum.h |  <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_CEILING | DraftICU 69 | 
-| unum.h |  <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_FLOOR | DraftICU 69 | 
-| unum.h |  <tt>enum</tt> UNumberFormatRoundingMode::UNUM_ROUND_HALF_ODD | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_RELAXED | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberRoundingPriority::UNUM_ROUNDING_PRIORITY_STRICT | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_ACCOUNTING_NEGATIVE | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberSignDisplay::UNUM_SIGN_NEGATIVE | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_AUTO | DraftICU 69 | 
-| unumberformatter.h |  <tt>enum</tt> UNumberTrailingZeroDisplay::UNUM_TRAILING_ZERO_HIDE_IF_WHOLE | DraftICU 69 | 
+| uniset.h |  bool icu::UnicodeSet::hasStrings() const | DraftICU 70 | 
 | uregex.h |  <tt>enum</tt> URegexpFlag::UREGEX_CANON_EQ | DraftICU 2.4 | 
-| uset.h |  void uset_complementAllCodePoints(USet*, const UChar*, int32_t) | DraftICU 69 | 
-| uset.h |  void uset_complementRange(USet*, UChar32, UChar32) | DraftICU 69 | 
-| uset.h |  void uset_complementString(USet*, const UChar*, int32_t) | DraftICU 69 | 
-| uset.h |  void uset_removeAllCodePoints(USet*, const UChar*, int32_t) | DraftICU 69 | 
-| uset.h |  void uset_retainAllCodePoints(USet*, const UChar*, int32_t) | DraftICU 69 | 
-| uset.h |  void uset_retainString(USet*, const UChar*, int32_t) | DraftICU 69 | 
-| vtzone.h |  void icu::VTimeZone::getOffsetFromLocal(UDate, UTimeZoneLocalOption, UTimeZoneLocalOption, int32_t&, int32_t&, UErrorCode&) const | DraftICU 69 | 
+| uset.h |  bool uset_hasStrings(const USet*) | DraftICU 70 | 
+| uset.h |  int32_t uset_getRangeCount(const USet*) | DraftICU 70 | 
+| usetiter.h |  UnicodeSetIterator& icu::UnicodeSetIterator::skipToStrings() | DraftICU 70 | 
 
 ## Simplifications
 
@@ -288,376 +173,10 @@
 This section shows cases where the signature was "simplified" for the sake of comparison. The simplified form is in bold, followed by
     all possible variations in "original" form.
 
-- **`UClassID icu::BreakIterator::getDynamicClassID() const`**
-  - `UClassID icu::BreakIterator::getDynamicClassID() const override=0`
-  - `UClassID icu::BreakIterator::getDynamicClassID() const=0`
-- **`UClassID icu::Calendar::getDynamicClassID() const`**
-  - `UClassID icu::Calendar::getDynamicClassID() const override=0`
-  - `UClassID icu::Calendar::getDynamicClassID() const=0`
-- **`UClassID icu::Collator::getDynamicClassID() const`**
-  - `UClassID icu::Collator::getDynamicClassID() const override=0`
-  - `UClassID icu::Collator::getDynamicClassID() const=0`
-- **`UClassID icu::ForwardCharacterIterator::getDynamicClassID() const`**
-  - `UClassID icu::ForwardCharacterIterator::getDynamicClassID() const override=0`
-  - `UClassID icu::ForwardCharacterIterator::getDynamicClassID() const=0`
-- **`UClassID icu::NumberFormat::getDynamicClassID() const`**
-  - `UClassID icu::NumberFormat::getDynamicClassID() const override=0`
-  - `UClassID icu::NumberFormat::getDynamicClassID() const=0`
-- **`UClassID icu::TimeZone::getDynamicClassID() const`**
-  - `UClassID icu::TimeZone::getDynamicClassID() const override=0`
-  - `UClassID icu::TimeZone::getDynamicClassID() const=0`
-- **`UClassID icu::Transliterator::getDynamicClassID() const`**
-  - `UClassID icu::Transliterator::getDynamicClassID() const override=0`
-  - `UClassID icu::Transliterator::getDynamicClassID() const=0`
-- **`UClassID icu::UnicodeFunctor::getDynamicClassID() const`**
-  - `UClassID icu::UnicodeFunctor::getDynamicClassID() const override=0`
-  - `UClassID icu::UnicodeFunctor::getDynamicClassID() const=0`
-- **`UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, bool)`**
-  - `UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, UBool)`
-  - `UMatchDegree icu::UnicodeFilter::matches(const Replaceable&, int32_t&, int32_t, UBool) override`
-- **`UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, bool)`**
-  - `UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, UBool)`
-  - `UMatchDegree icu::UnicodeSet::matches(const Replaceable&, int32_t&, int32_t, UBool) override`
-- **`UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, bool escapeUnprintable=) const`**
-  - `UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, UBool escapeUnprintable=) const`
-  - `UnicodeString& icu::UnicodeSet::toPattern(UnicodeString&, UBool escapeUnprintable=) const override`
-- **`bool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::AnnualTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::AnnualTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::AnnualTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::AnnualTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`**
-  - `UBool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`
-  - `UBool icu::AnnualTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override`
-- **`bool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const`**
-  - `UBool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const`
-  - `bool icu::AnnualTimeZoneRule::operator!=(const TimeZoneRule&) const override`
-- **`bool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const`**
-  - `UBool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const`
-  - `bool icu::AnnualTimeZoneRule::operator==(const TimeZoneRule&) const override`
-- **`bool icu::BreakIterator::operator==(const BreakIterator&) const`**
-  - `UBool icu::BreakIterator::operator==(const BreakIterator&) const=0`
-  - `bool icu::BreakIterator::operator==(const BreakIterator&) const=0`
-- **`bool icu::ChoiceFormat::operator==(const Format&) const`**
-  - `UBool icu::ChoiceFormat::operator==(const Format&) const`
-  - `bool icu::ChoiceFormat::operator==(const Format&) const override`
-- **`bool icu::DateFormat::operator==(const Format&) const`**
-  - `UBool icu::DateFormat::operator==(const Format&) const`
-  - `bool icu::DateFormat::operator==(const Format&) const override`
-- **`bool icu::DateIntervalFormat::operator==(const Format&) const`**
-  - `UBool icu::DateIntervalFormat::operator==(const Format&) const`
-  - `bool icu::DateIntervalFormat::operator==(const Format&) const override`
-- **`bool icu::DecimalFormat::operator==(const Format&) const`**
-  - `UBool icu::DecimalFormat::operator==(const Format&) const U_OVERRIDE`
-  - `bool icu::DecimalFormat::operator==(const Format&) const U_OVERRIDE`
-- **`bool icu::Format::operator==(const Format&) const`**
-  - `UBool icu::Format::operator==(const Format&) const=0`
-  - `bool icu::Format::operator==(const Format&) const=0`
-- **`bool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const`**
-  - `UBool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const=0`
-  - `bool icu::ForwardCharacterIterator::operator==(const ForwardCharacterIterator&) const=0`
-- **`bool icu::GregorianCalendar::haveDefaultCentury() const`**
-  - `UBool icu::GregorianCalendar::haveDefaultCentury() const`
-  - `UBool icu::GregorianCalendar::haveDefaultCentury() const override`
-- **`bool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const`**
-  - `UBool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const`
-  - `UBool icu::GregorianCalendar::inDaylightTime(UErrorCode&) const override`
-- **`bool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const`**
-  - `UBool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const`
-  - `UBool icu::GregorianCalendar::isEquivalentTo(const Calendar&) const override`
-- **`bool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::InitialTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::InitialTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::InitialTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::InitialTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`**
-  - `UBool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`
-  - `UBool icu::InitialTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override`
-- **`bool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const`**
-  - `UBool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const`
-  - `bool icu::InitialTimeZoneRule::operator!=(const TimeZoneRule&) const override`
-- **`bool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const`**
-  - `UBool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const`
-  - `bool icu::InitialTimeZoneRule::operator==(const TimeZoneRule&) const override`
-- **`bool icu::MeasureFormat::operator==(const Format&) const`**
-  - `UBool icu::MeasureFormat::operator==(const Format&) const`
-  - `bool icu::MeasureFormat::operator==(const Format&) const override`
-- **`bool icu::MessageFormat::operator==(const Format&) const`**
-  - `UBool icu::MessageFormat::operator==(const Format&) const`
-  - `bool icu::MessageFormat::operator==(const Format&) const override`
-- **`bool icu::NumberFormat::operator==(const Format&) const`**
-  - `UBool icu::NumberFormat::operator==(const Format&) const`
-  - `bool icu::NumberFormat::operator==(const Format&) const override`
-- **`bool icu::PluralFormat::operator==(const Format&) const`**
-  - `UBool icu::PluralFormat::operator==(const Format&) const`
-  - `bool icu::PluralFormat::operator==(const Format&) const override`
-- **`bool icu::RuleBasedBreakIterator::isBoundary(int32_t)`**
-  - `UBool icu::RuleBasedBreakIterator::isBoundary(int32_t)`
-  - `UBool icu::RuleBasedBreakIterator::isBoundary(int32_t) override`
-- **`bool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const`**
-  - `UBool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const`
-  - `bool icu::RuleBasedBreakIterator::operator==(const BreakIterator&) const override`
-- **`bool icu::RuleBasedCollator::operator==(const Collator&) const`**
-  - `UBool icu::RuleBasedCollator::operator==(const Collator&) const`
-  - `bool icu::RuleBasedCollator::operator==(const Collator&) const override`
-- **`bool icu::RuleBasedNumberFormat::isLenient() const`**
-  - `UBool icu::RuleBasedNumberFormat::isLenient() const`
-  - `UBool icu::RuleBasedNumberFormat::isLenient() const override`
-- **`bool icu::RuleBasedNumberFormat::operator==(const Format&) const`**
-  - `UBool icu::RuleBasedNumberFormat::operator==(const Format&) const`
-  - `bool icu::RuleBasedNumberFormat::operator==(const Format&) const override`
-- **`bool icu::RuleBasedTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::RuleBasedTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::RuleBasedTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::RuleBasedTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::RuleBasedTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::RuleBasedTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const`**
-  - `UBool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const`
-  - `UBool icu::RuleBasedTimeZone::hasSameRules(const TimeZone&) const override`
-- **`bool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const`**
-  - `UBool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const`
-  - `UBool icu::RuleBasedTimeZone::inDaylightTime(UDate, UErrorCode&) const override`
-- **`bool icu::RuleBasedTimeZone::operator==(const TimeZone&) const`**
-  - `UBool icu::RuleBasedTimeZone::operator==(const TimeZone&) const`
-  - `bool icu::RuleBasedTimeZone::operator==(const TimeZone&) const override`
-- **`bool icu::RuleBasedTimeZone::useDaylightTime() const`**
-  - `UBool icu::RuleBasedTimeZone::useDaylightTime() const`
-  - `UBool icu::RuleBasedTimeZone::useDaylightTime() const override`
-- **`bool icu::SelectFormat::operator==(const Format&) const`**
-  - `UBool icu::SelectFormat::operator==(const Format&) const`
-  - `bool icu::SelectFormat::operator==(const Format&) const override`
-- **`bool icu::SimpleDateFormat::operator==(const Format&) const`**
-  - `UBool icu::SimpleDateFormat::operator==(const Format&) const`
-  - `bool icu::SimpleDateFormat::operator==(const Format&) const override`
-- **`bool icu::SimpleNumberFormatFactory::visible() const`**
-  - `UBool icu::SimpleNumberFormatFactory::visible() const`
-  - `UBool icu::SimpleNumberFormatFactory::visible() const override`
-- **`bool icu::SimpleTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::SimpleTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::SimpleTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::SimpleTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::SimpleTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::SimpleTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const`**
-  - `UBool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const`
-  - `UBool icu::SimpleTimeZone::hasSameRules(const TimeZone&) const override`
-- **`bool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const`**
-  - `UBool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const`
-  - `UBool icu::SimpleTimeZone::inDaylightTime(UDate, UErrorCode&) const override`
-- **`bool icu::SimpleTimeZone::operator==(const TimeZone&) const`**
-  - `UBool icu::SimpleTimeZone::operator==(const TimeZone&) const`
-  - `bool icu::SimpleTimeZone::operator==(const TimeZone&) const override`
-- **`bool icu::SimpleTimeZone::useDaylightTime() const`**
-  - `UBool icu::SimpleTimeZone::useDaylightTime() const`
-  - `UBool icu::SimpleTimeZone::useDaylightTime() const override`
-- **`bool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const`**
-  - `UBool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const`
-  - `bool icu::StringCharacterIterator::operator==(const ForwardCharacterIterator&) const override`
-- **`bool icu::StringSearch::operator==(const SearchIterator&) const`**
-  - `UBool icu::StringSearch::operator==(const SearchIterator&) const`
-  - `bool icu::StringSearch::operator==(const SearchIterator&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::TimeArrayTimeZoneRule::getFinalStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const`
-  - `UBool icu::TimeArrayTimeZoneRule::getFirstStart(int32_t, int32_t, UDate&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::TimeArrayTimeZoneRule::getNextStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, bool, UDate&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const`
-  - `UBool icu::TimeArrayTimeZoneRule::getPreviousStart(UDate, int32_t, int32_t, UBool, UDate&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const`
-  - `UBool icu::TimeArrayTimeZoneRule::isEquivalentTo(const TimeZoneRule&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const`
-  - `bool icu::TimeArrayTimeZoneRule::operator!=(const TimeZoneRule&) const override`
-- **`bool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const`**
-  - `UBool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const`
-  - `bool icu::TimeArrayTimeZoneRule::operator==(const TimeZoneRule&) const override`
-- **`bool icu::TimeZoneFormat::operator==(const Format&) const`**
-  - `UBool icu::TimeZoneFormat::operator==(const Format&) const`
-  - `bool icu::TimeZoneFormat::operator==(const Format&) const override`
-- **`bool icu::TimeZoneNames::operator==(const TimeZoneNames&) const`**
-  - `UBool icu::TimeZoneNames::operator==(const TimeZoneNames&) const=0`
-  - `bool icu::TimeZoneNames::operator==(const TimeZoneNames&) const=0`
-- **`bool icu::UCharCharacterIterator::hasNext()`**
-  - `UBool icu::UCharCharacterIterator::hasNext()`
-  - `UBool icu::UCharCharacterIterator::hasNext() override`
-- **`bool icu::UCharCharacterIterator::hasPrevious()`**
-  - `UBool icu::UCharCharacterIterator::hasPrevious()`
-  - `UBool icu::UCharCharacterIterator::hasPrevious() override`
-- **`bool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const`**
-  - `UBool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const`
-  - `bool icu::UCharCharacterIterator::operator==(const ForwardCharacterIterator&) const override`
-- **`bool icu::UnicodeSet::contains(UChar32) const`**
-  - `UBool icu::UnicodeSet::contains(UChar32) const`
-  - `UBool icu::UnicodeSet::contains(UChar32) const override`
-- **`bool icu::UnicodeString::hasMetaData() const`**
-  - `UBool icu::UnicodeString::hasMetaData() const`
-  - `UBool icu::UnicodeString::hasMetaData() const override`
-- **`bool icu::UnicodeStringAppendable::appendCodePoint(UChar32)`**
-  - `UBool icu::UnicodeStringAppendable::appendCodePoint(UChar32)`
-  - `UBool icu::UnicodeStringAppendable::appendCodePoint(UChar32) override`
-- **`bool icu::UnicodeStringAppendable::appendCodeUnit(char16_t)`**
-  - `UBool icu::UnicodeStringAppendable::appendCodeUnit(char16_t)`
-  - `UBool icu::UnicodeStringAppendable::appendCodeUnit(char16_t) override`
-- **`bool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t)`**
-  - `UBool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t)`
-  - `UBool icu::UnicodeStringAppendable::appendString(const char16_t*, int32_t) override`
-- **`bool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t)`**
-  - `UBool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t)`
-  - `UBool icu::UnicodeStringAppendable::reserveAppendCapacity(int32_t) override`
-- **`bool icu::VTimeZone::getNextTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::VTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::VTimeZone::getNextTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::VTimeZone::getPreviousTransition(UDate, bool, TimeZoneTransition&) const`**
-  - `UBool icu::VTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const`
-  - `UBool icu::VTimeZone::getPreviousTransition(UDate, UBool, TimeZoneTransition&) const override`
-- **`bool icu::VTimeZone::hasSameRules(const TimeZone&) const`**
-  - `UBool icu::VTimeZone::hasSameRules(const TimeZone&) const`
-  - `UBool icu::VTimeZone::hasSameRules(const TimeZone&) const override`
-- **`bool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const`**
-  - `UBool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const`
-  - `UBool icu::VTimeZone::inDaylightTime(UDate, UErrorCode&) const override`
-- **`bool icu::VTimeZone::operator==(const TimeZone&) const`**
-  - `UBool icu::VTimeZone::operator==(const TimeZone&) const`
-  - `bool icu::VTimeZone::operator==(const TimeZone&) const override`
-- **`bool icu::VTimeZone::useDaylightTime() const`**
-  - `UBool icu::VTimeZone::useDaylightTime() const`
-  - `UBool icu::VTimeZone::useDaylightTime() const override`
-- **`void icu::RuleBasedNumberFormat::setLenient(bool)`**
-  - `void icu::RuleBasedNumberFormat::setLenient(UBool)`
-  - `void icu::RuleBasedNumberFormat::setLenient(UBool) override`
-- **`void icu::RuleBasedTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const`**
-  - `void icu::RuleBasedTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const`
-  - `void icu::RuleBasedTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override`
-- **`void icu::SimpleTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const`**
-  - `void icu::SimpleTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const`
-  - `void icu::SimpleTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override`
-- **`void icu::VTimeZone::getOffset(UDate, bool, int32_t&, int32_t&, UErrorCode&) const`**
-  - `void icu::VTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const`
-  - `void icu::VTimeZone::getOffset(UDate, UBool, int32_t&, int32_t&, UErrorCode&) const override`
-- **`void* icu::AnnualTimeZoneRule::clone() const`**
-  - `AnnualTimeZoneRule* icu::AnnualTimeZoneRule::clone() const`
-  - `AnnualTimeZoneRule* icu::AnnualTimeZoneRule::clone() const override`
-- **`void* icu::BasicTimeZone::clone() const`**
-  - `BasicTimeZone* icu::BasicTimeZone::clone() const override=0`
-  - `BasicTimeZone* icu::BasicTimeZone::clone() const=0`
-- **`void* icu::ChoiceFormat::clone() const`**
-  - `ChoiceFormat* icu::ChoiceFormat::clone() const`
-  - `ChoiceFormat* icu::ChoiceFormat::clone() const override`
-- **`void* icu::CurrencyAmount::clone() const`**
-  - `CurrencyAmount* icu::CurrencyAmount::clone() const`
-  - `CurrencyAmount* icu::CurrencyAmount::clone() const override`
-- **`void* icu::CurrencyUnit::clone() const`**
-  - `CurrencyUnit* icu::CurrencyUnit::clone() const`
-  - `CurrencyUnit* icu::CurrencyUnit::clone() const override`
-- **`void* icu::DateFormat::clone() const`**
-  - `DateFormat* icu::DateFormat::clone() const override=0`
-  - `DateFormat* icu::DateFormat::clone() const=0`
-- **`void* icu::DateIntervalFormat::clone() const`**
-  - `DateIntervalFormat* icu::DateIntervalFormat::clone() const`
-  - `DateIntervalFormat* icu::DateIntervalFormat::clone() const override`
-- **`void* icu::GregorianCalendar::clone() const`**
-  - `GregorianCalendar* icu::GregorianCalendar::clone() const`
-  - `GregorianCalendar* icu::GregorianCalendar::clone() const override`
-- **`void* icu::InitialTimeZoneRule::clone() const`**
-  - `InitialTimeZoneRule* icu::InitialTimeZoneRule::clone() const`
-  - `InitialTimeZoneRule* icu::InitialTimeZoneRule::clone() const override`
-- **`void* icu::MeasureFormat::clone() const`**
-  - `MeasureFormat* icu::MeasureFormat::clone() const`
-  - `MeasureFormat* icu::MeasureFormat::clone() const override`
-- **`void* icu::MessageFormat::clone() const`**
-  - `MessageFormat* icu::MessageFormat::clone() const`
-  - `MessageFormat* icu::MessageFormat::clone() const override`
-- **`void* icu::NumberFormat::clone() const`**
-  - `NumberFormat* icu::NumberFormat::clone() const override=0`
-  - `NumberFormat* icu::NumberFormat::clone() const=0`
-- **`void* icu::PluralFormat::clone() const`**
-  - `PluralFormat* icu::PluralFormat::clone() const`
-  - `PluralFormat* icu::PluralFormat::clone() const override`
-- **`void* icu::RuleBasedBreakIterator::clone() const`**
-  - `RuleBasedBreakIterator* icu::RuleBasedBreakIterator::clone() const`
-  - `RuleBasedBreakIterator* icu::RuleBasedBreakIterator::clone() const override`
-- **`void* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&)`**
-  - `RuleBasedBreakIterator* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&)`
-  - `RuleBasedBreakIterator* icu::RuleBasedBreakIterator::createBufferClone(void*, int32_t&, UErrorCode&) override`
-- **`void* icu::RuleBasedCollator::clone() const`**
-  - `RuleBasedCollator* icu::RuleBasedCollator::clone() const`
-  - `RuleBasedCollator* icu::RuleBasedCollator::clone() const override`
-- **`void* icu::RuleBasedNumberFormat::clone() const`**
-  - `RuleBasedNumberFormat* icu::RuleBasedNumberFormat::clone() const`
-  - `RuleBasedNumberFormat* icu::RuleBasedNumberFormat::clone() const override`
-- **`void* icu::RuleBasedTimeZone::clone() const`**
-  - `RuleBasedTimeZone* icu::RuleBasedTimeZone::clone() const`
-  - `RuleBasedTimeZone* icu::RuleBasedTimeZone::clone() const override`
-- **`void* icu::SelectFormat::clone() const`**
-  - `SelectFormat* icu::SelectFormat::clone() const`
-  - `SelectFormat* icu::SelectFormat::clone() const override`
-- **`void* icu::SimpleDateFormat::clone() const`**
-  - `SimpleDateFormat* icu::SimpleDateFormat::clone() const`
-  - `SimpleDateFormat* icu::SimpleDateFormat::clone() const override`
-- **`void* icu::SimpleTimeZone::clone() const`**
-  - `SimpleTimeZone* icu::SimpleTimeZone::clone() const`
-  - `SimpleTimeZone* icu::SimpleTimeZone::clone() const override`
-- **`void* icu::StringCharacterIterator::clone() const`**
-  - `StringCharacterIterator* icu::StringCharacterIterator::clone() const`
-  - `StringCharacterIterator* icu::StringCharacterIterator::clone() const override`
-- **`void* icu::StringSearch::safeClone() const`**
-  - `StringSearch* icu::StringSearch::safeClone() const`
-  - `StringSearch* icu::StringSearch::safeClone() const override`
-- **`void* icu::TimeArrayTimeZoneRule::clone() const`**
-  - `TimeArrayTimeZoneRule* icu::TimeArrayTimeZoneRule::clone() const`
-  - `TimeArrayTimeZoneRule* icu::TimeArrayTimeZoneRule::clone() const override`
-- **`void* icu::TimeUnit::clone() const`**
-  - `TimeUnit* icu::TimeUnit::clone() const`
-  - `TimeUnit* icu::TimeUnit::clone() const override`
-- **`void* icu::TimeUnitAmount::clone() const`**
-  - `TimeUnitAmount* icu::TimeUnitAmount::clone() const`
-  - `TimeUnitAmount* icu::TimeUnitAmount::clone() const override`
-- **`void* icu::TimeUnitFormat::clone() const`**
-  - `TimeUnitFormat* icu::TimeUnitFormat::clone() const`
-  - `TimeUnitFormat* icu::TimeUnitFormat::clone() const override`
-- **`void* icu::TimeZoneFormat::clone() const`**
-  - `TimeZoneFormat* icu::TimeZoneFormat::clone() const`
-  - `TimeZoneFormat* icu::TimeZoneFormat::clone() const override`
-- **`void* icu::UCharCharacterIterator::clone() const`**
-  - `UCharCharacterIterator* icu::UCharCharacterIterator::clone() const`
-  - `UCharCharacterIterator* icu::UCharCharacterIterator::clone() const override`
-- **`void* icu::UnicodeFilter::clone() const`**
-  - `UnicodeFilter* icu::UnicodeFilter::clone() const override=0`
-  - `UnicodeFilter* icu::UnicodeFilter::clone() const=0`
-- **`void* icu::UnicodeSet::clone() const`**
-  - `UnicodeSet* icu::UnicodeSet::clone() const`
-  - `UnicodeSet* icu::UnicodeSet::clone() const override`
-- **`void* icu::UnicodeString::clone() const`**
-  - `UnicodeString* icu::UnicodeString::clone() const`
-  - `UnicodeString* icu::UnicodeString::clone() const override`
-- **`void* icu::VTimeZone::clone() const`**
-  - `VTimeZone* icu::VTimeZone::clone() const`
-  - `VTimeZone* icu::VTimeZone::clone() const override`
 
 ## Colophon
 
-Contents generated by StableAPI tool on Wed Sep 29 11:59:13 PDT 2021
+Contents generated by StableAPI tool on Thu Mar 10 11:13:13 PST 2022
 
 Copyright © 2019 and later: Unicode, Inc. and others.
 License & terms of use: http://www.unicode.org/copyright.html

Modified: trunk/Build/source/libs/icu/icu-src/LICENSE
===================================================================
--- trunk/Build/source/libs/icu/icu-src/LICENSE	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/LICENSE	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,6 +1,19 @@
-COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
 
-Copyright © 1991-2020 Unicode, Inc. All rights reserved.
+See Terms of Use <https://www.unicode.org/copyright.html>
+for definitions of Unicode Inc.’s Data Files and Software.
+
+NOTICE TO USER: Carefully read the following legal agreement.
+BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"),
+YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE
+TERMS AND CONDITIONS OF THIS AGREEMENT.
+IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE
+THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2022 Unicode, Inc. All rights reserved.
 Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
 
 Permission is hereby granted, free of charge, to any person obtaining
@@ -32,7 +45,7 @@
 use or other dealings in these Data Files or Software without prior
 written authorization of the copyright holder.
 
----------------------
+----------------------------------------------------------------------
 
 Third-Party Software Licenses
 
@@ -40,8 +53,10 @@
 terms for licensed third-party software components included within ICU
 libraries.
 
-1. ICU License - ICU 1.8.1 to ICU 57.1
+----------------------------------------------------------------------
 
+ICU License - ICU 1.8.1 to ICU 57.1
+
 COPYRIGHT AND PERMISSION NOTICE
 
 Copyright (c) 1995-2016 International Business Machines Corporation and others
@@ -75,8 +90,10 @@
 All trademarks and registered trademarks mentioned herein are the
 property of their respective owners.
 
-2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+----------------------------------------------------------------------
 
+Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
  #     The Google Chrome software developed by Google is licensed under
  # the BSD license. Other software included in this distribution is
  # provided under other licenses, as set forth below.
@@ -279,8 +296,10 @@
  #
  #  ---------------COPYING.ipadic-----END----------------------------------
 
-3. Lao Word Break Dictionary Data (laodict.txt)
+----------------------------------------------------------------------
 
+Lao Word Break Dictionary Data (laodict.txt)
+
  # Copyright (C) 2016 and later: Unicode, Inc. and others.
  # License & terms of use: http://www.unicode.org/copyright.html
  # Copyright (c) 2015 International Business Machines Corporation
@@ -319,8 +338,10 @@
  # OF THE POSSIBILITY OF SUCH DAMAGE.
  #  --------------------------------------------------------------------------
 
-4. Burmese Word Break Dictionary Data (burmesedict.txt)
+----------------------------------------------------------------------
 
+Burmese Word Break Dictionary Data (burmesedict.txt)
+
  #  Copyright (c) 2014 International Business Machines Corporation
  #  and others. All Rights Reserved.
  #
@@ -359,8 +380,10 @@
  #  SUCH DAMAGE.
  #  --------------------------------------------------------------------------
 
-5. Time Zone Database
+----------------------------------------------------------------------
 
+Time Zone Database
+
   ICU uses the public domain data and code derived from Time Zone
 Database for its time zone support. The ownership of the TZ database
 is explained in BCP 175: Procedure for Maintaining the Time Zone
@@ -382,8 +405,10 @@
  #    making a contribution to the database or code waives all rights to
  #    future claims in that contribution or in the TZ Database.
 
-6. Google double-conversion
+----------------------------------------------------------------------
 
+Google double-conversion
+
 Copyright 2006-2011, the V8 project authors. All rights reserved.
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -410,3 +435,85 @@
 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+
+File: aclocal.m4 (only for ICU4C)
+Section: pkg.m4 - Macros to locate and utilise pkg-config.
+
+
+Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+Copyright © 2012-2015 Dan Nicholson <dbn.lists at gmail.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.
+
+As a special exception to the GNU General Public License, if you
+distribute this file as part of a program that contains a
+configuration script generated by Autoconf, you may include it under
+the same distribution terms that you use for the rest of that
+program.
+
+
+(The condition for the exception is fulfilled because
+ICU4C includes a configuration script generated by Autoconf,
+namely the `configure` script.)
+
+----------------------------------------------------------------------
+
+File: config.guess (only for ICU4C)
+
+
+This file is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, see <https://www.gnu.org/licenses/>.
+
+As a special exception to the GNU General Public License, if you
+distribute this file as part of a program that contains a
+configuration script generated by Autoconf, you may include it under
+the same distribution terms that you use for the rest of that
+program.  This Exception is an additional permission under section 7
+of the GNU General Public License, version 3 ("GPLv3").
+
+
+(The condition for the exception is fulfilled because
+ICU4C includes a configuration script generated by Autoconf,
+namely the `configure` script.)
+
+----------------------------------------------------------------------
+
+File: install-sh (only for ICU4C)
+
+
+Copyright 1991 by the Massachusetts Institute of Technology
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission.  M.I.T. makes no representations about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.

Deleted: trunk/Build/source/libs/icu/icu-src/source/common/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,1213 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This file defines Bazel targets for a subset of ICU4C "common" library header and source files.
-# The configuration of dependencies among targets is strongly assisted by the
-# file in depstest that maintains such information, at
-# icu4c/source/test/depstest/dependencies.txt .
-
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-# When compiling code in the `common` dir, the constant
-# `U_COMMON_IMPLEMENTATION` needs to be defined. See 
-# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
-
-# If linker errors occur, then this may be a sign that the dependencies were 
-# not specified correctly. Use dependencies.txt in depstest for assistance. See
-# https://stackoverflow.com/q/66111709/2077918 .
-
-cc_library(
-    name = "headers",
-    hdrs = glob([
-        "unicode/*.h", # public
-        "*.h",         # internal
-        ],
-        # Instead of using these checked-in files, our Bazel build process
-        # regenerates them and then uses the new versions.
-        # Same list of .h files as in icu4c/source/data/unidata/clean.sh.
-        exclude = ["norm2_nfc_data.h", "propname_data.h", "*_props_data.h"],
-    ),
-    # We need to add includes in order to preserve existing source files'
-    # include directives that use traditional paths, not paths relative to
-    # Bazel workspace:
-    # https://stackoverflow.com/a/65635893/2077918
-    includes = ["."],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "platform",
-    srcs = [
-        "cmemory.cpp", 
-        "uobject.cpp",
-        "cstring.cpp",
-        "cwchar.cpp",
-        "uinvchar.cpp",
-        "charstr.cpp",
-        "unistr.cpp",
-        "appendable.cpp",
-        "stringpiece.cpp",
-        "ustrtrns.cpp",
-        "ustring.cpp",  
-        "ustrfmt.cpp",  
-        "utf_impl.cpp",
-        "putil.cpp",
-        "ucln_cmn.cpp",  
-        "udataswp.cpp",  
-        "umath.cpp",
-        "umutex.cpp",
-        "sharedobject.cpp",
-        "utrace.cpp",
-    ],
-    deps = [
-        ":headers",
-        # omit other deps b/c they are sys symbols
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-    linkopts = ["-ldl"],
-)
-
-cc_library(
-    name = "utrie",
-    srcs = ["utrie.cpp"],
-    deps = [":platform"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "utrie2",
-    srcs = ["utrie2.cpp"],
-    deps = [":platform"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "utrie2_builder",
-    srcs = ["utrie2_builder.cpp"],
-    deps = [
-        ":utrie",
-        ":utrie2",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucptrie",
-    srcs = ["ucptrie.cpp"],
-    deps = [":platform"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "umutablecptrie",
-    srcs = ["umutablecptrie.cpp"],
-    deps = [":ucptrie"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "bytestrie",
-    srcs = ["bytestrie.cpp"],
-    deps = [":platform"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "bytestriebuilder",
-    srcs = ["bytestriebuilder.cpp"],
-    deps = [
-        ":bytestrie",
-        ":stringtriebuilder",
-        ":sort",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "stringtriebuilder",
-    srcs = ["stringtriebuilder.cpp"],
-    deps = [
-        ":uhash",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uhash",
-    hdrs = [
-        "uhash.h",
-    ],
-    srcs = [
-        "uhash.cpp",
-    ],
-    deps = [
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "errorcode",
-    hdrs = [
-    ],
-    srcs = [
-        "errorcode.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":platform",
-        ":utypes",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "utypes",
-    srcs = [
-        "utypes.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uniset",
-    srcs = [
-        "uniset.cpp",
-        "unifilt.cpp",
-        "unisetspan.cpp",
-        "bmpset.cpp",
-        "util.cpp",
-        "unifunct.cpp",
-        "usetiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":patternprops",
-        ":uvector",
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "patternprops",
-    srcs = [
-        "patternprops.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "propsvec",
-    srcs = [
-        "propsvec.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":sort",
-        ":utrie2_builder",
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "propname",
-    srcs = [
-        "propname.cpp",
-        "propname_data.h",
-    ],
-    includes = ["."],
-    deps = [
-        ":bytestrie",
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-# Note: The cc_library target names "uvector32" and "uvector64" match the
-# dependencies.txt group names, but the filenames are "uvectr32.*"/"uvectr64.*".
-cc_library(
-    name = "uvector32",
-    srcs = [
-        "uvectr32.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uvector64",
-    srcs = [
-        "uvectr64.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "sort",
-    srcs = [
-        "uarrsort.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uvector",
-    srcs = [
-        "uvector.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":platform",
-        ":sort",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "breakiterator",
-    srcs = [
-        "brkiter.cpp",
-        "brkeng.cpp",
-        "dictbe.cpp",
-        "dictionarydata.cpp",
-        "filteredbrk.cpp",
-        "lstmbe.cpp",
-        "rbbi.cpp",
-        "rbbi_cache.cpp",
-        "rbbidata.cpp",
-        "rbbinode.cpp",
-        "rbbirb.cpp",
-        "rbbiscan.cpp",
-        "rbbisetb.cpp",
-        "rbbistbl.cpp",
-        "rbbitblb.cpp",
-        "ubrk.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":bytestrie",
-        ":headers",
-        ":normlzr",
-        ":resourcebundle",
-        ":schriter",
-        ":service_registration",
-        ":ucharstrie",
-        ":ucharstriebuilder",
-        ":uhash",
-        ":uniset_core",
-        ":uniset_props",
-        ":ustack",
-        ":utext",
-        ":utrie2_builder",
-        ":uvector32",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "bytesinkutil",
-    srcs = [
-        "bytesinkutil.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":bytestream",
-        ":edits",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "bytestream",
-    srcs = [
-        "bytestream.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "canonical_iterator",
-    srcs = [
-        "caniter.cpp",
-    ],
-    deps = [
-        ":normalizer2",
-        ":usetiter",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "characterproperties",
-    srcs = [
-        "characterproperties.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":emojiprops",
-        ":ucptrie",
-        ":umutablecptrie",
-        ":uniset_core",
-        ":uprops",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "chariter",
-    srcs = [
-        "chariter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "edits",
-    srcs = [
-        "edits.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":icu_utility",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "filterednormalizer2",
-    srcs = [
-        "filterednormalizer2.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":normalizer2",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "hashtable",
-    srcs = [
-        "uhash_us.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uhash",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "icu_utility",
-    srcs = [
-        "util.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":patternprops",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "loadednormalizer2",
-    srcs = [
-        "loadednormalizer2impl.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":normalizer2",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "locale_display_names",
-    srcs = [
-        "locdispnames.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":locresdata",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "locresdata",
-    srcs = [
-        "locresdata.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":resourcebundle",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "normlzr",
-    srcs = [
-        "normlzr.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":filterednormalizer2",
-        ":headers",
-        ":schriter",
-        ":uniset_props",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "parsepos",
-    srcs = [
-        "parsepos.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "resourcebundle",
-    srcs = [
-        "localebuilder.cpp",
-        "locavailable.cpp",
-        "locbased.cpp",
-        "locid.cpp",
-        "loclikely.cpp",
-        "locmap.cpp",
-        "resbund.cpp",
-        "resource.cpp",
-        "uloc.cpp",
-        "uloc_tag.cpp",
-        "uloc_keytype.cpp",
-        "uresbund.cpp",
-        "uresdata.cpp",
-        "wintz.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":bytesinkutil",
-        ":errorcode",
-        ":headers",
-        ":propname",
-        ":sort",
-        ":stringenumeration",
-        ":ucol_swp",
-        ":udata",
-        ":uhash",
-        ":uscript_props",
-        ":uvector",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "schriter",
-    srcs = [
-        "schriter.cpp",
-        "uchriter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":chariter",
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "service_registration",
-    srcs = [
-        "locutil.cpp",
-        "serv.cpp",
-        "servlk.cpp",
-        "servlkf.cpp",
-        "servls.cpp",
-        "servnotf.cpp",
-        "servrbf.cpp",
-        "servslkf.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":hashtable",
-        ":headers",
-        ":locale_display_names",
-        ":resourcebundle",
-        ":uvector",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "stringenumeration",
-    srcs = [
-        "uenum.cpp",
-        "ustrenum.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ubidi_props",
-    srcs = [
-        "ubidi_props.cpp",
-        "ubidi_props_data.h",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":utrie2",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucase",
-    srcs = [
-        "ucase.cpp",
-        "ucase_props_data.h",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":utrie2",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uchar",
-    srcs = [
-        "uchar.cpp",
-        "uchar_props_data.h",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":utrie2",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "emojiprops",
-    srcs = [
-        "emojiprops.cpp",
-        "emojiprops.h",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ucharstrie",
-        ":ucharstrieiterator",
-        ":ucptrie",
-        ":udata",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucharstrie",
-    srcs = [
-        "ucharstrie.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucharstriebuilder",
-    srcs = [
-        "ucharstriebuilder.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":sort",
-        ":stringtriebuilder",
-        ":ucharstrie",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucharstrieiterator",
-    srcs = [
-        "ucharstrieiterator.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ucharstrie",
-        ":uvector32",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ucol_swp",
-    srcs = [
-        "ucol_swp.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":utrie_swap",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "udata",
-    srcs = [
-        "restrace.cpp",
-        "ucmndata.cpp",
-        "udata.cpp",
-        "udatamem.cpp",
-        "umapfile.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":icu_utility",
-        ":platform",
-        ":uhash",
-        "//icu4c/source/stubdata",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uiter",
-    srcs = [
-        "uiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ulist",
-    srcs = [
-        "ulist.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "unames",
-    srcs = [
-        "unames.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uchar",
-        ":udata",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "unifiedcache",
-    srcs = [
-        "unifiedcache.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-        ":uhash",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uniset_core",
-    srcs = [
-        "bmpset.cpp",
-        "unifilt.cpp",
-        "unifunct.cpp",
-        "uniset.cpp",
-        "unisetspan.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":icu_utility",
-        ":patternprops",
-        ":uvector",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uniset_closure",
-    srcs = [
-        "uniset_closure.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uniset_core",
-        ":unistr_case_locale",
-        ":unistr_titlecase_brkiter",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uniset_props",
-    srcs = [
-        "uniset_props.cpp",
-        "ruleiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":characterproperties",
-        ":headers",
-        ":parsepos",
-        ":propname",
-        ":resourcebundle",
-        ":unames",
-        ":uniset_core",
-        ":unistr_case",
-        ":uprops",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "unistr_case",
-    srcs = [
-        "unistr_case.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ustring_case",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "unistr_case_locale",
-    srcs = [
-        "unistr_case_locale.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":unistr_case",
-        ":ustring_case_locale",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "unistr_titlecase_brkiter",
-    srcs = [
-        "unistr_titlecase_brkiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ustr_titlecase_brkiter",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uprops",
-    srcs = [
-        "uprops.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":emojiprops",
-        ":loadednormalizer2",
-        ":normalizer2",
-        ":ubidi_props",
-        ":ucase",
-        ":uchar",
-        ":unistr_case",
-        ":ustring_case",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uscript_props",
-    srcs = [
-        "uscript_props.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uset",
-    srcs = [
-        "uset.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-        ":uniset_core",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uset_props",
-    srcs = [
-        "uset_props.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uniset_closure",
-        ":uniset_core",
-        ":uniset_props",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "usetiter",
-    srcs = [
-        "usetiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":platform",
-        ":uniset_core",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ustack",
-    srcs = [
-        "ustack.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uvector",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ustr_titlecase_brkiter",
-    srcs = [
-        "ustr_titlecase_brkiter.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":breakiterator",
-        ":headers",
-        ":ucase",
-        ":ustring_case_locale",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ustring_case",
-    srcs = [
-        "ustrcase.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ucase",
-        ":uchar",
-        ":edits",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "ustring_case_locale",
-    srcs = [
-        "ustrcase_locale.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":resourcebundle",
-        ":ustring_case",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "utext",
-    srcs = [
-        "utext.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":ucase",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "utrie_swap",
-    srcs = [
-        "utrie_swap.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":udata",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)
-
-# This target depends on a header file that contains NFC/NFD normalization data.
-# This header file is generated by a script (generate.sh) that invokes the gennorm2 binary.
-# See the Unicode update change log (changes.txt).
-cc_library(
-    name = "normalizer2",
-    srcs = [
-        "norm2_nfc_data.h",  # generated by gennorm2
-        "normalizer2.cpp",
-        "normalizer2impl.cpp",
-    ],
-    includes = ["."],
-    hdrs = [
-        "normalizer2impl.h",
-    ],
-    deps = [
-        ":headers",
-    ],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",  
-    ],
-)

Added: trunk/Build/source/libs/icu/icu-src/source/common/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/common/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,1213 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This file defines Bazel targets for a subset of ICU4C "common" library header and source files.
+# The configuration of dependencies among targets is strongly assisted by the
+# file in depstest that maintains such information, at
+# icu4c/source/test/depstest/dependencies.txt .
+
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+# When compiling code in the `common` dir, the constant
+# `U_COMMON_IMPLEMENTATION` needs to be defined. See 
+# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
+
+# If linker errors occur, then this may be a sign that the dependencies were 
+# not specified correctly. Use dependencies.txt in depstest for assistance. See
+# https://stackoverflow.com/q/66111709/2077918 .
+
+cc_library(
+    name = "headers",
+    hdrs = glob([
+        "unicode/*.h", # public
+        "*.h",         # internal
+        ],
+        # Instead of using these checked-in files, our Bazel build process
+        # regenerates them and then uses the new versions.
+        # Same list of .h files as in icu4c/source/data/unidata/clean.sh.
+        exclude = ["norm2_nfc_data.h", "propname_data.h", "*_props_data.h"],
+    ),
+    # We need to add includes in order to preserve existing source files'
+    # include directives that use traditional paths, not paths relative to
+    # Bazel workspace:
+    # https://stackoverflow.com/a/65635893/2077918
+    includes = ["."],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "platform",
+    srcs = [
+        "cmemory.cpp", 
+        "uobject.cpp",
+        "cstring.cpp",
+        "cwchar.cpp",
+        "uinvchar.cpp",
+        "charstr.cpp",
+        "unistr.cpp",
+        "appendable.cpp",
+        "stringpiece.cpp",
+        "ustrtrns.cpp",
+        "ustring.cpp",  
+        "ustrfmt.cpp",  
+        "utf_impl.cpp",
+        "putil.cpp",
+        "ucln_cmn.cpp",  
+        "udataswp.cpp",  
+        "umath.cpp",
+        "umutex.cpp",
+        "sharedobject.cpp",
+        "utrace.cpp",
+    ],
+    deps = [
+        ":headers",
+        # omit other deps b/c they are sys symbols
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+    linkopts = ["-ldl"],
+)
+
+cc_library(
+    name = "utrie",
+    srcs = ["utrie.cpp"],
+    deps = [":platform"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "utrie2",
+    srcs = ["utrie2.cpp"],
+    deps = [":platform"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "utrie2_builder",
+    srcs = ["utrie2_builder.cpp"],
+    deps = [
+        ":utrie",
+        ":utrie2",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucptrie",
+    srcs = ["ucptrie.cpp"],
+    deps = [":platform"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "umutablecptrie",
+    srcs = ["umutablecptrie.cpp"],
+    deps = [":ucptrie"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "bytestrie",
+    srcs = ["bytestrie.cpp"],
+    deps = [":platform"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "bytestriebuilder",
+    srcs = ["bytestriebuilder.cpp"],
+    deps = [
+        ":bytestrie",
+        ":stringtriebuilder",
+        ":sort",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "stringtriebuilder",
+    srcs = ["stringtriebuilder.cpp"],
+    deps = [
+        ":uhash",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uhash",
+    hdrs = [
+        "uhash.h",
+    ],
+    srcs = [
+        "uhash.cpp",
+    ],
+    deps = [
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "errorcode",
+    hdrs = [
+    ],
+    srcs = [
+        "errorcode.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":platform",
+        ":utypes",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "utypes",
+    srcs = [
+        "utypes.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uniset",
+    srcs = [
+        "uniset.cpp",
+        "unifilt.cpp",
+        "unisetspan.cpp",
+        "bmpset.cpp",
+        "util.cpp",
+        "unifunct.cpp",
+        "usetiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":patternprops",
+        ":uvector",
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "patternprops",
+    srcs = [
+        "patternprops.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "propsvec",
+    srcs = [
+        "propsvec.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":sort",
+        ":utrie2_builder",
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "propname",
+    srcs = [
+        "propname.cpp",
+        "propname_data.h",
+    ],
+    includes = ["."],
+    deps = [
+        ":bytestrie",
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+# Note: The cc_library target names "uvector32" and "uvector64" match the
+# dependencies.txt group names, but the filenames are "uvectr32.*"/"uvectr64.*".
+cc_library(
+    name = "uvector32",
+    srcs = [
+        "uvectr32.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uvector64",
+    srcs = [
+        "uvectr64.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "sort",
+    srcs = [
+        "uarrsort.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uvector",
+    srcs = [
+        "uvector.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":platform",
+        ":sort",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "breakiterator",
+    srcs = [
+        "brkiter.cpp",
+        "brkeng.cpp",
+        "dictbe.cpp",
+        "dictionarydata.cpp",
+        "filteredbrk.cpp",
+        "lstmbe.cpp",
+        "rbbi.cpp",
+        "rbbi_cache.cpp",
+        "rbbidata.cpp",
+        "rbbinode.cpp",
+        "rbbirb.cpp",
+        "rbbiscan.cpp",
+        "rbbisetb.cpp",
+        "rbbistbl.cpp",
+        "rbbitblb.cpp",
+        "ubrk.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":bytestrie",
+        ":headers",
+        ":normlzr",
+        ":resourcebundle",
+        ":schriter",
+        ":service_registration",
+        ":ucharstrie",
+        ":ucharstriebuilder",
+        ":uhash",
+        ":uniset_core",
+        ":uniset_props",
+        ":ustack",
+        ":utext",
+        ":utrie2_builder",
+        ":uvector32",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "bytesinkutil",
+    srcs = [
+        "bytesinkutil.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":bytestream",
+        ":edits",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "bytestream",
+    srcs = [
+        "bytestream.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "canonical_iterator",
+    srcs = [
+        "caniter.cpp",
+    ],
+    deps = [
+        ":normalizer2",
+        ":usetiter",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "characterproperties",
+    srcs = [
+        "characterproperties.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":emojiprops",
+        ":ucptrie",
+        ":umutablecptrie",
+        ":uniset_core",
+        ":uprops",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "chariter",
+    srcs = [
+        "chariter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "edits",
+    srcs = [
+        "edits.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":icu_utility",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "filterednormalizer2",
+    srcs = [
+        "filterednormalizer2.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":normalizer2",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "hashtable",
+    srcs = [
+        "uhash_us.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uhash",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "icu_utility",
+    srcs = [
+        "util.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":patternprops",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "loadednormalizer2",
+    srcs = [
+        "loadednormalizer2impl.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":normalizer2",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "locale_display_names",
+    srcs = [
+        "locdispnames.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":locresdata",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "locresdata",
+    srcs = [
+        "locresdata.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":resourcebundle",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "normlzr",
+    srcs = [
+        "normlzr.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":filterednormalizer2",
+        ":headers",
+        ":schriter",
+        ":uniset_props",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "parsepos",
+    srcs = [
+        "parsepos.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "resourcebundle",
+    srcs = [
+        "localebuilder.cpp",
+        "locavailable.cpp",
+        "locbased.cpp",
+        "locid.cpp",
+        "loclikely.cpp",
+        "locmap.cpp",
+        "resbund.cpp",
+        "resource.cpp",
+        "uloc.cpp",
+        "uloc_tag.cpp",
+        "uloc_keytype.cpp",
+        "uresbund.cpp",
+        "uresdata.cpp",
+        "wintz.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":bytesinkutil",
+        ":errorcode",
+        ":headers",
+        ":propname",
+        ":sort",
+        ":stringenumeration",
+        ":ucol_swp",
+        ":udata",
+        ":uhash",
+        ":uscript_props",
+        ":uvector",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "schriter",
+    srcs = [
+        "schriter.cpp",
+        "uchriter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":chariter",
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "service_registration",
+    srcs = [
+        "locutil.cpp",
+        "serv.cpp",
+        "servlk.cpp",
+        "servlkf.cpp",
+        "servls.cpp",
+        "servnotf.cpp",
+        "servrbf.cpp",
+        "servslkf.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":hashtable",
+        ":headers",
+        ":locale_display_names",
+        ":resourcebundle",
+        ":uvector",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "stringenumeration",
+    srcs = [
+        "uenum.cpp",
+        "ustrenum.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ubidi_props",
+    srcs = [
+        "ubidi_props.cpp",
+        "ubidi_props_data.h",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":utrie2",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucase",
+    srcs = [
+        "ucase.cpp",
+        "ucase_props_data.h",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":utrie2",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uchar",
+    srcs = [
+        "uchar.cpp",
+        "uchar_props_data.h",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":utrie2",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "emojiprops",
+    srcs = [
+        "emojiprops.cpp",
+        "emojiprops.h",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ucharstrie",
+        ":ucharstrieiterator",
+        ":ucptrie",
+        ":udata",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucharstrie",
+    srcs = [
+        "ucharstrie.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucharstriebuilder",
+    srcs = [
+        "ucharstriebuilder.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":sort",
+        ":stringtriebuilder",
+        ":ucharstrie",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucharstrieiterator",
+    srcs = [
+        "ucharstrieiterator.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ucharstrie",
+        ":uvector32",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ucol_swp",
+    srcs = [
+        "ucol_swp.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":utrie_swap",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "udata",
+    srcs = [
+        "restrace.cpp",
+        "ucmndata.cpp",
+        "udata.cpp",
+        "udatamem.cpp",
+        "umapfile.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":icu_utility",
+        ":platform",
+        ":uhash",
+        "//icu4c/source/stubdata",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uiter",
+    srcs = [
+        "uiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ulist",
+    srcs = [
+        "ulist.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "unames",
+    srcs = [
+        "unames.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uchar",
+        ":udata",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "unifiedcache",
+    srcs = [
+        "unifiedcache.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+        ":uhash",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uniset_core",
+    srcs = [
+        "bmpset.cpp",
+        "unifilt.cpp",
+        "unifunct.cpp",
+        "uniset.cpp",
+        "unisetspan.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":icu_utility",
+        ":patternprops",
+        ":uvector",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uniset_closure",
+    srcs = [
+        "uniset_closure.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uniset_core",
+        ":unistr_case_locale",
+        ":unistr_titlecase_brkiter",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uniset_props",
+    srcs = [
+        "uniset_props.cpp",
+        "ruleiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":characterproperties",
+        ":headers",
+        ":parsepos",
+        ":propname",
+        ":resourcebundle",
+        ":unames",
+        ":uniset_core",
+        ":unistr_case",
+        ":uprops",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "unistr_case",
+    srcs = [
+        "unistr_case.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ustring_case",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "unistr_case_locale",
+    srcs = [
+        "unistr_case_locale.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":unistr_case",
+        ":ustring_case_locale",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "unistr_titlecase_brkiter",
+    srcs = [
+        "unistr_titlecase_brkiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ustr_titlecase_brkiter",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uprops",
+    srcs = [
+        "uprops.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":emojiprops",
+        ":loadednormalizer2",
+        ":normalizer2",
+        ":ubidi_props",
+        ":ucase",
+        ":uchar",
+        ":unistr_case",
+        ":ustring_case",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uscript_props",
+    srcs = [
+        "uscript_props.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uset",
+    srcs = [
+        "uset.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+        ":uniset_core",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uset_props",
+    srcs = [
+        "uset_props.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uniset_closure",
+        ":uniset_core",
+        ":uniset_props",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "usetiter",
+    srcs = [
+        "usetiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":platform",
+        ":uniset_core",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ustack",
+    srcs = [
+        "ustack.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uvector",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ustr_titlecase_brkiter",
+    srcs = [
+        "ustr_titlecase_brkiter.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":breakiterator",
+        ":headers",
+        ":ucase",
+        ":ustring_case_locale",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ustring_case",
+    srcs = [
+        "ustrcase.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ucase",
+        ":uchar",
+        ":edits",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "ustring_case_locale",
+    srcs = [
+        "ustrcase_locale.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":resourcebundle",
+        ":ustring_case",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "utext",
+    srcs = [
+        "utext.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":ucase",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "utrie_swap",
+    srcs = [
+        "utrie_swap.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":udata",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)
+
+# This target depends on a header file that contains NFC/NFD normalization data.
+# This header file is generated by a script (generate.sh) that invokes the gennorm2 binary.
+# See the Unicode update change log (changes.txt).
+cc_library(
+    name = "normalizer2",
+    srcs = [
+        "norm2_nfc_data.h",  # generated by gennorm2
+        "normalizer2.cpp",
+        "normalizer2impl.cpp",
+    ],
+    includes = ["."],
+    hdrs = [
+        "normalizer2impl.h",
+    ],
+    deps = [
+        ":headers",
+    ],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",  
+    ],
+)

Modified: trunk/Build/source/libs/icu/icu-src/source/common/brkeng.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/brkeng.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/brkeng.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -79,6 +79,7 @@
                              int32_t /* startPos */,
                              int32_t endPos,
                              UVector32 &/*foundBreaks*/,
+                             UBool /* isPhraseBreaking */,
                              UErrorCode &status) const {
     if (U_FAILURE(status)) return 0;
     UChar32 c = utext_current32(text); 

Modified: trunk/Build/source/libs/icu/icu-src/source/common/brkeng.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/brkeng.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/brkeng.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -75,6 +75,7 @@
                               int32_t startPos,
                               int32_t endPos,
                               UVector32 &foundBreaks,
+                              UBool isPhraseBreaking,
                               UErrorCode &status) const = 0;
 
 };
@@ -194,6 +195,7 @@
                               int32_t startPos,
                               int32_t endPos,
                               UVector32 &foundBreaks,
+                              UBool isPhraseBreaking,
                               UErrorCode &status) const override;
 
  /**

Modified: trunk/Build/source/libs/icu/icu-src/source/common/brkiter.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/brkiter.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/brkiter.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -30,6 +30,7 @@
 #include "unicode/ures.h"
 #include "unicode/ustring.h"
 #include "unicode/filteredbrk.h"
+#include "bytesinkutil.h"
 #include "ucln_cmn.h"
 #include "cstring.h"
 #include "umutex.h"
@@ -115,7 +116,7 @@
     }
 
     // Create a RuleBasedBreakIterator
-    result = new RuleBasedBreakIterator(file, status);
+    result = new RuleBasedBreakIterator(file, uprv_strstr(type, "phrase") != NULL, status);
 
     // If there is a result, set the valid locale and actual locale, and the kind
     if (U_SUCCESS(status) && result != NULL) {
@@ -408,7 +409,6 @@
     if (U_FAILURE(status)) {
         return NULL;
     }
-    char lbType[kKeyValueLenMax];
 
     BreakIterator *result = NULL;
     switch (kind) {
@@ -428,18 +428,29 @@
         break;
     case UBRK_LINE:
         {
+            char lb_lw[kKeyValueLenMax];
             UTRACE_ENTRY(UTRACE_UBRK_CREATE_LINE);
-            uprv_strcpy(lbType, "line");
-            char lbKeyValue[kKeyValueLenMax] = {0};
+            uprv_strcpy(lb_lw, "line");
             UErrorCode kvStatus = U_ZERO_ERROR;
-            int32_t kLen = loc.getKeywordValue("lb", lbKeyValue, kKeyValueLenMax, kvStatus);
-            if (U_SUCCESS(kvStatus) && kLen > 0 && (uprv_strcmp(lbKeyValue,"strict")==0 || uprv_strcmp(lbKeyValue,"normal")==0 || uprv_strcmp(lbKeyValue,"loose")==0)) {
-                uprv_strcat(lbType, "_");
-                uprv_strcat(lbType, lbKeyValue);
+            CharString value;
+            CharStringByteSink valueSink(&value);
+            loc.getKeywordValue("lb", valueSink, kvStatus);
+            if (U_SUCCESS(kvStatus) && (value == "strict" || value == "normal" || value == "loose")) {
+                uprv_strcat(lb_lw, "_");
+                uprv_strcat(lb_lw, value.data());
             }
-            result = BreakIterator::buildInstance(loc, lbType, status);
+            // lw=phrase is only supported in Japanese.
+            if (uprv_strcmp(loc.getLanguage(), "ja") == 0) {
+                value.clear();
+                loc.getKeywordValue("lw", valueSink, kvStatus);
+                if (U_SUCCESS(kvStatus) && value == "phrase") {
+                    uprv_strcat(lb_lw, "_");
+                    uprv_strcat(lb_lw, value.data());
+                }
+            }
+            result = BreakIterator::buildInstance(loc, lb_lw, status);
 
-            UTRACE_DATA1(UTRACE_INFO, "lb=%s", lbKeyValue);
+            UTRACE_DATA1(UTRACE_INFO, "lb_lw=%s", lb_lw);
             UTRACE_EXIT_STATUS(status);
         }
         break;

Modified: trunk/Build/source/libs/icu/icu-src/source/common/common.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/common.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/common.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -58,7 +58,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuuc70d.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuuc71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuucd.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuucd.lib</ImportLibrary>
     </Link>
@@ -70,7 +70,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuuc70.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuuc71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuuc.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuuc.lib</ImportLibrary>
     </Link>

Modified: trunk/Build/source/libs/icu/icu-src/source/common/common_uwp.vcxproj
===================================================================
(Binary files differ)

Modified: trunk/Build/source/libs/icu/icu-src/source/common/dictbe.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/dictbe.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/dictbe.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -17,7 +17,10 @@
 #include "dictbe.h"
 #include "unicode/uniset.h"
 #include "unicode/chariter.h"
+#include "unicode/resbund.h"
 #include "unicode/ubrk.h"
+#include "unicode/usetiter.h"
+#include "ubrkimpl.h"
 #include "utracimp.h"
 #include "uvectr32.h"
 #include "uvector.h"
@@ -48,6 +51,7 @@
                                  int32_t startPos,
                                  int32_t endPos,
                                  UVector32 &foundBreaks,
+                                 UBool isPhraseBreaking,
                                  UErrorCode& status) const {
     if (U_FAILURE(status)) return 0;
     (void)startPos;            // TODO: remove this param?
@@ -68,7 +72,7 @@
     }
     rangeStart = start;
     rangeEnd = current;
-    result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks, status);
+    result = divideUpDictionaryRange(text, rangeStart, rangeEnd, foundBreaks, isPhraseBreaking, status);
     utext_setNativeIndex(text, current);
     
     return result;
@@ -199,13 +203,13 @@
 {
     UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
     UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Thai");
-    fThaiWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]]"), status);
+    UnicodeSet thaiWordSet(UnicodeString(u"[[:Thai:]&[:LineBreak=SA:]]"), status);
     if (U_SUCCESS(status)) {
-        setCharacters(fThaiWordSet);
+        setCharacters(thaiWordSet);
     }
-    fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]&[:M:]]"), status);
+    fMarkSet.applyPattern(UnicodeString(u"[[:Thai:]&[:LineBreak=SA:]&[:M:]]"), status);
     fMarkSet.add(0x0020);
-    fEndWordSet = fThaiWordSet;
+    fEndWordSet = thaiWordSet;
     fEndWordSet.remove(0x0E31);             // MAI HAN-AKAT
     fEndWordSet.remove(0x0E40, 0x0E44);     // SARA E through SARA AI MAIMALAI
     fBeginWordSet.add(0x0E01, 0x0E2E);      // KO KAI through HO NOKHUK
@@ -230,6 +234,7 @@
                                                 int32_t rangeStart,
                                                 int32_t rangeEnd,
                                                 UVector32 &foundBreaks,
+                                                UBool /* isPhraseBreaking */,
                                                 UErrorCode& status) const {
     if (U_FAILURE(status)) return 0;
     utext_setNativeIndex(text, rangeStart);
@@ -441,13 +446,13 @@
 {
     UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
     UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Laoo");
-    fLaoWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Laoo:]&[:LineBreak=SA:]]"), status);
+    UnicodeSet laoWordSet(UnicodeString(u"[[:Laoo:]&[:LineBreak=SA:]]"), status);
     if (U_SUCCESS(status)) {
-        setCharacters(fLaoWordSet);
+        setCharacters(laoWordSet);
     }
-    fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Laoo:]&[:LineBreak=SA:]&[:M:]]"), status);
+    fMarkSet.applyPattern(UnicodeString(u"[[:Laoo:]&[:LineBreak=SA:]&[:M:]]"), status);
     fMarkSet.add(0x0020);
-    fEndWordSet = fLaoWordSet;
+    fEndWordSet = laoWordSet;
     fEndWordSet.remove(0x0EC0, 0x0EC4);     // prefix vowels
     fBeginWordSet.add(0x0E81, 0x0EAE);      // basic consonants (including holes for corresponding Thai characters)
     fBeginWordSet.add(0x0EDC, 0x0EDD);      // digraph consonants (no Thai equivalent)
@@ -469,6 +474,7 @@
                                                 int32_t rangeStart,
                                                 int32_t rangeEnd,
                                                 UVector32 &foundBreaks,
+                                                UBool /* isPhraseBreaking */,
                                                 UErrorCode& status) const {
     if (U_FAILURE(status)) return 0;
     if ((rangeEnd - rangeStart) < LAO_MIN_WORD_SPAN) {
@@ -637,14 +643,13 @@
 {
     UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
     UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Mymr");
-    fBurmeseWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Mymr:]&[:LineBreak=SA:]]"), status);
+    fBeginWordSet.add(0x1000, 0x102A);      // basic consonants and independent vowels
+    fEndWordSet.applyPattern(UnicodeString(u"[[:Mymr:]&[:LineBreak=SA:]]"), status);
+    fMarkSet.applyPattern(UnicodeString(u"[[:Mymr:]&[:LineBreak=SA:]&[:M:]]"), status);
+    fMarkSet.add(0x0020);
     if (U_SUCCESS(status)) {
-        setCharacters(fBurmeseWordSet);
+        setCharacters(fEndWordSet);
     }
-    fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Mymr:]&[:LineBreak=SA:]&[:M:]]"), status);
-    fMarkSet.add(0x0020);
-    fEndWordSet = fBurmeseWordSet;
-    fBeginWordSet.add(0x1000, 0x102A);      // basic consonants and independent vowels
 
     // Compact for caching.
     fMarkSet.compact();
@@ -662,6 +667,7 @@
                                                 int32_t rangeStart,
                                                 int32_t rangeEnd,
                                                 UVector32 &foundBreaks,
+                                                UBool /* isPhraseBreaking */,
                                                 UErrorCode& status ) const {
     if (U_FAILURE(status)) return 0;
     if ((rangeEnd - rangeStart) < BURMESE_MIN_WORD_SPAN) {
@@ -830,13 +836,13 @@
 {
     UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
     UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Khmr");
-    fKhmerWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Khmr:]&[:LineBreak=SA:]]"), status);
+    UnicodeSet khmerWordSet(UnicodeString(u"[[:Khmr:]&[:LineBreak=SA:]]"), status);
     if (U_SUCCESS(status)) {
-        setCharacters(fKhmerWordSet);
+        setCharacters(khmerWordSet);
     }
-    fMarkSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Khmr:]&[:LineBreak=SA:]&[:M:]]"), status);
+    fMarkSet.applyPattern(UnicodeString(u"[[:Khmr:]&[:LineBreak=SA:]&[:M:]]"), status);
     fMarkSet.add(0x0020);
-    fEndWordSet = fKhmerWordSet;
+    fEndWordSet = khmerWordSet;
     fBeginWordSet.add(0x1780, 0x17B3);
     //fBeginWordSet.add(0x17A3, 0x17A4);      // deprecated vowels
     //fEndWordSet.remove(0x17A5, 0x17A9);     // Khmer independent vowels that can't end a word
@@ -867,6 +873,7 @@
                                                 int32_t rangeStart,
                                                 int32_t rangeEnd,
                                                 UVector32 &foundBreaks,
+                                                UBool /* isPhraseBreaking */,
                                                 UErrorCode& status ) const {
     if (U_FAILURE(status)) return 0;
     if ((rangeEnd - rangeStart) < KHMER_MIN_WORD_SPAN) {
@@ -1050,25 +1057,27 @@
 : DictionaryBreakEngine(), fDictionary(adoptDictionary) {
     UTRACE_ENTRY(UTRACE_UBRK_CREATE_BREAK_ENGINE);
     UTRACE_DATA1(UTRACE_INFO, "dictbe=%s", "Hani");
+    nfkcNorm2 = Normalizer2::getNFKCInstance(status);
     // Korean dictionary only includes Hangul syllables
-    fHangulWordSet.applyPattern(UNICODE_STRING_SIMPLE("[\\uac00-\\ud7a3]"), status);
-    fHanWordSet.applyPattern(UNICODE_STRING_SIMPLE("[:Han:]"), status);
-    fKatakanaWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Katakana:]\\uff9e\\uff9f]"), status);
-    fHiraganaWordSet.applyPattern(UNICODE_STRING_SIMPLE("[:Hiragana:]"), status);
-    nfkcNorm2 = Normalizer2::getNFKCInstance(status);
+    fHangulWordSet.applyPattern(UnicodeString(u"[\\uac00-\\ud7a3]"), status);
+    fHangulWordSet.compact();
+    // Digits, open puncutation and Alphabetic characters.
+    fDigitOrOpenPunctuationOrAlphabetSet.applyPattern(
+        UnicodeString(u"[[:Nd:][:Pi:][:Ps:][:Alphabetic:]]"), status);
+    fDigitOrOpenPunctuationOrAlphabetSet.compact();
+    fClosePunctuationSet.applyPattern(UnicodeString(u"[[:Pc:][:Pd:][:Pe:][:Pf:][:Po:]]"), status);
+    fClosePunctuationSet.compact();
 
-    if (U_SUCCESS(status)) {
-        // handle Korean and Japanese/Chinese using different dictionaries
-        if (type == kKorean) {
+    // handle Korean and Japanese/Chinese using different dictionaries
+    if (type == kKorean) {
+        if (U_SUCCESS(status)) {
             setCharacters(fHangulWordSet);
-        } else { //Chinese and Japanese
-            UnicodeSet cjSet;
-            cjSet.addAll(fHanWordSet);
-            cjSet.addAll(fKatakanaWordSet);
-            cjSet.addAll(fHiraganaWordSet);
-            cjSet.add(0xFF70); // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
-            cjSet.add(0x30FC); // KATAKANA-HIRAGANA PROLONGED SOUND MARK
+        }
+    } else { //Chinese and Japanese
+        UnicodeSet cjSet(UnicodeString(u"[[:Han:][:Hiragana:][:Katakana:]\\u30fc\\uff70\\uff9e\\uff9f]"), status);
+        if (U_SUCCESS(status)) {
             setCharacters(cjSet);
+            initJapanesePhraseParameter(status);
         }
     }
     UTRACE_EXIT_STATUS(status);
@@ -1096,7 +1105,6 @@
             (value >= 0xFF66 && value <= 0xFF9f);
 }
 
-
 // Function for accessing internal utext flags.
 //   Replicates an internal UText function.
 
@@ -1103,7 +1111,6 @@
 static inline int32_t utext_i32_flag(int32_t bitIndex) {
     return (int32_t)1 << bitIndex;
 }
-
        
 /*
  * @param text A UText representing the text
@@ -1117,6 +1124,7 @@
         int32_t rangeStart,
         int32_t rangeEnd,
         UVector32 &foundBreaks,
+        UBool isPhraseBreaking,
         UErrorCode& status) const {
     if (U_FAILURE(status)) return 0;
     if (rangeStart >= rangeEnd) {
@@ -1347,6 +1355,31 @@
     if ((uint32_t)bestSnlp.elementAti(numCodePts) == kuint32max) {
         t_boundary.addElement(numCodePts, status);
         numBreaks++;
+    } else if (isPhraseBreaking) {
+        t_boundary.addElement(numCodePts, status);
+        if(U_SUCCESS(status)) {
+            numBreaks++;
+            int32_t prevIdx = numCodePts;
+
+            int32_t codeUnitIdx = -1;
+            int32_t prevCodeUnitIdx = -1;
+            int32_t length = -1;
+            for (int32_t i = prev.elementAti(numCodePts); i > 0; i = prev.elementAti(i)) {
+                codeUnitIdx = inString.moveIndex32(0, i);
+                prevCodeUnitIdx = inString.moveIndex32(0, prevIdx);
+                // Calculate the length by using the code unit.
+                length = prevCodeUnitIdx - codeUnitIdx;
+                prevIdx = i;
+                // Keep the breakpoint if the pattern is not in the fSkipSet and continuous Katakana
+                // characters don't occur.
+                if (!fSkipSet.containsKey(inString.tempSubString(codeUnitIdx, length))
+                    && (!isKatakana(inString.char32At(inString.moveIndex32(codeUnitIdx, -1)))
+                           || !isKatakana(inString.char32At(codeUnitIdx)))) {
+                    t_boundary.addElement(i, status);
+                    numBreaks++;
+                }
+            }
+        }
     } else {
         for (int32_t i = numCodePts; i > 0; i = prev.elementAti(i)) {
             t_boundary.addElement(i, status);
@@ -1367,7 +1400,8 @@
     // while reversing t_boundary and pushing values to foundBreaks.
     int32_t prevCPPos = -1;
     int32_t prevUTextPos = -1;
-    for (int32_t i = numBreaks-1; i >= 0; i--) {
+    int32_t correctedNumBreaks = 0;
+    for (int32_t i = numBreaks - 1; i >= 0; i--) {
         int32_t cpPos = t_boundary.elementAti(i);
         U_ASSERT(cpPos > prevCPPos);
         int32_t utextPos =  inputMap.isValid() ? inputMap->elementAti(cpPos) : cpPos + rangeStart;
@@ -1375,7 +1409,15 @@
         if (utextPos > prevUTextPos) {
             // Boundaries are added to foundBreaks output in ascending order.
             U_ASSERT(foundBreaks.size() == 0 || foundBreaks.peeki() < utextPos);
-            foundBreaks.push(utextPos, status);
+            // In phrase breaking, there has to be a breakpoint between Cj character and close
+            // punctuation.
+            // E.g.[携帯電話]正しい選択 -> [携帯▁電話]▁正しい▁選択 -> breakpoint between ] and 正
+            if (utextPos != rangeStart
+                || (isPhraseBreaking && utextPos > 0
+                       && fClosePunctuationSet.contains(utext_char32At(inText, utextPos - 1)))) {
+                foundBreaks.push(utextPos, status);
+                correctedNumBreaks++;
+            }
         } else {
             // Normalization expanded the input text, the dictionary found a boundary
             // within the expansion, giving two boundaries with the same index in the
@@ -1387,10 +1429,53 @@
     }
     (void)prevCPPos; // suppress compiler warnings about unused variable
 
+    UChar32 nextChar = utext_char32At(inText, rangeEnd);
+    if (!foundBreaks.isEmpty() && foundBreaks.peeki() == rangeEnd) {
+        // In phrase breaking, there has to be a breakpoint between Cj character and
+        // the number/open punctuation.
+        // E.g. る文字「そうだ、京都」->る▁文字▁「そうだ、▁京都」-> breakpoint between 字 and「
+        // E.g. 乗車率90%程度だろうか -> 乗車▁率▁90%▁程度だろうか -> breakpoint between 率 and 9
+        // E.g. しかもロゴがUnicode! -> しかも▁ロゴが▁Unicode!-> breakpoint between が and U
+        if (isPhraseBreaking) {
+            if (!fDigitOrOpenPunctuationOrAlphabetSet.contains(nextChar)) {
+                foundBreaks.popi();
+                correctedNumBreaks--;
+            }
+        } else {
+            foundBreaks.popi();
+            correctedNumBreaks--;
+        }
+    }
+
     // inString goes out of scope
     // inputMap goes out of scope
-    return numBreaks;
+    return correctedNumBreaks;
 }
+
+void CjkBreakEngine::initJapanesePhraseParameter(UErrorCode& error) {
+    loadJapaneseExtensions(error);
+    loadHiragana(error);
+}
+
+void CjkBreakEngine::loadJapaneseExtensions(UErrorCode& error) {
+    const char* tag = "extensions";
+    ResourceBundle ja(U_ICUDATA_BRKITR, "ja", error);
+    if (U_SUCCESS(error)) {
+        ResourceBundle bundle = ja.get(tag, error);
+        while (U_SUCCESS(error) && bundle.hasNext()) {
+            fSkipSet.puti(bundle.getNextString(error), 1, error);
+        }
+    }
+}
+
+void CjkBreakEngine::loadHiragana(UErrorCode& error) {
+    UnicodeSet hiraganaWordSet(UnicodeString(u"[:Hiragana:]"), error);
+    hiraganaWordSet.compact();
+    UnicodeSetIterator iterator(hiraganaWordSet);
+    while (iterator.next()) {
+        fSkipSet.puti(UnicodeString(iterator.getCodepoint()), 1, error);
+    }
+}
 #endif
 
 U_NAMESPACE_END

Modified: trunk/Build/source/libs/icu/icu-src/source/common/dictbe.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/dictbe.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/dictbe.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -15,6 +15,7 @@
 #include "unicode/utext.h"
 
 #include "brkeng.h"
+#include "hash.h"
 #include "uvectr32.h"
 
 U_NAMESPACE_BEGIN
@@ -80,6 +81,7 @@
                               int32_t startPos,
                               int32_t endPos,
                               UVector32 &foundBreaks,
+                              UBool isPhraseBreaking,
                               UErrorCode& status ) const override;
 
  protected:
@@ -105,6 +107,7 @@
                                            int32_t rangeStart,
                                            int32_t rangeEnd,
                                            UVector32 &foundBreaks,
+                                           UBool isPhraseBreaking,
                                            UErrorCode& status) const = 0;
 
 };
@@ -127,7 +130,6 @@
      * @internal
      */
 
-  UnicodeSet                fThaiWordSet;
   UnicodeSet                fEndWordSet;
   UnicodeSet                fBeginWordSet;
   UnicodeSet                fSuffixSet;
@@ -164,6 +166,7 @@
                                            int32_t rangeStart,
                                            int32_t rangeEnd,
                                            UVector32 &foundBreaks,
+                                           UBool isPhraseBreaking,
                                            UErrorCode& status) const override;
 
 };
@@ -186,7 +189,6 @@
      * @internal
      */
 
-  UnicodeSet                fLaoWordSet;
   UnicodeSet                fEndWordSet;
   UnicodeSet                fBeginWordSet;
   UnicodeSet                fMarkSet;
@@ -222,6 +224,7 @@
                                            int32_t rangeStart,
                                            int32_t rangeEnd,
                                            UVector32 &foundBreaks,
+                                           UBool isPhraseBreaking,
                                            UErrorCode& status) const override;
 
 };
@@ -244,7 +247,6 @@
      * @internal
      */
 
-  UnicodeSet                fBurmeseWordSet;
   UnicodeSet                fEndWordSet;
   UnicodeSet                fBeginWordSet;
   UnicodeSet                fMarkSet;
@@ -280,6 +282,7 @@
                                            int32_t rangeStart,
                                            int32_t rangeEnd,
                                            UVector32 &foundBreaks,
+                                           UBool isPhraseBreaking,
                                            UErrorCode& status) const override;
 
 };
@@ -302,7 +305,6 @@
      * @internal
      */
 
-  UnicodeSet                fKhmerWordSet;
   UnicodeSet                fEndWordSet;
   UnicodeSet                fBeginWordSet;
   UnicodeSet                fMarkSet;
@@ -338,6 +340,7 @@
                                            int32_t rangeStart,
                                            int32_t rangeEnd,
                                            UVector32 &foundBreaks,
+                                           UBool isPhraseBreaking,
                                            UErrorCode& status) const override;
 
 };
@@ -366,13 +369,22 @@
      * @internal
      */
   UnicodeSet                fHangulWordSet;
-  UnicodeSet                fHanWordSet;
-  UnicodeSet                fKatakanaWordSet;
-  UnicodeSet                fHiraganaWordSet;
+  UnicodeSet                fDigitOrOpenPunctuationOrAlphabetSet;
+  UnicodeSet                fClosePunctuationSet;
 
   DictionaryMatcher        *fDictionary;
   const Normalizer2        *nfkcNorm2;
 
+ private:
+  // Load Japanese extensions.
+  void loadJapaneseExtensions(UErrorCode& error);
+  // Load Japanese Hiragana.
+  void loadHiragana(UErrorCode& error);
+  // Initialize fSkipSet by loading Japanese Hiragana and extensions.
+  void initJapanesePhraseParameter(UErrorCode& error);
+
+  Hashtable fSkipSet;
+
  public:
 
     /**
@@ -404,6 +416,7 @@
           int32_t rangeStart,
           int32_t rangeEnd,
           UVector32 &foundBreaks,
+          UBool isPhraseBreaking,
           UErrorCode& status) const override;
 
 };

Modified: trunk/Build/source/libs/icu/icu-src/source/common/localematcher.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/localematcher.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/localematcher.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -168,12 +168,9 @@
 bool LocaleMatcher::Builder::ensureSupportedLocaleVector() {
     if (U_FAILURE(errorCode_)) { return false; }
     if (supportedLocales_ != nullptr) { return true; }
-    supportedLocales_ = new UVector(uprv_deleteUObject, nullptr, errorCode_);
+    LocalPointer<UVector> lpSupportedLocales(new UVector(uprv_deleteUObject, nullptr, errorCode_), errorCode_);
     if (U_FAILURE(errorCode_)) { return false; }
-    if (supportedLocales_ == nullptr) {
-        errorCode_ = U_MEMORY_ALLOCATION_ERROR;
-        return false;
-    }
+    supportedLocales_ = lpSupportedLocales.orphan();
     return true;
 }
 
@@ -187,9 +184,8 @@
     for (int32_t i = 0; i < length; ++i) {
         Locale *locale = list.orphanLocaleAt(i);
         if (locale == nullptr) { continue; }
-        supportedLocales_->addElementX(locale, errorCode_);
+        supportedLocales_->adoptElement(locale, errorCode_);
         if (U_FAILURE(errorCode_)) {
-            delete locale;
             break;
         }
     }
@@ -197,36 +193,22 @@
 }
 
 LocaleMatcher::Builder &LocaleMatcher::Builder::setSupportedLocales(Locale::Iterator &locales) {
-    if (U_FAILURE(errorCode_)) { return *this; }
-    clearSupportedLocales();
-    if (!ensureSupportedLocaleVector()) { return *this; }
-    while (locales.hasNext()) {
-        const Locale &locale = locales.next();
-        Locale *clone = locale.clone();
-        if (clone == nullptr) {
-            errorCode_ = U_MEMORY_ALLOCATION_ERROR;
-            break;
+    if (ensureSupportedLocaleVector()) {
+        clearSupportedLocales();
+        while (locales.hasNext() && U_SUCCESS(errorCode_)) {
+            const Locale &locale = locales.next();
+            LocalPointer<Locale> clone (locale.clone(), errorCode_);
+            supportedLocales_->adoptElement(clone.orphan(), errorCode_);
         }
-        supportedLocales_->addElementX(clone, errorCode_);
-        if (U_FAILURE(errorCode_)) {
-            delete clone;
-            break;
-        }
     }
     return *this;
 }
 
 LocaleMatcher::Builder &LocaleMatcher::Builder::addSupportedLocale(const Locale &locale) {
-    if (!ensureSupportedLocaleVector()) { return *this; }
-    Locale *clone = locale.clone();
-    if (clone == nullptr) {
-        errorCode_ = U_MEMORY_ALLOCATION_ERROR;
-        return *this;
+    if (ensureSupportedLocaleVector()) {
+        LocalPointer<Locale> clone(locale.clone(), errorCode_);
+        supportedLocales_->adoptElement(clone.orphan(), errorCode_);
     }
-    supportedLocales_->addElementX(clone, errorCode_);
-    if (U_FAILURE(errorCode_)) {
-        delete clone;
-    }
     return *this;
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/common/locid.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/locid.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/locid.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1204,14 +1204,11 @@
     // We have multiple field so we have to allocate and parse
     CharString* str = new CharString(
         replacement, (int32_t)uprv_strlen(replacement), status);
+    LocalPointer<CharString> lpStr(str, status);
+    toBeFreed.adoptElement(lpStr.orphan(), status);
     if (U_FAILURE(status)) {
         return;
     }
-    if (str == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return;
-    }
-    toBeFreed.addElementX(str, status);
     char* data = str->data();
     replacedLanguage = (const char*) data;
     char* endOfField = uprv_strchr(data, '_');
@@ -1420,12 +1417,9 @@
                                (int32_t)(firstSpace - replacement), status), status);
         }
         if (U_FAILURE(status)) { return false; }
-        if (item.isNull()) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return false;
-        }
         replacedRegion = item->data();
-        toBeFreed.addElementX(item.orphan(), status);
+        toBeFreed.adoptElement(item.orphan(), status);
+        if (U_FAILURE(status)) { return false; }
     }
     U_ASSERT(!same(region, replacedRegion));
     region = replacedRegion;
@@ -1659,10 +1653,10 @@
         while ((end = uprv_strchr(start, SEP_CHAR)) != nullptr &&
                U_SUCCESS(status)) {
             *end = NULL_CHAR;  // null terminate inside variantsBuff
-            variants.addElementX(start, status);
+            variants.addElement(start, status);
             start = end + 1;
         }
-        variants.addElementX(start, status);
+        variants.addElement(start, status);
     }
     if (U_FAILURE(status)) { return false; }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,8 +1,8 @@
 // © 2021 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 
+#include <complex>
 #include <utility>
-#include <ctgmath>
 
 #include "unicode/utypes.h"
 
@@ -639,6 +639,7 @@
                                                 int32_t startPos,
                                                 int32_t endPos,
                                                 UVector32 &foundBreaks,
+                                                UBool /* isPhraseBreaking */,
                                                 UErrorCode& status) const {
     if (U_FAILURE(status)) return 0;
     int32_t beginFoundBreakSize = foundBreaks.size();

Modified: trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/lstmbe.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -62,6 +62,7 @@
                                              int32_t rangeStart,
                                              int32_t rangeEnd,
                                              UVector32 &foundBreaks,
+                                             UBool isPhraseBreaking,
                                              UErrorCode& status) const override;
 private:
     const LSTMData* fData;

Modified: trunk/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/normalizer2impl.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2496,15 +2496,18 @@
         // origin is not the first character, or it is U+0000.
         UnicodeSet *set;
         if((canonValue&CANON_HAS_SET)==0) {
-            set=new UnicodeSet;
-            if(set==NULL) {
-                errorCode=U_MEMORY_ALLOCATION_ERROR;
+            LocalPointer<UnicodeSet> lpSet(new UnicodeSet, errorCode);
+            set=lpSet.getAlias();
+            if(U_FAILURE(errorCode)) {
                 return;
             }
             UChar32 firstOrigin=(UChar32)(canonValue&CANON_VALUE_MASK);
             canonValue=(canonValue&~CANON_VALUE_MASK)|CANON_HAS_SET|(uint32_t)canonStartSets.size();
             umutablecptrie_set(mutableTrie, decompLead, canonValue, &errorCode);
-            canonStartSets.addElementX(set, errorCode);
+            canonStartSets.adoptElement(lpSet.orphan(), errorCode);
+            if (U_FAILURE(errorCode)) {
+                return;
+            }
             if(firstOrigin!=0) {
                 set->add(firstOrigin);
             }

Modified: trunk/Build/source/libs/icu/icu-src/source/common/rbbi.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/rbbi.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/rbbi.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -82,7 +82,20 @@
     }
 }
 
+//-------------------------------------------------------------------------------
 //
+//   Constructor   from a UDataMemory handle to precompiled break rules
+//                 stored in an ICU data file. This construcotr is private API,
+//                 only for internal use.
+//
+//-------------------------------------------------------------------------------
+RuleBasedBreakIterator::RuleBasedBreakIterator(UDataMemory* udm, UBool isPhraseBreaking,
+        UErrorCode &status) : RuleBasedBreakIterator(udm, status)
+{
+    fIsPhraseBreaking = isPhraseBreaking;
+}
+
+//
 //  Construct from precompiled binary rules (tables).  This constructor is public API,
 //  taking the rules as a (const uint8_t *) to match the type produced by getBinaryRules().
 //
@@ -322,6 +335,7 @@
     fBreakCache           = nullptr;
     fDictionaryCache      = nullptr;
     fLookAheadMatches     = nullptr;
+    fIsPhraseBreaking     = false;
 
     // Note: IBM xlC is unable to assign or initialize member fText from UTEXT_INITIALIZER.
     // fText                 = UTEXT_INITIALIZER;

Modified: trunk/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/rbbi_cache.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -163,7 +163,7 @@
         // Ask the language object if there are any breaks. It will add them to the cache and
         // leave the text pointer on the other side of its range, ready to search for the next one.
         if (lbe != NULL) {
-            foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBreaks, status);
+            foundBreakCount += lbe->findBreaks(text, rangeStart, rangeEnd, fBreaks, fBI->fIsPhraseBreaking, status);
         }
 
         // Reload the loop variables for the next go-round

Modified: trunk/Build/source/libs/icu/icu-src/source/common/serv.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/serv.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/serv.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -625,10 +625,7 @@
                     }
                 }
 
-                LocalPointer<UnicodeString> idClone(new UnicodeString(*id), status);
-                if (U_SUCCESS(status) && idClone->isBogus()) {
-                    status = U_MEMORY_ALLOCATION_ERROR;
-                }
+                LocalPointer<UnicodeString> idClone(id->clone(), status);
                 result.adoptElement(idClone.orphan(), status);
             }
             delete fallbackKey;

Modified: trunk/Build/source/libs/icu/icu-src/source/common/servls.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/servls.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/servls.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -179,7 +179,8 @@
 
             length = other._ids.size();
             for(i = 0; i < length; ++i) {
-                _ids.addElementX(((UnicodeString *)other._ids.elementAt(i))->clone(), status);
+                LocalPointer<UnicodeString> clonedId(((UnicodeString *)other._ids.elementAt(i))->clone(), status);
+                _ids.adoptElement(clonedId.orphan(), status);
             }
 
             if(U_SUCCESS(status)) {

Modified: trunk/Build/source/libs/icu/icu-src/source/common/servnotf.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/servnotf.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/servnotf.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -49,7 +49,11 @@
         if (acceptsListener(*l)) {
             Mutex lmx(&notifyLock);
             if (listeners == NULL) {
-                listeners = new UVector(5, status);
+                LocalPointer<UVector> lpListeners(new UVector(5, status), status);
+                if (U_FAILURE(status)) {
+                    return;
+                }
+                listeners = lpListeners.orphan();
             } else {
                 for (int i = 0, e = listeners->size(); i < e; ++i) {
                     const EventListener* el = (const EventListener*)(listeners->elementAt(i));
@@ -59,7 +63,7 @@
                 }
             }
 
-            listeners->addElementX((void*)l, status); // cast away const
+            listeners->addElement((void*)l, status); // cast away const
         }
 #ifdef NOTIFIER_DEBUG
         else {
@@ -102,13 +106,11 @@
 void 
 ICUNotifier::notifyChanged(void) 
 {
+    Mutex lmx(&notifyLock);
     if (listeners != NULL) {
-        Mutex lmx(&notifyLock);
-        if (listeners != NULL) {
-            for (int i = 0, e = listeners->size(); i < e; ++i) {
-                EventListener* el = (EventListener*)listeners->elementAt(i);
-                notifyListener(*el);
-            }
+        for (int i = 0, e = listeners->size(); i < e; ++i) {
+            EventListener* el = (EventListener*)listeners->elementAt(i);
+            notifyListener(*el);
         }
     }
 }

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ubrk.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ubrk.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ubrk.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -168,7 +168,7 @@
     BreakIterator *newBI = ((BreakIterator *)bi)->clone();
     if (newBI == NULL) {
         *status = U_MEMORY_ALLOCATION_ERROR;
-    } else {
+    } else if (pBufferSize != NULL) {
         *status = U_SAFECLONE_ALLOCATED_WARNING;
     }
     return (UBreakIterator *)newBI;
@@ -176,15 +176,7 @@
 
 U_CAPI UBreakIterator * U_EXPORT2
 ubrk_clone(const UBreakIterator *bi, UErrorCode *status) {
-    if (U_FAILURE(*status)) {
-        return nullptr;
-    }
-    BreakIterator *newBI = ((BreakIterator *)bi)->clone();
-    if (newBI == nullptr) {
-        *status = U_MEMORY_ALLOCATION_ERROR;
-        return nullptr;
-    }
-    return (UBreakIterator *)newBI;
+    return ubrk_safeClone(bi, nullptr, nullptr, status);
 }
 
 

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ucase.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ucase.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ucase.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -22,27 +22,14 @@
 #include "unicode/utypes.h"
 #include "unicode/unistr.h"
 #include "unicode/uset.h"
-#include "unicode/udata.h" /* UDataInfo */
 #include "unicode/utf16.h"
-#include "ucmndata.h" /* DataHeader */
-#include "udatamem.h"
+#include "cmemory.h"
+#include "uassert.h"
+#include "ucase.h"
 #include "umutex.h"
-#include "uassert.h"
-#include "cmemory.h"
 #include "utrie2.h"
-#include "ucase.h"
 
-struct UCaseProps {
-    UDataMemory *mem;
-    const int32_t *indexes;
-    const uint16_t *exceptions;
-    const uint16_t *unfold;
-
-    UTrie2 trie;
-    uint8_t formatVersion[4];
-};
-
-/* ucase_props_data.h is machine-generated by gencase --csource */
+/* ucase_props_data.h is machine-generated by genprops/casepropsbuilder.cpp */
 #define INCLUDED_FROM_UCASE_CPP
 #include "ucase_props_data.h"
 
@@ -77,6 +64,13 @@
 
 /* data access primitives --------------------------------------------------- */
 
+U_CAPI const struct UCaseProps * U_EXPORT2
+ucase_getSingleton(int32_t *pExceptionsLength, int32_t *pUnfoldLength) {
+    *pExceptionsLength = UPRV_LENGTHOF(ucase_props_exceptions);
+    *pUnfoldLength = UPRV_LENGTHOF(ucase_props_unfold);
+    return &ucase_props_singleton;
+}
+
 U_CFUNC const UTrie2 * U_EXPORT2
 ucase_getTrie() {
     return &ucase_props_singleton.trie;
@@ -690,7 +684,7 @@
  *   - The general category of C is
  *     Nonspacing Mark (Mn), or Enclosing Mark (Me), or Format Control (Cf), or
  *     Letter Modifier (Lm), or Symbol Modifier (Sk)
- *   - C is one of the following characters 
+ *   - C is one of the following characters
  *     U+0027 APOSTROPHE
  *     U+00AD SOFT HYPHEN (SHY)
  *     U+2019 RIGHT SINGLE QUOTATION MARK
@@ -1064,6 +1058,8 @@
     // The sign of the result has meaning, input must be non-negative so that it can be returned as is.
     U_ASSERT(c >= 0);
     UChar32 result=c;
+    // Reset the output pointer in case it was uninitialized.
+    *pString=nullptr;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
     if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_IS_UPPER_OR_TITLE(props)) {
@@ -1148,7 +1144,6 @@
                     0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE
                     0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE
                  */
-                *pString=nullptr;
                 return 0; /* remove the dot (continue without output) */
             } else if(loc==UCASE_LOC_TURKISH && c==0x49 && !isFollowedByDotAbove(iter, context)) {
                 /*
@@ -1215,6 +1210,8 @@
     // The sign of the result has meaning, input must be non-negative so that it can be returned as is.
     U_ASSERT(c >= 0);
     UChar32 result=c;
+    // Reset the output pointer in case it was uninitialized.
+    *pString=nullptr;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
     if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_GET_TYPE(props)==UCASE_LOWER) {
@@ -1252,7 +1249,6 @@
 
                     0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE
                  */
-                *pString=nullptr;
                 return 0; /* remove the dot (continue without output) */
             } else if(c==0x0587) {
                 // See ICU-13416:
@@ -1449,6 +1445,8 @@
     // The sign of the result has meaning, input must be non-negative so that it can be returned as is.
     U_ASSERT(c >= 0);
     UChar32 result=c;
+    // Reset the output pointer in case it was uninitialized.
+    *pString=nullptr;
     uint16_t props=UTRIE2_GET16(&ucase_props_singleton.trie, c);
     if(!UCASE_HAS_EXCEPTION(props)) {
         if(UCASE_IS_UPPER_OR_TITLE(props)) {
@@ -1542,7 +1540,7 @@
 u_tolower(UChar32 c) {
     return ucase_tolower(c);
 }
-    
+
 /* Transforms the Unicode character to its upper case equivalent.*/
 U_CAPI UChar32 U_EXPORT2
 u_toupper(UChar32 c) {

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ucase.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ucase.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ucase.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -312,6 +312,21 @@
 
 U_CDECL_END
 
+/* for icuexportdata -------------------------------------------------------- */
+
+struct UCaseProps {
+    void *mem;  // TODO: was unused, and type UDataMemory -- remove
+    const int32_t *indexes;
+    const uint16_t *exceptions;
+    const uint16_t *unfold;
+
+    UTrie2 trie;
+    uint8_t formatVersion[4];
+};
+
+U_CAPI const struct UCaseProps * U_EXPORT2
+ucase_getSingleton(int32_t *pExceptionsLength, int32_t *pUnfoldLength);
+
 /* file definitions --------------------------------------------------------- */
 
 #define UCASE_DATA_NAME "ucase"

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ucasemap.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -112,8 +112,7 @@
     if(length==sizeof(csm->locale)) {
         *pErrorCode=U_BUFFER_OVERFLOW_ERROR;
     }
-    if(U_SUCCESS(*pErrorCode)) {
-        csm->caseLocale=UCASE_LOC_UNKNOWN;
+    if(U_SUCCESS(*pErrorCode)) {     
         csm->caseLocale = ucase_getCaseLocale(csm->locale);
     } else {
         csm->locale[0]=0;
@@ -420,6 +419,97 @@
 
 #if !UCONFIG_NO_BREAK_ITERATION
 
+namespace {
+
+constexpr uint8_t ACUTE_BYTE0 = u8"\u0301"[0];
+
+constexpr uint8_t ACUTE_BYTE1 = u8"\u0301"[1];
+
+/**
+ * Input: c is a letter I with or without acute accent.
+ * start is the index in src after c, and is less than segmentLimit.
+ * If a plain i/I is followed by a plain j/J,
+ * or an i/I with acute (precomposed or decomposed) is followed by a j/J with acute,
+ * then we output accordingly.
+ *
+ * @return the src index after the titlecased sequence, or the start index if no Dutch IJ
+ */
+int32_t maybeTitleDutchIJ(const uint8_t *src, UChar32 c, int32_t start, int32_t segmentLimit,
+                          ByteSink &sink, uint32_t options, icu::Edits *edits, UErrorCode &errorCode) {
+    U_ASSERT(start < segmentLimit);
+
+    int32_t index = start;
+    bool withAcute = false;
+
+    // If the conditions are met, then the following variables tell us what to output.
+    int32_t unchanged1 = 0;  // code units before the j, or the whole sequence (0..3)
+    bool doTitleJ = false;  // true if the j needs to be titlecased
+    int32_t unchanged2 = 0;  // after the j (0 or 1)
+
+    // next character after the first letter
+    UChar32 c2;
+    c2 = src[index++];
+
+    // Is the first letter an i/I with accent?
+    if (c == u'I') {
+        if (c2 == ACUTE_BYTE0 && index < segmentLimit && src[index++] == ACUTE_BYTE1) {
+            withAcute = true;
+            unchanged1 = 2;  // ACUTE is 2 code units in UTF-8
+            if (index == segmentLimit) { return start; }
+            c2 = src[index++];
+        }
+    } else {  // Í
+        withAcute = true;
+    }
+
+    // Is the next character a j/J?
+    if (c2 == u'j') {
+        doTitleJ = true;
+    } else if (c2 == u'J') {
+        ++unchanged1;
+    } else {
+        return start;
+    }
+
+    // A plain i/I must be followed by a plain j/J.
+    // An i/I with acute must be followed by a j/J with acute.
+    if (withAcute) {
+        if ((index + 1) >= segmentLimit || src[index++] != ACUTE_BYTE0 || src[index++] != ACUTE_BYTE1) {
+            return start;
+        }
+        if (doTitleJ) {
+            unchanged2 = 2;  // ACUTE is 2 code units in UTF-8
+        } else {
+            unchanged1 = unchanged1 + 2;    // ACUTE is 2 code units in UTF-8
+        }
+    }
+
+    // There must not be another combining mark.
+    if (index < segmentLimit) {
+        int32_t cp;
+        int32_t i = index;
+        U8_NEXT(src, i, segmentLimit, cp);
+        uint32_t typeMask = U_GET_GC_MASK(cp);
+        if ((typeMask & U_GC_M_MASK) != 0) {
+            return start;
+        }
+    }
+
+    // Output the rest of the Dutch IJ.
+    ByteSinkUtil::appendUnchanged(src + start, unchanged1, sink, options, edits, errorCode);
+    start += unchanged1;
+    if (doTitleJ) {
+        ByteSinkUtil::appendCodePoint(1, u'J', sink, edits);
+        ++start;
+    }
+    ByteSinkUtil::appendUnchanged(src + start, unchanged2, sink, options, edits, errorCode);
+
+    U_ASSERT(start + unchanged2 == index);
+    return index;
+}
+
+}  // namespace
+
 U_CFUNC void U_CALLCONV
 ucasemap_internalUTF8ToTitle(
         int32_t caseLocale, uint32_t options, BreakIterator *iter,
@@ -504,20 +594,15 @@
                 }
 
                 /* Special case Dutch IJ titlecasing */
-                if (titleStart+1 < index &&
-                        caseLocale == UCASE_LOC_DUTCH &&
-                        (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) {
-                    if (src[titleStart+1] == 0x006A) {
-                        ByteSinkUtil::appendCodePoint(1, 0x004A, sink, edits);
-                        titleLimit++;
-                    } else if (src[titleStart+1] == 0x004A) {
-                        // Keep the capital J from getting lowercased.
-                        if (!ByteSinkUtil::appendUnchanged(src+titleStart+1, 1,
-                                                           sink, options, edits, errorCode)) {
-                            return;
-                        }
-                        titleLimit++;
+                if (titleLimit < index &&
+                    caseLocale == UCASE_LOC_DUTCH) {
+                    if (c < 0) {
+                        c = ~c;
                     }
+
+                    if (c == u'I' || c == u'Í') {
+                        titleLimit = maybeTitleDutchIJ(src, c, titleLimit, index, sink, options, edits, errorCode);
+                    }
                 }
 
                 /* lowercase [titleLimit..index[ */

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ucnv.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ucnv.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ucnv.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -252,7 +252,10 @@
             UTRACE_EXIT_STATUS(*status);
             return NULL;
         }
-        *status = U_SAFECLONE_ALLOCATED_WARNING;
+        // If pBufferSize was NULL as the input, pBufferSize is set to &stackBufferSize in this function.
+        if (pBufferSize != &stackBufferSize) {
+            *status = U_SAFECLONE_ALLOCATED_WARNING;
+        }
 
         /* record the fact that memory was allocated */
         *pBufferSize = bufferSizeNeeded;
@@ -317,8 +320,12 @@
     return localConverter;
 }
 
+U_CAPI UConverter* U_EXPORT2
+ucnv_clone(const UConverter* cnv, UErrorCode *status)
+{
+    return ucnv_safeClone(cnv, nullptr, nullptr, status);
+}
 
-
 /*Decreases the reference counter in the shared immutable section of the object
  *and frees the mutable part*/
 

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ucurr.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ucurr.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ucurr.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -254,7 +254,7 @@
 }
 
 /**
- * Deleter for OlsonToMetaMappingEntry
+ * Deleter for IsoCodeEntry
  */
 static void U_CALLCONV
 deleteIsoCodeEntry(void *obj) {

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uloc.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uloc.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uloc.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -186,10 +186,10 @@
 };
 
 static const char* const DEPRECATED_LANGUAGES[]={
-    "in", "iw", "ji", "jw", NULL, NULL
+    "in", "iw", "ji", "jw", "mo", NULL, NULL
 };
 static const char* const REPLACEMENT_LANGUAGES[]={
-    "id", "he", "yi", "jv", NULL, NULL
+    "id", "he", "yi", "jv", "ro", NULL, NULL
 };
 
 /**
@@ -444,7 +444,7 @@
 /*  "VA",  "VC",  "VE",  "VG",  "VI",  "VN",  "VU",  "WF",     */
     "VAT", "VCT", "VEN", "VGB", "VIR", "VNM", "VUT", "WLF",
 /*  "WS",  "XK",  "YE",  "YT",  "ZA",  "ZM",  "ZW",          */
-    "WSM", "XXK", "YEM", "MYT", "ZAF", "ZMB", "ZWE",
+    "WSM", "XKK", "YEM", "MYT", "ZAF", "ZMB", "ZWE",
 NULL,
 /*  "AN",  "BU",  "CS",  "FX",  "RO", "SU",  "TP",  "YD",  "YU",  "ZR" */
     "ANT", "BUR", "SCG", "FXX", "ROM", "SUN", "TMP", "YMD", "YUG", "ZAR",

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/localematcher.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -461,13 +461,13 @@
          * Option for whether to include or ignore one-way (fallback) match data.
          * By default, they are included.
          *
-         * @param direction the match direction to set.
+         * @param matchDirection the match direction to set.
          * @return this Builder object
          * @stable ICU 67
          */
-        Builder &setDirection(ULocMatchDirection direction) {
+        Builder &setDirection(ULocMatchDirection matchDirection) {
             if (U_SUCCESS(errorCode_)) {
-                direction_ = direction;
+                direction_ = matchDirection;
             }
             return *this;
         }

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/rbbi.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -147,6 +147,11 @@
      */
     int32_t *fLookAheadMatches;
 
+    /**
+     *  A flag to indicate if phrase based breaking is enabled.
+     */
+    UBool fIsPhraseBreaking;
+
     //=======================================================================
     // constructors
     //=======================================================================
@@ -163,6 +168,21 @@
      */
     RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status);
 
+    /**
+     * This constructor uses the udata interface to create a BreakIterator
+     * whose internal tables live in a memory-mapped file.  "image" is an
+     * ICU UDataMemory handle for the pre-compiled break iterator tables.
+     * @param image handle to the memory image for the break iterator data.
+     *        Ownership of the UDataMemory handle passes to the Break Iterator,
+     *        which will be responsible for closing it when it is no longer needed.
+     * @param status Information on any errors encountered.
+     * @param isPhraseBreaking true if phrase based breaking is required, otherwise false.
+     * @see udata_open
+     * @see #getBinaryRules
+     * @internal (private)
+     */
+    RuleBasedBreakIterator(UDataMemory* image, UBool isPhraseBreaking, UErrorCode &status);
+
     /** @internal */
     friend class RBBIRuleBuilder;
     /** @internal */

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/ubrk.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -312,11 +312,12 @@
  *  If *pBufferSize is not enough for a stack-based safe clone,
  *  new memory will be allocated.
  * @param status to indicate whether the operation went on smoothly or there were errors
- *  An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any allocations were necessary.
+ *  An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used
+ * if pBufferSize != NULL and any allocations were necessary
  * @return pointer to the new clone
  * @deprecated ICU 69 Use ubrk_clone() instead.
  */
-U_CAPI UBreakIterator * U_EXPORT2
+U_DEPRECATED UBreakIterator * U_EXPORT2
 ubrk_safeClone(
           const UBreakIterator *bi,
           void *stackBuffer,
@@ -325,21 +326,17 @@
 
 #endif /* U_HIDE_DEPRECATED_API */
 
-#ifndef U_HIDE_DRAFT_API
-
 /**
  * Thread safe cloning operation.
  * @param bi iterator to be cloned
  * @param status to indicate whether the operation went on smoothly or there were errors
  * @return pointer to the new clone
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI UBreakIterator * U_EXPORT2
 ubrk_clone(const UBreakIterator *bi,
            UErrorCode *status);
 
-#endif  // U_HIDE_DRAFT_API
-
 #ifndef U_HIDE_DEPRECATED_API
 
 /**

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/ucnv.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -477,7 +477,7 @@
  *
  * <p>The name will NOT be looked up in the alias mechanism, nor will the converter be
  * stored in the converter cache or the alias table. The only way to open further converters
- * is call this function multiple times, or use the ucnv_safeClone() function to clone a
+ * is call this function multiple times, or use the ucnv_clone() function to clone a
  * 'primary' converter.</p>
  *
  * <p>A future version of ICU may add alias table lookups and/or caching
@@ -493,7 +493,7 @@
  * @return the created Unicode converter object, or <TT>NULL</TT> if an error occurred
  * @see udata_open
  * @see ucnv_open
- * @see ucnv_safeClone
+ * @see ucnv_clone
  * @see ucnv_close
  * @stable ICU 2.2
  */
@@ -502,6 +502,20 @@
 
 /**
  * Thread safe converter cloning operation.
+ *
+ * You must ucnv_close() the clone.
+ *
+ * @param cnv converter to be cloned
+ * @param status to indicate whether the operation went on smoothly or there were errors
+ * @return pointer to the new clone
+ * @stable ICU 71
+ */
+U_CAPI UConverter* U_EXPORT2 ucnv_clone(const UConverter *cnv, UErrorCode *status);
+
+#ifndef U_HIDE_DEPRECATED_API
+
+/**
+ * Thread safe converter cloning operation.
  * For most efficient operation, pass in a stackBuffer (and a *pBufferSize)
  * with at least U_CNV_SAFECLONE_BUFFERSIZE bytes of space.
  * If the buffer size is sufficient, then the clone will use the stack buffer;
@@ -532,21 +546,19 @@
  *  pointer to size of allocated space.
  * @param status to indicate whether the operation went on smoothly or there were errors
  *  An informational status value, U_SAFECLONE_ALLOCATED_WARNING,
- *  is used if any allocations were necessary.
+ *  is used if pBufferSize != NULL and any allocations were necessary
  *  However, it is better to check if *pBufferSize grew for checking for
  *  allocations because warning codes can be overridden by subsequent
  *  function calls.
  * @return pointer to the new clone
- * @stable ICU 2.0
+ * @deprecated ICU 71 Use ucnv_clone() instead.
  */
-U_CAPI UConverter * U_EXPORT2
+U_DEPRECATED UConverter * U_EXPORT2
 ucnv_safeClone(const UConverter *cnv,
                void             *stackBuffer,
                int32_t          *pBufferSize,
                UErrorCode       *status);
 
-#ifndef U_HIDE_DEPRECATED_API
-
 /**
  * \def U_CNV_SAFECLONE_BUFFERSIZE
  * Definition of a buffer size that is designed to be large enough for

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/uniset.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1229,7 +1229,6 @@
      */
     UnicodeSet& retain(UChar32 c);
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Retains only the specified string from this set if it is present.
      * Upon return this set will be empty if it did not contain s, or
@@ -1238,10 +1237,9 @@
      *
      * @param s the source string
      * @return this object, for chaining
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UnicodeSet& retain(const UnicodeString &s);
-#endif  // U_HIDE_DRAFT_API
 
     /**
      * Removes the specified range from this set if it is present.

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/urename.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/urename.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/urename.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -567,6 +567,7 @@
 #define ucase_addStringCaseClosure U_ICU_ENTRY_POINT_RENAME(ucase_addStringCaseClosure)
 #define ucase_fold U_ICU_ENTRY_POINT_RENAME(ucase_fold)
 #define ucase_getCaseLocale U_ICU_ENTRY_POINT_RENAME(ucase_getCaseLocale)
+#define ucase_getSingleton U_ICU_ENTRY_POINT_RENAME(ucase_getSingleton)
 #define ucase_getTrie U_ICU_ENTRY_POINT_RENAME(ucase_getTrie)
 #define ucase_getType U_ICU_ENTRY_POINT_RENAME(ucase_getType)
 #define ucase_getTypeOrIgnorable U_ICU_ENTRY_POINT_RENAME(ucase_getTypeOrIgnorable)
@@ -630,6 +631,7 @@
 #define ucnv_cbFromUWriteUChars U_ICU_ENTRY_POINT_RENAME(ucnv_cbFromUWriteUChars)
 #define ucnv_cbToUWriteSub U_ICU_ENTRY_POINT_RENAME(ucnv_cbToUWriteSub)
 #define ucnv_cbToUWriteUChars U_ICU_ENTRY_POINT_RENAME(ucnv_cbToUWriteUChars)
+#define ucnv_clone U_ICU_ENTRY_POINT_RENAME(ucnv_clone)
 #define ucnv_close U_ICU_ENTRY_POINT_RENAME(ucnv_close)
 #define ucnv_compareNames U_ICU_ENTRY_POINT_RENAME(ucnv_compareNames)
 #define ucnv_convert U_ICU_ENTRY_POINT_RENAME(ucnv_convert)
@@ -725,6 +727,7 @@
 #define ucnvsel_selectForString U_ICU_ENTRY_POINT_RENAME(ucnvsel_selectForString)
 #define ucnvsel_selectForUTF8 U_ICU_ENTRY_POINT_RENAME(ucnvsel_selectForUTF8)
 #define ucnvsel_serialize U_ICU_ENTRY_POINT_RENAME(ucnvsel_serialize)
+#define ucol_clone U_ICU_ENTRY_POINT_RENAME(ucol_clone)
 #define ucol_cloneBinary U_ICU_ENTRY_POINT_RENAME(ucol_cloneBinary)
 #define ucol_close U_ICU_ENTRY_POINT_RENAME(ucol_close)
 #define ucol_closeElements U_ICU_ENTRY_POINT_RENAME(ucol_closeElements)
@@ -904,6 +907,7 @@
 #define udatpg_getBestPattern U_ICU_ENTRY_POINT_RENAME(udatpg_getBestPattern)
 #define udatpg_getBestPatternWithOptions U_ICU_ENTRY_POINT_RENAME(udatpg_getBestPatternWithOptions)
 #define udatpg_getDateTimeFormat U_ICU_ENTRY_POINT_RENAME(udatpg_getDateTimeFormat)
+#define udatpg_getDateTimeFormatForStyle U_ICU_ENTRY_POINT_RENAME(udatpg_getDateTimeFormatForStyle)
 #define udatpg_getDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_getDecimal)
 #define udatpg_getDefaultHourCycle U_ICU_ENTRY_POINT_RENAME(udatpg_getDefaultHourCycle)
 #define udatpg_getFieldDisplayName U_ICU_ENTRY_POINT_RENAME(udatpg_getFieldDisplayName)
@@ -918,6 +922,7 @@
 #define udatpg_setAppendItemFormat U_ICU_ENTRY_POINT_RENAME(udatpg_setAppendItemFormat)
 #define udatpg_setAppendItemName U_ICU_ENTRY_POINT_RENAME(udatpg_setAppendItemName)
 #define udatpg_setDateTimeFormat U_ICU_ENTRY_POINT_RENAME(udatpg_setDateTimeFormat)
+#define udatpg_setDateTimeFormatForStyle U_ICU_ENTRY_POINT_RENAME(udatpg_setDateTimeFormatForStyle)
 #define udatpg_setDecimal U_ICU_ENTRY_POINT_RENAME(udatpg_setDecimal)
 #define udict_swap U_ICU_ENTRY_POINT_RENAME(udict_swap)
 #define udtitvfmt_close U_ICU_ENTRY_POINT_RENAME(udtitvfmt_close)

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/uset.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/uset.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/uset.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -628,7 +628,6 @@
 U_CAPI void U_EXPORT2
 uset_removeString(USet* set, const UChar* str, int32_t strLen);
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Removes EACH of the characters in this string. Note: "ch" == {"c", "h"}
  * A frozen set will not be modified.
@@ -636,11 +635,10 @@
  * @param set the object to be modified
  * @param str the string
  * @param length the length of the string, or -1 if NUL-terminated
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_removeAllCodePoints(USet *set, const UChar *str, int32_t length);
-#endif  // U_HIDE_DRAFT_API
 
 /**
  * Removes from this set all of its elements that are contained in the
@@ -671,7 +669,6 @@
 U_CAPI void U_EXPORT2
 uset_retain(USet* set, UChar32 start, UChar32 end);
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Retains only the specified string from this set if it is present.
  * Upon return this set will be empty if it did not contain s, or
@@ -681,7 +678,7 @@
  * @param set the object to be modified
  * @param str the string
  * @param length the length of the string, or -1 if NUL-terminated
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_retainString(USet *set, const UChar *str, int32_t length);
@@ -693,11 +690,10 @@
  * @param set the object to be modified
  * @param str the string
  * @param length the length of the string, or -1 if NUL-terminated
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_retainAllCodePoints(USet *set, const UChar *str, int32_t length);
-#endif  // U_HIDE_DRAFT_API
 
 /**
  * Retains only the elements in this set that are contained in the
@@ -741,7 +737,6 @@
 U_CAPI void U_EXPORT2
 uset_complement(USet* set);
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Complements the specified range in this set.  Any character in
  * the range will be removed if it is in this set, or will be
@@ -753,7 +748,7 @@
  * @param set the object to be modified
  * @param start first character, inclusive, of range
  * @param end last character, inclusive, of range
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_complementRange(USet *set, UChar32 start, UChar32 end);
@@ -766,7 +761,7 @@
  * @param set the object to be modified
  * @param str the string
  * @param length the length of the string, or -1 if NUL-terminated
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_complementString(USet *set, const UChar *str, int32_t length);
@@ -778,11 +773,10 @@
  * @param set the object to be modified
  * @param str the string
  * @param length the length of the string, or -1 if NUL-terminated
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI void U_EXPORT2
 uset_complementAllCodePoints(USet *set, const UChar *str, int32_t length);
-#endif  // U_HIDE_DRAFT_API
 
 /**
  * Complements in this set all elements contained in the specified

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unicode/uvernum.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -60,7 +60,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION_MAJOR_NUM 70
+#define U_ICU_VERSION_MAJOR_NUM 71
 
 /** The current ICU minor version as an integer.
  *  This value will change in the subsequent releases of ICU
@@ -86,7 +86,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.6
  */
-#define U_ICU_VERSION_SUFFIX _70
+#define U_ICU_VERSION_SUFFIX _71
 
 /**
  * \def U_DEF2_ICU_ENTRY_POINT_RENAME
@@ -139,7 +139,7 @@
  *  This value will change in the subsequent releases of ICU
  *  @stable ICU 2.4
  */
-#define U_ICU_VERSION "70.1"
+#define U_ICU_VERSION "71.1"
 
 /**
  * The current ICU library major version number as a string, for library name suffixes.
@@ -152,13 +152,13 @@
  *
  * @stable ICU 2.6
  */
-#define U_ICU_VERSION_SHORT "70"
+#define U_ICU_VERSION_SHORT "71"
 
 #ifndef U_HIDE_INTERNAL_API
 /** Data version in ICU4C.
  * @internal ICU 4.4 Internal Use Only
  **/
-#define U_ICU_DATA_VERSION "70.1"
+#define U_ICU_DATA_VERSION "71.1"
 #endif  /* U_HIDE_INTERNAL_API */
 
 /*===========================================================================

Modified: trunk/Build/source/libs/icu/icu-src/source/common/unistr.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/unistr.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/unistr.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -334,7 +334,8 @@
 // UnicodeString overrides clone() with a real implementation
 UnicodeString *
 UnicodeString::clone() const {
-  return new UnicodeString(*this);
+  LocalPointer<UnicodeString> clonedString(new UnicodeString(*this));
+  return clonedString.isValid() && !clonedString->isBogus() ? clonedString.orphan() : nullptr;
 }
 
 //========================================
@@ -1976,7 +1977,12 @@
 but defining it here makes sure that it is included with this object file.
 This makes sure that static library dependencies are kept to a minimum.
 */
+#if defined(__clang__) || U_GCC_MAJOR_MINOR >= 1100
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-function"
 static void uprv_UnicodeStringDummy(void) {
     delete [] (new UnicodeString[2]);
 }
+#pragma GCC diagnostic pop
 #endif
+#endif

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uposixdefs.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uposixdefs.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uposixdefs.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,4 +1,4 @@
-// © 2016 and later: Unicode, Inc. and others
+// © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 /*
 *******************************************************************************
@@ -51,9 +51,6 @@
  * Make sure things like readlink and such functions work.
  * Poorly upgraded Solaris machines can't have this defined.
  * Cleanly installed Solaris can use this #define.
- * [Experience with TeX Live is that it always causes failure.
- *  http://tug.org/pipermail/tlbuild/2013q1/002493.html
- *  http://tug.org/pipermail/tlbuild/2013q1/002536.html ]
  *
  * z/OS needs this definition for timeval and to get usleep.
  */

Modified: trunk/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/ustrcase.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -36,6 +36,12 @@
 #include "ustr_imp.h"
 #include "uassert.h"
 
+/**
+ * Code point for COMBINING ACUTE ACCENT
+ * @internal
+ */
+#define ACUTE u'\u0301'
+
 U_NAMESPACE_BEGIN
 
 namespace {
@@ -396,6 +402,94 @@
 
 #if !UCONFIG_NO_BREAK_ITERATION
 
+namespace {
+
+/**
+ * Input: c is a letter I with or without acute accent.
+ * start is the index in src after c, and is less than segmentLimit.
+ * If a plain i/I is followed by a plain j/J,
+ * or an i/I with acute (precomposed or decomposed) is followed by a j/J with acute,
+ * then we output accordingly.
+ *
+ * @return the src index after the titlecased sequence, or the start index if no Dutch IJ
+ */
+int32_t maybeTitleDutchIJ(const UChar *src, UChar32 c, int32_t start, int32_t segmentLimit,
+                          UChar *dest, int32_t &destIndex, int32_t destCapacity, uint32_t options,
+                          icu::Edits *edits) {
+    U_ASSERT(start < segmentLimit);
+
+    int32_t index = start;
+    bool withAcute = false;
+
+    // If the conditions are met, then the following variables tell us what to output.
+    int32_t unchanged1 = 0;  // code units before the j, or the whole sequence (0..3)
+    bool doTitleJ = false;  // true if the j needs to be titlecased
+    int32_t unchanged2 = 0;  // after the j (0 or 1)
+
+    // next character after the first letter
+    UChar c2 = src[index++];
+
+    // Is the first letter an i/I with accent?
+    if (c == u'I') {
+        if (c2 == ACUTE) {
+            withAcute = true;
+            unchanged1 = 1;
+            if (index == segmentLimit) { return start; }
+            c2 = src[index++];
+        }
+    } else {  // Í
+        withAcute = true;
+    }
+
+    // Is the next character a j/J?
+    if (c2 == u'j') {
+        doTitleJ = true;
+    } else if (c2 == u'J') {
+        ++unchanged1;
+    } else {
+        return start;
+    }
+
+    // A plain i/I must be followed by a plain j/J.
+    // An i/I with acute must be followed by a j/J with acute.
+    if (withAcute) {
+        if (index == segmentLimit || src[index++] != ACUTE) { return start; }
+        if (doTitleJ) {
+            unchanged2 = 1;
+        } else {
+            ++unchanged1;
+        }
+    }
+
+    // There must not be another combining mark.
+    if (index < segmentLimit) {
+        int32_t cp;
+        int32_t i = index;
+        U16_NEXT(src, i, segmentLimit, cp);
+        uint32_t typeMask = U_GET_GC_MASK(cp);
+        if ((typeMask & U_GC_M_MASK) != 0) {
+            return start;
+        }
+    }
+
+    // Output the rest of the Dutch IJ.
+    destIndex = appendUnchanged(dest, destIndex, destCapacity, src + start, unchanged1, options, edits);
+    start += unchanged1;
+    if (doTitleJ) {
+        destIndex = appendUChar(dest, destIndex, destCapacity, u'J');
+        if (edits != nullptr) {
+            edits->addReplace(1, 1);
+        }
+        ++start;
+    }
+    destIndex = appendUnchanged(dest, destIndex, destCapacity, src + start, unchanged2, options, edits);
+
+    U_ASSERT(start + unchanged2 == index);
+    return index;
+}
+
+}  // namespace
+
 U_CFUNC int32_t U_CALLCONV
 ustrcase_internalToTitle(int32_t caseLocale, uint32_t options, BreakIterator *iter,
                          UChar *dest, int32_t destCapacity,
@@ -412,7 +506,7 @@
     csc.limit=srcLength;
     int32_t destIndex=0;
     int32_t prev=0;
-    UBool isFirstIndex=TRUE;
+    bool isFirstIndex=true;
 
     /* titlecasing loop */
     while(prev<srcLength) {
@@ -419,7 +513,7 @@
         /* find next index where to titlecase */
         int32_t index;
         if(isFirstIndex) {
-            isFirstIndex=FALSE;
+            isFirstIndex=false;
             index=iter->first();
         } else {
             index=iter->next();
@@ -446,7 +540,7 @@
                 // Stop with titleStart<titleLimit<=index
                 // if there is a character to be titlecased,
                 // or else stop with titleStart==titleLimit==index.
-                UBool toCased = (options&U_TITLECASE_ADJUST_TO_CASED) != 0;
+                bool toCased = (options&U_TITLECASE_ADJUST_TO_CASED) != 0;
                 while (toCased ? UCASE_NONE==ucase_getType(c) : !ustrcase_isLNS(c)) {
                     titleStart=titleLimit;
                     if(titleLimit==index) {
@@ -479,28 +573,16 @@
 
                 /* Special case Dutch IJ titlecasing */
                 if (titleStart+1 < index &&
-                        caseLocale == UCASE_LOC_DUTCH &&
-                        (src[titleStart] == 0x0049 || src[titleStart] == 0x0069)) {
-                    if (src[titleStart+1] == 0x006A) {
-                        destIndex=appendUChar(dest, destIndex, destCapacity, 0x004A);
-                        if(destIndex<0) {
-                            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
-                            return 0;
-                        }
-                        if(edits!=NULL) {
-                            edits->addReplace(1, 1);
-                        }
-                        titleLimit++;
-                    } else if (src[titleStart+1] == 0x004A) {
-                        // Keep the capital J from getting lowercased.
-                        destIndex=appendUnchanged(dest, destIndex, destCapacity,
-                                                  src+titleStart+1, 1, options, edits);
-                        if(destIndex<0) {
-                            errorCode=U_INDEX_OUTOFBOUNDS_ERROR;
-                            return 0;
-                        }
-                        titleLimit++;
+                        caseLocale == UCASE_LOC_DUTCH) {
+                    if (c < 0) {
+                        c = ~c;
                     }
+
+                    if (c == u'I' || c == u'Í') {
+                        titleLimit = maybeTitleDutchIJ(src, c, titleStart + 1, index, 
+                                                       dest, destIndex, destCapacity, options, 
+                                                       edits);
+                    }
                 }
 
                 /* lowercase [titleLimit..index[ */

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uvector.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uvector.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uvector.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -99,14 +99,6 @@
     return true;
 }
 
-// TODO: delete this function once all call sites have been migrated to the
-//       new addElement().
-void UVector::addElementX(void* obj, UErrorCode &status) {
-    if (ensureCapacityX(count + 1, status)) {
-        elements[count++].pointer = obj;
-    }
-}
-
 void UVector::addElement(void* obj, UErrorCode &status) {
     U_ASSERT(deleter == nullptr);
     if (ensureCapacity(count + 1, status)) {
@@ -331,38 +323,6 @@
     return -1;
 }
 
-UBool UVector::ensureCapacityX(int32_t minimumCapacity, UErrorCode &status) {
-    if (minimumCapacity < 0) {
-        status = U_ILLEGAL_ARGUMENT_ERROR;
-        return FALSE;
-	}
-    if (capacity < minimumCapacity) {
-        if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
-        	status = U_ILLEGAL_ARGUMENT_ERROR;
-        	return FALSE;
-        }
-        int32_t newCap = capacity * 2;
-        if (newCap < minimumCapacity) {
-            newCap = minimumCapacity;
-        }
-        if (newCap > (int32_t)(INT32_MAX / sizeof(UElement))) {	// integer overflow check
-        	// We keep the original memory contents on bad minimumCapacity.
-        	status = U_ILLEGAL_ARGUMENT_ERROR;
-        	return FALSE;
-        }
-        UElement* newElems = (UElement *)uprv_realloc(elements, sizeof(UElement)*newCap);
-        if (newElems == nullptr) {
-            // We keep the original contents on the memory failure on realloc or bad minimumCapacity.
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return FALSE;
-        }
-        elements = newElems;
-        capacity = newCap;
-    }
-    return TRUE;
-}
-
-
 UBool UVector::ensureCapacity(int32_t minimumCapacity, UErrorCode &status) {
     if (U_FAILURE(status)) {
         return false;
@@ -370,7 +330,7 @@
     if (minimumCapacity < 0) {
         status = U_ILLEGAL_ARGUMENT_ERROR;
         return false;
-	}
+    }
     if (capacity < minimumCapacity) {
         if (capacity > (INT32_MAX - 1) / 2) {        	// integer overflow check
             status = U_ILLEGAL_ARGUMENT_ERROR;
@@ -396,6 +356,7 @@
     }
     return true;
 }
+
 /**
  * Change the size of this vector as follows: If newSize is smaller,
  * then truncate the array, possibly deleting held elements for i >=

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uvector.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uvector.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uvector.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -123,12 +123,6 @@
     // java.util.Vector API
     //------------------------------------------------------------
 
-    /*
-     * Old version of addElement, with non-standard error handling.
-     * Will be removed once all uses have been switched to the new addElement().
-     */
-    void addElementX(void* obj, UErrorCode &status);
-
     /**
      * Add an element at the end of the vector.
      * For use only with vectors that do not adopt their elements, which is to say,
@@ -197,12 +191,6 @@
 
     inline UBool isEmpty(void) const {return count == 0;}
 
-    /*
-     * Old version of ensureCapacity, with non-standard error handling.
-     * Will be removed once all uses have been switched to the new ensureCapacity().
-     */
-    UBool ensureCapacityX(int32_t minimumCapacity, UErrorCode &status);
-
     UBool ensureCapacity(int32_t minimumCapacity, UErrorCode &status);
 
     /**

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -83,7 +83,7 @@
 }
 
 
-bool UVector32::operator==(const UVector32& other) {
+bool UVector32::operator==(const UVector32& other) const {
     int32_t i;
     if (count != other.count) return false;
     for (i=0; i<count; ++i) {

Modified: trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/common/uvectr32.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -86,12 +86,12 @@
      * equal if they are of the same size and all elements are equal,
      * as compared using this object's comparer.
      */
-    bool operator==(const UVector32& other);
+    bool operator==(const UVector32& other) const;
 
     /**
      * Equivalent to !operator==()
      */
-    inline bool operator!=(const UVector32& other);
+    inline bool operator!=(const UVector32& other) const;
 
     //------------------------------------------------------------
     // java.util.Vector API
@@ -268,7 +268,7 @@
     return elementAti(count-1);
 }
 
-inline bool UVector32::operator!=(const UVector32& other) {
+inline bool UVector32::operator!=(const UVector32& other) const {
     return !operator==(other);
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/configure
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/configure	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/configure	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ICU 70.1.
+# Generated by GNU Autoconf 2.69 for ICU 71.1.
 #
 # Report bugs to <http://icu-project.org/bugs>.
 #
@@ -582,8 +582,8 @@
 # Identity of this package.
 PACKAGE_NAME='ICU'
 PACKAGE_TARNAME='International Components for Unicode'
-PACKAGE_VERSION='70.1'
-PACKAGE_STRING='ICU 70.1'
+PACKAGE_VERSION='71.1'
+PACKAGE_STRING='ICU 71.1'
 PACKAGE_BUGREPORT='http://icu-project.org/bugs'
 PACKAGE_URL='http://icu-project.org'
 
@@ -1375,7 +1375,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures ICU 70.1 to adapt to many kinds of systems.
+\`configure' configures ICU 71.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1442,7 +1442,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ICU 70.1:";;
+     short | recursive ) echo "Configuration of ICU 71.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1580,7 +1580,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ICU configure 70.1
+ICU configure 71.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2326,7 +2326,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ICU $as_me 70.1, which was
+It was created by ICU $as_me 71.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -6160,12 +6160,6 @@
         else
             CXXFLAGS="$OLD_CXXFLAGS"
         fi
-# TL: why? http://bugs.icu-project.org/trac/ticket/13543
-#        case "${host}" in
-#        *-*-solaris*)
-#            CXXFLAGS="$OLD_CXXFLAGS"
-#            ;;
-#        esac
     fi
 fi
 
@@ -8607,7 +8601,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ICU $as_me 70.1, which was
+This file was extended by ICU $as_me 71.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8661,7 +8655,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-ICU config.status 70.1
+ICU config.status 71.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/icu/icu-src/source/configure.ac
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/configure.ac	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/configure.ac	2022-05-31 01:17:15 UTC (rev 63452)
@@ -527,11 +527,6 @@
         else
             CXXFLAGS="$OLD_CXXFLAGS"
         fi
-        case "${host}" in
-        *-*-solaris*)
-            CXXFLAGS="$OLD_CXXFLAGS"
-            ;;
-        esac
     fi
 fi
 

Modified: trunk/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/data/cldr-icu-readme.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -138,24 +138,52 @@
 export ICU4J_ROOT=$HOME/icu-myfork/icu4j
 export TOOLS_ROOT=$HOME/icu-myfork/tools
 
-# 2. Build and install the CLDR jar
+# 1d. Directory for logs/notes (create if does not exist)
 
-cd $TOOLS_ROOT/cldr
-ant install-cldr-libs
+export NOTES=...(some directory)...
+mkdir -p $NOTES
 
-See the $TOOLS_ROOT/cldr/lib/README.txt file for more information on the CLDR
-jar and the install-cldr-jars.sh script.
-
-# 3. Configure ICU4C, build and test without new data first, to verify that
+# 2a. Configure ICU4C, build and test without new data first, to verify that
 # there are no pre-existing errors. Here <platform> is the runConfigureICU
 # code for the platform you are building, e.g. Linux, MacOSX, Cygwin.
+# (optionally build with debug enabled)
 
 cd $ICU4C_DIR/source
-./runConfigureICU <platform>
+./runConfigureICU [--enable-debug] <platform>
 make clean
-make check 2>&1 | tee /tmp/icu4c-oldData-makeCheck.txt
+make check 2>&1 | tee $NOTES/icu4c-oldData-makeCheck.txt
 
-# 4a. Generate the CLDR production data. This process uses ant with ICU's
+# 2b. Now with ICU4J, build and test without new data first, to verify that
+# there are no pre-existing errors (or at least to have the pre-existing errors
+# as a base for comparison):
+
+cd $ICU4J_ROOT
+ant clean
+ant check 2>&1 | tee $NOTES/icu4j-oldData-antCheck.txt
+
+# 3. Make pre-adjustments as necessary
+# 3a. Copy latest relevant CLDR dtds to ICU
+cp -p $CLDR_DIR/common/dtd/ldml.dtd $ICU4C_DIR/source/data/dtd/cldr/common/dtd/
+cp -p $CLDR_DIR/common/dtd/ldmlICU.dtd $ICU4C_DIR/source/data/dtd/cldr/common/dtd/
+
+# 3b. Update the cldr-icu tooling to use the latest tagged version of ICU
+open $TOOLS_ROOT/cldr/cldr-to-icu/pom.xml
+# search for icu4j-for-cldr and update to the latest tagged version per instructions
+
+# 3c. Update the build for any new icu version, added locales, etc.
+open $TOOLS_ROOT/cldr/cldr-to-icu/build-icu-data.xml
+# update icuVersion, icuDataVersion if necessary
+# update lists of locales to include if necessary
+
+# 4. Build and install the CLDR jar
+
+cd $TOOLS_ROOT/cldr
+ant install-cldr-libs
+
+See the $TOOLS_ROOT/cldr/lib/README.txt file for more information on the CLDR
+jar and the install-cldr-jars.sh script.
+
+# 5a. Generate the CLDR production data. This process uses ant with ICU's
 # data/build.xml
 #
 # Running "ant cleanprod" is necessary to clean out the production data directory
@@ -167,9 +195,9 @@
 cd $ICU4C_DIR/source/data
 ant cleanprod
 ant setup
-ant proddata 2>&1 | tee /tmp/cldr-newData-proddataLog.txt
+ant proddata 2>&1 | tee $NOTES/cldr-newData-proddataLog.txt
 
-# 4b. Build the new ICU4C data files; these include .txt files and .py files.
+# 5b. Build the new ICU4C data files; these include .txt files and .py files.
 # These new files will replace whatever was already present in the ICU4C sources.
 # This process uses the LdmlConverter in $TOOLS_ROOT/cldr/cldr-to-icu/;
 # see $TOOLS_ROOT/cldr/cldr-to-icu/README.txt
@@ -187,59 +215,58 @@
 # build-icu-data.xml file, such as adding new locales etc.
 
 cd $TOOLS_ROOT/cldr/cldr-to-icu
-ant -f build-icu-data.xml -DcldrDataDir="$CLDR_TMP_DIR/production" | tee /tmp/cldr-newData-builddataLog.txt
+ant -f build-icu-data.xml -DcldrDataDir="$CLDR_TMP_DIR/production" | tee $NOTES/cldr-newData-builddataLog.txt
 
-# 4c. Update the CLDR testData files needed by ICU4C and ICU4J tests, ensuring
+# 5c. Update the CLDR testData files needed by ICU4C and ICU4J tests, ensuring
 # they're representative of the newest CLDR data.
 
 cd $TOOLS_ROOT/cldr
 ant copy-cldr-testdata
 
-# 4d. Copy from CLDR common/testData/localeIdentifiers/localeCanonicalization.txt
+# 5d. Copy from CLDR common/testData/localeIdentifiers/localeCanonicalization.txt
 # into icu4c/source/test/testdata/localeCanonicalization.txt
 # and icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode/localeCanonicalization.txt
 # and add the following line to the beginning of these two files
 # # File copied from cldr common/testData/localeIdentifiers/localeCanonicalization.txt
 
-# 4e. For the time being, manually re-add the lstm entries in data/brkitr/root.txt
-
+# 5e. For the time being, manually re-add the lstm entries in data/brkitr/root.txt
 open $ICU4C_DIR/source/data/brkitr/root.txt 
 
-# paste the following block at the end, after the dictionaries block>
+# paste the following block after the dictionaries block and before the final closing '}':
     lstm{
         Thai{"Thai_graphclust_model4_heavy.res"}
         Mymr{"Burmese_graphclust_model5_heavy.res"}
     }
 
-# 5. Check which data files have modifications, which have been added or removed
+# 6. Check which data files have modifications, which have been added or removed
 # (if there are no changes, you may not need to proceed further). Make sure the
 # list seems reasonable.
 
-cd $ICU4C_DIR/source/data
+cd $ICU4C_DIR/..
 git status
 
-# 5a. You may also want to check which files were modified in CLDR production data:
+# 6a. You may also want to check which files were modified in CLDR production data:
 
 cd $CLDR_TMP_DIR
 git status
 
-# 6. Fix any errors, investigate any warnings.
+# 7. Fix any errors, investigate any warnings.
 #
 # Fixing may entail modifying CLDR source data or TOOLS_ROOT config files or
 # tooling.
 
-# 7. Now rebuild ICU4C with the new data and run make check tests.
+# 8. Now rebuild ICU4C with the new data and run make check tests.
 # Again, keep a log so you can investigate the errors.
 cd $ICU4C_DIR/source
 
-# 7a. If any files were added or removed (likely), re-run configure:
-./runConfigureICU <platform>
+# 8a. If any files were added or removed (likely), re-run configure:
+./runConfigureICU [--enable-debug] <platform>
 make clean
 
-# 7b. Now do the rebuild.
-make check 2>&1 | tee /tmp/icu4c-newData-makeCheck.txt
+# 8b. Now do the rebuild.
+make check 2>&1 | tee $NOTES/icu4c-newData-makeCheck.txt
 
-# 8. Investigate each test case failure. The first run processing new CLDR data
+# 9. Investigate each test case failure. The first run processing new CLDR data
 # from the Survey Tool can result in thousands of failures (in many cases, one
 # CLDR data fix can resolve hundreds of test failures). If the error is caused
 # by bad CLDR data, then file a CLDR bug, fix the data, and regenerate from
@@ -249,9 +276,9 @@
 # Note that if the new data has any differences in structure, you will have to
 # update test/testdata/structLocale.txt or /tsutil/cldrtest/TestLocaleStructure
 # may fail.
-# Repeat steps 4-7 until there are no errors.
+# Repeat steps 4-8 until there are no errors.
 
-# 9. You can also run the make check tests in exhaustive mode. As an alternative
+# 10. You can also run the make check tests in exhaustive mode. As an alternative
 # you can run them as part of the pre-merge tests by adding the following as a
 # comment in the pull request: "/azp run CI-Exhaustive". You should do one or the
 # other; the exhaustive tests are *not* run automatically on each pull request,
@@ -260,18 +287,11 @@
 cd $ICU4C_DIR/source
 export INTLTEST_OPTS="-e"
 export CINTLTST_OPTS="-e"
-make check 2>&1 | tee /tmp/icu4c-newData-makeCheckEx.txt
+make check 2>&1 | tee $NOTES/icu4c-newData-makeCheckEx.txt
 
-# 10. Again, investigate each failure, fixing CLDR data or ICU test cases as
-# appropriate, and repeating steps 4-7 and 9 until there are no errors.
+# 11. Again, investigate each failure, fixing CLDR data or ICU test cases as
+# appropriate, and repeating steps 4-8 and 10 until there are no errors.
 
-# 11. Now with ICU4J, build and test without new data first, to verify that
-# there are no pre-existing errors (or at least to have the pre-existing errors
-# as a base for comparison):
-
-cd $ICU4J_ROOT
-ant check 2>&1 | tee /tmp/icu4j-oldData-antCheck.txt
-
 # 12. Transfer the data to ICU4J:
 cd $ICU4C_DIR/source
 
@@ -291,7 +311,7 @@
 # Keep a log so you can investigate the errors.
 
 cd $ICU4J_ROOT
-ant check 2>&1 | tee /tmp/icu4j-newData-antCheck.txt
+ant check 2>&1 | tee $NOTES/icu4j-newData-antCheck.txt
 
 # 14. Investigate test case failures; fix test cases and repeat from step 12,
 # or fix CLDR data and repeat from step 4, as appropriate, until there are no

Added: trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldml.dtd
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldml.dtd	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldml.dtd	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,3208 @@
+<!--
+Copyright © 1991-2022 Unicode, Inc.
+For terms of use, see http://www.unicode.org/copyright.html
+SPDX-License-Identifier: Unicode-DFS-2016
+CLDR data files are interpreted according to the LDML specification (http://unicode.org/reports/tr35/)
+-->
+
+<!ELEMENT ldml ( identity, ( alias | ( fallback*, localeDisplayNames?, layout?, contextTransforms?, characters?, delimiters?, measurement?, dates?, numbers?, units?, listPatterns?, collations?, posix?, characterLabels?, segmentations?, rbnf?, typographicNames?, annotations?, metadata?, references?, special* ) ) ) >
+<!ATTLIST ldml version CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST ldml draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT identity ( alias | ( version, generation?, language, script?, territory?, variant?, special* ) ) >
+<!ATTLIST identity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+<!-- # These elements are common to almost all elements defined -->
+
+<!ELEMENT alias ( special* ) >
+<!ATTLIST alias source NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/locale-->
+    <!-- at VALUE-->
+<!ATTLIST alias path CDATA #IMPLIED >
+    <!-- at MATCH:regex/\.\..*-->
+    <!-- at VALUE-->
+<!ATTLIST alias alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST alias draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT special ANY >
+
+<!ELEMENT version EMPTY >
+<!ATTLIST version number CDATA #REQUIRED >
+    <!-- at MATCH:regex/\$Revision.*\$-->
+    <!-- at METADATA-->
+<!ATTLIST version cldrVersion CDATA #FIXED "41" >
+    <!-- at MATCH:any-->
+    <!-- at VALUE-->
+<!ATTLIST version draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT generation EMPTY >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST generation date CDATA #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST generation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT language ( #PCDATA ) >
+<!ATTLIST language type NMTOKEN #REQUIRED >
+    <!-- at MATCH:validity/locale-->
+<!ATTLIST language alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/long, secondary, short, variant, menu-->
+<!ATTLIST language draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST language references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT script ( #PCDATA ) >
+<!ATTLIST script type NMTOKEN #REQUIRED >
+    <!-- at MATCH:validity/script-->
+<!ATTLIST script alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/secondary, short, stand-alone, variant-->
+<!ATTLIST script draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST script references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT territory ( #PCDATA ) >
+<!ATTLIST territory type NMTOKEN #REQUIRED >
+    <!-- at MATCH:validity/region-->
+<!ATTLIST territory alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/short, variant-->
+<!ATTLIST territory draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST territory references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT variant ( #PCDATA ) >
+<!ATTLIST variant type NMTOKEN #REQUIRED >
+    <!-- at MATCH:validity/variant-->
+<!ATTLIST variant alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/secondary, variant-->
+<!ATTLIST variant draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST variant references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT fallback ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST fallback alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fallback draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fallback references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT localeDisplayNames ( alias | ( localeDisplayPattern?, languages?, scripts?, territories?, subdivisions?, variants?, keys?, types?, transformNames?, measurementSystemNames?, codePatterns?, special* ) ) >
+<!ATTLIST localeDisplayNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT localeDisplayPattern ( alias | ( localePattern*, localeSeparator*, localeKeyTypePattern*, special* ) ) >
+<!ATTLIST localeDisplayPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST localeDisplayPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST localeDisplayPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT localePattern ( #PCDATA ) >
+<!ATTLIST localePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST localePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST localePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT localeSeparator ( #PCDATA ) >
+<!ATTLIST localeSeparator alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST localeSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST localeSeparator references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT localeKeyTypePattern ( #PCDATA ) >
+<!ATTLIST localeKeyTypePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST localeKeyTypePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST localeKeyTypePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more language -->
+
+<!ELEMENT languages ( alias | ( language | special )* ) >
+<!ATTLIST languages draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST languages standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST languages references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST languages validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more script -->
+
+<!ELEMENT scripts ( alias | ( script | special )* ) >
+<!ATTLIST scripts draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scripts standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scripts references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST scripts validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more territory -->
+
+<!ELEMENT territories ( alias | ( territory | special )* ) >
+<!ATTLIST territories draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST territories standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST territories references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST territories validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT subdivisions ( alias | ( subdivision | special )* ) >
+<!ATTLIST subdivisions draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST subdivisions references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT subdivision ( #PCDATA ) >
+<!ATTLIST subdivision type NMTOKEN #REQUIRED >
+    <!-- at MATCH:or/validity/subdivision||literal/AS, AW, AX, BL, CP, CW, GF, GP, GU, HK, IC, MF, MO, MP, MQ, NC, PF, PM, PR, RE, SX, TA, TF, TW, UM, VI, WF, YT, itsd, no50-->
+<!ATTLIST subdivision alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST subdivision draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more variant -->
+
+<!ELEMENT variants ( alias | ( variant | special )* ) >
+<!ATTLIST variants draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST variants standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST variants references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST variants validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more key -->
+
+<!ELEMENT keys ( alias | ( key | special )* ) >
+<!ATTLIST keys draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST keys standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST keys references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST keys validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT key ( #PCDATA ) >
+<!ATTLIST key type NMTOKEN #REQUIRED >
+    <!-- at MATCH:or/bcp47/anykey||literal/t-->
+<!ATTLIST key alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST key draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST key references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more type -->
+
+<!ELEMENT types ( alias | ( type | special )* ) >
+<!ATTLIST types draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST types standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST types references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST types validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT type ( #PCDATA ) >
+<!ATTLIST type key NMTOKEN #REQUIRED >
+    <!-- at MATCH:bcp47/anykey-->
+<!ATTLIST type type NMTOKEN #REQUIRED >
+    <!-- at MATCH:bcp47/anyvalue-->
+<!ATTLIST type alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/short, variant-->
+<!ATTLIST type draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST type references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT transformNames ( alias | ( transformName | special )* ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST transformNames draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST transformNames references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT transformName ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST transformName type NMTOKEN #REQUIRED >
+    <!-- at DEPRECATED-->
+<!ATTLIST transformName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST transformName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST transformName references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!-- # Either 1 alias OR any specials, any order, zero or more measurementSystemName -->
+
+<!ELEMENT measurementSystemNames ( alias | ( measurementSystemName | special )* ) >
+<!ATTLIST measurementSystemNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystemNames references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST measurementSystemNames validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT measurementSystemName ( #PCDATA ) >
+<!ATTLIST measurementSystemName type (US | metric | UK) #REQUIRED >
+<!ATTLIST measurementSystemName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST measurementSystemName draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST measurementSystemName references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT codePatterns ( alias | ( codePattern | special )* ) >
+
+<!ELEMENT codePattern ( #PCDATA ) >
+<!ATTLIST codePattern type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/language, script, territory-->
+<!ATTLIST codePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST codePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST codePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+<!-- # layout and orientation are script specific, so validSublocales attribute is not required -->
+
+<!ELEMENT layout ( alias | ( orientation*, inList*, inText*, special* ) ) >
+<!ATTLIST layout draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST layout references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT orientation ( alias | ( characterOrder*, lineOrder*, special* ) ) >
+<!ATTLIST orientation characters (left-to-right | right-to-left | top-to-bottom | bottom-to-top) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST orientation lines (left-to-right | right-to-left | top-to-bottom | bottom-to-top) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST orientation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST orientation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST orientation standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST orientation references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT characterOrder ( #PCDATA ) >
+<!ATTLIST characterOrder alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST characterOrder draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT lineOrder ( #PCDATA ) >
+<!ATTLIST lineOrder alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST lineOrder draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT inList ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST inList casing (titlecase-words | titlecase-firstword | lowercase-words | mixed) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST inList alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST inList draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST inList references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT inText ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST inText type (languages | scripts | territories | variants | keys | types | measurementSystemNames | monthWidth | dayWidth | quarterWidth | long | fields | currency) #IMPLIED >
+    <!-- at DEPRECATED-->
+<!ATTLIST inText alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST inText draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST inText references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT contextTransforms ( alias | ( contextTransformUsage*, special* ) ) >
+<!ATTLIST contextTransforms alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST contextTransforms draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST contextTransforms references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST contextTransforms validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT contextTransformUsage ( alias | ( contextTransform*, special* ) ) >
+<!ATTLIST contextTransformUsage type CDATA #REQUIRED >
+    <!-- at MATCH:literal/calendar-field, currencyName, day-format-except-narrow, day-standalone-except-narrow, era-abbr, era-name, keyValue, languages, month-format-except-narrow, month-standalone-except-narrow, number-spellout, relative, script, typographicNames-->
+<!ATTLIST contextTransformUsage alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST contextTransformUsage draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST contextTransformUsage references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST contextTransformUsage validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT contextTransform ( #PCDATA ) >
+<!ATTLIST contextTransform type (uiListOrMenu | stand-alone) #REQUIRED >
+<!ATTLIST contextTransform alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST contextTransform draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST contextTransform references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT characters ( alias | ( exemplarCharacters*, ellipsis*, moreInformation*, stopwords*, indexLabels*, mapping*, parseLenients*, special* ) ) >
+<!ATTLIST characters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT exemplarCharacters ( #PCDATA | cp )* >
+<!ATTLIST exemplarCharacters type (auxiliary | standard | punctuation | currencySymbol | index | numbers) #IMPLIED >
+    <!-- at DEPRECATED:currencySymbol-->
+<!ATTLIST exemplarCharacters alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST exemplarCharacters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST exemplarCharacters standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST exemplarCharacters references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST exemplarCharacters validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- # This element can occur anywhere there may be localizable data -->
+
+<!ELEMENT cp ( special* ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST cp hex NMTOKEN #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT ellipsis ( #PCDATA ) >
+<!ATTLIST ellipsis type (initial | medial | final | word-initial | word-medial | word-final) #REQUIRED >
+<!ATTLIST ellipsis alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST ellipsis draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST ellipsis references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT moreInformation ( #PCDATA ) >
+<!ATTLIST moreInformation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST moreInformation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST moreInformation references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT stopwords ( stopwordList* ) >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT stopwordList ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST stopwordList type NMTOKEN #REQUIRED >
+    <!-- at DEPRECATED-->
+<!ATTLIST stopwordList alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST stopwordList draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST stopwordList references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexLabels ( indexSeparator*, compressedIndexSeparator*, indexRangePattern*, indexLabelBefore*, indexLabelAfter*, indexLabel* ) >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexSeparator ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexSeparator alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexSeparator references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT compressedIndexSeparator ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST compressedIndexSeparator alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST compressedIndexSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST compressedIndexSeparator references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexRangePattern ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexRangePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexRangePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexRangePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexLabelBefore ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelBefore alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelBefore draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelBefore references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexLabelAfter ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelAfter alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelAfter draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabelAfter references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT indexLabel ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabel indexSource CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabel priority (1 | 2 | 3) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabel alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabel draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST indexLabel references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT mapping ( special* ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping registry NMTOKEN #REQUIRED >
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping type NMTOKEN #IMPLIED >
+    <!-- use choice instead -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping choice NMTOKEN #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping alt NMTOKENS #IMPLIED >
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST mapping validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT parseLenients ( alias | ( parseLenient*, special* ) ) >
+<!ATTLIST parseLenients scope (general | number | date) #REQUIRED >
+<!ATTLIST parseLenients level (lenient | stricter) #REQUIRED >
+
+<!ELEMENT parseLenient ( #PCDATA ) >
+<!ATTLIST parseLenient sample CDATA #REQUIRED >
+    <!-- at MATCH:any-->
+<!ATTLIST parseLenient alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST parseLenient draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT delimiters ( alias | ( quotationStart*, quotationEnd*, alternateQuotationStart*, alternateQuotationEnd*, special* ) ) >
+<!ATTLIST delimiters alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST delimiters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST delimiters standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST delimiters references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST delimiters validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT quotationStart ( #PCDATA | cp )* >
+<!ATTLIST quotationStart alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quotationStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST quotationStart references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT quotationEnd ( #PCDATA | cp )* >
+<!ATTLIST quotationEnd alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quotationEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST quotationEnd references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT alternateQuotationStart ( #PCDATA | cp )* >
+<!ATTLIST alternateQuotationStart alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST alternateQuotationStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST alternateQuotationStart references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT alternateQuotationEnd ( #PCDATA | cp )* >
+<!ATTLIST alternateQuotationEnd alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST alternateQuotationEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST alternateQuotationEnd references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT measurement ( alias | ( measurementSystem*, paperSize*, special* ) ) >
+    <!-- use measurementData in supplemental instead -->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurement alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurement draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurement standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurement references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurement validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT measurementSystem ( special* ) >
+    <!-- use measurementSystem in supplemental instead -->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem type (metric | US | UK) #REQUIRED >
+    <!-- use choice instead -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem choice (metric | US | UK) #IMPLIED >
+    <!-- really required, but needs to be optional to support type also -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST measurementSystem validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT paperSize ( alias | ( height*, width*, special* ) ) >
+    <!-- use paperSize in supplemental instead -->
+    <!-- at DEPRECATED-->
+<!ATTLIST paperSize alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST paperSize draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST paperSize standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST paperSize references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST paperSize validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT height ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST height alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST height draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST height references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT width ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST width alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST width draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST width references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT dates ( alias | ( localizedPatternChars*, dateRangePattern*, calendars?, fields?, timeZoneNames?, special* ) ) >
+<!ATTLIST dates alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dates draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dates standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dates references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dates validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT localizedPatternChars ( #PCDATA | cp )* >
+    <!-- at DEPRECATED-->
+<!ATTLIST localizedPatternChars alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST localizedPatternChars draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST localizedPatternChars standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST localizedPatternChars references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST localizedPatternChars validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateRangePattern ( #PCDATA ) >
+    <!-- use intervalFormats. -->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateRangePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateRangePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateRangePattern standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateRangePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateRangePattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT calendars ( alias | ( default*, calendar*, special* ) ) >
+    <!-- use calendarPreferenceData instead of default element -->
+<!ATTLIST calendars draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST calendars validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT default ( special* ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST default type NMTOKEN #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST default choice NMTOKEN #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST default alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST default draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST default references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT calendar ( alias | ( months?, monthNames?, monthAbbr?, monthPatterns?, days?, dayNames?, dayAbbr?, quarters?, week?, am*, pm*, dayPeriods?, eras?, cyclicNameSets?, dateFormats?, timeFormats?, dateTimeFormats?, fields*, special* ) ) >
+    <!-- use of fields is deprecated here -->
+<!ATTLIST calendar type NMTOKEN #REQUIRED >
+    <!-- at MATCH:bcp47/ca-->
+<!ATTLIST calendar alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST calendar draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST calendar standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST calendar references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST calendar validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT months ( alias | ( default*, monthContext*, special* ) ) >
+<!ATTLIST months alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST months draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST months standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST months references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST months validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthContext ( alias | ( default*, monthWidth*, special* ) ) >
+<!ATTLIST monthContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST monthContext alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthContext standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthContext validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthWidth ( alias | ( month*, special* ) ) >
+<!ATTLIST monthWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST monthWidth alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthWidth standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthWidth validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT month ( #PCDATA | cp )* >
+<!ATTLIST month type (1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13) #REQUIRED >
+<!ATTLIST month yeartype (standard | leap) #IMPLIED >
+<!ATTLIST month alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST month draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST month references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT monthNames ( alias | ( month*, special* ) ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST monthNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthAbbr ( alias | ( month*, special* ) ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST monthAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthPatterns ( alias | ( monthPatternContext*, special* ) ) >
+<!ATTLIST monthPatterns alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthPatterns references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthPatterns validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthPatternContext ( alias | ( monthPatternWidth*, special* ) ) >
+<!ATTLIST monthPatternContext type (format | stand-alone | numeric) #REQUIRED >
+<!ATTLIST monthPatternContext alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthPatternContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthPatternContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthPatternContext validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthPatternWidth ( alias | ( monthPattern*, special* ) ) >
+<!ATTLIST monthPatternWidth type (abbreviated | narrow | wide | all) #REQUIRED >
+<!ATTLIST monthPatternWidth alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthPatternWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST monthPatternWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthPatternWidth validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT monthPattern ( #PCDATA ) >
+<!ATTLIST monthPattern type (leap | standardAfterLeap | combined) #REQUIRED >
+<!ATTLIST monthPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST monthPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST monthPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT days ( alias | ( default*, dayContext*, special* ) ) >
+<!ATTLIST days alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST days draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST days standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST days references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST days validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dayContext ( alias | ( default*, dayWidth*, special* ) ) >
+<!ATTLIST dayContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST dayContext alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dayContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayContext standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dayContext validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dayWidth ( alias | ( day*, special* ) ) >
+<!ATTLIST dayWidth type (abbreviated | narrow | short | wide) #REQUIRED >
+<!ATTLIST dayWidth alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dayWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayWidth standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dayWidth validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT day ( #PCDATA ) >
+<!ATTLIST day type (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+<!ATTLIST day alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST day draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST day references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT dayNames ( alias | ( day*, special* ) ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST dayNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dayAbbr ( alias | ( day*, special* ) ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST dayAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT quarters ( alias | ( default*, quarterContext*, special* ) ) >
+<!ATTLIST quarters alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quarters draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST quarters references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST quarters validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT quarterContext ( alias | ( default*, quarterWidth*, special* ) ) >
+<!ATTLIST quarterContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST quarterContext alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quarterContext draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST quarterContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST quarterContext validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT quarterWidth ( alias | ( quarter*, special* ) ) >
+<!ATTLIST quarterWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST quarterWidth alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quarterWidth draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST quarterWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST quarterWidth validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT quarter ( #PCDATA ) >
+<!ATTLIST quarter type (1 | 2 | 3 | 4) #REQUIRED >
+<!ATTLIST quarter alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST quarter draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST quarter references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT week ( alias | ( minDays*, firstDay*, weekendStart*, weekendEnd*, special* ) ) >
+    <!-- use supplemental weekData -->
+    <!-- at DEPRECATED-->
+<!ATTLIST week alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST week draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST week standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST week references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST week validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT minDays ( special* ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST minDays count (1 | 2 | 3 | 4 | 5 | 6 | 7) #REQUIRED >
+    <!-- at DEPRECATED-->
+<!ATTLIST minDays alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST minDays draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST minDays references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT firstDay ( special* ) >
+    <!-- use supplemental data -->
+    <!-- at DEPRECATED-->
+<!ATTLIST firstDay day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST firstDay alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST firstDay draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST firstDay references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT weekendStart ( special* ) >
+    <!-- use supplemental data -->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendStart day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendStart time CDATA "00:00" >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendStart alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendStart draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendStart references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT weekendEnd ( special* ) >
+    <!-- use supplemental data -->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendEnd day (sun | mon | tue | wed | thu | fri | sat) #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendEnd time CDATA "24:00" >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendEnd alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendEnd draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST weekendEnd references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT am ( #PCDATA ) >
+    <!-- use dayPeriods -->
+    <!-- at DEPRECATED-->
+<!ATTLIST am alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST am draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST am references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST am validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT pm ( #PCDATA ) >
+    <!-- use dayPeriods -->
+    <!-- at DEPRECATED-->
+<!ATTLIST pm alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST pm draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST pm references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST pm validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dayPeriods ( alias | ( dayPeriodContext*, special* ) ) >
+<!ATTLIST dayPeriods draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayPeriods references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT dayPeriodContext ( alias | ( dayPeriodWidth*, special* ) ) >
+<!ATTLIST dayPeriodContext type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/format, stand-alone-->
+<!ATTLIST dayPeriodContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayPeriodContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT dayPeriodWidth ( alias | ( dayPeriod*, special* ) ) >
+<!ATTLIST dayPeriodWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST dayPeriodWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dayPeriodWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT dayPeriod ( #PCDATA ) >
+<!ATTLIST dayPeriod type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/afternoon1, afternoon2, am, evening1, evening2, midnight, morning1, morning2, night1, night2, noon, pm-->
+<!ATTLIST dayPeriod alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dayPeriod draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dayPeriod references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT eras ( alias | ( eraNames?, eraAbbr?, eraNarrow?, special* ) ) >
+<!ATTLIST eras alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST eras draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST eras standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST eras references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST eras validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT eraNames ( alias | ( era*, special* ) ) >
+<!ATTLIST eraNames alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST eraNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST eraNames references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST eraNames validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT era ( #PCDATA ) >
+<!ATTLIST era type NMTOKEN #REQUIRED >
+    <!-- at MATCH:range/0~237-->
+<!ATTLIST era alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST era draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST era references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT eraAbbr ( alias | ( era*, special* ) ) >
+<!ATTLIST eraAbbr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST eraAbbr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST eraAbbr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST eraAbbr validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT eraNarrow ( alias | ( era*, special* ) ) >
+<!ATTLIST eraNarrow alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST eraNarrow draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST eraNarrow references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST eraNarrow validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cyclicNameSets ( alias | ( cyclicNameSet*, special* ) ) >
+<!ATTLIST cyclicNameSets alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cyclicNameSets draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST cyclicNameSets references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cyclicNameSets validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cyclicNameSet ( alias | ( cyclicNameContext*, special* ) ) >
+<!ATTLIST cyclicNameSet type (years | months | days | dayParts | zodiacs | solarTerms) #REQUIRED >
+<!ATTLIST cyclicNameSet alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cyclicNameSet draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST cyclicNameSet references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cyclicNameSet validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cyclicNameContext ( alias | ( cyclicNameWidth*, special* ) ) >
+<!ATTLIST cyclicNameContext type (format | stand-alone) #REQUIRED >
+<!ATTLIST cyclicNameContext alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cyclicNameContext draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST cyclicNameContext references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cyclicNameContext validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cyclicNameWidth ( alias | ( cyclicName*, special* ) ) >
+<!ATTLIST cyclicNameWidth type (abbreviated | narrow | wide) #REQUIRED >
+<!ATTLIST cyclicNameWidth alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cyclicNameWidth draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST cyclicNameWidth references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cyclicNameWidth validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cyclicName ( #PCDATA ) >
+<!ATTLIST cyclicName type NMTOKEN #REQUIRED >
+    <!-- at MATCH:range/1~60-->
+<!ATTLIST cyclicName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cyclicName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cyclicName references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT dateFormats ( alias | ( default*, dateFormatLength*, special* ) ) >
+<!ATTLIST dateFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateFormatLength ( alias | ( default*, dateFormat*, special* ) ) >
+<!ATTLIST dateFormatLength type (full | long | medium | short) #REQUIRED >
+<!ATTLIST dateFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dateFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dateFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateFormat ( alias | ( pattern*, datetimeSkeleton*, displayName*, special* ) ) >
+<!ATTLIST dateFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST dateFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dateFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dateFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT pattern ( #PCDATA ) >
+<!ATTLIST pattern type NMTOKEN "standard" >
+    <!-- at MATCH:literal/1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000, 100000000000, 1000000000000, 10000000000000, 100000000000000, approximately, atLeast, atMost, range, standard-->
+<!ATTLIST pattern numbers CDATA #IMPLIED >
+    <!-- TODO: generalize this to be any (M=|d=)?<numberSystem> -->
+    <!-- at MATCH:literal/M=romanlow, d=hanidays, hanidec, hebr, y=jpanyear-->
+    <!-- at VALUE-->
+<!ATTLIST pattern count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+    <!-- Only used for decimalFormats type="1000..." -->
+<!ATTLIST pattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST pattern draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST pattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT datetimeSkeleton ( #PCDATA ) >
+<!ATTLIST datetimeSkeleton numbers CDATA #IMPLIED >
+    <!-- TODO: generalize this to be any (M=|d=)?<numberSystem> -->
+    <!-- at MATCH:literal/M=romanlow, d=hanidays, hanidec, hebr, y=jpanyear-->
+    <!-- at VALUE-->
+<!ATTLIST datetimeSkeleton alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST datetimeSkeleton draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST datetimeSkeleton references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT displayName ( #PCDATA ) >
+<!ATTLIST displayName count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+    <!-- only for currencies -->
+<!ATTLIST displayName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST displayName draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST displayName references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT timeFormats ( alias | ( default*, timeFormatLength*, special* ) ) >
+<!ATTLIST timeFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT timeFormatLength ( alias | ( default*, timeFormat*, special* ) ) >
+<!ATTLIST timeFormatLength type (full | long | medium | short) #REQUIRED >
+<!ATTLIST timeFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST timeFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST timeFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT timeFormat ( alias | ( pattern*, datetimeSkeleton*, displayName*, special* ) ) >
+<!ATTLIST timeFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST timeFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST timeFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST timeFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateTimeFormats ( alias | ( default*, dateTimeFormatLength*, availableFormats*, appendItems*, intervalFormats*, special* ) ) >
+<!ATTLIST dateTimeFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateTimeFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateTimeFormatLength ( alias | ( default*, dateTimeFormat*, special* ) ) >
+<!ATTLIST dateTimeFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST dateTimeFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dateTimeFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateTimeFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateTimeFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dateTimeFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateTimeFormat ( alias | ( pattern*, displayName*, special* ) ) >
+<!ATTLIST dateTimeFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST dateTimeFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dateTimeFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateTimeFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST dateTimeFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST dateTimeFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT availableFormats ( alias | ( dateFormatItem*, special* ) ) >
+<!ATTLIST availableFormats alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST availableFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST availableFormats references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST availableFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT dateFormatItem ( #PCDATA ) >
+<!ATTLIST dateFormatItem id CDATA #REQUIRED >
+    <!-- TODO rationalize this list -->
+    <!-- at MATCH:literal/Bh, Bhm, Bhms, E, EBhm, EBhms, EEEEd, EHm, EHms, Ed, Ehm, Ehms, Gy, GyM, GyMEEEEd, GyMMM, GyMMMEEEEd, GyMMMEd, GyMMMM, GyMMMMEd, GyMMMMd, GyMMMd, GyMd, H, HHmm, HHmmZ, HHmmss, Hm, HmZ, Hmm, Hms, Hmsv, Hmsvvvv, Hmv, Hmvvvv, M, MEEEEd, MEd, MMM, MMMEEEEd, MMMEd, MMMM, MMMMEEEEd, MMMMEd, MMMMW, MMMMd, MMMMdd, MMMd, MMMdd, MMd, MMdd, Md, Mdd, UM, UMMM, UMMMd, UMd, d, h, hhmm, hhmmss, hm, hms, hmsv, hmsvvvv, hmv, hmvvvv, mmss, ms, y, yM, yMEEEEd, yMEd, yMM, yMMM, yMMMEEEEd, yMMMEd, yMMMM, yMMMMEEEEd, yMMMMEd, yMMMMccccd, yMMMMd, yMMMd, yMMdd, yMd, yQ, yQQQ, yQQQQ, yw, yyyy, yyyyM, yyyyMEEEEd, yyyyMEd, yyyyMM, yyyyMMM, yyyyMMMEEEEd, yyyyMMMEd, yyyyMMMM, yyyyMMMMEd, yyyyMMMMccccd, yyyyMMMMd, yyyyMMMd, yyyyMMdd, yyyyMd, yyyyQQQ, yyyyQQQQ-->
+<!ATTLIST dateFormatItem count (zero | one | two | few | many | other) #IMPLIED >
+<!ATTLIST dateFormatItem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST dateFormatItem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST dateFormatItem references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT appendItems ( alias | ( appendItem*, special* ) ) >
+<!ATTLIST appendItems alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST appendItems draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST appendItems references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST appendItems validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT appendItem ( #PCDATA ) >
+<!ATTLIST appendItem request CDATA #REQUIRED >
+    <!-- at MATCH:literal/Day, Day-Of-Week, Era, Hour, Minute, Month, Quarter, Second, Timezone, Week, Year-->
+<!ATTLIST appendItem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST appendItem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST appendItem references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT intervalFormats ( alias | ( intervalFormatFallback*, intervalFormatItem*, special* ) ) >
+<!ATTLIST intervalFormats alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST intervalFormats draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST intervalFormats references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST intervalFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT intervalFormatFallback ( #PCDATA ) >
+<!ATTLIST intervalFormatFallback alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST intervalFormatFallback draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST intervalFormatFallback references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST intervalFormatFallback validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT intervalFormatItem ( alias | ( greatestDifference*, special* ) ) >
+<!ATTLIST intervalFormatItem id NMTOKEN #REQUIRED >
+    <!-- TODO: check to see if this should be minimized -->
+    <!-- at MATCH:literal/Bh, Bhm, Gy, GyM, GyMEd, GyMMM, GyMMMEd, GyMMMd, GyMd, H, Hm, Hmv, Hv, M, MEd, MMM, MMMEEEEd, MMMEd, MMMM, MMMMEd, MMMMd, MMMd, Md, d, h, hm, hmv, hv, y, yM, yMEd, yMMM, yMMMEEEEd, yMMMEd, yMMMM, yMMMMEEEEd, yMMMMEd, yMMMMd, yMMMd, yMd, GGGGGyM, GGGGGyMEd, GGGGGyMd, GyMMMM, GyMMMMEd, GyMMMMd-->
+<!ATTLIST intervalFormatItem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST intervalFormatItem draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST intervalFormatItem references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST intervalFormatItem validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT greatestDifference ( #PCDATA ) >
+<!ATTLIST greatestDifference id NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/B, G, H, M, a, d, h, m, y-->
+<!ATTLIST greatestDifference alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST greatestDifference draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST greatestDifference references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST greatestDifference validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT fields ( alias | ( field*, special* ) ) >
+<!ATTLIST fields alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST fields draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fields standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fields references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST fields validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT field ( alias | ( displayName*, relative*, relativeTime*, relativePeriod*, special* ) ) >
+<!ATTLIST field type (era | era-short | era-narrow | year | year-short | year-narrow | quarter | quarter-short | quarter-narrow | month | month-short | month-narrow | week | week-short | week-narrow | weekOfMonth | weekOfMonth-short | weekOfMonth-narrow | day | day-short | day-narrow | dayOfYear | dayOfYear-short | dayOfYear-narrow | weekday | weekday-short | weekday-narrow | weekdayOfMonth | weekdayOfMonth-short | weekdayOfMonth-narrow | sun | sun-short | sun-narrow | mon | mon-short | mon-narrow | tue | tue-short | tue-narrow | wed | wed-short | wed-narrow | thu | thu-short | thu-narrow | fri | fri-short | fri-narrow | sat | sat-short | sat-narrow | dayperiod | dayperiod-short | dayperiod-narrow | hour | hour-short | hour-narrow | minute | minute-short | minute-narrow | second | second-short | second-narrow | zone | zone-short | zone-narrow) #REQUIRED >
+<!ATTLIST field alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST field draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST field standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST field references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST field validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT relative ( #PCDATA ) >
+<!ATTLIST relative type NMTOKEN #REQUIRED >
+    <!-- TODO: determine whether to allow 3 -->
+    <!-- at MATCH:range/-2~3-->
+<!ATTLIST relative alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST relative draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST relative references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST relative validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT relativeTime ( alias | ( relativeTimePattern*, special* ) ) >
+<!ATTLIST relativeTime type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/future, past-->
+<!ATTLIST relativeTime alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST relativeTime draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST relativeTime references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST relativeTime validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT relativeTimePattern ( #PCDATA ) >
+<!ATTLIST relativeTimePattern count (zero | one | two | few | many | other) #REQUIRED >
+<!ATTLIST relativeTimePattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST relativeTimePattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST relativeTimePattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST relativeTimePattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT relativePeriod ( #PCDATA ) >
+<!ATTLIST relativePeriod alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST relativePeriod draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT timeZoneNames ( alias | ( hourFormat*, hoursFormat*, gmtFormat*, gmtZeroFormat*, regionFormat*, fallbackFormat*, fallbackRegionFormat*, abbreviationFallback*, preferenceOrdering*, singleCountries*, default*, zone*, metazone*, special* ) ) >
+<!ATTLIST timeZoneNames draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST timeZoneNames validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT hourFormat ( #PCDATA ) >
+<!ATTLIST hourFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST hourFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST hourFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT hoursFormat ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST hoursFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST hoursFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST hoursFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT gmtFormat ( #PCDATA ) >
+<!ATTLIST gmtFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST gmtFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST gmtFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT gmtZeroFormat ( #PCDATA ) >
+<!ATTLIST gmtZeroFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST gmtZeroFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST gmtZeroFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT regionFormat ( #PCDATA ) >
+<!ATTLIST regionFormat type (standard | daylight) #IMPLIED >
+<!ATTLIST regionFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST regionFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST regionFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT fallbackFormat ( #PCDATA ) >
+<!ATTLIST fallbackFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST fallbackFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST fallbackFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT fallbackRegionFormat ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST fallbackRegionFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fallbackRegionFormat draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST fallbackRegionFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT abbreviationFallback EMPTY >
+    <!-- at DEPRECATED-->
+<!ATTLIST abbreviationFallback type (GMT | standard) #IMPLIED >
+    <!-- use choice instead -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST abbreviationFallback choice (GMT | standard) #IMPLIED >
+    <!-- really required, but needs to be optional to support type also -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST abbreviationFallback alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST abbreviationFallback draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST abbreviationFallback references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT preferenceOrdering EMPTY >
+    <!-- use metazones instead -->
+    <!-- at DEPRECATED-->
+<!ATTLIST preferenceOrdering type CDATA #IMPLIED >
+    <!-- use choice instead -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST preferenceOrdering choice CDATA #IMPLIED >
+    <!-- really required, but needs to be optional to support type also -->
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST preferenceOrdering alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST preferenceOrdering draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST preferenceOrdering references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT singleCountries EMPTY >
+    <!-- at DEPRECATED-->
+<!ATTLIST singleCountries list CDATA #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST singleCountries alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST singleCountries draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST singleCountries references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT zone ( alias | ( long*, short*, commonlyUsed*, exemplarCity*, special* ) ) >
+<!ATTLIST zone type CDATA #REQUIRED >
+    <!-- at MATCH:bcp47/tz-->
+<!ATTLIST zone alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST zone draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST zone standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST zone references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST zone validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT long ( alias | ( generic*, standard*, daylight*, special* ) ) >
+<!ATTLIST long alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST long draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST long references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST long validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT generic ( #PCDATA ) >
+<!ATTLIST generic alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST generic draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST generic references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT standard ( #PCDATA ) >
+<!ATTLIST standard alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST standard draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST standard references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT daylight ( #PCDATA ) >
+<!ATTLIST daylight alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST daylight draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST daylight references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT short ( alias | ( generic*, standard*, daylight*, special* ) ) >
+<!ATTLIST short alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST short draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST short references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST short validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT commonlyUsed ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST commonlyUsed used (true | false) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST commonlyUsed alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST commonlyUsed draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST commonlyUsed references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT exemplarCity ( #PCDATA ) >
+<!ATTLIST exemplarCity alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/formal, secondary-->
+<!ATTLIST exemplarCity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST exemplarCity references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT metazone ( alias | ( long*, short*, commonlyUsed*, special* ) ) >
+<!ATTLIST metazone type CDATA #REQUIRED >
+    <!-- at MATCH:metazone-->
+<!ATTLIST metazone alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST metazone draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST metazone standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST metazone references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST metazone validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT numbers ( alias | ( defaultNumberingSystem*, otherNumberingSystems*, minimumGroupingDigits*, symbols*, decimalFormats*, scientificFormats*, percentFormats*, currencyFormats*, currencies?, miscPatterns*, minimalPairs*, special* ) ) >
+<!ATTLIST numbers alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST numbers draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST numbers standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST numbers references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST numbers validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT defaultNumberingSystem ( #PCDATA ) >
+<!ATTLIST defaultNumberingSystem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+<!ATTLIST defaultNumberingSystem draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST defaultNumberingSystem references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT otherNumberingSystems ( alias | ( native*, traditional*, finance*, special* ) ) >
+<!ATTLIST otherNumberingSystems alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST otherNumberingSystems draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT native ( #PCDATA ) >
+<!ATTLIST native alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST native draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+
+<!ELEMENT traditional ( #PCDATA ) >
+<!ATTLIST traditional alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST traditional draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+
+<!ELEMENT finance ( #PCDATA ) >
+<!ATTLIST finance alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST finance draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+
+<!ELEMENT minimumGroupingDigits ( #PCDATA ) >
+<!ATTLIST minimumGroupingDigits alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST minimumGroupingDigits draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST minimumGroupingDigits references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT symbols ( alias | ( decimal*, group*, list*, percentSign*, nativeZeroDigit*, patternDigit*, plusSign*, minusSign*, approximatelySign*, exponential*, superscriptingExponent*, perMille*, infinity*, nan*, currencyDecimal*, currencyGroup*, timeSeparator*, special* ) ) >
+<!ATTLIST symbols alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST symbols draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST symbols standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST symbols references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST symbols validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST symbols numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT decimal ( #PCDATA ) >
+<!ATTLIST decimal alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST decimal draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST decimal references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST decimal numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT group ( #PCDATA ) >
+<!ATTLIST group alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST group draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST group references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST group numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT list ( #PCDATA ) >
+<!ATTLIST list alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST list draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST list references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST list numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT percentSign ( #PCDATA ) >
+<!ATTLIST percentSign alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST percentSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST percentSign references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST percentSign numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT nativeZeroDigit ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST nativeZeroDigit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST nativeZeroDigit draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST nativeZeroDigit references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST nativeZeroDigit numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT patternDigit ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST patternDigit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST patternDigit draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST patternDigit references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST patternDigit numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT plusSign ( #PCDATA ) >
+<!ATTLIST plusSign alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST plusSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST plusSign references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST plusSign numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT minusSign ( #PCDATA ) >
+<!ATTLIST minusSign alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST minusSign draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST minusSign references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST minusSign numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT approximatelySign ( #PCDATA ) >
+<!ATTLIST approximatelySign alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST approximatelySign draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST approximatelySign references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT exponential ( #PCDATA ) >
+<!ATTLIST exponential alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST exponential draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST exponential references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST exponential numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT superscriptingExponent ( #PCDATA ) >
+<!ATTLIST superscriptingExponent alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST superscriptingExponent draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST superscriptingExponent references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT perMille ( #PCDATA ) >
+<!ATTLIST perMille alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST perMille draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST perMille references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST perMille numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT infinity ( #PCDATA ) >
+<!ATTLIST infinity alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST infinity draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST infinity references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST infinity numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT nan ( #PCDATA ) >
+<!ATTLIST nan alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST nan draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST nan references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST nan numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currencyDecimal ( #PCDATA ) >
+<!ATTLIST currencyDecimal alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currencyDecimal draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST currencyDecimal references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST currencyDecimal numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currencyGroup ( #PCDATA ) >
+<!ATTLIST currencyGroup alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currencyGroup draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST currencyGroup references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST currencyGroup numberSystem CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT timeSeparator ( #PCDATA ) >
+<!ATTLIST timeSeparator alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST timeSeparator draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST timeSeparator references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT decimalFormats ( alias | ( default*, decimalFormatLength*, special* ) ) >
+<!ATTLIST decimalFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormats numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT decimalFormatLength ( alias | ( default*, decimalFormat*, special* ) ) >
+<!ATTLIST decimalFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST decimalFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST decimalFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST decimalFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT decimalFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST decimalFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST decimalFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST decimalFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST decimalFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST decimalFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT scientificFormats ( alias | ( default*, scientificFormatLength*, special* ) ) >
+<!ATTLIST scientificFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormats numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT scientificFormatLength ( alias | ( default*, scientificFormat*, special* ) ) >
+<!ATTLIST scientificFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST scientificFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST scientificFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST scientificFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT scientificFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST scientificFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST scientificFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST scientificFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST scientificFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST scientificFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT percentFormats ( alias | ( default*, percentFormatLength*, special* ) ) >
+<!ATTLIST percentFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormats numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT percentFormatLength ( alias | ( default*, percentFormat*, special* ) ) >
+<!ATTLIST percentFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST percentFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST percentFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST percentFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT percentFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST percentFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST percentFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST percentFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST percentFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST percentFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currencyFormats ( alias | ( default*, currencySpacing*, currencyFormatLength*, unitPattern*, special* ) ) >
+<!ATTLIST currencyFormats draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormats validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormats numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT currencySpacing ( alias | ( beforeCurrency*, afterCurrency*, special* ) ) >
+
+<!ELEMENT beforeCurrency ( alias | ( currencyMatch*, surroundingMatch*, insertBetween*, special* ) ) >
+
+<!ELEMENT currencyMatch ( #PCDATA ) >
+<!ATTLIST currencyMatch alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currencyMatch draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST currencyMatch references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT surroundingMatch ( #PCDATA ) >
+<!ATTLIST surroundingMatch alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST surroundingMatch draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST surroundingMatch references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT insertBetween ( #PCDATA ) >
+<!ATTLIST insertBetween alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST insertBetween draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST insertBetween references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT afterCurrency ( alias | ( currencyMatch*, surroundingMatch*, insertBetween*, special* ) ) >
+
+<!ELEMENT currencyFormatLength ( alias | ( default*, currencyFormat*, special* ) ) >
+<!ATTLIST currencyFormatLength type (full | long | medium | short) #IMPLIED >
+<!ATTLIST currencyFormatLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currencyFormatLength draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormatLength standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormatLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST currencyFormatLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currencyFormat ( alias | ( pattern*, special* ) ) >
+<!ATTLIST currencyFormat type NMTOKEN "standard" >
+    <!-- at MATCH:literal/accounting, standard-->
+<!ATTLIST currencyFormat alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currencyFormat draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormat standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencyFormat references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST currencyFormat validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT unitPattern ( #PCDATA ) >
+<!ATTLIST unitPattern count (0 | 1 | zero | one | two | few | many | other) #REQUIRED >
+<!ATTLIST unitPattern case NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/ablative, accusative, comitative, dative, ergative, genitive, instrumental, locative, locativecopulative, nominative, oblique, prepositional, sociative, vocative, elative, illative, partitive, terminative, translative-->
+<!ATTLIST unitPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST unitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST unitPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST unitPattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currencies ( alias | ( default?, currency*, special* ) ) >
+<!ATTLIST currencies draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currencies validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT currency ( alias | ( ( ( pattern+, displayName*, symbol* ) | ( displayName+, symbol*, pattern* ) | ( symbol+, pattern* ) )?, decimal*, group*, special* ) ) >
+
+<!-- # warning: pattern appears twice in the above. The first is for consistency with all other cases of
+    pattern + displayName; the second is for backwards compatibility -->
+<!ATTLIST currency type NMTOKEN "standard" >
+    <!-- at MATCH:validity/currency-->
+<!ATTLIST currency alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST currency draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST currency references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST currency validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT symbol ( #PCDATA ) >
+<!ATTLIST symbol choice (true | false) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST symbol alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/formal, narrow, variant-->
+<!ATTLIST symbol draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST symbol references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT miscPatterns ( alias | ( default*, pattern*, special* ) ) >
+<!ATTLIST miscPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST miscPatterns numberSystem CDATA #IMPLIED >
+    <!-- at MATCH:bcp47/nu-->
+
+<!ELEMENT minimalPairs ( alias | ( pluralMinimalPairs*, ordinalMinimalPairs*, caseMinimalPairs*, genderMinimalPairs*, special* ) ) >
+<!ATTLIST minimalPairs alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST minimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT pluralMinimalPairs ( #PCDATA ) >
+<!ATTLIST pluralMinimalPairs count NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/few, many, one, other, two, zero-->
+<!ATTLIST pluralMinimalPairs alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST pluralMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT ordinalMinimalPairs ( #PCDATA ) >
+<!ATTLIST ordinalMinimalPairs ordinal NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/few, many, one, other, two, zero-->
+<!ATTLIST ordinalMinimalPairs alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST ordinalMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT caseMinimalPairs ( #PCDATA ) >
+<!ATTLIST caseMinimalPairs case NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/ablative, accusative, comitative, dative, ergative, genitive, instrumental, locative, locativecopulative, nominative, oblique, prepositional, sociative, vocative, elative, illative, partitive, terminative, translative-->
+<!ATTLIST caseMinimalPairs alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST caseMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT genderMinimalPairs ( #PCDATA ) >
+<!ATTLIST genderMinimalPairs gender NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/animate, common, feminine, inanimate, masculine, neuter, personal-->
+<!ATTLIST genderMinimalPairs alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST genderMinimalPairs draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT units ( alias | ( unit*, unitLength*, durationUnit*, special* ) ) >
+<!ATTLIST units alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST units draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST units references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST units validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT unit ( alias | ( gender*, displayName*, unitPattern*, perUnitPattern*, special* ) ) >
+<!ATTLIST unit type NMTOKEN #REQUIRED >
+    <!-- at MATCH:validity/unit-->
+<!ATTLIST unit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST unit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST unit references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST unit validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT gender ( #PCDATA ) >
+<!ATTLIST gender alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/animate, common, feminine, inanimate, masculine, neuter, personal-->
+<!ATTLIST gender draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT perUnitPattern ( #PCDATA ) >
+<!ATTLIST perUnitPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST perUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST perUnitPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT unitLength ( alias | ( compoundUnit*, unit*, coordinateUnit*, special* ) ) >
+<!ATTLIST unitLength type (long | short | narrow) #REQUIRED >
+<!ATTLIST unitLength alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST unitLength draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST unitLength references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST unitLength validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT compoundUnit ( alias | ( compoundUnitPattern1*, compoundUnitPattern*, unitPrefixPattern*, special* ) ) >
+<!ATTLIST compoundUnit type NMTOKEN #REQUIRED >
+    <!-- at MATCH:or/regex/10p-?[0-9]{1,2}||regex/1024p[1-8]||literal/per, times, power2, power3-->
+<!ATTLIST compoundUnit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST compoundUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST compoundUnit references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST compoundUnit validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT compoundUnitPattern1 ( #PCDATA ) >
+<!ATTLIST compoundUnitPattern1 count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+<!ATTLIST compoundUnitPattern1 gender NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/animate, common, feminine, inanimate, masculine, neuter, personal-->
+<!ATTLIST compoundUnitPattern1 case NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/ablative, accusative, comitative, dative, ergative, genitive, instrumental, locative, locativecopulative, nominative, oblique, prepositional, sociative, vocative-->
+<!ATTLIST compoundUnitPattern1 alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST compoundUnitPattern1 draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST compoundUnitPattern1 references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT compoundUnitPattern ( #PCDATA ) >
+<!ATTLIST compoundUnitPattern case NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/ablative, accusative, comitative, dative, ergative, genitive, instrumental, locative, locativecopulative, nominative, oblique, prepositional, sociative, vocative-->
+<!ATTLIST compoundUnitPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST compoundUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST compoundUnitPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST compoundUnitPattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT unitPrefixPattern ( #PCDATA ) >
+<!ATTLIST unitPrefixPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST unitPrefixPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST unitPrefixPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT coordinateUnit ( alias | ( displayName*, coordinateUnitPattern*, special* ) ) >
+<!ATTLIST coordinateUnit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST coordinateUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT coordinateUnitPattern ( #PCDATA ) >
+<!ATTLIST coordinateUnitPattern type (north | east | south | west) #REQUIRED >
+<!ATTLIST coordinateUnitPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST coordinateUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT durationUnit ( alias | ( durationUnitPattern*, special* ) ) >
+<!ATTLIST durationUnit type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/hm, hms, ms-->
+<!ATTLIST durationUnit alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST durationUnit draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST durationUnit references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT durationUnitPattern ( #PCDATA ) >
+<!ATTLIST durationUnitPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST durationUnitPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST durationUnitPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST durationUnitPattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT listPatterns ( alias | ( listPattern*, special* ) ) >
+<!ATTLIST listPatterns alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST listPatterns draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST listPatterns references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST listPatterns validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT listPattern ( alias | ( listPatternPart*, special* ) ) >
+<!ATTLIST listPattern type NMTOKEN #IMPLIED >
+    <!-- at MATCH:literal/or, or-narrow, or-short, standard-narrow, standard-short, unit, unit-narrow, unit-short-->
+<!ATTLIST listPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST listPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST listPattern references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST listPattern validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT listPatternPart ( #PCDATA ) >
+<!ATTLIST listPatternPart type (start | middle | end | 2 | 3) #REQUIRED >
+<!ATTLIST listPatternPart alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST listPatternPart draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST listPatternPart references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST listPatternPart validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT collations ( alias | ( defaultCollation?, default*, collation*, special* ) ) >
+<!ATTLIST collations version NMTOKEN #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST collations draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- should be DEPRECATED, but needs some cleanup first -->
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST collations validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT defaultCollation ( #PCDATA ) >
+<!ATTLIST defaultCollation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST defaultCollation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT collation ( alias | ( base?, import*, settings?, suppress_contractions?, optimize?, ( cr* | rules? ), special* ) ) >
+<!ATTLIST collation type NMTOKEN "standard" >
+    <!-- at MATCH:or/bcp47/co||regex/private-.*||literal/digits-after-->
+<!ATTLIST collation visibility (internal | external) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST collation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/proposed, short, variant-->
+<!ATTLIST collation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST collation standard CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST collation references CDATA #IMPLIED >
+    <!-- at MATCH:any-->
+    <!-- at METADATA-->
+<!ATTLIST collation validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT base ( alias | special ) >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT import EMPTY >
+    <!-- deprecated, see CLDR ticket #8289 -->
+    <!-- at DEPRECATED-->
+<!ATTLIST import source CDATA #REQUIRED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST import type CDATA #IMPLIED >
+    <!-- at DEPRECATED-->
+<!ATTLIST import draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST import references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT settings ( special* ) >
+    <!-- deprecated, see CLDR ticket #8289 -->
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings strength (primary | secondary | tertiary | quaternary | identical) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings alternate (non-ignorable | shifted) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings backwards (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings normalization (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings caseLevel (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings caseFirst (upper | lower | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings hiraganaQuarternary (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings hiraganaQuaternary (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings maxVariable (space | punct | symbol | currency) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings numeric (on | off) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings private (true | false) #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings variableTop CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST settings reorder NMTOKENS #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT suppress_contractions ( #PCDATA | cp )* >
+    <!-- deprecated, see CLDR ticket #8289 -->
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT optimize ( #PCDATA | cp )* >
+    <!-- deprecated, see CLDR ticket #8289 -->
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT cr ( #PCDATA ) >
+<!ATTLIST cr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST cr draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST cr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- # Use the cr element instead, with ICU syntax. -->
+
+<!ELEMENT rules ( alias | ( ( reset | import ), ( reset | import | p | pc | s | sc | t | tc | q | qc | i | ic | x )* ) ) >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT reset ( #PCDATA | cp | first_variable | last_variable | first_tertiary_ignorable | last_tertiary_ignorable | first_secondary_ignorable | last_secondary_ignorable | first_primary_ignorable | last_primary_ignorable | first_non_ignorable | last_non_ignorable | first_trailing | last_trailing )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+<!ATTLIST reset before NMTOKEN #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_variable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_variable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_tertiary_ignorable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_tertiary_ignorable EMPTY >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_secondary_ignorable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_secondary_ignorable EMPTY >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_primary_ignorable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_primary_ignorable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_non_ignorable EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_non_ignorable EMPTY >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT first_trailing EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT last_trailing EMPTY >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT p ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT pc ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT s ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT sc ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT t ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT tc ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT q ( #PCDATA | cp | last_variable )* >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT qc ( #PCDATA | cp | last_variable )* >
+    <!-- at DEPRECATED-->
+
+<!ELEMENT i ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT ic ( #PCDATA | cp | last_variable )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT x ( context?, ( p | pc | s | sc | t | tc | q | qc | i | ic )*, extend? ) >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT context ( #PCDATA | cp )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT extend ( #PCDATA | cp )* >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+
+<!-- ######################################################### -->
+
+<!ELEMENT posix ( alias | ( messages*, special* ) ) >
+<!ATTLIST posix draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST posix references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST posix validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT messages ( alias | ( yesstr*, nostr*, yesexpr*, noexpr*, special* ) ) >
+<!ATTLIST messages alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST messages draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST messages references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST messages validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT yesstr ( #PCDATA ) >
+<!ATTLIST yesstr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST yesstr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST yesstr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT nostr ( #PCDATA ) >
+<!ATTLIST nostr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST nostr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST nostr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT yesexpr ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST yesexpr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST yesexpr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST yesexpr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT noexpr ( #PCDATA ) >
+    <!-- at DEPRECATED-->
+<!ATTLIST noexpr alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST noexpr draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST noexpr references CDATA #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT characterLabels ( alias | ( characterLabelPattern*, characterLabel*, special* ) ) >
+
+<!ELEMENT characterLabelPattern ( #PCDATA ) >
+<!ATTLIST characterLabelPattern type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/all, category-list, compatibility, enclosed, extended, historic, miscellaneous, other, scripts, strokes, subscript, superscript-->
+<!ATTLIST characterLabelPattern count (0 | 1 | zero | one | two | few | many | other) #IMPLIED >
+    <!-- count only used for certain patterns" -->
+<!ATTLIST characterLabelPattern alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST characterLabelPattern draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT characterLabel ( #PCDATA ) >
+<!ATTLIST characterLabel type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/activities, african_scripts, american_scripts, animal, animals_nature, arrows, body, box_drawing, braille, building, bullets_stars, consonantal_jamo, currency_symbols, dash_connector, digits, dingbats, divination_symbols, downwards_arrows, downwards_upwards_arrows, east_asian_scripts, emoji, european_scripts, female, flag, flags, food_drink, format, format_whitespace, full_width_form_variant, geometric_shapes, half_width_form_variant, han_characters, han_radicals, hanja, hanzi_simplified, hanzi_traditional, heart, historic_scripts, ideographic_desc_characters, japanese_kana, kanbun, kanji, keycap, leftwards_arrows, leftwards_rightwards_arrows, letterlike_symbols, limited_use, male, math_symbols, middle_eastern_scripts, miscellaneous, modern_scripts, modifier, musical_symbols, nature, nonspacing, numbers, objects, other, paired, person, phonetic_alphabet, pictographs, place, plant, punctuation, rightwards_arrows, sign_standard_symbols, small_form_variant, smiley, smileys_people, south_asian_scripts, southeast_asian_scripts, spacing, sport, symbols, technical_symbols, tone_marks, travel, travel_places, upwards_arrows, variant_forms, vocalic_jamo, weather, western_asian_scripts, whitespace-->
+<!ATTLIST characterLabel alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST characterLabel draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT segmentations ( alias | ( segmentation*, special* ) ) >
+<!ATTLIST segmentations alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST segmentations draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST segmentations references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST segmentations validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT segmentation ( alias | ( variables?, segmentRules?, exceptions?, suppressions? ) | special* ) >
+<!ATTLIST segmentation type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/GraphemeClusterBreak, LineBreak, SentenceBreak, WordBreak-->
+<!ATTLIST segmentation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST segmentation draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST segmentation references CDATA #IMPLIED >
+    <!-- at METADATA-->
+<!ATTLIST segmentation validSubLocales CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT variables ( alias | ( variable*, special* ) ) >
+
+<!ELEMENT variable ( #PCDATA ) >
+    <!-- at ORDERED-->
+<!ATTLIST variable id CDATA #REQUIRED >
+    <!-- at MATCH:regex/\$[a-zA-Z0-9_]+-->
+<!ATTLIST variable alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST variable draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST variable references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT segmentRules ( alias | ( rule*, special* ) ) >
+
+<!ELEMENT rule ( #PCDATA ) >
+<!ATTLIST rule id NMTOKEN #REQUIRED >
+    <!-- at MATCH:range/0.0~9999.0-->
+<!ATTLIST rule alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST rule draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+<!ATTLIST rule references CDATA #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT exceptions ( exception* ) >
+    <!-- use suppressions instead -->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT exception ( #PCDATA ) >
+    <!-- at ORDERED-->
+    <!-- at DEPRECATED-->
+<!ATTLIST exception draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT suppressions ( alias | ( suppression*, special* ) ) >
+<!ATTLIST suppressions type NMTOKEN "standard" >
+    <!-- at MATCH:literal/standard-->
+<!ATTLIST suppressions draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT suppression ( #PCDATA ) >
+    <!-- at ORDERED-->
+<!ATTLIST suppression alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST suppression draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT rbnf ( alias | ( rulesetGrouping*, special* ) ) >
+
+<!ELEMENT rulesetGrouping ( alias | ( ruleset*, special* ) ) >
+<!ATTLIST rulesetGrouping type NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/NumberingSystemRules, OrdinalRules, SpelloutRules-->
+<!ATTLIST rulesetGrouping draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT ruleset ( alias | ( rbnfrule*, special* ) ) >
+    <!-- at ORDERED-->
+<!ATTLIST ruleset type NMTOKEN #REQUIRED >
+    <!-- at MATCH:regex/(ord-M-)?[\-0-9a-z]+-->
+<!ATTLIST ruleset access (public | private) #IMPLIED >
+    <!-- at VALUE-->
+<!ATTLIST ruleset allowsParsing (true | false) #IMPLIED >
+    <!-- at VALUE-->
+<!ATTLIST ruleset draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT rbnfrule ( #PCDATA ) >
+    <!-- at ORDERED-->
+<!ATTLIST rbnfrule value CDATA #REQUIRED >
+    <!-- at MATCH:or/range/-1.0E20~1.0E20||literal/-x, 0, 0.x, NaN, -Inf, Inf, x,x, x.x-->
+    <!-- at VALUE-->
+<!ATTLIST rbnfrule radix CDATA #IMPLIED >
+    <!-- at MATCH:literal/1,000, 100, 1000, 100000, 20-->
+    <!-- at VALUE-->
+<!ATTLIST rbnfrule decexp CDATA #IMPLIED >
+    <!-- at VALUE-->
+<!ATTLIST rbnfrule alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST rbnfrule draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED:true, false-->
+
+<!ELEMENT typographicNames ( alias | ( axisName*, styleName*, featureName*, special* ) ) >
+
+<!ELEMENT axisName ( #PCDATA ) >
+<!ATTLIST axisName type (ital | opsz | slnt | wdth | wght) #REQUIRED >
+<!ATTLIST axisName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST axisName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT styleName ( #PCDATA ) >
+<!ATTLIST styleName type (ital | opsz | slnt | wdth | wght) #REQUIRED >
+<!ATTLIST styleName subtype NMTOKEN #REQUIRED >
+    <!-- at MATCH:literal/-12, 0, 1, 100, 112.5, 12, 125, 144, 150, 18, 200, 24, 300, 350, 380, 400, 50, 500, 600, 62.5, 700, 72, 75, 8, 800, 87.5, 900, 950-->
+<!ATTLIST styleName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/compressed, demi, extended, heavy, narrow, short, ultra, ultrablack, ultraheavy, wide-->
+<!ATTLIST styleName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT featureName ( #PCDATA ) >
+<!ATTLIST featureName type (afrc | cpsp | dlig | frac | lnum | onum | ordn | pnum | smcp | tnum | zero) #REQUIRED >
+<!ATTLIST featureName alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/short, variant-->
+<!ATTLIST featureName draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT annotations ( alias | ( annotation*, special* ) ) >
+
+<!ELEMENT annotation ( #PCDATA ) >
+<!ATTLIST annotation cp CDATA #REQUIRED >
+    <!-- at MATCH:any-->
+<!ATTLIST annotation tts CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST annotation type (tts) #IMPLIED >
+<!ATTLIST annotation alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST annotation draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!-- ######################################################### -->
+<!-- # This element contains metadata for Survey Tool internal use (optimization, etc). -->
+
+<!ELEMENT metadata ( alias | ( casingData?, special* ) ) >
+    <!-- at METADATA-->
+
+<!ELEMENT casingData ( alias | ( casingItem*, special* ) ) >
+    <!-- at METADATA-->
+
+<!ELEMENT casingItem ( #PCDATA ) >
+<!ATTLIST casingItem type CDATA #REQUIRED >
+    <!-- at MATCH:any-->
+<!ATTLIST casingItem override (true | false) #IMPLIED >
+    <!-- at VALUE-->
+<!ATTLIST casingItem forceError (true | false) #IMPLIED >
+    <!-- at VALUE-->
+<!ATTLIST casingItem alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+<!ATTLIST casingItem draft (approved | contributed | provisional | unconfirmed) #IMPLIED >
+    <!-- at METADATA-->
+
+<!ELEMENT references ( reference* ) >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+
+<!ELEMENT reference ( #PCDATA ) >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST reference type NMTOKEN #REQUIRED >
+    <!-- at DEPRECATED-->
+<!ATTLIST reference uri CDATA #IMPLIED >
+    <!-- at VALUE-->
+    <!-- at DEPRECATED-->
+<!ATTLIST reference alt NMTOKENS #IMPLIED >
+    <!-- at MATCH:literal/variant-->
+    <!-- at DEPRECATED-->
+<!ATTLIST reference draft (approved | contributed | provisional | unconfirmed | true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->
+<!ATTLIST reference standard (true | false) #IMPLIED >
+    <!-- at METADATA-->
+    <!-- at DEPRECATED-->


Property changes on: trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldml.dtd
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldmlICU.dtd
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldmlICU.dtd	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldmlICU.dtd	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,125 @@
+<!--
+Copyright © 1991-2021 Unicode, Inc.
+For terms of use, see http://www.unicode.org/copyright.html
+SPDX-License-Identifier: Unicode-DFS-2016
+CLDR data files are interpreted according to the LDML specification (http://unicode.org/reports/tr35/)
+-->
+
+<!--
+NOTE: Unlike the other DTDs, this file is manually maintained.
+-->
+
+<!-- ######################################################### -->
+<!-- The alias, default, special and cp elements are already defined in ldml.dtd. Defining them here as well would break locale conversion.  -->
+<!-- ######################################################### -->
+
+<!--  ICU Specific elements                                    -->
+<!-- ######################################################### -->
+<!ATTLIST special xmlns:icu CDATA #IMPLIED>
+<!ATTLIST special icu:version CDATA #IMPLIED>
+
+<!ELEMENT icu:version EMPTY>
+<!ATTLIST icu:version icu:specialVersion  CDATA #FIXED "41" >
+<!ATTLIST icu:version icu:requiredLDMLVersion CDATA #FIXED "41" >
+
+<!-- ICU Scripts -->
+
+<!ELEMENT icu:scripts (alias | icu:script* ) >
+<!ATTLIST icu:scripts draft ( true | false ) #IMPLIED >
+<!ATTLIST icu:scripts standard CDATA #IMPLIED >
+
+<!ELEMENT icu:script ( #PCDATA ) >
+<!ATTLIST icu:script type NMTOKEN #REQUIRED >
+<!ATTLIST icu:script draft ( true | false ) #IMPLIED >
+
+<!-- RBNF data -->
+<!ELEMENT icu:ruleBasedNumberFormats ( alias | (default?, icu:ruleBasedNumberFormat*)) >
+
+<!-- Either bare data or any number of cp -->
+<!ELEMENT icu:ruleBasedNumberFormat (#PCDATA | cp)* >
+<!ATTLIST icu:ruleBasedNumberFormat type NMTOKEN #IMPLIED >
+
+<!-- RBBI data -->
+<!ELEMENT icu:breakIteratorData (alias | (icu:boundaries?, icu:dictionaries?, icu:extensions?, icu:lstm?)) >
+
+<!ELEMENT icu:boundaries (alias | (icu:grapheme?, icu:word?, icu:line*, icu:sentence?, icu:title?, icu:xgc?)) >
+
+<!ELEMENT icu:dictionaries (alias | (icu:dictionary*)) >
+
+<!ELEMENT icu:extensions (alias | (icu:extension*)) >
+
+<!ELEMENT icu:extension ( #PCDATA ) >
+    <!-- at ORDERED-->
+
+<!ELEMENT icu:lstm (alias | (icu:lstmdata*)) >
+
+<!ELEMENT icu:lstmdata ( #PCDATA ) >
+<!ATTLIST icu:lstmdata icu:dependency NMTOKEN #IMPLIED >
+<!ATTLIST icu:lstmdata type NMTOKEN #REQUIRED >
+
+<!ELEMENT icu:dictionary ( #PCDATA ) >
+<!ATTLIST icu:dictionary icu:dependency NMTOKEN #IMPLIED >
+<!ATTLIST icu:dictionary type NMTOKEN #REQUIRED >
+
+<!ELEMENT icu:grapheme ( #PCDATA ) >
+<!ATTLIST icu:grapheme icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:grapheme icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:word ( #PCDATA ) >
+<!ATTLIST icu:word icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:word icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:line ( #PCDATA ) >
+<!ATTLIST icu:line icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:line icu:dependency NMTOKEN #IMPLIED >
+<!ATTLIST icu:line alt NMTOKENS #IMPLIED >
+
+<!ELEMENT icu:sentence ( #PCDATA ) >
+<!ATTLIST icu:sentence icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:sentence icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:title ( #PCDATA ) >
+<!ATTLIST icu:title icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:title icu:dependency NMTOKEN #IMPLIED >
+
+<!ELEMENT icu:xgc ( #PCDATA ) >
+<!ATTLIST icu:xgc icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:append NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:xgc icu:dependency NMTOKEN #IMPLIED >
+
+<!--deprecated -->
+<!ELEMENT icu:breakDictionaryData EMPTY >
+<!ATTLIST icu:breakDictionaryData icu:class NMTOKEN #IMPLIED >
+<!ATTLIST icu:breakDictionaryData icu:import NMTOKEN #IMPLIED >
+<!ATTLIST icu:breakDictionaryData icu:importFile CDATA #IMPLIED >
+
+<!-- RBT data  -->
+<!ELEMENT icu:transforms ( alias | (default?, icu:transform*)) >
+<!ELEMENT icu:transform ( #PCDATA |cp )* >
+<!ATTLIST icu:transform type NMTOKEN #REQUIRED >
+
+<!-- leap month information, all deprecated -->
+<!ELEMENT icu:isLeapMonth ( alias | (icu:nonLeapSymbol?, icu:leapSymbol? ))> <!-- deprecated -->
+<!ELEMENT icu:nonLeapSymbol ( #PCDATA ) > <!-- deprecated -->
+<!ELEMENT icu:leapSymbol ( #PCDATA ) > <!-- deprecated -->
+
+<!-- UCA Rules -->
+<!ELEMENT icu:UCARules EMPTY >
+<!ATTLIST icu:UCARules icu:uca_rules CDATA #REQUIRED >
+
+<!-- Dependencies Rules -->
+<!ELEMENT icu:depends EMPTY >
+<!ATTLIST icu:depends icu:dependency CDATA #REQUIRED >
+
+<!-- ######################################################### -->


Property changes on: trunk/Build/source/libs/icu/icu-src/source/data/dtd/cldr/common/dtd/ldmlICU.dtd
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Build/source/libs/icu/icu-src/source/data/in/icudt70l.dat
===================================================================
(Binary files differ)

Added: trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat
===================================================================
(Binary files differ)

Index: trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat	2022-05-31 01:17:15 UTC (rev 63452)

Property changes on: trunk/Build/source/libs/icu/icu-src/source/data/in/icudt71l.dat
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Modified: trunk/Build/source/libs/icu/icu-src/source/data/makedata.mak
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/makedata.mak	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/data/makedata.mak	2022-05-31 01:17:15 UTC (rev 63452)
@@ -12,11 +12,11 @@
 
 ##############################################################################
 # Keep the following in sync with the version - see common/unicode/uvernum.h
-U_ICUDATA_NAME=icudt70
+U_ICUDATA_NAME=icudt71
 ##############################################################################
 !IF "$(UWP)" == "UWP"
 # Optionally change the name of the data file for the UWP version.
-U_ICUDATA_NAME=icudt70
+U_ICUDATA_NAME=icudt71
 !ENDIF
 U_ICUDATA_ENDIAN_SUFFIX=l
 UNICODE_VERSION=14.0
@@ -142,6 +142,13 @@
 ICUTOOLS=$(ICUP)\source\tools
 !MESSAGE ICU tools path is $(ICUTOOLS)
 
+NATIVE_ARM=
+!IF "$(PROCESSOR_ARCHITECTURE)" == "ARM64" || "$(PROCESSOR_ARCHITEW6432)" == "ARM64"
+NATIVE_ARM=ARM64
+!ELSE IF "$(PROCESSOR_ARCHITECTURE)" == "ARM" || "$(PROCESSOR_ARCHITEW6432)" == "ARM"
+NATIVE_ARM=ARM
+!ENDIF
+
 #   ARM_CROSS_BUILD
 #       In order to support cross-compiling for ARM/ARM64 using the x64 tools
 #       we need to know if we're building the ARM/ARM64 data DLL, otherwise
@@ -148,7 +155,7 @@
 #       the existence of the x64 bits will cause us to think we are already done.
 #    Note: This is only for the "regular" builds, the UWP builds have a separate project file entirely.
 ARM_CROSS_BUILD=
-!IF "$(UWP)" == ""
+!IF "$(UWP)" == "" && "$(NATIVE_ARM)" == ""
 !IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
 ARM_CROSS_BUILD=ARM
 ARM_CROSSBUILD_TS=$(ICUTMP)\$(ARM_CROSS_BUILD).timestamp
@@ -185,7 +192,19 @@
 !IF "$(CFG)" == "x86\Release" || "$(CFG)" == "x86\Debug"
 PATH = $(ICUP)\bin;$(PATH)
 ICUPBIN=$(ICUP)\bin
+# Use these path whether or not it's UWP build.
+!ELSE IF "$(NATIVE_ARM)" != ""
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
+PATH = $(ICUP)\binARM;$(PATH)
+ICUPBIN=$(ICUP)\binARM
+!ELSE IF "$(CFG)" == "ARM64\Release" || "$(CFG)" == "ARM64\Debug"
+PATH = $(ICUP)\binARM64;$(PATH)
+ICUPBIN=$(ICUP)\binARM64
 !ELSE
+!ERROR Cross-build from ARM to x86 is not supported!
+!ENDIF
+# Build x86_64 or cross-build ARM
+!ELSE
 PATH = $(ICUP)\bin64;$(PATH)
 ICUPBIN=$(ICUP)\bin64
 !ENDIF

Deleted: trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,13 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This Bazel build file is needed to declare targets for the files used as
-# inputs to binary executables that are a part of other Bazel genrule targets.
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-exports_files([
-    "nfc.txt", "nfkc.txt", "nfkc_cf.txt", "uts46.txt",
-])

Added: trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/data/unidata/norm2/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,13 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This Bazel build file is needed to declare targets for the files used as
+# inputs to binary executables that are a part of other Bazel genrule targets.
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+exports_files([
+    "nfc.txt", "nfkc.txt", "nfkc_cf.txt", "uts46.txt",
+])

Deleted: trunk/Build/source/libs/icu/icu-src/source/data/unidata/ucdterms.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/data/unidata/ucdterms.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/data/unidata/ucdterms.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,47 +0,0 @@
-UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
-
-Unicode Data Files include all data files under the directories
-http://www.unicode.org/Public/ and http://www.unicode.org/reports/.
-Unicode Software includes any source code under the directories
-http://www.unicode.org/Public/ and http://www.unicode.org/reports/.
-
-NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
-INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA FILES"),
-AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND
-BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE,
-DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
-
-COPYRIGHT AND PERMISSION NOTICE
-
-Copyright (C) 2016 and later: Unicode, Inc. and others.
-License & terms of use: http://www.unicode.org/copyright.html
-Copyright (c) 1991-2004 Unicode, Inc. All rights reserved. Distributed under the
-Terms of Use in http://www.unicode.org/copyright.html.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-the Unicode data files and associated documentation (the "Data Files") or
-Unicode software and associated documentation (the "Software") to deal in the
-Data Files or Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, and/or sell copies of
-the Data Files or Software, and to permit persons to whom the Data Files or
-Software are furnished to do so, provided that (a) the above copyright notice(s)
-and this permission notice appear in all copies of the Data Files or Software,
-(b) both the above copyright notice(s) and this permission notice appear in
-associated documentation, and (c) there is clear notice in each modified Data
-File or in the Software as well as in the documentation associated with the Data
-File(s) or Software that the data or software has been modified.
-
-THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
-PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
-NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
-DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR
-SOFTWARE.
-
-Except as contained in this notice, the name of a copyright holder shall not be
-used in advertising or otherwise to promote the sale, use or other dealings in
-these Data Files or Software without prior written authorization of the
-copyright holder.

Modified: trunk/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/extra/uconv/makedata.mak	2022-05-31 01:17:15 UTC (rev 63452)
@@ -51,8 +51,16 @@
 ICD=$(ICUDATA)^\
 DATA_PATH=$(ICUP)\data^\
 
+NATIVE_ARM=
+!IF "$(PROCESSOR_ARCHITECTURE)" == "ARM64" || "$(PROCESSOR_ARCHITEW6432)" == "ARM64"
+NATIVE_ARM=ARM64
+!ELSE IF "$(PROCESSOR_ARCHITECTURE)" == "ARM" || "$(PROCESSOR_ARCHITEW6432)" == "ARM"
+NATIVE_ARM=ARM
+!ENDIF
+
 # Use the x64 tools for building ARM and ARM64.
 # Note: This is similar to the TOOLS CFG PATH in source\data\makedata.mak
+!IF "$(NATIVE_ARM)" == ""
 !IF "$(CFG)" == "x64\Release" || "$(CFG)" == "x64\Debug" || "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug" || "$(CFG)" == "ARM64\Release"  || "$(CFG)" == "ARM64\Debug"
 ICUTOOLS=$(ICUP)\bin64
 PATH = $(ICUP)\bin64;$(PATH)
@@ -60,6 +68,15 @@
 ICUTOOLS=$(ICUP)\bin
 PATH = $(ICUP)\bin;$(PATH)
 !ENDIF
+!ELSE
+!IF "$(CFG)" == "ARM\Release" || "$(CFG)" == "ARM\Debug"
+ICUTOOLS=$(ICUP)\binARM
+PATH = $(ICUP)\binARM;$(PATH)
+!ELSE
+ICUTOOLS=$(ICUP)\binARM64
+PATH = $(ICUP)\binARM64;$(PATH)
+!ENDIF
+!ENDIF
 
 # If building ARM/ARM, then we need to pass the arch as an argument.
 EXTRA_PKGDATA_ARGUMENTS=

Deleted: trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,130 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This file defines Bazel targets for a subset of the ICU4C "i18n" library header and source files.
-# The configuration of dependencies among targets is strongly assisted by the
-# file in depstest that maintains such information, at
-# icu4c/source/test/depstest/dependencies.txt .
-
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-# When compiling code in the `common` dir, the constant
-# `U_I18n_IMPLEMENTATION` needs to be defined. See 
-# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
-
-# If linker errors occur, then this may be a sign that the dependencies were 
-# not specified correctly. Use dependencies.txt in depstest for assistance. See
-# https://stackoverflow.com/q/66111709/2077918 .
-
-cc_library(
-    name = "headers",
-    hdrs = glob([
-        "unicode/*.h", # public
-        "*.h",         # internal
-    ]),
-    # We need to add includes in order to preserve existing source files'
-    # include directives that use traditional paths, not paths relative to
-    # Bazel workspace:
-    # https://stackoverflow.com/a/65635893/2077918
-    includes = ["."],
-    local_defines = [
-        "U_I18N_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "collation",
-    srcs = [
-        "bocsu.cpp",
-        "coleitr.cpp",
-        "coll.cpp",
-        "collation.cpp",
-        "collationcompare.cpp",
-        "collationdata.cpp",
-        "collationdatareader.cpp",
-        "collationdatawriter.cpp",
-        "collationfastlatin.cpp",
-        # collationfcd.cpp is generated by genuca;
-        # probably hard to build genuca without depending on the old version.
-        "collationfcd.cpp",
-        "collationiterator.cpp",
-        "collationkeys.cpp",
-        "collationroot.cpp",
-        "collationrootelements.cpp",
-        "collationsets.cpp",
-        "collationsettings.cpp",
-        "collationtailoring.cpp",
-        "rulebasedcollator.cpp",
-        "sortkey.cpp",
-        "ucol.cpp",
-        "ucol_res.cpp",
-        "ucol_sit.cpp",
-        "ucoleitr.cpp",
-        "uitercollationiterator.cpp",
-        "utf16collationiterator.cpp",
-        "utf8collationiterator.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":headers",
-        ":uclean_i18n",
-        "//icu4c/source/common:bytestream",
-        "//icu4c/source/common:normalizer2",
-        "//icu4c/source/common:platform",
-        "//icu4c/source/common:propname",
-        "//icu4c/source/common:resourcebundle",
-        "//icu4c/source/common:service_registration",
-        "//icu4c/source/common:ucharstrieiterator",
-        "//icu4c/source/common:uiter",
-        "//icu4c/source/common:ulist",
-        "//icu4c/source/common:unifiedcache",
-        "//icu4c/source/common:uset",
-        "//icu4c/source/common:usetiter",
-        "//icu4c/source/common:utrie2",
-        "//icu4c/source/common:uvector32",
-        "//icu4c/source/common:uvector64",
-    ],
-    local_defines = [
-        "U_I18N_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "collation_builder",
-    srcs = [
-        "collationbuilder.cpp",
-        "collationdatabuilder.cpp",
-        "collationfastlatinbuilder.cpp",
-        "collationruleparser.cpp",
-        "collationweights.cpp",
-    ],
-    includes = ["."],
-    deps = [
-        ":collation",
-        "//icu4c/source/common:canonical_iterator",
-        "//icu4c/source/common:ucharstriebuilder",
-        "//icu4c/source/common:uset_props"
-    ],
-    local_defines = [
-        "U_I18N_IMPLEMENTATION",
-    ],
-)
-
-cc_library(
-    name = "uclean_i18n",
-    srcs = [
-        "ucln_in.cpp",
-    ],
-    hdrs = ["ucln_in.h"],
-    includes = ["."],
-    deps = [
-        "//icu4c/source/common:platform",
-    ],
-    local_defines = [
-        "U_I18N_IMPLEMENTATION",
-    ],
-)

Added: trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,130 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This file defines Bazel targets for a subset of the ICU4C "i18n" library header and source files.
+# The configuration of dependencies among targets is strongly assisted by the
+# file in depstest that maintains such information, at
+# icu4c/source/test/depstest/dependencies.txt .
+
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+# When compiling code in the `common` dir, the constant
+# `U_I18n_IMPLEMENTATION` needs to be defined. See 
+# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
+
+# If linker errors occur, then this may be a sign that the dependencies were 
+# not specified correctly. Use dependencies.txt in depstest for assistance. See
+# https://stackoverflow.com/q/66111709/2077918 .
+
+cc_library(
+    name = "headers",
+    hdrs = glob([
+        "unicode/*.h", # public
+        "*.h",         # internal
+    ]),
+    # We need to add includes in order to preserve existing source files'
+    # include directives that use traditional paths, not paths relative to
+    # Bazel workspace:
+    # https://stackoverflow.com/a/65635893/2077918
+    includes = ["."],
+    local_defines = [
+        "U_I18N_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "collation",
+    srcs = [
+        "bocsu.cpp",
+        "coleitr.cpp",
+        "coll.cpp",
+        "collation.cpp",
+        "collationcompare.cpp",
+        "collationdata.cpp",
+        "collationdatareader.cpp",
+        "collationdatawriter.cpp",
+        "collationfastlatin.cpp",
+        # collationfcd.cpp is generated by genuca;
+        # probably hard to build genuca without depending on the old version.
+        "collationfcd.cpp",
+        "collationiterator.cpp",
+        "collationkeys.cpp",
+        "collationroot.cpp",
+        "collationrootelements.cpp",
+        "collationsets.cpp",
+        "collationsettings.cpp",
+        "collationtailoring.cpp",
+        "rulebasedcollator.cpp",
+        "sortkey.cpp",
+        "ucol.cpp",
+        "ucol_res.cpp",
+        "ucol_sit.cpp",
+        "ucoleitr.cpp",
+        "uitercollationiterator.cpp",
+        "utf16collationiterator.cpp",
+        "utf8collationiterator.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":headers",
+        ":uclean_i18n",
+        "//icu4c/source/common:bytestream",
+        "//icu4c/source/common:normalizer2",
+        "//icu4c/source/common:platform",
+        "//icu4c/source/common:propname",
+        "//icu4c/source/common:resourcebundle",
+        "//icu4c/source/common:service_registration",
+        "//icu4c/source/common:ucharstrieiterator",
+        "//icu4c/source/common:uiter",
+        "//icu4c/source/common:ulist",
+        "//icu4c/source/common:unifiedcache",
+        "//icu4c/source/common:uset",
+        "//icu4c/source/common:usetiter",
+        "//icu4c/source/common:utrie2",
+        "//icu4c/source/common:uvector32",
+        "//icu4c/source/common:uvector64",
+    ],
+    local_defines = [
+        "U_I18N_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "collation_builder",
+    srcs = [
+        "collationbuilder.cpp",
+        "collationdatabuilder.cpp",
+        "collationfastlatinbuilder.cpp",
+        "collationruleparser.cpp",
+        "collationweights.cpp",
+    ],
+    includes = ["."],
+    deps = [
+        ":collation",
+        "//icu4c/source/common:canonical_iterator",
+        "//icu4c/source/common:ucharstriebuilder",
+        "//icu4c/source/common:uset_props"
+    ],
+    local_defines = [
+        "U_I18N_IMPLEMENTATION",
+    ],
+)
+
+cc_library(
+    name = "uclean_i18n",
+    srcs = [
+        "ucln_in.cpp",
+    ],
+    hdrs = ["ucln_in.h"],
+    includes = ["."],
+    deps = [
+        "//icu4c/source/common:platform",
+    ],
+    local_defines = [
+        "U_I18N_IMPLEMENTATION",
+    ],
+)

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/alphaindex.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -451,12 +451,11 @@
     bucketList->setDeleter(uprv_deleteUObject);
 
     // underflow bucket
-    Bucket *bucket = new Bucket(getUnderflowLabel(), emptyString_, U_ALPHAINDEX_UNDERFLOW);
-    if (bucket == NULL) {
-        errorCode = U_MEMORY_ALLOCATION_ERROR;
+    LocalPointer<Bucket> bucket(new Bucket(getUnderflowLabel(), emptyString_, U_ALPHAINDEX_UNDERFLOW), errorCode);
+    if (U_FAILURE(errorCode)) {
         return NULL;
     }
-    bucketList->addElementX(bucket, errorCode);
+    bucketList->adoptElement(bucket.orphan(), errorCode);
     if (U_FAILURE(errorCode)) { return NULL; }
 
     UnicodeString temp;
@@ -481,28 +480,24 @@
             if (skippedScript && bucketList->size() > 1) {
                 // We are skipping one or more scripts,
                 // and we are not just getting out of the underflow label.
-                bucket = new Bucket(getInflowLabel(), inflowBoundary, U_ALPHAINDEX_INFLOW);
-                if (bucket == NULL) {
-                    errorCode = U_MEMORY_ALLOCATION_ERROR;
-                    return NULL;
-                }
-                bucketList->addElementX(bucket, errorCode);
+                bucket.adoptInsteadAndCheckErrorCode(
+                    new Bucket(getInflowLabel(), inflowBoundary, U_ALPHAINDEX_INFLOW), errorCode);
+                bucketList->adoptElement(bucket.orphan(), errorCode);
+                if (U_FAILURE(errorCode)) { return nullptr; }
             }
         }
         // Add a bucket with the current label.
-        bucket = new Bucket(fixLabel(current, temp), current, U_ALPHAINDEX_NORMAL);
-        if (bucket == NULL) {
-            errorCode = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        bucketList->addElementX(bucket, errorCode);
+        bucket.adoptInsteadAndCheckErrorCode(
+            new Bucket(fixLabel(current, temp), current, U_ALPHAINDEX_NORMAL), errorCode);
+        bucketList->adoptElement(bucket.orphan(), errorCode);
+        if (U_FAILURE(errorCode)) { return nullptr; }
         // Remember ASCII and Pinyin buckets for Pinyin redirects.
         UChar c;
         if (current.length() == 1 && 0x41 <= (c = current.charAt(0)) && c <= 0x5A) {  // A-Z
-            asciiBuckets[c - 0x41] = bucket;
+            asciiBuckets[c - 0x41] = (Bucket *)bucketList->lastElement();
         } else if (current.length() == BASE_LENGTH + 1 && current.startsWith(BASE, BASE_LENGTH) &&
                 0x41 <= (c = current.charAt(BASE_LENGTH)) && c <= 0x5A) {
-            pinyinBuckets[c - 0x41] = bucket;
+            pinyinBuckets[c - 0x41] = (Bucket *)bucketList->lastElement();
             hasPinyin = TRUE;
         }
         // Check for multiple primary weights.
@@ -526,15 +521,16 @@
                     // to the previous single-character bucket.
                     // For example, after ... Q R S Sch we add Sch\uFFFF->S
                     // and after ... Q R S Sch Sch\uFFFF St we add St\uFFFF->S.
-                    bucket = new Bucket(emptyString_,
+                    bucket.adoptInsteadAndCheckErrorCode(new Bucket(emptyString_,
                         UnicodeString(current).append((UChar)0xFFFF),
-                        U_ALPHAINDEX_NORMAL);
-                    if (bucket == NULL) {
-                        errorCode = U_MEMORY_ALLOCATION_ERROR;
+                        U_ALPHAINDEX_NORMAL),
+                        errorCode);
+                    if (U_FAILURE(errorCode)) {
                         return NULL;
                     }
                     bucket->displayBucket_ = singleBucket;
-                    bucketList->addElementX(bucket, errorCode);
+                    bucketList->adoptElement(bucket.orphan(), errorCode);
+                    if (U_FAILURE(errorCode)) { return nullptr; }
                     hasInvisibleBuckets = TRUE;
                     break;
                 }
@@ -553,12 +549,10 @@
         return bl;
     }
     // overflow bucket
-    bucket = new Bucket(getOverflowLabel(), *scriptUpperBoundary, U_ALPHAINDEX_OVERFLOW);
-    if (bucket == NULL) {
-        errorCode = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
-    }
-    bucketList->addElementX(bucket, errorCode); // final
+    bucket.adoptInsteadAndCheckErrorCode(
+        new Bucket(getOverflowLabel(), *scriptUpperBoundary, U_ALPHAINDEX_OVERFLOW), errorCode);
+    bucketList->adoptElement(bucket.orphan(), errorCode); // final
+    if (U_FAILURE(errorCode)) { return nullptr; }
 
     if (hasPinyin) {
         // Redirect Pinyin buckets.
@@ -589,7 +583,7 @@
     int32_t i = bucketList->size() - 1;
     Bucket *nextBucket = getBucket(*bucketList, i);
     while (--i > 0) {
-        bucket = getBucket(*bucketList, i);
+        Bucket *bucket = getBucket(*bucketList, i);
         if (bucket->displayBucket_ != NULL) {
             continue;  // skip invisible buckets
         }
@@ -609,9 +603,9 @@
     // Do not call publicBucketList->setDeleter():
     // This vector shares its objects with the bucketList.
     for (int32_t j = 0; j < bucketList->size(); ++j) {
-        bucket = getBucket(*bucketList, j);
+        Bucket *bucket = getBucket(*bucketList, j);
         if (bucket->displayBucket_ == NULL) {
-            publicBucketList->addElementX(bucket, errorCode);
+            publicBucketList->addElement(bucket, errorCode);
         }
     }
     if (U_FAILURE(errorCode)) { return NULL; }
@@ -679,13 +673,13 @@
             bucket = bucket->displayBucket_;
         }
         if (bucket->records_ == NULL) {
-            bucket->records_ = new UVector(errorCode);
-            if (bucket->records_ == NULL) {
-                errorCode = U_MEMORY_ALLOCATION_ERROR;
+            LocalPointer<UVector> records(new UVector(errorCode), errorCode);
+            if (U_FAILURE(errorCode)) {
                 return;
             }
+            bucket->records_ = records.orphan();
         }
-        bucket->records_->addElementX(r, errorCode);
+        bucket->records_->addElement(r, errorCode);
     }
 }
 
@@ -1011,12 +1005,11 @@
             // and the one for unassigned implicit weights (Cn).
             continue;
         }
-        UnicodeString *s = new UnicodeString(boundary);
-        if (s == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
+        LocalPointer<UnicodeString> s(new UnicodeString(boundary), status);
+        dest->adoptElement(s.orphan(), status);
+        if (U_FAILURE(status)) {
+            return nullptr;
         }
-        dest->addElementX(s, status);
     }
     return dest.orphan();
 }
@@ -1067,19 +1060,18 @@
         return *this;
     }
     if (inputList_ == NULL) {
-        inputList_ = new UVector(status);
-        if (inputList_ == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
+        LocalPointer<UVector> inputList(new UVector(status), status);
+        if (U_FAILURE(status)) {
             return *this;
         }
+        inputList_ = inputList.orphan();
         inputList_->setDeleter(alphaIndex_deleteRecord);
     }
-    Record *r = new Record(name, data);
-    if (r == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
+    LocalPointer<Record> r(new Record(name, data), status);
+    inputList_->adoptElement(r.orphan(), status);
+    if (U_FAILURE(status)) {
         return *this;
     }
-    inputList_->addElementX(r, status);
     clearBuckets();
     //std::string ss;
     //std::string ss2;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/collationdatabuilder.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -522,12 +522,11 @@
         errorCode = U_BUFFER_OVERFLOW_ERROR;
         return -1;
     }
-    ConditionalCE32 *cond = new ConditionalCE32(context, ce32);
-    if(cond == NULL) {
-        errorCode = U_MEMORY_ALLOCATION_ERROR;
+    LocalPointer<ConditionalCE32> cond(new ConditionalCE32(context, ce32), errorCode);
+    conditionalCE32s.adoptElement(cond.orphan(), errorCode);
+    if(U_FAILURE(errorCode)) {
         return -1;
     }
-    conditionalCE32s.addElementX(cond, errorCode);
     return index;
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/csdetect.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -270,6 +270,11 @@
 
     maxMatchesFound = resultCount;
 
+    if (maxMatchesFound == 0) {
+        status = U_INVALID_CHAR_FOUND;
+        return NULL;
+    }
+
     return resultArray;
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-ieee.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -164,11 +164,19 @@
   }
 
   bool IsQuietNan() const {
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+    return IsNan() && ((AsUint64() & kQuietNanBit) == 0);
+#else
     return IsNan() && ((AsUint64() & kQuietNanBit) != 0);
+#endif
   }
 
   bool IsSignalingNan() const {
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+    return IsNan() && ((AsUint64() & kQuietNanBit) != 0);
+#else
     return IsNan() && ((AsUint64() & kQuietNanBit) == 0);
+#endif
   }
 
 
@@ -250,8 +258,13 @@
  private:
   static const int kDenormalExponent = -kExponentBias + 1;
   static const uint64_t kInfinity = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF00000, 00000000);
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+  static const uint64_t kNaN = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF7FFFF, FFFFFFFF);
+#else
   static const uint64_t kNaN = DOUBLE_CONVERSION_UINT64_2PART_C(0x7FF80000, 00000000);
+#endif
 
+
   const uint64_t d64_;
 
   static uint64_t DiyFpToUint64(DiyFp diy_fp) {
@@ -350,11 +363,19 @@
   }
 
   bool IsQuietNan() const {
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+    return IsNan() && ((AsUint32() & kQuietNanBit) == 0);
+#else
     return IsNan() && ((AsUint32() & kQuietNanBit) != 0);
+#endif
   }
 
   bool IsSignalingNan() const {
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+    return IsNan() && ((AsUint32() & kQuietNanBit) != 0);
+#else
     return IsNan() && ((AsUint32() & kQuietNanBit) == 0);
+#endif
   }
 
 
@@ -424,7 +445,11 @@
   static const int kDenormalExponent = -kExponentBias + 1;
   static const int kMaxExponent = 0xFF - kExponentBias;
   static const uint32_t kInfinity = 0x7F800000;
+#if (defined(__mips__) && !defined(__mips_nan2008)) || defined(__hppa__)
+  static const uint32_t kNaN = 0x7FBFFFFF;
+#else
   static const uint32_t kNaN = 0x7FC00000;
+#endif
 
   const uint32_t d32_;
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/double-conversion-utils.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -37,6 +37,9 @@
 #ifndef DOUBLE_CONVERSION_UTILS_H_
 #define DOUBLE_CONVERSION_UTILS_H_
 
+// Use DOUBLE_CONVERSION_NON_PREFIXED_MACROS to get unprefixed macros as was
+// the case in double-conversion releases prior to 3.1.6
+
 #include <cstdlib>
 #include <cstring>
 
@@ -46,9 +49,17 @@
 #define DOUBLE_CONVERSION_ASSERT(condition)         \
     U_ASSERT(condition)
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(ASSERT)
+#define ASSERT DOUBLE_CONVERSION_ASSERT
+#endif
+
 #ifndef DOUBLE_CONVERSION_UNIMPLEMENTED
 #define DOUBLE_CONVERSION_UNIMPLEMENTED() (abort())
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(UNIMPLEMENTED)
+#define UNIMPLEMENTED DOUBLE_CONVERSION_UNIMPLEMENTED
+#endif
+
 #ifndef DOUBLE_CONVERSION_NO_RETURN
 #ifdef _MSC_VER
 #define DOUBLE_CONVERSION_NO_RETURN __declspec(noreturn)
@@ -56,6 +67,10 @@
 #define DOUBLE_CONVERSION_NO_RETURN __attribute__((noreturn))
 #endif
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(NO_RETURN)
+#define NO_RETURN DOUBLE_CONVERSION_NO_RETURN
+#endif
+
 #ifndef DOUBLE_CONVERSION_UNREACHABLE
 #ifdef _MSC_VER
 void DOUBLE_CONVERSION_NO_RETURN abort_noreturn();
@@ -65,6 +80,9 @@
 #define DOUBLE_CONVERSION_UNREACHABLE()   (abort())
 #endif
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(UNREACHABLE)
+#define UNREACHABLE DOUBLE_CONVERSION_UNREACHABLE
+#endif
 
 // Not all compilers support __has_attribute and combining a check for both
 // ifdef and __has_attribute on the same preprocessor line isn't portable.
@@ -81,6 +99,9 @@
 #define DOUBLE_CONVERSION_UNUSED
 #endif
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(UNUSED)
+#define UNUSED DOUBLE_CONVERSION_UNUSED
+#endif
 
 #if DOUBLE_CONVERSION_HAS_ATTRIBUTE(uninitialized)
 #define DOUBLE_CONVERSION_STACK_UNINITIALIZED __attribute__((uninitialized))
@@ -87,6 +108,9 @@
 #else
 #define DOUBLE_CONVERSION_STACK_UNINITIALIZED
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(STACK_UNINITIALIZED)
+#define STACK_UNINITIALIZED DOUBLE_CONVERSION_STACK_UNINITIALIZED
+#endif
 
 // Double operations detection based on target architecture.
 // Linux uses a 80bit wide floating point stack on x86. This induces double
@@ -127,7 +151,7 @@
     defined(_MIPS_ARCH_MIPS32R2) || defined(__ARMEB__) ||\
     defined(__AARCH64EL__) || defined(__aarch64__) || defined(__AARCH64EB__) || \
     defined(__riscv) || defined(__e2k__) || \
-    defined(__or1k__) || defined(__arc__) || \
+    defined(__or1k__) || defined(__arc__) || defined(__ARC64__) || \
     defined(__microblaze__) || defined(__XTENSA__) || \
     defined(__EMSCRIPTEN__) || defined(__wasm32__)
 #define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
@@ -144,6 +168,9 @@
 #else
 #error Target architecture was not detected as supported by Double-Conversion.
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(CORRECT_DOUBLE_OPERATIONS)
+#define CORRECT_DOUBLE_OPERATIONS DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
+#endif
 
 #if defined(_WIN32) && !defined(__MINGW32__)
 
@@ -169,8 +196,10 @@
 // Usage: instead of writing 0x1234567890123456
 //      write DOUBLE_CONVERSION_UINT64_2PART_C(0x12345678,90123456);
 #define DOUBLE_CONVERSION_UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(UINT64_2PART_C)
+#define UINT64_2PART_C DOUBLE_CONVERSION_UINT64_2PART_C
+#endif
 
-
 // The expression DOUBLE_CONVERSION_ARRAY_SIZE(a) is a compile-time constant of type
 // size_t which represents the number of elements of the given
 // array. You should only use DOUBLE_CONVERSION_ARRAY_SIZE on statically allocated
@@ -180,6 +209,9 @@
   ((sizeof(a) / sizeof(*(a))) /                         \
   static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(ARRAY_SIZE)
+#define ARRAY_SIZE DOUBLE_CONVERSION_ARRAY_SIZE
+#endif
 
 // A macro to disallow the evil copy constructor and operator= functions
 // This should be used in the private: declarations for a class
@@ -188,6 +220,9 @@
   TypeName(const TypeName&);                    \
   void operator=(const TypeName&)
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(DC_DISALLOW_COPY_AND_ASSIGN)
+#define DC_DISALLOW_COPY_AND_ASSIGN DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN
+#endif
 
 // A macro to disallow all the implicit constructors, namely the
 // default constructor, copy constructor and operator= functions.
@@ -200,6 +235,9 @@
   TypeName();                                    \
   DOUBLE_CONVERSION_DISALLOW_COPY_AND_ASSIGN(TypeName)
 #endif
+#if defined(DOUBLE_CONVERSION_NON_PREFIXED_MACROS) && !defined(DC_DISALLOW_IMPLICIT_CONSTRUCTORS)
+#define DC_DISALLOW_IMPLICIT_CONSTRUCTORS DOUBLE_CONVERSION_DISALLOW_IMPLICIT_CONSTRUCTORS
+#endif
 
 // ICU PATCH: Wrap in ICU namespace
 U_NAMESPACE_BEGIN

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/dtfmtsym.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1574,26 +1574,20 @@
                                                        errorCode);
                     if (U_FAILURE(errorCode)) { return; }
                 }
-                LocalPointer<UnicodeString> aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode);
-                resourcesToVisitNext->addElementX(aliasRelativePathCopy.getAlias(), errorCode);
+                LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
+                resourcesToVisitNext->adoptElement(aliasRelativePathCopy.orphan(), errorCode);
                 if (U_FAILURE(errorCode)) { return; }
-                // Only release ownership after resourcesToVisitNext takes it (no error happened):
-                aliasRelativePathCopy.orphan();
                 continue;
 
             } else if (aliasType == SAME_CALENDAR) {
                 // Register same-calendar alias
                 if (arrays.get(aliasRelativePath) == NULL && maps.get(aliasRelativePath) == NULL) {
-                    LocalPointer<UnicodeString> aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode);
-                    aliasPathPairs.addElementX(aliasRelativePathCopy.getAlias(), errorCode);
+                    LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
+                    aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode);
                     if (U_FAILURE(errorCode)) { return; }
-                    // Only release ownership after aliasPathPairs takes it (no error happened):
-                    aliasRelativePathCopy.orphan();
-                    LocalPointer<UnicodeString> keyUStringCopy(new UnicodeString(keyUString), errorCode);
-                    aliasPathPairs.addElementX(keyUStringCopy.getAlias(), errorCode);
+                    LocalPointer<UnicodeString> keyUStringCopy(keyUString.clone(), errorCode);
+                    aliasPathPairs.adoptElement(keyUStringCopy.orphan(), errorCode);
                     if (U_FAILURE(errorCode)) { return; }
-                    // Only release ownership after aliasPathPairs takes it (no error happened):
-                    keyUStringCopy.orphan();
                 }
                 continue;
             }
@@ -1760,16 +1754,12 @@
             if (U_FAILURE(errorCode)) { return; }
             if (aliasType == SAME_CALENDAR) {
                 // Store the alias path and the current path on aliasPathPairs
-                LocalPointer<UnicodeString> aliasRelativePathCopy(new UnicodeString(aliasRelativePath), errorCode);
-                aliasPathPairs.addElementX(aliasRelativePathCopy.getAlias(), errorCode);
+                LocalPointer<UnicodeString> aliasRelativePathCopy(aliasRelativePath.clone(), errorCode);
+                aliasPathPairs.adoptElement(aliasRelativePathCopy.orphan(), errorCode);
                 if (U_FAILURE(errorCode)) { return; }
-                // Only release ownership after aliasPathPairs takes it (no error happened):
-                aliasRelativePathCopy.orphan();
-                LocalPointer<UnicodeString> pathCopy(new UnicodeString(path), errorCode);
-                aliasPathPairs.addElementX(pathCopy.getAlias(), errorCode);
+                LocalPointer<UnicodeString> pathCopy(path.clone(), errorCode);
+                aliasPathPairs.adoptElement(pathCopy.orphan(), errorCode);
                 if (U_FAILURE(errorCode)) { return; }
-                // Only release ownership after aliasPathPairs takes it (no error happened):
-                pathCopy.orphan();
 
                 // Drop the latest key on the path and continue
                 path.retainBetween(0, pathLength);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/dtitvfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -965,16 +965,22 @@
     UnicodeString result = skeleton;
     
     UChar hourMetachar = u'\0';
+    UChar dayPeriodChar = u'\0';
     int32_t metacharStart = 0;
     int32_t metacharCount = 0;
     for (int32_t i = 0; i < result.length(); i++) {
         UChar c = result[i];
-        if (c == LOW_J || c == CAP_J || c == CAP_C) {
+        if (c == LOW_J || c == CAP_J || c == CAP_C || c == LOW_H || c == CAP_H || c == LOW_K || c == CAP_K) {
             if (hourMetachar == u'\0') {
                 hourMetachar = c;
                 metacharStart = i;
             }
             ++metacharCount;
+        } else if (c == LOW_A || c == LOW_B || c == CAP_B) {
+            if (dayPeriodChar == u'\0') {
+                dayPeriodChar = c;
+            }
+            ++metacharCount;
         } else {
             if (hourMetachar != u'\0') {
                 break;
@@ -985,7 +991,6 @@
     if (hourMetachar != u'\0') {
         UErrorCode err = U_ZERO_ERROR;
         UChar hourChar = CAP_H;
-        UChar dayPeriodChar = LOW_A;
         UnicodeString convertedPattern = DateFormat::getBestPattern(fLocale, UnicodeString(hourMetachar), err);
 
         if (U_SUCCESS(err)) {
@@ -1012,6 +1017,8 @@
                 dayPeriodChar = LOW_B;
             } else if (convertedPattern.indexOf(CAP_B) != -1) {
                 dayPeriodChar = CAP_B;
+            } else if (dayPeriodChar == u'\0') {
+                dayPeriodChar = LOW_A;
             }
         }
         

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/dtptngen.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -273,8 +273,6 @@
     "", "-short", "-narrow"
 };
 
-// TODO(ticket:13619): remove when definition uncommented in dtptngen.h.
-static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1;
 static constexpr UDateTimePGDisplayWidth UDATPG_WIDTH_APPENDITEM = UDATPG_WIDE;
 static constexpr int32_t UDATPG_FIELD_KEY_MAX = 24; // max length of CLDR field tag (type + width)
 
@@ -393,10 +391,13 @@
     *fp = *(other.fp);
     dtMatcher->copyFrom(other.dtMatcher->skeleton);
     *distanceInfo = *(other.distanceInfo);
-    dateTimeFormat = other.dateTimeFormat;
+    for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
+        dateTimeFormat[style] = other.dateTimeFormat[style];
+    }
     decimal = other.decimal;
-    // NUL-terminate for the C API.
-    dateTimeFormat.getTerminatedBuffer();
+    for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
+        dateTimeFormat[style].getTerminatedBuffer(); // NUL-terminate for the C API.
+    }
     decimal.getTerminatedBuffer();
     delete skipMatcher;
     if ( other.skipMatcher == nullptr ) {
@@ -430,7 +431,12 @@
         return true;
     }
     if ((pLocale==other.pLocale) && (patternMap->equals(*other.patternMap)) &&
-        (dateTimeFormat==other.dateTimeFormat) && (decimal==other.decimal)) {
+        (decimal==other.decimal)) {
+        for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
+            if (dateTimeFormat[style] != other.dateTimeFormat[style]) {
+                return false;
+            }
+        }
         for ( int32_t i=0 ; i<UDATPG_FIELD_COUNT; ++i ) {
             if (appendItemFormats[i] != other.appendItemFormats[i]) {
                 return false;
@@ -1199,7 +1205,21 @@
     }
     resultPattern.remove();
     status = U_ZERO_ERROR;
-    dtFormat=getDateTimeFormat();
+    // determine which dateTimeFormat to use
+    PtnSkeleton* reqSkeleton = dtMatcher->getSkeletonPtr();
+    UDateFormatStyle style = UDAT_SHORT;
+    int32_t monthFieldLen = reqSkeleton->baseOriginal.getFieldLength(UDATPG_MONTH_FIELD);
+    if (monthFieldLen == 4) {
+        if (reqSkeleton->baseOriginal.getFieldLength(UDATPG_WEEKDAY_FIELD) > 0) {
+            style = UDAT_FULL;
+        } else {
+            style = UDAT_LONG;
+        }
+    } else if (monthFieldLen == 3) {
+        style = UDAT_MEDIUM;
+    }
+    // and now use it to compose date and time
+    dtFormat=getDateTimeFormat(style, status);
     SimpleFormatter(dtFormat, 2, 2, status).format(timePattern, datePattern, resultPattern, status);
     return resultPattern;
 }
@@ -1335,17 +1355,48 @@
 
 void
 DateTimePatternGenerator::setDateTimeFormat(const UnicodeString& dtFormat) {
-    dateTimeFormat = dtFormat;
-    // NUL-terminate for the C API.
-    dateTimeFormat.getTerminatedBuffer();
+    UErrorCode status = U_ZERO_ERROR;
+    for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
+        setDateTimeFormat((UDateFormatStyle)style, dtFormat, status);
+    }
 }
 
 const UnicodeString&
 DateTimePatternGenerator::getDateTimeFormat() const {
-    return dateTimeFormat;
+    UErrorCode status = U_ZERO_ERROR;
+    return getDateTimeFormat(UDAT_MEDIUM, status);
 }
 
 void
+DateTimePatternGenerator::setDateTimeFormat(UDateFormatStyle style, const UnicodeString& dtFormat, UErrorCode& status) {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    if (style < UDAT_FULL || style > UDAT_SHORT) {
+        status = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    dateTimeFormat[style] = dtFormat;
+    // Note for the following: getTerminatedBuffer() can re-allocate the UnicodeString
+    // buffer so we do this here before clients request a const ref to the UnicodeString
+    // or its buffer.
+    dateTimeFormat[style].getTerminatedBuffer(); // NUL-terminate for the C API.
+}
+
+const UnicodeString&
+DateTimePatternGenerator::getDateTimeFormat(UDateFormatStyle style, UErrorCode& status) const {
+    static const UnicodeString emptyString = UNICODE_STRING_SIMPLE("");
+    if (U_FAILURE(status)) {
+        return emptyString;
+    }
+    if (style < UDAT_FULL || style > UDAT_SHORT) {
+        status = U_ILLEGAL_ARGUMENT_ERROR;
+        return emptyString;
+    }
+    return dateTimeFormat[style];
+}
+
+void
 DateTimePatternGenerator::setDateTimeFromCalendar(const Locale& locale, UErrorCode& status) {
     if (U_FAILURE(status)) { return; }
 
@@ -1378,13 +1429,15 @@
     }
     if (U_FAILURE(status)) { return; }
 
-    if (ures_getSize(dateTimePatterns.getAlias()) <= DateFormat::kDateTime)
+    if (ures_getSize(dateTimePatterns.getAlias()) <= DateFormat::kDateTimeOffset + DateFormat::kShort)
     {
         status = U_INVALID_FORMAT_ERROR;
         return;
     }
-    resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), (int32_t)DateFormat::kDateTime, &resStrLen, &status);
-    setDateTimeFormat(UnicodeString(TRUE, resStr, resStrLen));
+    for (int32_t style = UDAT_FULL; style <= UDAT_SHORT; style++) {
+        resStr = ures_getStringByIndex(dateTimePatterns.getAlias(), (int32_t)DateFormat::kDateTimeOffset + style, &resStrLen, &status);
+        setDateTimeFormat((UDateFormatStyle)style, UnicodeString(TRUE, resStr, resStrLen), status);
+    }
 }
 
 void
@@ -2788,16 +2841,17 @@
                     break;
             }
             if ( !isCanonicalItem(s) ) {
-                LocalPointer<UnicodeString> newElem(new UnicodeString(s), status);
+                LocalPointer<UnicodeString> newElem(s.clone(), status);
                 if (U_FAILURE(status)) { 
                     return;
                 }
-                fSkeletons->addElementX(newElem.getAlias(), status);
+                fSkeletons->addElement(newElem.getAlias(), status);
                 if (U_FAILURE(status)) {
                     fSkeletons.adoptInstead(nullptr);
                     return;
                 }
-                newElem.orphan(); // fSkeletons vector now owns the UnicodeString.
+                newElem.orphan(); // fSkeletons vector now owns the UnicodeString (although it
+                                  // does not use a deleter function to manage the ownership).
             }
             curElem = curElem->next.getAlias();
         }
@@ -2865,12 +2919,13 @@
     if (U_FAILURE(status)) {
         return;
     }
-    fPatterns->addElementX(newElem.getAlias(), status);
+    fPatterns->addElement(newElem.getAlias(), status);
     if (U_FAILURE(status)) {
         fPatterns.adoptInstead(nullptr);
         return;
     }
-    newElem.orphan(); // fPatterns now owns the string.
+    newElem.orphan(); // fPatterns now owns the string, although a UVector
+                      // deleter function is not used to manage that ownership.
 }
 
 const UnicodeString*

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/formattedval_sbimpl.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -230,6 +230,11 @@
             if (si + 1 < spanIndicesCount) {
                 nextSpanStart = spanIndices[si + 1].start;
             }
+            if (length == 0) {
+                // ICU-21871: Don't return fields on empty spans
+                i--;
+                continue;
+            }
             if (cfpos.matchesField(spanCategory, spanValue)) {
                 fieldStart = i - fString.fZero;
                 int32_t end = fieldStart + length;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/i18n.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -60,7 +60,7 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuin70d.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuin71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuind.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuind.lib</ImportLibrary>
     </Link>
@@ -73,7 +73,7 @@
     </ClCompile>
     <Link>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuin70.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuin71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icuin.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuin.lib</ImportLibrary>
     </Link>

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/i18n_uwp.vcxproj
===================================================================
(Binary files differ)

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/measunit_extra.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/measunit_extra.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/measunit_extra.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -615,7 +615,7 @@
 
     // Set to true when we've seen a "-per-" or a "per-", after which all units
     // are in the denominator. Until we find an "-and-", at which point the
-    // identifier is invalid pending TODO(CLDR-13700).
+    // identifier is invalid pending TODO(CLDR-13701).
     bool fAfterPer = false;
 
     Parser() : fSource(""), fTrie(u"") {}
@@ -669,7 +669,7 @@
      * dimensionality.
      *
      * Returns an error if we parse both compound units and "-and-", since mixed
-     * compound units are not yet supported - TODO(CLDR-13700).
+     * compound units are not yet supported - TODO(CLDR-13701).
      *
      * @param result Will be overwritten by the result, if status shows success.
      * @param sawAnd If an "-and-" was parsed prior to finding the "single

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -854,19 +854,21 @@
 MessageFormat::getFormatNames(UErrorCode& status) {
     if (U_FAILURE(status))  return NULL;
 
-    UVector *fFormatNames = new UVector(status);
+    LocalPointer<UVector> formatNames(new UVector(status), status);
     if (U_FAILURE(status)) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        return NULL;
+        return nullptr;
     }
-    fFormatNames->setDeleter(uprv_deleteUObject);
+    formatNames->setDeleter(uprv_deleteUObject);
 
     for (int32_t partIndex = 0; (partIndex = nextTopLevelArgStart(partIndex)) >= 0;) {
-        fFormatNames->addElementX(new UnicodeString(getArgName(partIndex + 1)), status);
+        LocalPointer<UnicodeString> name(getArgName(partIndex + 1).clone(), status);
+        formatNames->adoptElement(name.orphan(), status);
+        if (U_FAILURE(status))  return nullptr;
     }
 
-    StringEnumeration* nameEnumerator = new FormatNameEnumeration(fFormatNames, status);
-    return nameEnumerator;
+    LocalPointer<StringEnumeration> nameEnumerator(
+        new FormatNameEnumeration(std::move(formatNames), status), status);
+    return U_SUCCESS(status) ? nameEnumerator.orphan() : nullptr;
 }
 
 // -------------------------------------
@@ -1912,9 +1914,9 @@
 }
 
 
-FormatNameEnumeration::FormatNameEnumeration(UVector *fNameList, UErrorCode& /*status*/) {
+FormatNameEnumeration::FormatNameEnumeration(LocalPointer<UVector> nameList, UErrorCode& /*status*/) {
     pos=0;
-    fFormatNames = fNameList;
+    fFormatNames = std::move(nameList);
 }
 
 const UnicodeString*
@@ -1936,7 +1938,6 @@
 }
 
 FormatNameEnumeration::~FormatNameEnumeration() {
-    delete fFormatNames;
 }
 
 MessageFormat::PluralSelectorProvider::PluralSelectorProvider(const MessageFormat &mf, UPluralType t)

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt_impl.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt_impl.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/msgfmt_impl.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -26,7 +26,7 @@
 
 class FormatNameEnumeration : public StringEnumeration {
 public:
-    FormatNameEnumeration(UVector *fFormatNames, UErrorCode& status);
+    FormatNameEnumeration(LocalPointer<UVector> fFormatNames, UErrorCode& status);
     virtual ~FormatNameEnumeration();
     static UClassID U_EXPORT2 getStaticClassID(void);
     virtual UClassID getDynamicClassID(void) const override;
@@ -35,7 +35,7 @@
     virtual int32_t count(UErrorCode& status) const override;
 private:
     int32_t pos;
-    UVector *fFormatNames;
+    LocalPointer<UVector> fFormatNames;
 };
 
 U_NAMESPACE_END

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_affixutils.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -135,8 +135,7 @@
         case TYPE_PLUS_SIGN:
             return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
         case TYPE_APPROXIMATELY_SIGN:
-            // TODO: Introduce a new field for the approximately sign?
-            return {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD};
+            return {UFIELD_CATEGORY_NUMBER, UNUM_APPROXIMATELY_SIGN_FIELD};
         case TYPE_PERCENT:
             return {UFIELD_CATEGORY_NUMBER, UNUM_PERCENT_FIELD};
         case TYPE_PERMILLE:

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_compact.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -157,8 +157,8 @@
         }
 
         // The string was not found; add it to the UVector.
-        // ANDY: This requires a const_cast.  Why?
-        output.addElementX(const_cast<UChar *>(pattern), status);
+        // Note: must cast off const from pattern to store it in a UVector, which expects (void *)
+        output.addElement(const_cast<UChar *>(pattern), status);
 
         continue_outer:
         continue;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -181,20 +181,22 @@
     return fingerprint;
 }
 
-void DecimalQuantity::roundToIncrement(double roundingIncrement, RoundingMode roundingMode,
-                                       UErrorCode& status) {
+void DecimalQuantity::roundToIncrement(
+        uint64_t increment,
+        digits_t magnitude,
+        RoundingMode roundingMode,
+        UErrorCode& status) {
     // Do not call this method with an increment having only a 1 or a 5 digit!
     // Use a more efficient call to either roundToMagnitude() or roundToNickel().
     // Check a few popular rounding increments; a more thorough check is in Java.
-    U_ASSERT(roundingIncrement != 0.01);
-    U_ASSERT(roundingIncrement != 0.05);
-    U_ASSERT(roundingIncrement != 0.1);
-    U_ASSERT(roundingIncrement != 0.5);
-    U_ASSERT(roundingIncrement != 1);
-    U_ASSERT(roundingIncrement != 5);
+    U_ASSERT(increment != 1);
+    U_ASSERT(increment != 5);
 
+    DecimalQuantity incrementDQ;
+    incrementDQ.setToLong(increment);
+    incrementDQ.adjustMagnitude(magnitude);
     DecNum incrementDN;
-    incrementDN.setTo(roundingIncrement, status);
+    incrementDQ.toDecNum(incrementDN, status);
     if (U_FAILURE(status)) { return; }
 
     // Divide this DecimalQuantity by the increment, round, then multiply back.
@@ -254,6 +256,12 @@
     return false;
 }
 
+int32_t DecimalQuantity::adjustToZeroScale() {
+    int32_t retval = scale;
+    scale = 0;
+    return retval;
+}
+
 double DecimalQuantity::getPluralOperand(PluralOperand operand) const {
     // If this assertion fails, you need to call roundToInfinity() or some other rounding method.
     // See the comment at the top of this file explaining the "isApproximate" field.
@@ -549,6 +557,65 @@
     }
 }
 
+DecimalQuantity DecimalQuantity::fromExponentString(UnicodeString num, UErrorCode& status) {
+    if (num.indexOf(u'e') >= 0 || num.indexOf(u'c') >= 0
+                || num.indexOf(u'E') >= 0 || num.indexOf(u'C') >= 0) {
+        int32_t ePos = num.lastIndexOf('e');
+        if (ePos < 0) {
+            ePos = num.lastIndexOf('c');
+        }
+        if (ePos < 0) {
+            ePos = num.lastIndexOf('E');
+        }
+        if (ePos < 0) {
+            ePos = num.lastIndexOf('C');
+        }
+        int32_t expNumPos = ePos + 1;
+        UnicodeString exponentStr = num.tempSubString(expNumPos, num.length() - expNumPos);
+
+        // parse exponentStr into exponent, but note that parseAsciiInteger doesn't handle the minus sign
+        bool isExpStrNeg = num[expNumPos] == u'-';
+        int32_t exponentParsePos = isExpStrNeg ? 1 : 0;
+        int32_t exponent = ICU_Utility::parseAsciiInteger(exponentStr, exponentParsePos);
+        exponent = isExpStrNeg ? -exponent : exponent;
+
+        // Compute the decNumber representation
+        UnicodeString fractionStr = num.tempSubString(0, ePos);
+        CharString fracCharStr = CharString();
+        fracCharStr.appendInvariantChars(fractionStr, status);
+        DecNum decnum;
+        decnum.setTo(fracCharStr.toStringPiece(), status);
+
+        // Clear and set this DecimalQuantity instance
+        DecimalQuantity dq;
+        dq.setToDecNum(decnum, status);
+        int32_t numFracDigit = getVisibleFractionCount(fractionStr);
+        dq.setMinFraction(numFracDigit);
+        dq.adjustExponent(exponent);
+
+        return dq;
+    } else {
+        DecimalQuantity dq;
+        int numFracDigit = getVisibleFractionCount(num);
+
+        CharString numCharStr = CharString();
+        numCharStr.appendInvariantChars(num, status);
+        dq.setToDecNumber(numCharStr.toStringPiece(), status);
+
+        dq.setMinFraction(numFracDigit);
+        return dq;
+    }
+}
+
+int32_t DecimalQuantity::getVisibleFractionCount(UnicodeString value) {
+    int decimalPos = value.indexOf('.') + 1;
+    if (decimalPos == 0) {
+        return 0;
+    } else {
+        return value.length() - decimalPos;
+    }
+}
+
 int64_t DecimalQuantity::toLong(bool truncateIfOverflow) const {
     // NOTE: Call sites should be guarded by fitsInLong(), like this:
     // if (dq.fitsInLong()) { /* use dq.toLong() */ } else { /* use some fallback */ }
@@ -948,6 +1015,44 @@
     return sb;
 }
 
+
+UnicodeString DecimalQuantity::toExponentString() const {
+    U_ASSERT(!isApproximate);
+    UnicodeString sb;
+    if (isNegative()) {
+        sb.append(u'-');
+    }
+
+    int32_t upper = scale + precision - 1;
+    int32_t lower = scale;
+    if (upper < lReqPos - 1) {
+        upper = lReqPos - 1;
+    }
+    if (lower > rReqPos) {
+        lower = rReqPos;
+    }    
+    int32_t p = upper;
+    if (p < 0) {
+        sb.append(u'0');
+    }
+    for (; p >= 0; p--) {
+        sb.append(u'0' + getDigitPos(p - scale));
+    }
+    if (lower < 0) {
+        sb.append(u'.');
+    }
+    for(; p >= lower; p--) {
+        sb.append(u'0' + getDigitPos(p - scale));
+    }
+
+    if (exponent != 0) {
+        sb.append(u'c');
+        ICU_Utility::appendNumber(sb, exponent);        
+    }
+
+    return sb;
+}
+
 UnicodeString DecimalQuantity::toScientificString() const {
     U_ASSERT(!isApproximate);
     UnicodeString result;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_decimalquantity.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -81,11 +81,15 @@
      *
      * <p>If rounding to a power of ten, use the more efficient {@link #roundToMagnitude} instead.
      *
-     * @param roundingIncrement The increment to which to round.
+     * @param increment The increment to which to round.
+     * @param magnitude The power of 10 to which to round.
      * @param roundingMode The {@link RoundingMode} to use if rounding is necessary.
      */
-    void roundToIncrement(double roundingIncrement, RoundingMode roundingMode,
-                          UErrorCode& status);
+    void roundToIncrement(
+        uint64_t increment,
+        digits_t magnitude,
+        RoundingMode roundingMode,
+        UErrorCode& status);
 
     /** Removes all fraction digits. */
     void truncate();
@@ -141,6 +145,13 @@
     bool adjustMagnitude(int32_t delta);
 
     /**
+     * Scales the number such that the least significant nonzero digit is at magnitude 0.
+     *
+     * @return The previous magnitude of the least significant digit.
+     */
+    int32_t adjustToZeroScale();
+
+    /**
      * @return The power of ten corresponding to the most significant nonzero digit.
      * The number must not be zero.
      */
@@ -234,6 +245,9 @@
     /** Internal method if the caller already has a DecNum. */
     DecimalQuantity &setToDecNum(const DecNum& n, UErrorCode& status);
 
+    /** Returns a DecimalQuantity after parsing the input string. */
+    static DecimalQuantity fromExponentString(UnicodeString n, UErrorCode& status);
+
     /**
      * Appends a digit, optionally with one or more leading zeros, to the end of the value represented
      * by this DecimalQuantity.
@@ -315,6 +329,10 @@
     /** Returns the string without exponential notation. Slightly slower than toScientificString(). */
     UnicodeString toPlainString() const;
 
+    /** Returns the string using ASCII digits and using exponential notation for non-zero
+    exponents, following the UTS 35 specification for plural rule samples. */
+    UnicodeString toExponentString() const;
+
     /** Visible for testing */
     inline bool isUsingBytes() { return usingBytes; }
 
@@ -518,6 +536,8 @@
 
     void _setToDecNum(const DecNum& dn, UErrorCode& status);
 
+    static int32_t getVisibleFractionCount(UnicodeString value);
+
     void convertToAccurateDouble();
 
     /** Ensure that a byte array of at least 40 digits is allocated. */

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_longnames.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -431,13 +431,33 @@
     subKey.append(unit.getType(), status);
     subKey.append("/", status);
 
+    // Check if unitSubType is an alias or not.
+    LocalUResourceBundlePointer aliasBundle(ures_open(U_ICUDATA_ALIAS, "metadata", &status));
+
+    UErrorCode aliasStatus = status;
+    StackUResourceBundle aliasFillIn;
+    CharString aliasKey;
+    aliasKey.append("alias/unit/", aliasStatus);
+    aliasKey.append(unit.getSubtype(), aliasStatus);
+    aliasKey.append("/replacement", aliasStatus);
+    ures_getByKeyWithFallback(aliasBundle.getAlias(), aliasKey.data(), aliasFillIn.getAlias(),
+                              &aliasStatus);
+    CharString unitSubType;
+    if (!U_FAILURE(aliasStatus)) {
+        // This means the subType is an alias. Then, replace unitSubType with the replacement.
+        auto replacement = ures_getUnicodeString(aliasFillIn.getAlias(), &status);
+        unitSubType.appendInvariantChars(replacement, status);
+    } else {
+        unitSubType.append(unit.getSubtype(), status);
+    }
+
     // Map duration-year-person, duration-week-person, etc. to duration-year, duration-week, ...
     // TODO(ICU-20400): Get duration-*-person data properly with aliases.
-    int32_t subtypeLen = static_cast<int32_t>(uprv_strlen(unit.getSubtype()));
-    if (subtypeLen > 7 && uprv_strcmp(unit.getSubtype() + subtypeLen - 7, "-person") == 0) {
-        subKey.append({unit.getSubtype(), subtypeLen - 7}, status);
+    int32_t subtypeLen = static_cast<int32_t>(uprv_strlen(unitSubType.data()));
+    if (subtypeLen > 7 && uprv_strcmp(unitSubType.data() + subtypeLen - 7, "-person") == 0) {
+        subKey.append({unitSubType.data(), subtypeLen - 7}, status);
     } else {
-        subKey.append({unit.getSubtype(), subtypeLen}, status);
+        subKey.append({unitSubType.data(), subtypeLen}, status);
     }
 
     if (width != UNUM_UNIT_WIDTH_FULL_NAME) {

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_mapper.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -134,7 +134,8 @@
         if (PatternStringUtils::ignoreRoundingIncrement(roundingIncrement, maxFrac)) {
             precision = Precision::constructFraction(minFrac, maxFrac);
         } else {
-            precision = Precision::constructIncrement(roundingIncrement, minFrac);
+            // Convert the double increment to an integer increment
+            precision = Precision::increment(roundingIncrement).withMinFraction(minFrac);
         }
     } else if (explicitMinMaxSig) {
         minSig = minSig < 1 ? 1 : minSig > kMaxIntFracSig ? kMaxIntFracSig : minSig;
@@ -293,9 +294,14 @@
         } else if (rounding_.fType == Precision::PrecisionType::RND_INCREMENT
                 || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_ONE
                 || rounding_.fType == Precision::PrecisionType::RND_INCREMENT_FIVE) {
-            increment_ = rounding_.fUnion.increment.fIncrement;
             minFrac_ = rounding_.fUnion.increment.fMinFrac;
+            // If incrementRounding is used, maxFrac is set equal to minFrac
             maxFrac_ = rounding_.fUnion.increment.fMinFrac;
+            // Convert the integer increment to a double
+            DecimalQuantity dq;
+            dq.setToLong(rounding_.fUnion.increment.fIncrement);
+            dq.adjustMagnitude(rounding_.fUnion.increment.fIncrementMagnitude);
+            increment_ = dq.toDouble();
         } else if (rounding_.fType == Precision::PrecisionType::RND_SIGNIFICANT) {
             minSig_ = rounding_.fUnion.fracSig.fMinSig;
             maxSig_ = rounding_.fUnion.fracSig.fMaxSig;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_output.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -39,6 +39,49 @@
     return fData->outputUnit;
 }
 
+NounClass FormattedNumber::getNounClass(UErrorCode &status) const {
+    UPRV_FORMATTED_VALUE_METHOD_GUARD(NounClass::OTHER);
+    const char *nounClass = fData->gender;
+
+    // if it is not exist, return `OTHER`
+    if (uprv_strcmp(nounClass, "") == 0) {
+        return NounClass::OTHER;
+    }
+
+    if (uprv_strcmp(nounClass, "neuter") == 0) {
+        return NounClass::NEUTER;
+    }
+
+    if (uprv_strcmp(nounClass, "feminine") == 0) {
+        return NounClass::FEMININE;
+    }
+
+    if (uprv_strcmp(nounClass, "masculine") == 0) {
+        return NounClass::MASCULINE;
+    }
+
+    if (uprv_strcmp(nounClass, "animate") == 0) {
+        return NounClass::ANIMATE;
+    }
+
+    if (uprv_strcmp(nounClass, "inanimate") == 0) {
+        return NounClass::INANIMATE;
+    }
+
+    if (uprv_strcmp(nounClass, "personal") == 0) {
+        return NounClass::PERSONAL;
+    }
+
+    if (uprv_strcmp(nounClass, "common") == 0) {
+        return NounClass::COMMON;
+    }
+
+    // In case there is no matching, this means there are noun classes
+    // that are not supported yet.
+    status = U_INTERNAL_PROGRAM_ERROR;
+    return NounClass::OTHER;
+}
+
 const char *FormattedNumber::getGender(UErrorCode &status) const {
     UPRV_FORMATTED_VALUE_METHOD_GUARD("")
     return fData->gender;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_patternstring.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -750,7 +750,7 @@
     int32_t groupingLength = grouping1 + grouping2 + 1;
 
     // Figure out the digits we need to put in the pattern.
-    double roundingInterval = properties.roundingIncrement;
+    double increment = properties.roundingIncrement;
     UnicodeString digitsString;
     int32_t digitsStringScale = 0;
     if (maxSig != uprv_min(dosMax, -1)) {
@@ -761,14 +761,14 @@
         while (digitsString.length() < maxSig) {
             digitsString.append(u'#');
         }
-    } else if (roundingInterval != 0.0 && !ignoreRoundingIncrement(roundingInterval,maxFrac)) {
-        // Rounding Interval.
-        digitsStringScale = -roundingutils::doubleFractionLength(roundingInterval, nullptr);
-        // TODO: Check for DoS here?
+    } else if (increment != 0.0 && !ignoreRoundingIncrement(increment,maxFrac)) {
+        // Rounding Increment.
         DecimalQuantity incrementQuantity;
-        incrementQuantity.setToDouble(roundingInterval);
+        incrementQuantity.setToDouble(increment);
+        incrementQuantity.roundToInfinity();
+        digitsStringScale = incrementQuantity.getLowerDisplayMagnitude();
         incrementQuantity.adjustMagnitude(-digitsStringScale);
-        incrementQuantity.roundToMagnitude(0, kDefaultMode, status);
+        incrementQuantity.setMinInteger(minInt - digitsStringScale);
         UnicodeString str = incrementQuantity.toPlainString();
         if (str.charAt(0) == u'-') {
             // TODO: Unsupported operation exception or fail silently?

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_rounding.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -36,27 +36,24 @@
     // Utilize DecimalQuantity/decNumber to parse this for us.
     DecimalQuantity dq;
     UErrorCode localStatus = U_ZERO_ERROR;
-    DecNum decnum;
-    decnum.setTo({buffer.data(), buffer.length()}, localStatus);
-    dq.setToDecNum(decnum, localStatus);
-    if (U_FAILURE(localStatus) || decnum.isSpecial()) {
+    dq.setToDecNumber({buffer.data(), buffer.length()}, localStatus);
+    if (U_FAILURE(localStatus) || dq.isNaN() || dq.isInfinite()) {
         // throw new SkeletonSyntaxException("Invalid rounding increment", segment, e);
         status = U_NUMBER_SKELETON_SYNTAX_ERROR;
         return;
     }
-    double increment = dq.toDouble();
-
-    // We also need to figure out how many digits. Do a brute force string operation.
-    int decimalOffset = 0;
-    while (decimalOffset < segment.length() && segment.charAt(decimalOffset) != '.') {
-        decimalOffset++;
+    // Now we break apart the number into a mantissa and exponent (magnitude).
+    int32_t magnitude = dq.adjustToZeroScale();
+    // setToDecNumber drops trailing zeros, so we search for the '.' manually.
+    for (int32_t i=0; i<buffer.length(); i++) {
+        if (buffer[i] == '.') {
+            int32_t newMagnitude = i - buffer.length() + 1;
+            dq.adjustMagnitude(magnitude - newMagnitude);
+            magnitude = newMagnitude;
+            break;
+        }
     }
-    if (decimalOffset == segment.length()) {
-        outPrecision = Precision::increment(increment);
-    } else {
-        int32_t fractionLength = segment.length() - decimalOffset - 1;
-        outPrecision = Precision::increment(increment).withMinFraction(fractionLength);
-    }
+    outPrecision = Precision::incrementExact(dq.toLong(), magnitude);
 }
 
 namespace {
@@ -94,34 +91,6 @@
 MultiplierProducer::~MultiplierProducer() = default;
 
 
-digits_t roundingutils::doubleFractionLength(double input, int8_t* singleDigit) {
-    char buffer[DoubleToStringConverter::kBase10MaximalLength + 1];
-    bool sign; // unused; always positive
-    int32_t length;
-    int32_t point;
-    DoubleToStringConverter::DoubleToAscii(
-            input,
-            DoubleToStringConverter::DtoaMode::SHORTEST,
-            0,
-            buffer,
-            sizeof(buffer),
-            &sign,
-            &length,
-            &point
-    );
-
-    if (singleDigit == nullptr) {
-        // no-op
-    } else if (length == 1) {
-        *singleDigit = buffer[0] - '0';
-    } else {
-        *singleDigit = -1;
-    }
-
-    return static_cast<digits_t>(length - point);
-}
-
-
 Precision Precision::unlimited() {
     return Precision(RND_NONE, {});
 }
@@ -204,12 +173,24 @@
 
 IncrementPrecision Precision::increment(double roundingIncrement) {
     if (roundingIncrement > 0.0) {
-        return constructIncrement(roundingIncrement, 0);
+        DecimalQuantity dq;
+        dq.setToDouble(roundingIncrement);
+        dq.roundToInfinity();
+        int32_t magnitude = dq.adjustToZeroScale();
+        return constructIncrement(dq.toLong(), magnitude);
     } else {
         return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
 }
 
+IncrementPrecision Precision::incrementExact(uint64_t mantissa, int16_t magnitude) {
+    if (mantissa > 0.0) {
+        return constructIncrement(mantissa, magnitude);
+    } else {
+        return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
+    }
+}
+
 CurrencyPrecision Precision::currency(UCurrencyUsage currencyUsage) {
     return constructCurrency(currencyUsage);
 }
@@ -226,7 +207,8 @@
             *this,
             minSignificantDigits,
             maxSignificantDigits,
-            priority);
+            priority,
+            false);
     } else {
         return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
@@ -239,7 +221,8 @@
             *this,
             1,
             minSignificantDigits,
-            UNUM_ROUNDING_PRIORITY_RELAXED);
+            UNUM_ROUNDING_PRIORITY_RELAXED,
+            true);
     } else {
         return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
@@ -251,7 +234,8 @@
         return constructFractionSignificant(*this,
             1,
             maxSignificantDigits,
-            UNUM_ROUNDING_PRIORITY_STRICT);
+            UNUM_ROUNDING_PRIORITY_STRICT,
+            true);
     } else {
         return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
@@ -266,8 +250,8 @@
     int32_t minMaxFrac = ucurr_getDefaultFractionDigitsForUsage(
             isoCode, fUnion.currencyUsage, &status);
     Precision retval = (increment != 0.0)
-        ? static_cast<Precision>(constructIncrement(increment, minMaxFrac))
-        : static_cast<Precision>(constructFraction(minMaxFrac, minMaxFrac));
+        ? Precision::increment(increment)
+        : static_cast<Precision>(Precision::fixedFraction(minMaxFrac));
     retval.fTrailingZeroDisplay = fTrailingZeroDisplay;
     return retval;
 }
@@ -285,7 +269,9 @@
 Precision IncrementPrecision::withMinFraction(int32_t minFrac) const {
     if (fType == RND_ERROR) { return *this; } // no-op in error state
     if (minFrac >= 0 && minFrac <= kMaxIntFracSig) {
-        return constructIncrement(fUnion.increment.fIncrement, minFrac);
+        IncrementPrecision copy = *this;
+        copy.fUnion.increment.fMinFrac = minFrac;
+        return copy;
     } else {
         return {U_NUMBER_ARG_OUTOFBOUNDS_ERROR};
     }
@@ -318,35 +304,34 @@
         const FractionPrecision &base,
         int32_t minSig,
         int32_t maxSig,
-        UNumberRoundingPriority priority) {
+        UNumberRoundingPriority priority,
+        bool retain) {
     FractionSignificantSettings settings = base.fUnion.fracSig;
     settings.fMinSig = static_cast<digits_t>(minSig);
     settings.fMaxSig = static_cast<digits_t>(maxSig);
     settings.fPriority = priority;
+    settings.fRetain = retain;
     PrecisionUnion union_;
     union_.fracSig = settings;
     return {RND_FRACTION_SIGNIFICANT, union_};
 }
 
-IncrementPrecision Precision::constructIncrement(double increment, int32_t minFrac) {
+IncrementPrecision Precision::constructIncrement(uint64_t increment, digits_t magnitude) {
     IncrementSettings settings;
     // Note: For number formatting, fIncrement is used for RND_INCREMENT but not
     // RND_INCREMENT_ONE or RND_INCREMENT_FIVE. However, fIncrement is used in all
     // three when constructing a skeleton.
     settings.fIncrement = increment;
-    settings.fMinFrac = static_cast<digits_t>(minFrac);
-    // One of the few pre-computed quantities:
-    // Note: it is possible for minFrac to be more than maxFrac... (misleading)
-    int8_t singleDigit;
-    settings.fMaxFrac = roundingutils::doubleFractionLength(increment, &singleDigit);
+    settings.fIncrementMagnitude = magnitude;
+    settings.fMinFrac = magnitude > 0 ? 0 : -magnitude;
     PrecisionUnion union_;
     union_.increment = settings;
-    if (singleDigit == 1) {
+    if (increment == 1) {
         // NOTE: In C++, we must return the correct value type with the correct union.
         // It would be invalid to return a RND_FRACTION here because the methods on the
         // IncrementPrecision type assume that the union is backed by increment data.
         return {RND_INCREMENT_ONE, union_};
-    } else if (singleDigit == 5) {
+    } else if (increment == 5) {
         return {RND_INCREMENT_FIVE, union_};
     } else {
         return {RND_INCREMENT, union_};
@@ -457,6 +442,23 @@
             break;
 
         case Precision::RND_FRACTION_SIGNIFICANT: {
+            // From ECMA-402:
+            /*
+            Let sResult be ToRawPrecision(...).
+            Let fResult be ToRawFixed(...).
+            If intlObj.[[RoundingType]] is morePrecision, then
+                If sResult.[[RoundingMagnitude]] ≤ fResult.[[RoundingMagnitude]], then
+                    Let result be sResult.
+                Else,
+                    Let result be fResult.
+            Else,
+                Assert: intlObj.[[RoundingType]] is lessPrecision.
+                If sResult.[[RoundingMagnitude]] ≤ fResult.[[RoundingMagnitude]], then
+                    Let result be fResult.
+                Else,
+                    Let result be sResult.
+            */
+
             int32_t roundingMag1 = getRoundingMagnitudeFraction(fPrecision.fUnion.fracSig.fMaxFrac);
             int32_t roundingMag2 = getRoundingMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMaxSig);
             int32_t roundingMag;
@@ -465,11 +467,35 @@
             } else {
                 roundingMag = uprv_max(roundingMag1, roundingMag2);
             }
-            value.roundToMagnitude(roundingMag, fRoundingMode, status);
+            if (!value.isZeroish()) {
+                int32_t upperMag = value.getMagnitude();
+                value.roundToMagnitude(roundingMag, fRoundingMode, status);
+                if (!value.isZeroish() && value.getMagnitude() != upperMag && roundingMag1 == roundingMag2) {
+                    // roundingMag2 needs to be the magnitude after rounding
+                    roundingMag2 += 1;
+                }
+            }
 
             int32_t displayMag1 = getDisplayMagnitudeFraction(fPrecision.fUnion.fracSig.fMinFrac);
             int32_t displayMag2 = getDisplayMagnitudeSignificant(value, fPrecision.fUnion.fracSig.fMinSig);
-            int32_t displayMag = uprv_min(displayMag1, displayMag2);
+            int32_t displayMag;
+            if (fPrecision.fUnion.fracSig.fRetain) {
+                // withMinDigits + withMaxDigits
+                displayMag = uprv_min(displayMag1, displayMag2);
+            } else if (fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
+                if (roundingMag2 <= roundingMag1) {
+                    displayMag = displayMag2;
+                } else {
+                    displayMag = displayMag1;
+                }
+            } else {
+                U_ASSERT(fPrecision.fUnion.fracSig.fPriority == UNUM_ROUNDING_PRIORITY_STRICT);
+                if (roundingMag2 <= roundingMag1) {
+                    displayMag = displayMag1;
+                } else {
+                    displayMag = displayMag2;
+                }
+            }
             resolvedMinFraction = uprv_max(0, -displayMag);
 
             break;
@@ -478,6 +504,7 @@
         case Precision::RND_INCREMENT:
             value.roundToIncrement(
                     fPrecision.fUnion.increment.fIncrement,
+                    fPrecision.fUnion.increment.fIncrementMagnitude,
                     fRoundingMode,
                     status);
             resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
@@ -485,7 +512,7 @@
 
         case Precision::RND_INCREMENT_ONE:
             value.roundToMagnitude(
-                    -fPrecision.fUnion.increment.fMaxFrac,
+                    fPrecision.fUnion.increment.fIncrementMagnitude,
                     fRoundingMode,
                     status);
             resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;
@@ -493,7 +520,7 @@
 
         case Precision::RND_INCREMENT_FIVE:
             value.roundToNickel(
-                    -fPrecision.fUnion.increment.fMaxFrac,
+                    fPrecision.fUnion.increment.fIncrementMagnitude,
                     fRoundingMode,
                     status);
             resolvedMinFraction = fPrecision.fUnion.increment.fMinFrac;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_roundingutils.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -174,15 +174,6 @@
     }
 }
 
-/**
- * Computes the number of fraction digits in a double. Used for computing maxFrac for an increment.
- * Calls into the DoubleToStringConverter library to do so.
- *
- * @param singleDigit An output parameter; set to a number if that is the
- *        only digit in the double, or -1 if there is more than one digit.
- */
-digits_t doubleFractionLength(double input, int8_t* singleDigit);
-
 } // namespace roundingutils
 
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1344,8 +1344,9 @@
         // @, @@, @@@
         maxSig = minSig;
     }
-    UNumberRoundingPriority priority;
+    auto& oldPrecision = static_cast<const FractionPrecision&>(macros.precision);
     if (offset < segment.length()) {
+        UNumberRoundingPriority priority;
         if (maxSig == -1) {
             // The wildcard character is not allowed with the priority annotation
             status = U_NUMBER_SKELETON_SYNTAX_ERROR;
@@ -1367,14 +1368,13 @@
             status = U_NUMBER_SKELETON_SYNTAX_ERROR;
             return false;
         }
+        macros.precision = oldPrecision.withSignificantDigits(minSig, maxSig, priority);
     } else if (maxSig == -1) {
         // withMinDigits
-        maxSig = minSig;
-        minSig = 1;
-        priority = UNUM_ROUNDING_PRIORITY_RELAXED;
+        macros.precision = oldPrecision.withMinDigits(minSig);
     } else if (minSig == 1) {
         // withMaxDigits
-        priority = UNUM_ROUNDING_PRIORITY_STRICT;
+        macros.precision = oldPrecision.withMaxDigits(maxSig);
     } else {
         // Digits options with both min and max sig require the priority option
         status = U_NUMBER_SKELETON_SYNTAX_ERROR;
@@ -1381,8 +1381,6 @@
         return false;
     }
 
-    auto& oldPrecision = static_cast<const FractionPrecision&>(macros.precision);
-    macros.precision = oldPrecision.withSignificantDigits(minSig, maxSig, priority);
     return true;
 }
 
@@ -1399,12 +1397,16 @@
     number::impl::parseIncrementOption(segment, macros.precision, status);
 }
 
-void blueprint_helpers::generateIncrementOption(double increment, int32_t minFrac, UnicodeString& sb,
-                                                UErrorCode&) {
+void blueprint_helpers::generateIncrementOption(
+        uint32_t increment,
+        digits_t incrementMagnitude,
+        int32_t minFrac,
+        UnicodeString& sb,
+        UErrorCode&) {
     // Utilize DecimalQuantity/double_conversion to format this for us.
     DecimalQuantity dq;
-    dq.setToDouble(increment);
-    dq.roundToInfinity();
+    dq.setToLong(increment);
+    dq.adjustMagnitude(incrementMagnitude);
     dq.setMinFraction(minFrac);
     sb.append(dq.toPlainString());
 }
@@ -1617,11 +1619,21 @@
         const Precision::FractionSignificantSettings& impl = macros.precision.fUnion.fracSig;
         blueprint_helpers::generateFractionStem(impl.fMinFrac, impl.fMaxFrac, sb, status);
         sb.append(u'/');
-        blueprint_helpers::generateDigitsStem(impl.fMinSig, impl.fMaxSig, sb, status);
-        if (impl.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
-            sb.append(u'r');
+        if (impl.fRetain) {
+            if (impl.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
+                // withMinDigits
+                blueprint_helpers::generateDigitsStem(impl.fMaxSig, -1, sb, status);
+            } else {
+                // withMaxDigits
+                blueprint_helpers::generateDigitsStem(1, impl.fMaxSig, sb, status);
+            }
         } else {
-            sb.append(u's');
+            blueprint_helpers::generateDigitsStem(impl.fMinSig, impl.fMaxSig, sb, status);
+            if (impl.fPriority == UNUM_ROUNDING_PRIORITY_RELAXED) {
+                sb.append(u'r');
+            } else {
+                sb.append(u's');
+            }
         }
     } else if (macros.precision.fType == Precision::RND_INCREMENT
             || macros.precision.fType == Precision::RND_INCREMENT_ONE
@@ -1630,6 +1642,7 @@
         sb.append(u"precision-increment/", -1);
         blueprint_helpers::generateIncrementOption(
                 impl.fIncrement,
+                impl.fIncrementMagnitude,
                 impl.fMinFrac,
                 sb,
                 status);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/number_skeletons.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -286,7 +286,7 @@
 void parseIncrementOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status);
 
 void
-generateIncrementOption(double increment, int32_t minFrac, UnicodeString& sb, UErrorCode& status);
+generateIncrementOption(uint32_t increment, digits_t incrementMagnitude, int32_t minFrac, UnicodeString& sb, UErrorCode& status);
 
 void parseIntegerWidthOption(const StringSegment& segment, MacroProps& macros, UErrorCode& status);
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/numsys.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -313,12 +313,7 @@
         }
         const char *nsName = ures_getKey(nsCurrent.getAlias());
         LocalPointer<UnicodeString> newElem(new UnicodeString(nsName, -1, US_INV), status);
-        if (U_SUCCESS(status)) {
-            numsysNames->addElementX(newElem.getAlias(), status);
-            if (U_SUCCESS(status)) {
-                newElem.orphan(); // on success, the numsysNames vector owns newElem.
-            }
-        }
+        numsysNames->adoptElement(newElem.orphan(), status);
     }
 
     ures_close(numberingSystemsInfo);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/plurrule.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1548,14 +1548,9 @@
     UBool  addKeywordOther = TRUE;
     RuleChain *node = header;
     while (node != nullptr) {
-        auto newElem = new UnicodeString(node->fKeyword);
-        if (newElem == nullptr) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        fKeywordNames.addElementX(newElem, status);
+        LocalPointer<UnicodeString> newElem(node->fKeyword.clone(), status);
+        fKeywordNames.adoptElement(newElem.orphan(), status);
         if (U_FAILURE(status)) {
-            delete newElem;
             return;
         }
         if (0 == node->fKeyword.compare(PLURAL_KEYWORD_OTHER, 5)) {
@@ -1565,14 +1560,9 @@
     }
 
     if (addKeywordOther) {
-        auto newElem = new UnicodeString(PLURAL_KEYWORD_OTHER);
-        if (newElem == nullptr) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return;
-        }
-        fKeywordNames.addElementX(newElem, status);
+        LocalPointer<UnicodeString> newElem(new UnicodeString(PLURAL_KEYWORD_OTHER), status);
+        fKeywordNames.adoptElement(newElem.orphan(), status);
         if (U_FAILURE(status)) {
-            delete newElem;
             return;
         }
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/rbt_set.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/rbt_set.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/rbt_set.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -163,16 +163,13 @@
 /**
  * Construct a new empty rule set.
  */
-TransliterationRuleSet::TransliterationRuleSet(UErrorCode& status) : UMemory() {
-    ruleVector = new UVector(&_deleteRule, NULL, status);
+TransliterationRuleSet::TransliterationRuleSet(UErrorCode& status) :
+        UMemory(), ruleVector(nullptr), rules(nullptr), index {}, maxContextLength(0) {
+    LocalPointer<UVector> lpRuleVector(new UVector(_deleteRule, nullptr, status), status);
     if (U_FAILURE(status)) {
         return;
     }
-    if (ruleVector == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-    }
-    rules = NULL;
-    maxContextLength = 0;
+    ruleVector = lpRuleVector.orphan();
 }
 
 /**
@@ -180,27 +177,24 @@
  */
 TransliterationRuleSet::TransliterationRuleSet(const TransliterationRuleSet& other) :
     UMemory(other),
-    ruleVector(0),
-    rules(0),
+    ruleVector(nullptr),
+    rules(nullptr),
     maxContextLength(other.maxContextLength) {
 
     int32_t i, len;
     uprv_memcpy(index, other.index, sizeof(index));
     UErrorCode status = U_ZERO_ERROR;
-    ruleVector = new UVector(&_deleteRule, NULL, status);
-    if (other.ruleVector != 0 && ruleVector != 0 && U_SUCCESS(status)) {
+    LocalPointer<UVector> lpRuleVector(new UVector(_deleteRule, nullptr, status), status);
+    if (U_FAILURE(status)) {
+        return;
+    }
+    ruleVector = lpRuleVector.orphan();
+    if (other.ruleVector != nullptr && U_SUCCESS(status)) {
         len = other.ruleVector->size();
         for (i=0; i<len && U_SUCCESS(status); ++i) {
-            TransliterationRule *tempTranslitRule = new TransliterationRule(*(TransliterationRule*)other.ruleVector->elementAt(i));
-            // Null pointer test
-            if (tempTranslitRule == NULL) {
-                status = U_MEMORY_ALLOCATION_ERROR;
-                break;
-            }
-            ruleVector->addElementX(tempTranslitRule, status);
-            if (U_FAILURE(status)) {
-                break;
-            }
+            LocalPointer<TransliterationRule> tempTranslitRule(
+                new TransliterationRule(*(TransliterationRule*)other.ruleVector->elementAt(i)), status);
+            ruleVector->adoptElement(tempTranslitRule.orphan(), status);
         }
     }
     if (other.rules != 0 && U_SUCCESS(status)) {
@@ -247,11 +241,11 @@
  */
 void TransliterationRuleSet::addRule(TransliterationRule* adoptedRule,
                                      UErrorCode& status) {
+    LocalPointer<TransliterationRule> lpAdoptedRule(adoptedRule);
+    ruleVector->adoptElement(lpAdoptedRule.orphan(), status);
     if (U_FAILURE(status)) {
-        delete adoptedRule;
         return;
     }
-    ruleVector->addElementX(adoptedRule, status);
 
     int32_t len;
     if ((len = adoptedRule->getContextLength()) > maxContextLength) {
@@ -316,7 +310,7 @@
         for (j=0; j<n; ++j) {
             if (indexValue[j] >= 0) {
                 if (indexValue[j] == x) {
-                    v.addElementX(ruleVector->elementAt(j), status);
+                    v.addElement(ruleVector->elementAt(j), status);
                 }
             } else {
                 // If the indexValue is < 0, then the first key character is
@@ -325,7 +319,7 @@
                 // rarely, so we seldom treat this code path.
                 TransliterationRule* r = (TransliterationRule*) ruleVector->elementAt(j);
                 if (r->matchesIndexValue((uint8_t)x)) {
-                    v.addElementX(r, status);
+                    v.addElement(r, status);
                 }
             }
         }
@@ -332,6 +326,9 @@
     }
     uprv_free(indexValue);
     index[256] = v.size();
+    if (U_FAILURE(status)) {
+        return;
+    }
 
     /* Freeze things into an array.
      */

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/region.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/region.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/region.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -39,11 +39,6 @@
 
 U_CDECL_BEGIN
 
-static void U_CALLCONV
-deleteRegion(void *obj) {
-    delete (icu::Region *)obj;
-}
-
 /**
  * Cleanup callback func
  */
@@ -90,7 +85,8 @@
 
     LocalPointer<UVector> continents(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
     LocalPointer<UVector> groupings(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
-    allRegions = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status);
+    LocalPointer<UVector> lpAllRegions(new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
+    allRegions = lpAllRegions.orphan();
 
     LocalUResourceBundlePointer metadata(ures_openDirect(NULL,"metadata",&status));
     LocalUResourceBundlePointer metadataAlias(ures_getByKey(metadata.getAlias(),"alias",NULL,&status));
@@ -109,16 +105,17 @@
     LocalUResourceBundlePointer worldContainment(ures_getByKey(territoryContainment.getAlias(),"001",NULL,&status));
     LocalUResourceBundlePointer groupingContainment(ures_getByKey(territoryContainment.getAlias(),"grouping",NULL,&status));
 
+    ucln_i18n_registerCleanup(UCLN_I18N_REGION, region_cleanup);
     if (U_FAILURE(status)) {
         return;
     }
 
     // now, initialize
-    uhash_setValueDeleter(newRegionIDMap.getAlias(), deleteRegion);  // regionIDMap owns objs
-    uhash_setKeyDeleter(newRegionAliases.getAlias(), uprv_deleteUObject); // regionAliases owns the string keys
+    uhash_setValueDeleter(newRegionIDMap.getAlias(), uprv_deleteUObject);  // regionIDMap owns objs
+    uhash_setKeyDeleter(newRegionAliases.getAlias(), uprv_deleteUObject);  // regionAliases owns the string keys
 
 
-    while ( ures_hasNext(regionRegular.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(regionRegular.getAlias())) {
         UnicodeString regionName = ures_getNextUnicodeString(regionRegular.getAlias(),NULL,&status);
         int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER);
         UChar buf[6];
@@ -126,18 +123,18 @@
         if ( rangeMarkerLocation > 0 ) {
             UChar endRange = regionName.charAt(rangeMarkerLocation+1);
             buf[rangeMarkerLocation] = 0;
-            while ( buf[rangeMarkerLocation-1] <= endRange ) {
+            while (U_SUCCESS(status) && buf[rangeMarkerLocation-1] <= endRange) {
                 LocalPointer<UnicodeString> newRegion(new UnicodeString(buf), status);
-                allRegions->addElementX(newRegion.orphan(),status);
+                allRegions->adoptElement(newRegion.orphan(), status);
                 buf[rangeMarkerLocation-1]++;
             }
         } else {
             LocalPointer<UnicodeString> newRegion(new UnicodeString(regionName), status);
-            allRegions->addElementX(newRegion.orphan(),status);
+            allRegions->adoptElement(newRegion.orphan(), status);
         }
     }
 
-    while ( ures_hasNext(regionMacro.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(regionMacro.getAlias())) {
         UnicodeString regionName = ures_getNextUnicodeString(regionMacro.getAlias(),NULL,&status);
         int32_t rangeMarkerLocation = regionName.indexOf(RANGE_MARKER);
         UChar buf[6];
@@ -145,26 +142,30 @@
         if ( rangeMarkerLocation > 0 ) {
             UChar endRange = regionName.charAt(rangeMarkerLocation+1);
             buf[rangeMarkerLocation] = 0;
-            while ( buf[rangeMarkerLocation-1] <= endRange ) {
+            while ( buf[rangeMarkerLocation-1] <= endRange && U_SUCCESS(status)) {
                 LocalPointer<UnicodeString> newRegion(new UnicodeString(buf), status);
-                allRegions->addElementX(newRegion.orphan(),status);
+                allRegions->adoptElement(newRegion.orphan(),status);
                 buf[rangeMarkerLocation-1]++;
             }
         } else {
             LocalPointer<UnicodeString> newRegion(new UnicodeString(regionName), status);
-            allRegions->addElementX(newRegion.orphan(),status);
+            allRegions->adoptElement(newRegion.orphan(),status);
         }
     }
 
-    while ( ures_hasNext(regionUnknown.getAlias()) ) {
-        LocalPointer<UnicodeString> regionName (new UnicodeString(ures_getNextUnicodeString(regionUnknown.getAlias(),NULL,&status),status));
-        allRegions->addElementX(regionName.orphan(),status);
+    while (U_SUCCESS(status) && ures_hasNext(regionUnknown.getAlias())) {
+        LocalPointer<UnicodeString> regionName (
+            new UnicodeString(ures_getNextUnicodeString(regionUnknown.getAlias(), nullptr, &status), status));
+        allRegions->adoptElement(regionName.orphan(),status);
     }
 
-    while ( ures_hasNext(worldContainment.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(worldContainment.getAlias())) {
         UnicodeString *continentName = new UnicodeString(ures_getNextUnicodeString(worldContainment.getAlias(),NULL,&status));
-        continents->addElementX(continentName,status);
+        continents->adoptElement(continentName,status);
     }
+    if (U_FAILURE(status)) {
+        return;
+    }
 
     for ( int32_t i = 0 ; i < allRegions->size() ; i++ ) {
         LocalPointer<Region> r(new Region(), status);
@@ -191,22 +192,32 @@
     }
 
     UResourceBundle *groupingBundle = nullptr;
-    while ( ures_hasNext(groupingContainment.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(groupingContainment.getAlias())) {
         groupingBundle = ures_getNextResource(groupingContainment.getAlias(), groupingBundle, &status);
         if (U_FAILURE(status)) {
             break;
         }
         UnicodeString *groupingName = new UnicodeString(ures_getKey(groupingBundle), -1, US_INV);
-        groupings->addElementX(groupingName,status);
-        Region *grouping = (Region *) uhash_get(newRegionIDMap.getAlias(),groupingName);
+        LocalPointer<UnicodeString> lpGroupingName(groupingName, status);
+        groupings->adoptElement(lpGroupingName.orphan(), status);
+        if (U_FAILURE(status)) {
+            break;
+        }
+        Region *grouping = (Region *) uhash_get(newRegionIDMap.getAlias(), groupingName);
         if (grouping != NULL) {
-            for (int32_t i = 0; i < ures_getSize(groupingBundle); i++) {
+            for (int32_t i = 0; i < ures_getSize(groupingBundle) && U_SUCCESS(status); i++) {
                 UnicodeString child = ures_getUnicodeStringByIndex(groupingBundle, i, &status);
                 if (U_SUCCESS(status)) {
                     if (grouping->containedRegions == NULL) {
-                        grouping->containedRegions = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status);
+                        LocalPointer<UVector> lpContainedRegions(
+                            new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
+                        grouping->containedRegions = lpContainedRegions.orphan();
+                        if (U_FAILURE(status)) {
+                            break;
+                        }
                     }
-                    grouping->containedRegions->addElementX(new UnicodeString(child), status);
+                    LocalPointer<UnicodeString> lpChildCopy(new UnicodeString(child), status);
+                    grouping->containedRegions->adoptElement(lpChildCopy.orphan(), status);
                 }
             }
         }
@@ -214,7 +225,7 @@
     ures_close(groupingBundle);
     
     // Process the territory aliases
-    while ( ures_hasNext(territoryAlias.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(territoryAlias.getAlias())) {
         LocalUResourceBundlePointer res(ures_getNextResource(territoryAlias.getAlias(),NULL,&status));
         const char *aliasFrom = ures_getKey(res.getAlias());
         LocalPointer<UnicodeString> aliasFromStr(new UnicodeString(aliasFrom, -1, US_INV), status);
@@ -259,7 +270,7 @@
             }
             UnicodeString currentRegion;
             //currentRegion.remove();   TODO: was already 0 length?
-            for (int32_t i = 0 ; i < aliasTo.length() ; i++ ) {
+            for (int32_t i = 0 ; i < aliasTo.length() && U_SUCCESS(status); i++ ) {
                 if ( aliasTo.charAt(i) != 0x0020 ) {
                     currentRegion.append(aliasTo.charAt(i));
                 }
@@ -267,7 +278,7 @@
                     Region *target = (Region *)uhash_get(newRegionIDMap.getAlias(),(void *)&currentRegion);
                     if (target) {
                         LocalPointer<UnicodeString> preferredValue(new UnicodeString(target->idStr), status);
-                        aliasFromRegion->preferredValues->addElementX((void *)preferredValue.orphan(),status);  // may add null if err
+                        aliasFromRegion->preferredValues->adoptElement(preferredValue.orphan(),status);  // may add null if err
                     }
                     currentRegion.remove();
                 }
@@ -276,9 +287,9 @@
     }
 
     // Process the code mappings - This will allow us to assign numeric codes to most of the territories.
-    while ( ures_hasNext(codeMappings.getAlias()) ) {
+    while (U_SUCCESS(status) && ures_hasNext(codeMappings.getAlias())) {
         UResourceBundle *mapping = ures_getNextResource(codeMappings.getAlias(),NULL,&status);
-        if ( ures_getType(mapping) == URES_ARRAY && ures_getSize(mapping) == 3) {
+        if (U_SUCCESS(status) && ures_getType(mapping) == URES_ARRAY && ures_getSize(mapping) == 3) {
             UnicodeString codeMappingID = ures_getUnicodeStringByIndex(mapping,0,&status);
             UnicodeString codeMappingNumber = ures_getUnicodeStringByIndex(mapping,1,&status);
             UnicodeString codeMapping3Letter = ures_getUnicodeStringByIndex(mapping,2,&status);
@@ -356,15 +367,23 @@
 
                 // Add the child region to the set of regions contained by the parent
                 if (parentRegion->containedRegions == NULL) {
-                    parentRegion->containedRegions = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status);
+                    LocalPointer<UVector> lpContainedRegions(
+                        new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status), status);
+                    parentRegion->containedRegions = lpContainedRegions.orphan();
+                    if (U_FAILURE(status)) {
+                        return;
+                    }
                 }
 
                 LocalPointer<UnicodeString> childStr(new UnicodeString(), status);
-                if( U_FAILURE(status) ) {
+                if (U_FAILURE(status)) {
                     return;  // error out
                 }
                 childStr->fastCopyFrom(childRegion->idStr);
-                parentRegion->containedRegions->addElementX((void *)childStr.orphan(),status);
+                parentRegion->containedRegions->adoptElement(childStr.orphan(),status);
+                if (U_FAILURE(status)) {
+                    return;
+                }
 
                 // Set the parent region to be the containing region of the child.
                 // Regions of type GROUPING can't be set as the parent, since another region
@@ -388,10 +407,9 @@
         if( U_FAILURE(status) ) {
             return;  // error out
         }
-        availableRegions[ar->fType]->addElementX((void *)arString.orphan(),status);
+        availableRegions[ar->fType]->adoptElement(arString.orphan(), status);
     }
     
-    ucln_i18n_registerCleanup(UCLN_I18N_REGION, region_cleanup);
     // copy hashtables
     numericCodeMap = newNumericCodeMap.orphan();
     regionIDMap = newRegionIDMap.orphan();
@@ -402,6 +420,7 @@
     for (int32_t i = 0 ; i < URGN_LIMIT ; i++ ) {
         if ( availableRegions[i] ) {
             delete availableRegions[i];
+            availableRegions[i] = nullptr;
         }
     }
 
@@ -417,7 +436,6 @@
         uhash_close(regionIDMap);
     }
     if (allRegions) {
-        allRegions->removeAllElements(); // Don't need the temporary list anymore.
         delete allRegions;
         allRegions = NULL;
     }
@@ -615,33 +633,30 @@
 StringEnumeration*
 Region::getContainedRegions( URegionType type, UErrorCode &status ) const {
     umtx_initOnce(gRegionDataInitOnce, &loadRegionData, status); // returns immediately if U_FAILURE(status)
+
+    UVector result(nullptr, uhash_compareChars, status);
+    LocalPointer<StringEnumeration> cr(getContainedRegions(status), status);
     if (U_FAILURE(status)) {
-        return NULL;
+        return nullptr;
     }
 
-    UVector *result = new UVector(NULL, uhash_compareChars, status);
-
-    StringEnumeration *cr = getContainedRegions(status);
-
-    for ( int32_t i = 0 ; i < cr->count(status) ; i++ ) {
-        const char *regionId = cr->next(NULL,status);
-        const Region *r = Region::getInstance(regionId,status);
+    const char *regionId;
+    while((regionId = cr->next(nullptr, status)) != nullptr && U_SUCCESS(status)) {
+        const Region *r = Region::getInstance(regionId, status);
         if ( r->getType() == type) {
-            result->addElementX((void *)&r->idStr,status);
+            result.addElement(const_cast<UnicodeString *>(&r->idStr), status);
         } else {
-            StringEnumeration *children = r->getContainedRegions(type, status);
-            for ( int32_t j = 0 ; j < children->count(status) ; j++ ) {
-                const char *id2 = children->next(NULL,status);
+            LocalPointer<StringEnumeration> children(r->getContainedRegions(type, status));
+            const char *id2;
+            while(U_SUCCESS(status) && ((id2 = children->next(nullptr, status)) != nullptr)) {
                 const Region *r2 = Region::getInstance(id2,status);
-                result->addElementX((void *)&r2->idStr,status);
+                result.addElement(const_cast<UnicodeString *>(&r2->idStr), status);
             }
-            delete children;
         }
     }
-    delete cr;
-    StringEnumeration* resultEnumeration = new RegionNameEnumeration(result,status);
-    delete result;
-    return resultEnumeration;
+    LocalPointer<StringEnumeration> resultEnumeration(
+        new RegionNameEnumeration(&result, status), status);
+    return U_SUCCESS(status) ? resultEnumeration.orphan() : nullptr;
 }
 
 /**
@@ -706,19 +721,22 @@
     return fType;
 }
 
-RegionNameEnumeration::RegionNameEnumeration(UVector *fNameList, UErrorCode& status) {
-    pos=0;
-    if (fNameList && U_SUCCESS(status)) {
-        fRegionNames = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, fNameList->size(),status);
-        for ( int32_t i = 0 ; i < fNameList->size() ; i++ ) {
-            UnicodeString* this_region_name = (UnicodeString *)fNameList->elementAt(i);
-            UnicodeString* new_region_name = new UnicodeString(*this_region_name);
-            fRegionNames->addElementX((void *)new_region_name,status);
+RegionNameEnumeration::RegionNameEnumeration(UVector *nameList, UErrorCode& status) :
+        pos(0), fRegionNames(nullptr) {
+    // TODO: https://unicode-org.atlassian.net/browse/ICU-21829
+    // Is all of the copying going on here really necessary?
+    if (nameList && U_SUCCESS(status)) {
+        LocalPointer<UVector> regionNames(
+            new UVector(uprv_deleteUObject, uhash_compareUnicodeString, nameList->size(), status), status);
+        for ( int32_t i = 0 ; U_SUCCESS(status) && i < nameList->size() ; i++ ) {
+            UnicodeString* this_region_name = (UnicodeString *)nameList->elementAt(i);
+            LocalPointer<UnicodeString> new_region_name(new UnicodeString(*this_region_name), status);
+            regionNames->adoptElement(new_region_name.orphan(), status);
         }
+        if (U_SUCCESS(status)) {
+            fRegionNames = regionNames.orphan();
+        }
     }
-    else {
-        fRegionNames = NULL;
-    }
 }
 
 const UnicodeString*

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/region_impl.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/region_impl.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/region_impl.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -26,7 +26,11 @@
 
 class RegionNameEnumeration : public StringEnumeration {
 public:
-    RegionNameEnumeration(UVector *fNameList, UErrorCode& status);
+    /**
+     * Construct an string enumeration over the supplied name list.
+     * Makes a copy of the supplied input name list; does not retain a reference to the original.
+     */
+    RegionNameEnumeration(UVector *nameList, UErrorCode& status);
     virtual ~RegionNameEnumeration();
     static UClassID U_EXPORT2 getStaticClassID(void);
     virtual UClassID getDynamicClassID(void) const override;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/smpdtfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -3792,6 +3792,9 @@
         src = &text;
     }
     parseInt(*src, number, pos, allowNegative,currentNumberFormat);
+    if (!isLenient() && pos.getIndex() < start + count) {
+        return -start;
+    }
     if (pos.getIndex() != parseStart) {
         int32_t val = number.getLong();
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/tmutfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -320,7 +320,7 @@
 TimeUnitFormat::setup(UErrorCode& err) {
     initDataMembers(err);
 
-    UVector pluralCounts(0, uhash_compareUnicodeString, 6, err);
+    UVector pluralCounts(nullptr, uhash_compareUnicodeString, 6, err);
     LocalPointer<StringEnumeration> keywords(getPluralRules().getKeywords(err), err);
     if (U_FAILURE(err)) {
         return;
@@ -327,7 +327,7 @@
     }
     UnicodeString* pluralCount;
     while ((pluralCount = const_cast<UnicodeString*>(keywords->snext(err))) != NULL) {
-      pluralCounts.addElementX(pluralCount, err);
+      pluralCounts.addElement(pluralCount, err);
     }
     readFromCurrentLocale(UTMUTFMT_FULL_STYLE, gUnitsTag, pluralCounts, err);
     checkConsistency(UTMUTFMT_FULL_STYLE, gUnitsTag, err);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/tzfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2459,7 +2459,7 @@
                 if (itemType != GMTOffsetField::TEXT) {
                     if (GMTOffsetField::isValid(itemType, itemLength)) {
                         GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast<uint8_t>(itemLength), status);
-                        result->addElementX(fld, status);
+                        result->adoptElement(fld, status);
                         if (U_FAILURE(status)) {
                             break;
                         }
@@ -2485,7 +2485,7 @@
                         if (itemType == GMTOffsetField::TEXT) {
                             if (text.length() > 0) {
                                 GMTOffsetField* textfld = GMTOffsetField::createText(text, status);
-                                result->addElementX(textfld, status);
+                                result->adoptElement(textfld, status);
                                 if (U_FAILURE(status)) {
                                     break;
                                 }
@@ -2494,7 +2494,7 @@
                         } else {
                             if (GMTOffsetField::isValid(itemType, itemLength)) {
                                 GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast<uint8_t>(itemLength), status);
-                                result->addElementX(fld, status);
+                                result->adoptElement(fld, status);
                                 if (U_FAILURE(status)) {
                                     break;
                                 }
@@ -2512,7 +2512,7 @@
                     if (itemType != GMTOffsetField::TEXT) {
                         if (GMTOffsetField::isValid(itemType, itemLength)) {
                             GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast<uint8_t>(itemLength), status);
-                            result->addElementX(fld, status);
+                            result->adoptElement(fld, status);
                             if (U_FAILURE(status)) {
                                 break;
                             }
@@ -2532,12 +2532,12 @@
         if (itemType == GMTOffsetField::TEXT) {
             if (text.length() > 0) {
                 GMTOffsetField* tfld = GMTOffsetField::createText(text, status);
-                result->addElementX(tfld, status);
+                result->adoptElement(tfld, status);
             }
         } else {
             if (GMTOffsetField::isValid(itemType, itemLength)) {
                 GMTOffsetField* fld = GMTOffsetField::createTimeField(itemType, static_cast<uint8_t>(itemLength), status);
-                result->addElementX(fld, status);
+                result->adoptElement(fld, status);
             } else {
                 status = U_ILLEGAL_ARGUMENT_ERROR;
             }

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/tzgnames.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -229,31 +229,28 @@
             if ((nameinfo->type & fTypes) != 0) {
                 // matches a requested type
                 if (fResults == NULL) {
-                    fResults = new UVector(uprv_free, NULL, status);
-                    if (fResults == NULL) {
-                        status = U_MEMORY_ALLOCATION_ERROR;
+                    LocalPointer<UVector> lpResults(new UVector(uprv_free, NULL, status), status);
+                    if (U_FAILURE(status)) {
+                        return false;
                     }
+                    fResults = lpResults.orphan();
                 }
-                if (U_SUCCESS(status)) {
-                    U_ASSERT(fResults != NULL);
-                    GMatchInfo *gmatch = (GMatchInfo *)uprv_malloc(sizeof(GMatchInfo));
-                    if (gmatch == NULL) {
-                        status = U_MEMORY_ALLOCATION_ERROR;
-                    } else {
-                        // add the match to the vector
-                        gmatch->gnameInfo = nameinfo;
-                        gmatch->matchLength = matchLength;
-                        gmatch->timeType = UTZFMT_TIME_TYPE_UNKNOWN;
-                        fResults->addElementX(gmatch, status);
-                        if (U_FAILURE(status)) {
-                            uprv_free(gmatch);
-                        } else {
-                            if (matchLength > fMaxMatchLen) {
-                                fMaxMatchLen = matchLength;
-                            }
-                        }
-                    }
+                GMatchInfo *gmatch = (GMatchInfo *)uprv_malloc(sizeof(GMatchInfo));
+                if (gmatch == NULL) {
+                    status = U_MEMORY_ALLOCATION_ERROR;
+                    return false;
                 }
+                // add the match to the vector
+                gmatch->gnameInfo = nameinfo;
+                gmatch->matchLength = matchLength;
+                gmatch->timeType = UTZFMT_TIME_TYPE_UNKNOWN;
+                fResults->adoptElement(gmatch, status);
+                if (U_FAILURE(status)) {
+                    return false;
+                }
+                if (matchLength > fMaxMatchLen) {
+                    fMaxMatchLen = matchLength;
+                }
             }
         }
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/tznames.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -414,15 +414,12 @@
     if (U_FAILURE(status)) {
         return;
     }
-    MatchInfo* matchInfo = new MatchInfo(nameType, matchLength, &tzID, NULL);
-    if (matchInfo == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
+    LocalPointer <MatchInfo> matchInfo(new MatchInfo(nameType, matchLength, &tzID, NULL), status);
+    UVector *matchesVec = matches(status);
+    if (U_FAILURE(status)) {
         return;
     }
-    matches(status)->addElementX(matchInfo, status);
-    if (U_FAILURE(status)) {
-        delete matchInfo;
-    }
+    matchesVec->adoptElement(matchInfo.orphan(), status);
 }
 
 void
@@ -431,15 +428,12 @@
     if (U_FAILURE(status)) {
         return;
     }
-    MatchInfo* matchInfo = new MatchInfo(nameType, matchLength, NULL, &mzID);
-    if (matchInfo == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
+    LocalPointer<MatchInfo> matchInfo(new MatchInfo(nameType, matchLength, NULL, &mzID), status);
+    UVector *matchesVec = matches(status);
+    if (U_FAILURE(status)) {
         return;
     }
-    matches(status)->addElementX(matchInfo, status);
-    if (U_FAILURE(status)) {
-        delete matchInfo;
-    }
+    matchesVec->adoptElement(matchInfo.orphan(), status);
 }
 
 int32_t

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/tznames_impl.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -148,7 +148,8 @@
         if (!fHasValuesVector) {
             // There is only one value so far, and not in a vector yet.
             // Create a vector and add the old value.
-            UVector *values = new UVector(valueDeleter, NULL, DEFAULT_CHARACTERNODE_CAPACITY, status);
+            LocalPointer<UVector> values(
+                new UVector(valueDeleter, NULL, DEFAULT_CHARACTERNODE_CAPACITY, status), status);
             if (U_FAILURE(status)) {
                 if (valueDeleter) {
                     valueDeleter(value);
@@ -155,12 +156,21 @@
                 }
                 return;
             }
-            values->addElementX(fValues, status);
-            fValues = values;
+            if (values->hasDeleter()) {
+                values->adoptElement(fValues, status);
+            } else {
+                values->addElement(fValues, status);
+            }
+            fValues = values.orphan();
             fHasValuesVector = TRUE;
         }
         // Add the new value.
-        ((UVector *)fValues)->addElementX(value, status);
+        UVector *values = (UVector *)fValues;
+        if (values->hasDeleter()) {
+            values->adoptElement(value, status);
+        } else {
+            values->addElement(value, status);
+        }
     }
 }
 
@@ -219,10 +229,8 @@
 TextTrieMap::put(const UChar *key, void *value, UErrorCode &status) {
     fIsEmpty = FALSE;
     if (fLazyContents == NULL) {
-        fLazyContents = new UVector(status);
-        if (fLazyContents == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-        }
+        LocalPointer<UVector> lpLazyContents(new UVector(status), status);
+        fLazyContents = lpLazyContents.orphan();
     }
     if (U_FAILURE(status)) {
         if (fValueDeleter) {
@@ -233,7 +241,7 @@
     U_ASSERT(fLazyContents != NULL);
 
     UChar *s = const_cast<UChar *>(key);
-    fLazyContents->addElementX(s, status);
+    fLazyContents->addElement(s, status);
     if (U_FAILURE(status)) {
         if (fValueDeleter) {
             fValueDeleter((void*) key);
@@ -241,7 +249,7 @@
         return;
     }
 
-    fLazyContents->addElementX(value, status);
+    fLazyContents->addElement(value, status);
 }
 
 void
@@ -854,7 +862,7 @@
 public:
     MetaZoneIDsEnumeration();
     MetaZoneIDsEnumeration(const UVector& mzIDs);
-    MetaZoneIDsEnumeration(UVector* mzIDs);
+    MetaZoneIDsEnumeration(LocalPointer<UVector> mzIDs);
     virtual ~MetaZoneIDsEnumeration();
     static UClassID U_EXPORT2 getStaticClassID(void);
     virtual UClassID getDynamicClassID(void) const override;
@@ -865,7 +873,7 @@
     int32_t fLen;
     int32_t fPos;
     const UVector* fMetaZoneIDs;
-    UVector *fLocalVector;
+    LocalPointer<UVector> fLocalVector;
 };
 
 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(MetaZoneIDsEnumeration)
@@ -879,8 +887,9 @@
     fLen = fMetaZoneIDs->size();
 }
 
-MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(UVector *mzIDs)
-: fLen(0), fPos(0), fMetaZoneIDs(mzIDs), fLocalVector(mzIDs) {
+MetaZoneIDsEnumeration::MetaZoneIDsEnumeration(LocalPointer<UVector> mzIDs)
+: fLen(0), fPos(0), fMetaZoneIDs(nullptr), fLocalVector(std::move(mzIDs)) {
+    fMetaZoneIDs = fLocalVector.getAlias();
     if (fMetaZoneIDs) {
         fLen = fMetaZoneIDs->size();
     }
@@ -906,9 +915,6 @@
 }
 
 MetaZoneIDsEnumeration::~MetaZoneIDsEnumeration() {
-    if (fLocalVector) {
-        delete fLocalVector;
-    }
 }
 
 
@@ -1153,28 +1159,23 @@
         return new MetaZoneIDsEnumeration();
     }
 
-    MetaZoneIDsEnumeration *senum = NULL;
-    UVector* mzIDs = new UVector(NULL, uhash_compareUChars, status);
-    if (mzIDs == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-    }
+    LocalPointer<MetaZoneIDsEnumeration> senum;
+    LocalPointer<UVector> mzIDs(new UVector(NULL, uhash_compareUChars, status), status);
     if (U_SUCCESS(status)) {
-        U_ASSERT(mzIDs != NULL);
+        U_ASSERT(mzIDs.isValid());
         for (int32_t i = 0; U_SUCCESS(status) && i < mappings->size(); i++) {
 
             OlsonToMetaMappingEntry *map = (OlsonToMetaMappingEntry *)mappings->elementAt(i);
             const UChar *mzID = map->mzid;
             if (!mzIDs->contains((void *)mzID)) {
-                mzIDs->addElementX((void *)mzID, status);
+                mzIDs->addElement((void *)mzID, status);
             }
         }
         if (U_SUCCESS(status)) {
-            senum = new MetaZoneIDsEnumeration(mzIDs);
-        } else {
-            delete mzIDs;
+            senum.adoptInsteadAndCheckErrorCode(new MetaZoneIDsEnumeration(std::move(mzIDs)), status);
         }
     }
-    return senum;
+    return U_SUCCESS(status) ? senum.orphan() : nullptr;
 }
 
 UnicodeString&

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/ucol.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/ucol.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/ucol.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -96,12 +96,18 @@
     if (newColl == NULL) {
         *status = U_MEMORY_ALLOCATION_ERROR;
         return nullptr;
-    } else {
+    } else if (pBufferSize != NULL) {
         *status = U_SAFECLONE_ALLOCATED_WARNING;
     }
     return newColl->toUCollator();
 }
 
+U_CAPI UCollator* U_EXPORT2
+ucol_clone(const UCollator *coll, UErrorCode *status)
+{
+    return ucol_safeClone(coll, nullptr, nullptr, status);
+}
+
 U_CAPI void U_EXPORT2
 ucol_close(UCollator *coll)
 {

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/udatpg.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/udatpg.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/udatpg.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -210,12 +210,47 @@
 U_CAPI const UChar * U_EXPORT2
 udatpg_getDateTimeFormat(const UDateTimePatternGenerator *dtpg,
                          int32_t *pLength) {
-    const UnicodeString &result=((const DateTimePatternGenerator *)dtpg)->getDateTimeFormat();
-    if(pLength!=NULL) {
+    UErrorCode status = U_ZERO_ERROR;
+    return udatpg_getDateTimeFormatForStyle(dtpg, UDAT_MEDIUM, pLength, &status);
+}
+
+U_CAPI void U_EXPORT2
+udatpg_setDateTimeFormatForStyle(UDateTimePatternGenerator *udtpg,
+                        UDateFormatStyle style,
+                        const UChar *dateTimeFormat, int32_t length,
+                        UErrorCode *pErrorCode) {
+    if (U_FAILURE(*pErrorCode)) {
+        return;
+    } else if (dateTimeFormat==nullptr) {
+        *pErrorCode = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    DateTimePatternGenerator *dtpg = reinterpret_cast<DateTimePatternGenerator *>(udtpg);
+    UnicodeString dtFormatString((UBool)(length<0), dateTimeFormat, length);
+    dtpg->setDateTimeFormat(style, dtFormatString, *pErrorCode);
+}
+
+U_CAPI const UChar* U_EXPORT2
+udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator *udtpg,
+                        UDateFormatStyle style, int32_t *pLength,
+                        UErrorCode *pErrorCode) {
+    static const UChar emptyString[] = { (UChar)0 };
+    if (U_FAILURE(*pErrorCode)) {
+        if (pLength !=nullptr) {
+            *pLength = 0;
+        }
+        return emptyString;
+    }
+    const DateTimePatternGenerator *dtpg = reinterpret_cast<const DateTimePatternGenerator *>(udtpg);
+    const UnicodeString &result = dtpg->getDateTimeFormat(style, *pErrorCode);
+    if (pLength != nullptr) {
         *pLength=result.length();
     }
+    // Note: The UnicodeString for the dateTimeFormat string in the DateTimePatternGenerator
+    // was NUL-terminated what it was set, to avoid doing it here which could re-allocate
+    // the buffe and affect and cont references to the string or its buffer.
     return result.getBuffer();
-}
+ }
 
 U_CAPI void U_EXPORT2
 udatpg_setDecimal(UDateTimePatternGenerator *dtpg,

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/basictz.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -152,10 +152,9 @@
     virtual void getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial,
         AnnualTimeZoneRule*& std, AnnualTimeZoneRule*& dst, UErrorCode& status) const;
 
-#ifndef U_FORCE_HIDE_DRAFT_API
     /**
      * Get time zone offsets from local wall time.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     virtual void getOffsetFromLocal(
         UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
@@ -162,7 +161,6 @@
         UTimeZoneLocalOption duplicatedTimeOpt, int32_t& rawOffset,
         int32_t& dstOffset, UErrorCode& status) const;
 
-#endif /* U_FORCE_HIDE_DRAFT_API */
 
 #ifndef U_HIDE_INTERNAL_API
     /**

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/dtptngen.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -311,6 +311,11 @@
      * for those two skeletons, so the result is put together with this pattern,
      * resulting in "d-MMM h:mm".
      *
+     * There are four DateTimeFormats in a DateTimePatternGenerator object,
+     * corresponding to date styles UDAT_FULL..UDAT_SHORT. This method sets
+     * all of them to the specified pattern. To set them individually, see
+     * setDateTimeFormat(UDateFormatStyle style, ...).
+     *
      * @param dateTimeFormat
      *            message format pattern, here {1} will be replaced by the date
      *            pattern and {0} will be replaced by the time pattern.
@@ -320,12 +325,67 @@
 
     /**
      * Getter corresponding to setDateTimeFormat.
+     *
+     * There are four DateTimeFormats in a DateTimePatternGenerator object,
+     * corresponding to date styles UDAT_FULL..UDAT_SHORT. This method gets
+     * the style for UDAT_MEDIUM (the default). To get them individually, see
+     * getDateTimeFormat(UDateFormatStyle style).
+     *
      * @return DateTimeFormat.
      * @stable ICU 3.8
      */
     const UnicodeString& getDateTimeFormat() const;
 
+#if !UCONFIG_NO_FORMATTING
+#ifndef U_HIDE_DRAFT_API
     /**
+     * dateTimeFormats are message patterns used to compose combinations of date
+     * and time patterns. There are four length styles, corresponding to the
+     * inferred style of the date pattern; these are UDateFormatStyle values:
+     *  - UDAT_FULL (for date pattern with weekday and long month), else
+     *  - UDAT_LONG (for a date pattern with long month), else
+     *  - UDAT_MEDIUM (for a date pattern with abbreviated month), else
+     *  - UDAT_SHORT (for any other date pattern).
+     * For details on dateTimeFormats, see
+     * https://www.unicode.org/reports/tr35/tr35-dates.html#dateTimeFormats.
+     * The default pattern in the root locale for all styles is "{1} {0}".
+     *
+     * @param style
+     *              one of DateFormat.FULL..DateFormat.SHORT. Error if out of range.
+     * @param dateTimeFormat
+     *              the new dateTimeFormat to set for the the specified style
+     * @param status
+     *              in/out parameter; if no failure status is already set,
+     *              it will be set according to result of the function (e.g.
+     *              U_ILLEGAL_ARGUMENT_ERROR for style out of range).
+     * @draft ICU 71
+     */
+    void setDateTimeFormat(UDateFormatStyle style, const UnicodeString& dateTimeFormat,
+                            UErrorCode& status);
+
+    /**
+     * Getter corresponding to setDateTimeFormat.
+     *
+     * @param style
+     *              one of UDAT_FULL..UDAT_SHORT. Error if out of range.
+     * @param status
+     *              in/out parameter; if no failure status is already set,
+     *              it will be set according to result of the function (e.g.
+     *              U_ILLEGAL_ARGUMENT_ERROR for style out of range).
+     * @return
+     *              the current dateTimeFormat for the the specified style, or
+     *              empty string in case of error. The UnicodeString reference,
+     *              or the contents of the string, may no longer be valid if
+     *              setDateTimeFormat is called, or the DateTimePatternGenerator
+     *              object is deleted.
+     * @draft ICU 71
+     */
+    const UnicodeString& getDateTimeFormat(UDateFormatStyle style,
+                            UErrorCode& status) const;
+#endif /* U_HIDE_DRAFT_API */
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+    /**
      * Return the best pattern matching the input skeleton. It is guaranteed to
      * have all of the fields in the skeleton.
      *
@@ -545,8 +605,7 @@
      */
     DateTimePatternGenerator& operator=(const DateTimePatternGenerator& other);
 
-    // TODO(ticket:13619): re-enable when UDATPG_NARROW no longer in  draft mode.
-    // static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1;
+    static const int32_t UDATPG_WIDTH_COUNT = UDATPG_NARROW + 1;
 
     Locale pLocale;  // pattern locale
     FormatParser *fp;
@@ -554,9 +613,8 @@
     DistanceInfo *distanceInfo;
     PatternMap *patternMap;
     UnicodeString appendItemFormats[UDATPG_FIELD_COUNT];
-    // TODO(ticket:13619): [3] -> UDATPG_WIDTH_COUNT
-    UnicodeString fieldDisplayNames[UDATPG_FIELD_COUNT][3];
-    UnicodeString dateTimeFormat;
+    UnicodeString fieldDisplayNames[UDATPG_FIELD_COUNT][UDATPG_WIDTH_COUNT];
+    UnicodeString dateTimeFormat[4];
     UnicodeString decimal;
     DateTimeMatcher *skipMatcher;
     Hashtable *fAvailableFormatKeyHash;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/measunit.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -77,7 +77,6 @@
 };
 
 
-#ifndef U_HIDE_DRAFT_API
 /**
  * Enumeration for SI and binary prefixes, e.g. "kilo-", "nano-", "mebi-".
  *
@@ -84,7 +83,7 @@
  * Enum values should be treated as opaque: use umeas_getPrefixPower() and
  * umeas_getPrefixBase() to find their corresponding values.
  *
- * @draft ICU 69
+ * @stable ICU 69
  * @see umeas_getPrefixBase
  * @see umeas_getPrefixPower
  */
@@ -96,7 +95,7 @@
      * implementation detail and should not be relied upon: use
      * umeas_getPrefixPower() to obtain meaningful values.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_ONE = 30 + 0,
 
@@ -103,7 +102,7 @@
     /**
      * SI prefix: yotta, 10^24.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_YOTTA = UMEASURE_PREFIX_ONE + 24,
 
@@ -119,7 +118,7 @@
     /**
      * SI prefix: zetta, 10^21.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_ZETTA = UMEASURE_PREFIX_ONE + 21,
 
@@ -126,7 +125,7 @@
     /**
      * SI prefix: exa, 10^18.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_EXA = UMEASURE_PREFIX_ONE + 18,
 
@@ -133,7 +132,7 @@
     /**
      * SI prefix: peta, 10^15.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_PETA = UMEASURE_PREFIX_ONE + 15,
 
@@ -140,7 +139,7 @@
     /**
      * SI prefix: tera, 10^12.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_TERA = UMEASURE_PREFIX_ONE + 12,
 
@@ -147,7 +146,7 @@
     /**
      * SI prefix: giga, 10^9.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_GIGA = UMEASURE_PREFIX_ONE + 9,
 
@@ -154,7 +153,7 @@
     /**
      * SI prefix: mega, 10^6.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_MEGA = UMEASURE_PREFIX_ONE + 6,
 
@@ -161,7 +160,7 @@
     /**
      * SI prefix: kilo, 10^3.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_KILO = UMEASURE_PREFIX_ONE + 3,
 
@@ -168,7 +167,7 @@
     /**
      * SI prefix: hecto, 10^2.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_HECTO = UMEASURE_PREFIX_ONE + 2,
 
@@ -175,7 +174,7 @@
     /**
      * SI prefix: deka, 10^1.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_DEKA = UMEASURE_PREFIX_ONE + 1,
 
@@ -182,7 +181,7 @@
     /**
      * SI prefix: deci, 10^-1.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_DECI = UMEASURE_PREFIX_ONE + -1,
 
@@ -189,7 +188,7 @@
     /**
      * SI prefix: centi, 10^-2.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_CENTI = UMEASURE_PREFIX_ONE + -2,
 
@@ -196,7 +195,7 @@
     /**
      * SI prefix: milli, 10^-3.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_MILLI = UMEASURE_PREFIX_ONE + -3,
 
@@ -203,7 +202,7 @@
     /**
      * SI prefix: micro, 10^-6.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_MICRO = UMEASURE_PREFIX_ONE + -6,
 
@@ -210,7 +209,7 @@
     /**
      * SI prefix: nano, 10^-9.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_NANO = UMEASURE_PREFIX_ONE + -9,
 
@@ -217,7 +216,7 @@
     /**
      * SI prefix: pico, 10^-12.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_PICO = UMEASURE_PREFIX_ONE + -12,
 
@@ -224,7 +223,7 @@
     /**
      * SI prefix: femto, 10^-15.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_FEMTO = UMEASURE_PREFIX_ONE + -15,
 
@@ -231,7 +230,7 @@
     /**
      * SI prefix: atto, 10^-18.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_ATTO = UMEASURE_PREFIX_ONE + -18,
 
@@ -238,7 +237,7 @@
     /**
      * SI prefix: zepto, 10^-21.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_ZEPTO = UMEASURE_PREFIX_ONE + -21,
 
@@ -245,7 +244,7 @@
     /**
      * SI prefix: yocto, 10^-24.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_YOCTO = UMEASURE_PREFIX_ONE + -24,
 
@@ -270,7 +269,7 @@
     /**
      * Binary prefix: kibi, 1024^1.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_KIBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 1,
 
@@ -286,7 +285,7 @@
     /**
      * Binary prefix: mebi, 1024^2.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_MEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 2,
 
@@ -293,7 +292,7 @@
     /**
      * Binary prefix: gibi, 1024^3.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_GIBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 3,
 
@@ -300,7 +299,7 @@
     /**
      * Binary prefix: tebi, 1024^4.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_TEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 4,
 
@@ -307,7 +306,7 @@
     /**
      * Binary prefix: pebi, 1024^5.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_PEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 5,
 
@@ -314,7 +313,7 @@
     /**
      * Binary prefix: exbi, 1024^6.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_EXBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 6,
 
@@ -321,7 +320,7 @@
     /**
      * Binary prefix: zebi, 1024^7.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_ZEBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 7,
 
@@ -328,7 +327,7 @@
     /**
      * Binary prefix: yobi, 1024^8.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMEASURE_PREFIX_YOBI = UMEASURE_PREFIX_INTERNAL_ONE_BIN + 8,
 
@@ -347,7 +346,7 @@
  * base is 10 for SI prefixes (kilo, micro) and 1024 for binary prefixes (kibi,
  * mebi).
  *
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI int32_t U_EXPORT2 umeas_getPrefixBase(UMeasurePrefix unitPrefix);
 
@@ -355,12 +354,10 @@
  * Returns the exponent of the factor associated with the given unit prefix, for
  * example 3 for kilo, -6 for micro, 1 for kibi, 2 for mebi, 3 for gibi.
  *
- * @draft ICU 69
+ * @stable ICU 69
  */
 U_CAPI int32_t U_EXPORT2 umeas_getPrefixPower(UMeasurePrefix unitPrefix);
 
-#endif // U_HIDE_DRAFT_API
-
 /**
  * A unit such as length, mass, volume, currency, etc.  A unit is
  * coupled with a numeric amount to produce a Measure.
@@ -481,7 +478,6 @@
      */
     UMeasureUnitComplexity getComplexity(UErrorCode& status) const;
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Creates a MeasureUnit which is this SINGLE unit augmented with the specified prefix.
      * For example, UMEASURE_PREFIX_KILO for "kilo", or UMEASURE_PREFIX_KIBI for "kibi".
@@ -494,7 +490,7 @@
      * @param prefix The prefix, from UMeasurePrefix.
      * @param status Set if this is not a SINGLE unit or if another error occurs.
      * @return A new SINGLE unit.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     MeasureUnit withPrefix(UMeasurePrefix prefix, UErrorCode& status) const;
 
@@ -510,10 +506,9 @@
      * @return The prefix of this SINGLE unit, from UMeasurePrefix.
      * @see umeas_getPrefixBase
      * @see umeas_getPrefixPower
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UMeasurePrefix getPrefix(UErrorCode& status) const;
-#endif // U_HIDE_DRAFT_API
 
     /**
      * Creates a MeasureUnit which is this SINGLE unit augmented with the specified dimensionality
@@ -989,13 +984,12 @@
      */
     static MeasureUnit getKarat();
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Returns by pointer, unit of concentr: milligram-ofglucose-per-deciliter.
      * Caller owns returned value and must free it.
      * Also see {@link #getMilligramOfglucosePerDeciliter()}.
      * @param status ICU error code.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     static MeasureUnit *createMilligramOfglucosePerDeciliter(UErrorCode &status);
 
@@ -1002,10 +996,9 @@
     /**
      * Returns by value, unit of concentr: milligram-ofglucose-per-deciliter.
      * Also see {@link #createMilligramOfglucosePerDeciliter()}.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     static MeasureUnit getMilligramOfglucosePerDeciliter();
-#endif /* U_HIDE_DRAFT_API */
 
     /**
      * Returns by pointer, unit of concentr: milligram-per-deciliter.

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/numberformatter.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -22,6 +22,7 @@
 #include "unicode/parseerr.h"
 #include "unicode/plurrule.h"
 #include "unicode/ucurr.h"
+#include "unicode/unounclass.h"
 #include "unicode/unum.h"
 #include "unicode/unumberformatter.h"
 #include "unicode/uobject.h"
@@ -640,7 +641,34 @@
      */
     static IncrementPrecision increment(double roundingIncrement);
 
+#ifndef U_HIDE_DRAFT_API
     /**
+     * Version of `Precision::increment()` that takes an integer at a particular power of 10.
+     *
+     * To round to the nearest 0.5 and display 2 fraction digits, with this function, you should write one of the following:
+     *
+     * <pre>
+     * Precision::incrementExact(5, -1).withMinFraction(2)
+     * Precision::incrementExact(50, -2).withMinFraction(2)
+     * Precision::incrementExact(50, -2)
+     * </pre>
+     *
+     * This is analagous to ICU4J `Precision.increment(new BigDecimal("0.50"))`.
+     *
+     * This behavior is modeled after ECMA-402. For more information, see:
+     * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#roundingincrement
+     *
+     * @param mantissa
+     *            The increment to which to round numbers.
+     * @param magnitude
+     *            The power of 10 of the ones digit of the mantissa.
+     * @return A precision for chaining or passing to the NumberFormatter precision() setter.
+     * @draft ICU 71
+     */
+    static IncrementPrecision incrementExact(uint64_t mantissa, int16_t magnitude);
+#endif // U_HIDE_DRAFT_API
+
+    /**
      * Show numbers rounded and padded according to the rules for the currency unit. The most common
      * rounding precision settings for currencies include <code>Precision::fixedFraction(2)</code>,
      * <code>Precision::integer()</code>, and <code>Precision::increment(0.05)</code> for cash transactions
@@ -659,16 +687,14 @@
      */
     static CurrencyPrecision currency(UCurrencyUsage currencyUsage);
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Configure how trailing zeros are displayed on numbers. For example, to hide trailing zeros
      * when the number is an integer, use UNUM_TRAILING_ZERO_HIDE_IF_WHOLE.
      *
      * @param trailingZeroDisplay Option to configure the display of trailing zeros.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     Precision trailingZeroDisplay(UNumberTrailingZeroDisplay trailingZeroDisplay) const;
-#endif // U_HIDE_DRAFT_API
 
   private:
     enum PrecisionType {
@@ -707,16 +733,23 @@
             impl::digits_t fMaxSig;
             /** @internal (private) */
             UNumberRoundingPriority fPriority;
+            /**
+             * Whether to retain trailing zeros based on the looser strategy.
+             * @internal (private)
+             */
+            bool fRetain;
         } fracSig;
         /** @internal (private) */
         struct IncrementSettings {
             // For RND_INCREMENT, RND_INCREMENT_ONE, and RND_INCREMENT_FIVE
+            // Note: This is a union, so we shouldn't own memory, since
+            // the default destructor would leak it.
             /** @internal (private) */
-            double fIncrement;
+            uint64_t fIncrement;
             /** @internal (private) */
+            impl::digits_t fIncrementMagnitude;
+            /** @internal (private) */
             impl::digits_t fMinFrac;
-            /** @internal (private) */
-            impl::digits_t fMaxFrac;
         } increment;
         UCurrencyUsage currencyUsage; // For RND_CURRENCY
         UErrorCode errorCode; // For RND_ERROR
@@ -759,9 +792,10 @@
         const FractionPrecision &base,
         int32_t minSig,
         int32_t maxSig,
-        UNumberRoundingPriority priority);
+        UNumberRoundingPriority priority,
+        bool retain);
 
-    static IncrementPrecision constructIncrement(double increment, int32_t minFrac);
+    static IncrementPrecision constructIncrement(uint64_t increment, impl::digits_t magnitude);
 
     static CurrencyPrecision constructCurrency(UCurrencyUsage usage);
 
@@ -801,7 +835,6 @@
  */
 class U_I18N_API FractionPrecision : public Precision {
   public:
-#ifndef U_HIDE_DRAFT_API
     /**
      * Override maximum fraction digits with maximum significant digits depending on the magnitude
      * of the number. See UNumberRoundingPriority.
@@ -814,13 +847,12 @@
      *            How to disambiguate between fraction digits and significant digits.
      * @return A precision for chaining or passing to the NumberFormatter precision() setter.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     Precision withSignificantDigits(
         int32_t minSignificantDigits,
         int32_t maxSignificantDigits,
         UNumberRoundingPriority priority) const;
-#endif // U_HIDE_DRAFT_API
 
     /**
      * Ensure that no less than this number of significant digits are retained when rounding
@@ -1170,7 +1202,8 @@
 
 namespace impl {
 
-// Do not enclose entire StringProp with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
+// Do not enclose entire StringProp with #ifndef U_HIDE_INTERNAL_API, needed for a protected field.
+// And do not enclose its class boilerplate within #ifndef U_HIDE_INTERNAL_API.
 /**
  * Manages NumberFormatterSettings::usage()'s char* instance on the heap.
  * @internal
@@ -1177,15 +1210,18 @@
  */
 class U_I18N_API StringProp : public UMemory {
 
-#ifndef U_HIDE_INTERNAL_API
-
   public:
     /** @internal */
+    ~StringProp();
+
+    /** @internal */
     StringProp(const StringProp &other);
 
     /** @internal */
     StringProp &operator=(const StringProp &other);
 
+#ifndef U_HIDE_INTERNAL_API
+
     /** @internal */
     StringProp(StringProp &&src) U_NOEXCEPT;
 
@@ -1193,9 +1229,6 @@
     StringProp &operator=(StringProp &&src) U_NOEXCEPT;
 
     /** @internal */
-    ~StringProp();
-
-    /** @internal */
     int16_t length() const {
         return fLength;
     }
@@ -2735,15 +2768,21 @@
      */
     MeasureUnit getOutputUnit(UErrorCode& status) const;
 
-#ifndef U_HIDE_INTERNAL_API
+#ifndef U_HIDE_DRAFT_API
+
     /**
-     * Gets the gender of the formatted output. Returns "" when the gender is
-     * unknown, or for ungendered languages.
+     * Gets the noun class of the formatted output. Returns `OTHER` when the noun class
+     * is not supported yet.
      *
-     * @internal ICU 69 technology preview.
+     * @return `NounClass`
+     * @draft ICU 71.
      */
-    const char *getGender(UErrorCode& status) const;
+    NounClass getNounClass(UErrorCode &status) const;
 
+#endif // U_HIDE_DRAFT_API
+
+#ifndef U_HIDE_INTERNAL_API
+
     /**
      *  Gets the raw DecimalQuantity for plural rule selection.
      *  @internal
@@ -2758,6 +2797,18 @@
 
 #endif  /* U_HIDE_INTERNAL_API */
 
+#ifndef U_HIDE_DEPRECATED_API
+
+    /**
+     * Gets the gender of the formatted output. Returns "" when the gender is
+     * unknown, or for ungendered languages.
+     *
+     * @deprecated This API is for ICU internal use only.
+     */
+    const char *getGender(UErrorCode &status) const;
+
+#endif /* U_HIDE_DEPRECATED_API */
+
   private:
     // Can't use LocalPointer because UFormattedNumberData is forward-declared
     const impl::UFormattedNumberData *fData;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/rbtz.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -303,16 +303,14 @@
     virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
         const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const override;
 
-#ifndef U_FORCE_HIDE_DRAFT_API
     /**
      * Get time zone offsets from local wall time.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     virtual void getOffsetFromLocal(
         UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
         UTimeZoneLocalOption duplicatedTimeOpt,
         int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override;
-#endif /* U_FORCE_HIDE_DRAFT_API */
 
 private:
     void deleteRules(void);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/simpletz.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -620,16 +620,14 @@
     virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
                            int32_t& dstOffset, UErrorCode& ec) const override;
 
-#ifndef U_FORCE_HIDE_DRAFT_API
     /**
      * Get time zone offsets from local wall time.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     virtual void getOffsetFromLocal(
         UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
         UTimeZoneLocalOption duplicatedTimeOpt,
         int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override;
-#endif /* U_FORCE_HIDE_DRAFT_API */
 
     /**
      * Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucal.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1617,25 +1617,23 @@
 ucal_getTimeZoneIDForWindowsID(const UChar* winid, int32_t len, const char* region,
                                 UChar* id, int32_t idCapacity, UErrorCode* status);
 
-#ifndef U_FORCE_HIDE_DRAFT_API
 /**
  * Options used by ucal_getTimeZoneOffsetFromLocal and BasicTimeZone::getOffsetFromLocal()
  * to specify how to interpret an input time when it does not exist, or when it is ambiguous,
  * around a time zone transition.
- * @draft ICU 69
+ * @stable ICU 69
  */
 enum UTimeZoneLocalOption {
-#ifndef U_HIDE_DRAFT_API
     /**
      * An input time is always interpreted as local time before
      * a time zone transition.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_FORMER = 0x04,
     /**
      * An input time is always interpreted as local time after
      * a time zone transition.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_LATTER = 0x0C,
     /**
@@ -1644,7 +1642,7 @@
      * sides of a time zone transition are standard time,
      * or daylight saving time, the local time before the
      * transition is used.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_STANDARD_FORMER = UCAL_TZ_LOCAL_FORMER | 0x01,
     /**
@@ -1653,7 +1651,7 @@
      * sides of a time zone transition are standard time,
      * or daylight saving time, the local time after the
      * transition is used.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_STANDARD_LATTER = UCAL_TZ_LOCAL_LATTER | 0x01,
     /**
@@ -1662,7 +1660,7 @@
      * sides of a time zone transition are standard time,
      * or daylight saving time, the local time before the
      * transition is used.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_DAYLIGHT_FORMER = UCAL_TZ_LOCAL_FORMER | 0x03,
     /**
@@ -1671,19 +1669,11 @@
      * sides of a time zone transition are standard time,
      * or daylight saving time, the local time after the
      * transition is used.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UCAL_TZ_LOCAL_DAYLIGHT_LATTER = UCAL_TZ_LOCAL_LATTER | 0x03,
-#else /* U_HIDE_DRAFT_API */
-    /**
-     * Dummy value to prevent empty enum if U_HIDE_DRAFT_API.
-     * This will go away when draft conditionals are removed.
-     * @internal
-     */
-    UCAL_TZ_LOCAL_NONE = 0,
-#endif /* U_HIDE_DRAFT_API */
 };
-typedef enum UTimeZoneLocalOption UTimeZoneLocalOption; /**< @draft ICU 69 */
+typedef enum UTimeZoneLocalOption UTimeZoneLocalOption; /**< @stable ICU 69 */
 
 /**
 * Returns the time zone raw and GMT offset for the given moment
@@ -1710,7 +1700,7 @@
 * typically one hour.
 * If the status is set to one of the error code, the value set is unspecified.
 * @param status A pointer to a UErrorCode to receive any errors.
-* @draft ICU 69
+* @stable ICU 69
 */
 U_CAPI void U_EXPORT2
 ucal_getTimeZoneOffsetFromLocal(
@@ -1718,7 +1708,6 @@
     UTimeZoneLocalOption nonExistingTimeOpt,
     UTimeZoneLocalOption duplicatedTimeOpt,
     int32_t* rawOffset, int32_t* dstOffset, UErrorCode* status);
-#endif /* U_FORCE_HIDE_DRAFT_API */
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/ucol.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -397,7 +397,7 @@
  * @param status A pointer to a UErrorCode to receive any errors
  * @return A pointer to a UCollator, or 0 if an error occurred.
  * @see ucol_openRules
- * @see ucol_safeClone
+ * @see ucol_clone
  * @see ucol_close
  * @stable ICU 2.0
  */
@@ -425,7 +425,7 @@
  * @return A pointer to a UCollator. It is not guaranteed that NULL be returned in case
  *         of error - please use status argument to check for errors.
  * @see ucol_open
- * @see ucol_safeClone
+ * @see ucol_clone
  * @see ucol_close
  * @stable ICU 2.0
  */
@@ -521,7 +521,7 @@
  * @param coll The UCollator to close.
  * @see ucol_open
  * @see ucol_openRules
- * @see ucol_safeClone
+ * @see ucol_clone
  * @stable ICU 2.0
  */
 U_CAPI void U_EXPORT2 
@@ -985,7 +985,6 @@
  * 
  *  @deprecated ICU 54
  */
-
 U_DEPRECATED int32_t U_EXPORT2
 ucol_normalizeShortDefinitionString(const char *source,
                                     char *destination,
@@ -1313,6 +1312,20 @@
 /**
  * Thread safe cloning operation. The result is a clone of a given collator.
  * @param coll collator to be cloned
+ * @param status to indicate whether the operation went on smoothly or there were errors
+ * @return pointer to the new clone
+ * @see ucol_open
+ * @see ucol_openRules
+ * @see ucol_close
+ * @stable ICU 71
+ */
+U_CAPI UCollator* U_EXPORT2 ucol_clone(const UCollator *coll, UErrorCode *status);
+
+#ifndef U_HIDE_DEPRECATED_API
+
+/**
+ * Thread safe cloning operation. The result is a clone of a given collator.
+ * @param coll collator to be cloned
  * @param stackBuffer <em>Deprecated functionality as of ICU 52, use NULL.</em><br>
  * user allocated space for the new clone. 
  * If NULL new memory will be allocated. 
@@ -1325,21 +1338,20 @@
  *  If *pBufferSize is not enough for a stack-based safe clone, 
  *  new memory will be allocated.
  * @param status to indicate whether the operation went on smoothly or there were errors
- *    An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used if any
- * allocations were necessary.
+ *    An informational status value, U_SAFECLONE_ALLOCATED_ERROR, is used
+ * if pBufferSize != NULL and any allocations were necessary
  * @return pointer to the new clone
  * @see ucol_open
  * @see ucol_openRules
  * @see ucol_close
- * @stable ICU 2.0
+ * @deprecated ICU 71 Use ucol_clone() instead.
  */
-U_CAPI UCollator* U_EXPORT2 
+U_DEPRECATED UCollator* U_EXPORT2
 ucol_safeClone(const UCollator *coll,
                void            *stackBuffer,
                int32_t         *pBufferSize,
                UErrorCode      *status);
 
-#ifndef U_HIDE_DEPRECATED_API
 
 /** default memory size for the new clone.
  * @deprecated ICU 52. Do not rely on ucol_safeClone() cloning into any provided buffer.

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/udatpg.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -492,6 +492,11 @@
  * for those two skeletons, so the result is put together with this pattern,
  * resulting in "d-MMM h:mm".
  *
+ * There are four DateTimeFormats in a UDateTimePatternGenerator object,
+ * corresponding to date styles UDAT_FULL..UDAT_SHORT. This method sets
+ * all of them to the specified pattern. To set them individually, see
+ * udatpg_setDateTimeFormatForStyle.
+ *
  * @param dtpg a pointer to UDateTimePatternGenerator.
  * @param dtFormat
  *            message format pattern, here {1} will be replaced by the date
@@ -505,6 +510,12 @@
 
 /**
  * Getter corresponding to setDateTimeFormat.
+ *
+ * There are four DateTimeFormats in a UDateTimePatternGenerator object,
+ * corresponding to date styles UDAT_FULL..UDAT_SHORT. This method gets
+ * the style for UDAT_MEDIUM (the default). To get them individually, see
+ * udatpg_getDateTimeFormatForStyle.
+ *
  * @param dtpg   a pointer to UDateTimePatternGenerator.
  * @param pLength A pointer that will receive the length of the format
  * @return dateTimeFormat.
@@ -514,7 +525,71 @@
 udatpg_getDateTimeFormat(const UDateTimePatternGenerator *dtpg,
                          int32_t *pLength);
 
+#if !UCONFIG_NO_FORMATTING
+#ifndef U_HIDE_DRAFT_API
 /**
+ * dateTimeFormats are message patterns used to compose combinations of date
+ * and time patterns. There are four length styles, corresponding to the
+ * inferred style of the date pattern; these are UDateFormatStyle values:
+ *  - UDAT_FULL (for date pattern with weekday and long month), else
+ *  - UDAT_LONG (for a date pattern with long month), else
+ *  - UDAT_MEDIUM (for a date pattern with abbreviated month), else
+ *  - UDAT_SHORT (for any other date pattern).
+ * For details on dateTimeFormats, see
+ * https://www.unicode.org/reports/tr35/tr35-dates.html#dateTimeFormats.
+ * The default pattern in the root locale for all styles is "{1} {0}".
+ *
+ * @param udtpg
+ *              a pointer to the UDateTimePatternGenerator
+ * @param style
+ *              one of UDAT_FULL..UDAT_SHORT. Error if out of range.
+ * @param dateTimeFormat
+ *              the new dateTimeFormat to set for the the specified style
+ * @param length
+ *              the length of dateTimeFormat, or -1 if unknown and pattern
+ *              is null-terminated
+ * @param pErrorCode
+ *              a pointer to the UErrorCode (in/out parameter); if no failure
+ *              status is already set, it will be set according to result of the
+ *              function (e.g. U_ILLEGAL_ARGUMENT_ERROR for style out of range).
+ * @draft ICU 71
+ */
+U_CAPI void U_EXPORT2
+udatpg_setDateTimeFormatForStyle(UDateTimePatternGenerator *udtpg,
+                        UDateFormatStyle style,
+                        const UChar *dateTimeFormat, int32_t length,
+                        UErrorCode *pErrorCode);
+
+/**
+ * Getter corresponding to udatpg_setDateTimeFormatForStyle.
+ *
+ * @param udtpg
+ *              a pointer to the UDateTimePatternGenerator
+ * @param style
+ *              one of UDAT_FULL..UDAT_SHORT. Error if out of range.
+ * @param pLength
+ *              a pointer that will receive the length of the format. May be NULL
+ *              if length is not desired.
+ * @param pErrorCode
+ *              a pointer to the UErrorCode (in/out parameter); if no failure
+ *              status is already set, it will be set according to result of the
+ *              function (e.g. U_ILLEGAL_ARGUMENT_ERROR for style out of range).
+ * @return
+ *              pointer to the current dateTimeFormat (0 terminated) for the specified
+ *              style, or empty string in case of error. The pointer and its contents
+ *              may no longer be valid if udatpg_setDateTimeFormat is called, or
+ *              udatpg_setDateTimeFormatForStyle for the same style is called, or the
+ *              UDateTimePatternGenerator object is closed.
+ * @draft ICU 71
+ */
+U_CAPI const UChar* U_EXPORT2
+udatpg_getDateTimeFormatForStyle(const UDateTimePatternGenerator *udtpg,
+                        UDateFormatStyle style, int32_t *pLength,
+                        UErrorCode *pErrorCode);
+#endif /* U_HIDE_DRAFT_API */
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+/**
  * The decimal value is used in formatting fractions of seconds. If the
  * skeleton contains fractional seconds, then this is used with the
  * fractional seconds. For example, suppose that the input pattern is

Added: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unounclass.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unounclass.h	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unounclass.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,43 @@
+// © 2022 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
+
+#ifndef __UNOUNCLASS_H__
+#define __UNOUNCLASS_H__
+
+#include "unicode/utypes.h"
+
+#if U_SHOW_CPLUSPLUS_API
+
+#if !UCONFIG_NO_FORMATTING
+
+#include "unicode/uversion.h"
+
+U_NAMESPACE_BEGIN
+
+#ifndef U_HIDE_DRAFT_API
+
+/**
+ * Represents all the grammatical noun classes that are supported by CLDR.
+ *
+ * @draft ICU 71.
+ */
+enum NounClass {
+    OTHER = 0,
+    NEUTER = 1,
+    FEMININE = 2,
+    MASCULINE = 3,
+    ANIMATE = 4,
+    INANIMATE = 5,
+    PERSONAL = 6,
+    COMMON = 7,
+};
+
+#endif // U_HIDE_DRAFT_API
+
+U_NAMESPACE_END
+
+#endif /* #if !UCONFIG_NO_FORMATTING */
+
+#endif /* U_SHOW_CPLUSPLUS_API */
+
+#endif // __UNOUNCLASS_H__


Property changes on: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unounclass.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unum.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -303,23 +303,21 @@
       * @stable ICU 4.8
       */
     UNUM_ROUND_UNNECESSARY,
-#ifndef U_HIDE_DRAFT_API
     /**
      * Rounds ties toward the odd number.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_ROUND_HALF_ODD,
     /**
      * Rounds ties toward +∞.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_ROUND_HALF_CEILING,
     /**
      * Rounds ties toward -∞.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_ROUND_HALF_FLOOR,
-#endif  // U_HIDE_DRAFT_API
 } UNumberFormatRoundingMode;
 
 /** The possible number format pad positions. 
@@ -401,6 +399,13 @@
     UNUM_MEASURE_UNIT_FIELD,
     /** @stable ICU 64 */
     UNUM_COMPACT_FIELD,
+#ifndef U_HIDE_DRAFT_API
+    /**
+     * Approximately sign. In ICU 70, this was categorized under the generic SIGN field.
+     * @draft ICU 71
+     */
+    UNUM_APPROXIMATELY_SIGN_FIELD,
+#endif // U_HIDE_DRAFT_API
 
 #ifndef U_HIDE_DEPRECATED_API
     /**
@@ -407,7 +412,11 @@
      * One more than the highest normal UNumberFormatFields value.
      * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
      */
-    UNUM_FIELD_COUNT = UNUM_SIGN_FIELD + 3
+#ifndef U_HIDE_DRAFT_API
+    UNUM_FIELD_COUNT = UNUM_COMPACT_FIELD + 2
+#else  // U_HIDE_DRAFT_API (for UNUM_APPROXIMATELY_SIGN_FIELD)
+    UNUM_FIELD_COUNT = UNUM_COMPACT_FIELD + 1
+#endif  // U_HIDE_DRAFT_API (for UNUM_APPROXIMATELY_SIGN_FIELD)
 #endif  /* U_HIDE_DEPRECATED_API */
 } UNumberFormatFields;
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/unumberformatter.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -78,7 +78,6 @@
  * </pre>
  */
 
-#ifndef U_FORCE_HIDE_DRAFT_API
 /**
  * An enum declaring how to resolve conflicts between maximum fraction digits and maximum
  * significant digits.
@@ -115,13 +114,13 @@
  * Here, RELAXED favors Max-Fraction and STRICT favors Max-Significant. Note that this larger
  * number caused the two modes to favor the opposite result.
  *
- * @draft ICU 69
+ * @stable ICU 69
  */
 typedef enum UNumberRoundingPriority {
     /**
      * Favor greater precision by relaxing one of the rounding constraints.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_ROUNDING_PRIORITY_RELAXED,
 
@@ -128,11 +127,10 @@
     /**
      * Favor adherence to all rounding constraints by producing lower precision.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_ROUNDING_PRIORITY_STRICT,
 } UNumberRoundingPriority;
-#endif // U_FORCE_HIDE_DRAFT_API
 
 /**
  * An enum declaring how to render units, including currencies. Example outputs when formatting 123 USD and 123
@@ -435,11 +433,10 @@
      */
     UNUM_SIGN_ACCOUNTING_EXCEPT_ZERO,
 
-#ifndef U_HIDE_DRAFT_API
     /**
      * Same as AUTO, but do not show the sign on negative zero.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_SIGN_NEGATIVE,
 
@@ -446,10 +443,9 @@
     /**
      * Same as ACCOUNTING, but do not show the sign on negative zero.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_SIGN_ACCOUNTING_NEGATIVE,
-#endif // U_HIDE_DRAFT_API
 
     // Do not conditionalize the following with #ifndef U_HIDE_INTERNAL_API,
     // needed for unconditionalized struct MacroProps
@@ -498,7 +494,6 @@
             UNUM_DECIMAL_SEPARATOR_COUNT
 } UNumberDecimalSeparatorDisplay;
 
-#ifndef U_FORCE_HIDE_DRAFT_API
 /**
  * An enum declaring how to render trailing zeros.
  * 
@@ -505,13 +500,13 @@
  * - UNUM_TRAILING_ZERO_AUTO: 0.90, 1.00, 1.10
  * - UNUM_TRAILING_ZERO_HIDE_IF_WHOLE: 0.90, 1, 1.10
  * 
- * @draft ICU 69
+ * @stable ICU 69
  */
 typedef enum UNumberTrailingZeroDisplay {
     /**
      * Display trailing zeros according to the settings for minimum fraction and significant digits.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_TRAILING_ZERO_AUTO,
 
@@ -518,11 +513,10 @@
     /**
      * Same as AUTO, but hide trailing zeros after the decimal separator if they are all zero.
      *
-     * @draft ICU 69
+     * @stable ICU 69
      */
     UNUM_TRAILING_ZERO_HIDE_IF_WHOLE,
 } UNumberTrailingZeroDisplay;
-#endif // U_FORCE_HIDE_DRAFT_API
 
 struct UNumberFormatter;
 /**

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/unicode/vtzone.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -264,16 +264,14 @@
     virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
                            int32_t& dstOffset, UErrorCode& ec) const override;
 
-#ifndef U_FORCE_HIDE_DRAFT_API
     /**
      * Get time zone offsets from local wall time.
-     * @draft ICU 69
+     * @stable ICU 69
      */
     virtual void getOffsetFromLocal(
         UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
         UTimeZoneLocalOption duplicatedTimeOpt,
         int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override;
-#endif /* U_FORCE_HIDE_DRAFT_API */
 
     /**
      * Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -183,7 +183,7 @@
             } else {
                 quantity = remainder;
             }
-        }   
+        }
     }
 
     applyRounder(intValues, quantity, rounder, status);
@@ -210,7 +210,6 @@
         }
     }
 
-
     // Transfer values into result and return:
     for(int32_t i = 0, n = unitsConverters_.length(); i < n; ++i) {
         U_ASSERT(tmpResult[i] != nullptr);
@@ -224,6 +223,12 @@
 void ComplexUnitsConverter::applyRounder(MaybeStackArray<int64_t, 5> &intValues, double &quantity,
                                          icu::number::impl::RoundingImpl *rounder,
                                          UErrorCode &status) const {
+    if (uprv_isInfinite(quantity) || uprv_isNaN(quantity)) {
+        // Inf and NaN can't be rounded, and calculating `carry` below is known
+        // to fail on Gentoo on HPPA and OpenSUSE on riscv64. Nothing to do.
+        return;
+    }
+
     if (rounder == nullptr) {
         // Nothing to do for the quantity.
         return;

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/units_complexconverter.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -108,13 +108,15 @@
     MaybeStackVector<Measure>
     convert(double quantity, icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const;
 
-  private:
+    // TODO(ICU-21937): Make it private after submitting the public units conversion API.
     MaybeStackVector<UnitsConverter> unitsConverters_;
 
+    // TODO(ICU-21937): Make it private after submitting the public units conversion API.
     // Individual units of mixed units, sorted big to small, with indices
     // indicating the requested output mixed unit order.
     MaybeStackVector<MeasureUnitImplWithIndex> units_;
 
+  private:
     // Sorts units_, which must be populated before calling this, and populates
     // unitsConverters_.
     void init(const MeasureUnitImpl &inputUnit, const ConversionRates &ratesInfo, UErrorCode &status);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/units_converter.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/units_converter.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/units_converter.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -9,6 +9,7 @@
 #include "cmemory.h"
 #include "double-conversion-string-to-double.h"
 #include "measunit_impl.h"
+#include "putilimp.h"
 #include "uassert.h"
 #include "unicode/errorcode.h"
 #include "unicode/localpointer.h"
@@ -588,10 +589,7 @@
 
     if (conversionRate_.reciprocal) {
         if (result == 0) {
-            // TODO: demonstrate the resulting behaviour in tests... and figure
-            // out desired behaviour. (Theoretical result should be infinity,
-            // not 0.)
-            return 0.0;
+            return uprv_getInfinity();
         }
         result = 1.0 / result;
     }
@@ -603,10 +601,7 @@
     double result = inputValue;
     if (conversionRate_.reciprocal) {
         if (result == 0) {
-            // TODO: demonstrate the resulting behaviour in tests... and figure
-            // out desired behaviour. (Theoretical result should be infinity,
-            // not 0.)
-            return 0.0;
+            return uprv_getInfinity();
         }
         result = 1.0 / result;
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/units_router.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/units_router.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/units_router.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -30,8 +30,6 @@
 struct RouteResult : UMemory {
     // A list of measures: a single measure for single units, multiple measures
     // for mixed units.
-    //
-    // TODO(icu-units/icu#21): figure out the right mixed unit API.
     MaybeStackVector<Measure> measures;
 
     // The output unit for this RouteResult. This may be a MIXED unit - for

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -63,23 +63,24 @@
 //         at the same time
 //
 
-SPUString::SPUString(UnicodeString *s) {
-    fStr = s;
+SPUString::SPUString(LocalPointer<UnicodeString> s) {
+    fStr = std::move(s);
     fCharOrStrTableIndex = 0;
 }
 
 
 SPUString::~SPUString() {
-    delete fStr;
 }
 
 
-SPUStringPool::SPUStringPool(UErrorCode &status) : fVec(NULL), fHash(NULL) {
-    fVec = new UVector(status);
-    if (fVec == NULL) {
-        status = U_MEMORY_ALLOCATION_ERROR;
+SPUStringPool::SPUStringPool(UErrorCode &status) : fVec(nullptr), fHash(nullptr) {
+    LocalPointer<UVector> vec(new UVector(status), status);
+    if (U_FAILURE(status)) {
         return;
     }
+    vec->setDeleter(
+        [](void *obj) {delete (SPUString *)obj;});
+    fVec = vec.orphan();
     fHash = uhash_open(uhash_hashUnicodeString,           // key hash function
                        uhash_compareUnicodeString,        // Key Comparator
                        NULL,                              // Value Comparator
@@ -88,11 +89,6 @@
 
 
 SPUStringPool::~SPUStringPool() {
-    int i;
-    for (i=fVec->size()-1; i>=0; i--) {
-        SPUString *s = static_cast<SPUString *>(fVec->elementAt(i));
-        delete s;
-    }
     delete fVec;
     uhash_close(fHash);
 }
@@ -135,18 +131,21 @@
 
 
 SPUString *SPUStringPool::addString(UnicodeString *src, UErrorCode &status) {
+    LocalPointer<UnicodeString> lpSrc(src);
+    if (U_FAILURE(status)) {
+        return nullptr;
+    }
     SPUString *hashedString = static_cast<SPUString *>(uhash_get(fHash, src));
-    if (hashedString != NULL) {
-        delete src;
-    } else {
-        hashedString = new SPUString(src);
-        if (hashedString == NULL) {
-            status = U_MEMORY_ALLOCATION_ERROR;
-            return NULL;
-        }
-        uhash_put(fHash, src, hashedString, &status);
-        fVec->addElementX(hashedString, status);
+    if (hashedString != nullptr) {
+        return hashedString;
     }
+    LocalPointer<SPUString> spuStr(new SPUString(std::move(lpSrc)), status);
+    hashedString = spuStr.getAlias();
+    fVec->adoptElement(spuStr.orphan(), status);
+    if (U_FAILURE(status)) {
+        return nullptr;
+    }
+    uhash_put(fHash, src, hashedString, &status);
     return hashedString;
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_conf.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -39,11 +39,12 @@
 //              Instances of SPUString exist during the compilation process only.
 
 struct SPUString : public UMemory {
-    UnicodeString  *fStr;             // The actual string.
-    int32_t         fCharOrStrTableIndex;   // Index into the final runtime data for this
-                                      // string (or, for length 1, the single string char
-                                      // itself, there being no string table entry for it.)
-    SPUString(UnicodeString *s);
+    LocalPointer<UnicodeString> fStr;     // The actual string.
+    int32_t      fCharOrStrTableIndex;    // Index into the final runtime data for this
+                                          // string (or, for length 1, the single string char
+                                          // itself, there being no string table entry for it.)
+
+    SPUString(LocalPointer<UnicodeString> s);
     ~SPUString();
 };
 

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/uspoof_impl.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -945,7 +945,7 @@
     uint32_t magic = ds->readUInt32(spoofDH->fMagic);
     ds->writeUInt32((uint32_t *)&outputDH->fMagic, magic);
 
-    if (outputDH->fFormatVersion != spoofDH->fFormatVersion) {
+    if (inBytes != outBytes) {
         uprv_memcpy(outputDH->fFormatVersion, spoofDH->fFormatVersion, sizeof(spoofDH->fFormatVersion));
     }
     // swap starting at fLength

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/vtzone.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -24,14 +24,6 @@
 
 U_NAMESPACE_BEGIN
 
-// This is the deleter that will be use to remove TimeZoneRule
-U_CDECL_BEGIN
-static void U_CALLCONV
-deleteTimeZoneRule(void* obj) {
-    delete (TimeZoneRule*) obj;
-}
-U_CDECL_END
-
 // Smybol characters used by RFC2445 VTIMEZONE
 static const UChar COLON = 0x3A; /* : */
 static const UChar SEMICOLON = 0x3B; /* ; */
@@ -976,22 +968,19 @@
     if (source.vtzlines != nullptr) {
         UErrorCode status = U_ZERO_ERROR;
         int32_t size = source.vtzlines->size();
-        vtzlines = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, size, status);
-        if (vtzlines == nullptr) {
+        LocalPointer<UVector> lpVtzLines(
+            new UVector(uprv_deleteUObject, uhash_compareUnicodeString, size, status), status);
+        if (U_FAILURE(status)) {
             return;
         }
-        if (U_SUCCESS(status)) {
-            for (int32_t i = 0; i < size; i++) {
-                UnicodeString *line = (UnicodeString*)source.vtzlines->elementAt(i);
-                vtzlines->addElementX(line->clone(), status);
-                if (U_FAILURE(status)) {
-                    break;
-                }
+        for (int32_t i = 0; i < size; i++) {
+            UnicodeString *line = ((UnicodeString*)source.vtzlines->elementAt(i))->clone();
+            lpVtzLines->adoptElement(line, status);
+            if (U_FAILURE(status) || line == nullptr) {
+                return;
             }
         }
-        if (U_FAILURE(status) && vtzlines != nullptr) {
-            delete vtzlines;
-        }
+        vtzlines = lpVtzLines.orphan();
     }
 }
 
@@ -1020,24 +1009,26 @@
         }
         if (vtzlines != nullptr) {
             delete vtzlines;
+            vtzlines = nullptr;
         }
         if (right.vtzlines != nullptr) {
             UErrorCode status = U_ZERO_ERROR;
             int32_t size = right.vtzlines->size();
-            vtzlines = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, size, status);
-            if (vtzlines != nullptr && U_SUCCESS(status)) {
+            LocalPointer<UVector> lpVtzLines(
+                new UVector(uprv_deleteUObject, uhash_compareUnicodeString, size, status), status);
+            if (U_SUCCESS(status)) {
                 for (int32_t i = 0; i < size; i++) {
-                    UnicodeString *line = (UnicodeString*)right.vtzlines->elementAt(i);
-                    vtzlines->addElementX(line->clone(), status);
+                    LocalPointer<UnicodeString> line(
+                        ((UnicodeString*)right.vtzlines->elementAt(i))->clone(), status);
+                    lpVtzLines->adoptElement(line.orphan(), status);
                     if (U_FAILURE(status)) {
                         break;
                     }
                 }
+                if (U_SUCCESS(status)) {
+                    vtzlines = lpVtzLines.orphan();
+                }
             }
-            if (U_FAILURE(status) && vtzlines != nullptr) {
-                delete vtzlines;
-                vtzlines = nullptr;
-            }
         }
         tzurl = right.tzurl;
         lastmod = right.lastmod;
@@ -1272,10 +1263,9 @@
 
 void
 VTimeZone::load(VTZReader& reader, UErrorCode& status) {
-    vtzlines = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, DEFAULT_VTIMEZONE_LINES, status);
-    if (vtzlines == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-    }
+    U_ASSERT(vtzlines == nullptr);
+    LocalPointer<UVector> lpVtzLines(
+        new UVector(uprv_deleteUObject, uhash_compareUnicodeString, DEFAULT_VTIMEZONE_LINES, status), status);
     if (U_FAILURE(status)) {
         return;
     }
@@ -1290,14 +1280,10 @@
             // end of file
             if (start && line.startsWith(ICAL_END_VTIMEZONE, -1)) {
                 LocalPointer<UnicodeString> element(new UnicodeString(line), status);
+                lpVtzLines->adoptElement(element.orphan(), status);
                 if (U_FAILURE(status)) {
-                    goto cleanupVtzlines;
+                    return;
                 }
-                vtzlines->addElementX(element.getAlias(), status);
-                if (U_FAILURE(status)) {
-                    goto cleanupVtzlines;
-                }
-                element.orphan(); // on success, vtzlines owns the object.
                 success = TRUE;
             }
             break;
@@ -1312,14 +1298,10 @@
                 if (start) {
                     if (line.length() > 0) {
                         LocalPointer<UnicodeString> element(new UnicodeString(line), status);
+                        lpVtzLines->adoptElement(element.orphan(), status);
                         if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
+                            return;
                         }
-                        vtzlines->addElementX(element.getAlias(), status);
-                        if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
-                        }
-                        element.orphan(); // on success, vtzlines owns the object.
                     }
                 }
                 line.remove();
@@ -1335,14 +1317,10 @@
                 if (start) {
                     if (line.startsWith(ICAL_END_VTIMEZONE, -1)) {
                         LocalPointer<UnicodeString> element(new UnicodeString(line), status);
+                        lpVtzLines->adoptElement(element.orphan(), status);
                         if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
+                            return;
                         }
-                        vtzlines->addElementX(element.getAlias(), status);
-                        if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
-                        }
-                        element.orphan(); // on success, vtzlines owns the object.
                         success = TRUE;
                         break;
                     }
@@ -1349,14 +1327,10 @@
                 } else {
                     if (line.startsWith(ICAL_BEGIN_VTIMEZONE, -1)) {
                         LocalPointer<UnicodeString> element(new UnicodeString(line), status);
+                        lpVtzLines->adoptElement(element.orphan(), status);
                         if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
+                            return;
                         }
-                        vtzlines->addElementX(element.getAlias(), status);
-                        if (U_FAILURE(status)) {
-                            goto cleanupVtzlines;
-                        }
-                        element.orphan(); // on success, vtzlines owns the object.
                         line.remove();
                         start = TRUE;
                         eol = FALSE;
@@ -1371,14 +1345,10 @@
         if (U_SUCCESS(status)) {
             status = U_INVALID_STATE_ERROR;
         }
-        goto cleanupVtzlines;
+        return;
     }
+    vtzlines = lpVtzLines.orphan();
     parse(status);
-    return;
-
-cleanupVtzlines:
-    delete vtzlines;
-    vtzlines = nullptr;
 }
 
 // parser state
@@ -1398,8 +1368,6 @@
         status = U_INVALID_STATE_ERROR;
         return;
     }
-    InitialTimeZoneRule *initialRule = nullptr;
-    RuleBasedTimeZone *rbtz = nullptr;
 
     // timezone ID
     UnicodeString tzid;
@@ -1418,28 +1386,16 @@
     UnicodeString name;     // RFC2445 prop name
     UnicodeString value;    // RFC2445 prop value
 
-    UVector *dates = nullptr;  // list of RDATE or RRULE strings
-    UVector *rules = nullptr;  // list of TimeZoneRule instances
-
     int32_t finalRuleIdx = -1;
     int32_t finalRuleCount = 0;
 
-    rules = new UVector(status);
-    if (rules == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-    }
-    if (U_FAILURE(status)) {
-        goto cleanupParse;
-    }
-     // Set the deleter to remove TimeZoneRule vectors to avoid memory leaks due to unowned TimeZoneRules.
-    rules->setDeleter(deleteTimeZoneRule);
+    // Set the deleter on rules to remove TimeZoneRule vectors to avoid memory leaks due to unowned TimeZoneRules.
+    UVector rules(uprv_deleteUObject, nullptr, status);
     
-    dates = new UVector(uprv_deleteUObject, uhash_compareUnicodeString, status);
-    if (dates == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-    }
+    // list of RDATE or RRULE strings
+    UVector dates(uprv_deleteUObject, uhash_compareUnicodeString, status);
     if (U_FAILURE(status)) {
-        goto cleanupParse;
+        return;
     }
     
     for (n = 0; n < vtzlines->size(); n++) {
@@ -1469,7 +1425,7 @@
                 // can be any value.
                 lastmod = parseDateTimeString(value, 0, status);
                 if (U_FAILURE(status)) {
-                    goto cleanupParse;
+                    return;
                 }
             } else if (name.compare(ICAL_BEGIN, -1) == 0) {
                 UBool isDST = (value.compare(ICAL_DAYLIGHT, -1) == 0);
@@ -1476,11 +1432,11 @@
                 if (value.compare(ICAL_STANDARD, -1) == 0 || isDST) {
                     // tzid must be ready at this point
                     if (tzid.length() == 0) {
-                        goto cleanupParse;
+                        return;
                     }
                     // initialize current zone properties
-                    if (dates->size() != 0) {
-                        dates->removeAllElements();
+                    if (dates.size() != 0) {
+                        dates.removeAllElements();
                     }
                     isRRULE = FALSE;
                     from.remove();
@@ -1491,7 +1447,7 @@
                 } else {
                     // BEGIN property other than STANDARD/DAYLIGHT
                     // must not be there.
-                    goto cleanupParse;
+                    return;
                 }
             } else if (name.compare(ICAL_END, -1) == 0) {
                 break;
@@ -1509,50 +1465,42 @@
             } else if (name.compare(ICAL_RDATE, -1) == 0) {
                 // RDATE mixed with RRULE is not supported
                 if (isRRULE) {
-                    goto cleanupParse;
+                    return;
                 }
                 // RDATE value may contain multiple date delimited
                 // by comma
                 UBool nextDate = TRUE;
                 int32_t dstart = 0;
-                UnicodeString *dstr = nullptr;
+                LocalPointer<UnicodeString> dstr;
                 while (nextDate) {
                     int32_t dend = value.indexOf(COMMA, dstart);
                     if (dend == -1) {
-                        dstr = new UnicodeString(value, dstart);
+                        dstr.adoptInsteadAndCheckErrorCode(new UnicodeString(value, dstart), status);
                         nextDate = FALSE;
                     } else {
-                        dstr = new UnicodeString(value, dstart, dend - dstart);
+                        dstr.adoptInsteadAndCheckErrorCode(new UnicodeString(value, dstart, dend - dstart), status);
                     }
-                    if (dstr == nullptr) {
-                        status = U_MEMORY_ALLOCATION_ERROR;
-                    } else {
-                        dates->addElementX(dstr, status);
-                    }
+                    dates.adoptElement(dstr.orphan(), status);
                     if (U_FAILURE(status)) {
-                        goto cleanupParse;
+                        return;
                     }
                     dstart = dend + 1;
                 }
             } else if (name.compare(ICAL_RRULE, -1) == 0) {
                 // RRULE mixed with RDATE is not supported
-                if (!isRRULE && dates->size() != 0) {
-                    goto cleanupParse;
+                if (!isRRULE && dates.size() != 0) {
+                    return;
                 }
                 isRRULE = true;
                 LocalPointer<UnicodeString> element(new UnicodeString(value), status);
+                dates.adoptElement(element.orphan(), status);
                 if (U_FAILURE(status)) {
-                    goto cleanupParse;
+                    return;
                 }
-                dates->addElementX(element.getAlias(), status);
-                if (U_FAILURE(status)) {
-                    goto cleanupParse;
-                }
-                element.orphan(); // on success, dates owns the object.
             } else if (name.compare(ICAL_END, -1) == 0) {
                 // Mandatory properties
                 if (dtstart.length() == 0 || from.length() == 0 || to.length() == 0) {
-                    goto cleanupParse;
+                    return;
                 }
                 // if zonename is not available, create one from tzid
                 if (zonename.length() == 0) {
@@ -1560,7 +1508,7 @@
                 }
 
                 // create a time zone rule
-                TimeZoneRule *rule = nullptr;
+                LocalPointer<TimeZoneRule> rule;
                 int32_t fromOffset = 0;
                 int32_t toOffset = 0;
                 int32_t rawOffset = 0;
@@ -1571,7 +1519,7 @@
                 fromOffset = offsetStrToMillis(from, status);
                 toOffset = offsetStrToMillis(to, status);
                 if (U_FAILURE(status)) {
-                    goto cleanupParse;
+                    return;
                 }
 
                 if (dst) {
@@ -1592,18 +1540,20 @@
                 // start time
                 start = parseDateTimeString(dtstart, fromOffset, status);
                 if (U_FAILURE(status)) {
-                    goto cleanupParse;
+                    return;
                 }
 
                 // Create the rule
                 UDate actualStart = MAX_MILLIS;
                 if (isRRULE) {
-                    rule = createRuleByRRULE(zonename, rawOffset, dstSavings, start, dates, fromOffset, status);
+                    rule.adoptInsteadAndCheckErrorCode(
+                        createRuleByRRULE(zonename, rawOffset, dstSavings, start, &dates, fromOffset, status), status);
                 } else {
-                    rule = createRuleByRDATE(zonename, rawOffset, dstSavings, start, dates, fromOffset, status);
+                    rule.adoptInsteadAndCheckErrorCode(
+                        createRuleByRDATE(zonename, rawOffset, dstSavings, start, &dates, fromOffset, status), status);
                 }
-                if (U_FAILURE(status) || rule == nullptr) {
-                    goto cleanupParse;
+                if (U_FAILURE(status)) {
+                    return;
                 } else {
                     UBool startAvail = rule->getFirstStart(fromOffset, 0, actualStart);
                     if (startAvail && actualStart < firstStart) {
@@ -1626,9 +1576,9 @@
                         }
                     }
                 }
-                rules->addElementX(rule, status);
+                rules.adoptElement(rule.orphan(), status);
                 if (U_FAILURE(status)) {
-                    goto cleanupParse;
+                    return;
                 }
                 state = VTZ;
             }
@@ -1636,28 +1586,31 @@
         }
     }
     // Must have at least one rule
-    if (rules->size() == 0) {
-        goto cleanupParse;
+    if (rules.size() == 0) {
+        return;
     }
 
     // Create a initial rule
     getDefaultTZName(tzid, FALSE, zonename);
-    initialRule = new InitialTimeZoneRule(zonename, initialRawOffset, initialDSTSavings);
-    if (initialRule == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        goto cleanupParse;
+    LocalPointer<InitialTimeZoneRule> initialRule(
+        new InitialTimeZoneRule(zonename, initialRawOffset, initialDSTSavings), status);
+    if (U_FAILURE(status)) {
+        return;
     }
 
     // Finally, create the RuleBasedTimeZone
-    rbtz = new RuleBasedTimeZone(tzid, initialRule);
-    if (rbtz == nullptr) {
-        status = U_MEMORY_ALLOCATION_ERROR;
-        goto cleanupParse;
+    // C++ awkwardness on memory allocation failure: the constructor wont be run, meaning
+    // that initialRule wont be adopted/deleted, as it normally would be.
+    LocalPointer<RuleBasedTimeZone> rbtz(
+        new RuleBasedTimeZone(tzid, initialRule.getAlias()), status);
+    if (U_SUCCESS(status)) {
+        initialRule.orphan();
+    } else {
+        return;
     }
-    initialRule = nullptr; // already adopted by RBTZ, no need to delete
 
-    for (n = 0; n < rules->size(); n++) {
-        TimeZoneRule *r = (TimeZoneRule*)rules->elementAt(n);
+    for (n = 0; n < rules.size(); n++) {
+        TimeZoneRule *r = (TimeZoneRule*)rules.elementAt(n);
         AnnualTimeZoneRule *atzrule = dynamic_cast<AnnualTimeZoneRule *>(r);
         if (atzrule != nullptr) {
             if (atzrule->getEndYear() == AnnualTimeZoneRule::MAX_YEAR) {
@@ -1669,18 +1622,18 @@
     if (finalRuleCount > 2) {
         // Too many final rules
         status = U_ILLEGAL_ARGUMENT_ERROR;
-        goto cleanupParse;
+        return;
     }
 
     if (finalRuleCount == 1) {
-        if (rules->size() == 1) {
+        if (rules.size() == 1) {
             // Only one final rule, only governs the initial rule,
             // which is already initialized, thus, we do not need to
             // add this transition rule
-            rules->removeAllElements();
+            rules.removeAllElements();
         } else {
             // Normalize the final rule
-            AnnualTimeZoneRule *finalRule = (AnnualTimeZoneRule*)rules->elementAt(finalRuleIdx);
+            AnnualTimeZoneRule *finalRule = (AnnualTimeZoneRule*)rules.elementAt(finalRuleIdx);
             int32_t tmpRaw = finalRule->getRawOffset();
             int32_t tmpDST = finalRule->getDSTSavings();
 
@@ -1688,11 +1641,11 @@
             UDate finalStart, start;
             finalRule->getFirstStart(initialRawOffset, initialDSTSavings, finalStart);
             start = finalStart;
-            for (n = 0; n < rules->size(); n++) {
+            for (n = 0; n < rules.size(); n++) {
                 if (finalRuleIdx == n) {
                     continue;
                 }
-                TimeZoneRule *r = (TimeZoneRule*)rules->elementAt(n);
+                TimeZoneRule *r = (TimeZoneRule*)rules.elementAt(n);
                 UDate lastStart;
                 r->getFinalStart(tmpRaw, tmpDST, lastStart);
                 if (lastStart > start) {
@@ -1704,78 +1657,58 @@
                 }
             }
 
-            TimeZoneRule *newRule = nullptr;
+            LocalPointer<TimeZoneRule> newRule;
             UnicodeString tznam;
             if (start == finalStart) {
                 // Transform this into a single transition
-                newRule = new TimeArrayTimeZoneRule(
-                        finalRule->getName(tznam),
-                        finalRule->getRawOffset(),
-                        finalRule->getDSTSavings(),
-                        &finalStart,
-                        1,
-                        DateTimeRule::UTC_TIME);
+                newRule.adoptInsteadAndCheckErrorCode(
+                    new TimeArrayTimeZoneRule(
+                            finalRule->getName(tznam),
+                            finalRule->getRawOffset(),
+                            finalRule->getDSTSavings(),
+                            &finalStart,
+                            1,
+                            DateTimeRule::UTC_TIME),
+                    status);
             } else {
                 // Update the end year
                 int32_t y, m, d, dow, doy, mid;
                 Grego::timeToFields(start, y, m, d, dow, doy, mid);
-                newRule = new AnnualTimeZoneRule(
-                        finalRule->getName(tznam),
-                        finalRule->getRawOffset(),
-                        finalRule->getDSTSavings(),
-                        *(finalRule->getRule()),
-                        finalRule->getStartYear(),
-                        y);
+                newRule.adoptInsteadAndCheckErrorCode(
+                    new AnnualTimeZoneRule(
+                            finalRule->getName(tznam),
+                            finalRule->getRawOffset(),
+                            finalRule->getDSTSavings(),
+                            *(finalRule->getRule()),
+                            finalRule->getStartYear(),
+                            y),
+                    status);
             }
-            if (newRule == nullptr) {
-                status = U_MEMORY_ALLOCATION_ERROR;
-                goto cleanupParse;
+            if (U_FAILURE(status)) {
+                return;
             }
-            rules->removeElementAt(finalRuleIdx);
-            rules->addElementX(newRule, status);
+            rules.removeElementAt(finalRuleIdx);
+            rules.adoptElement(newRule.orphan(), status);
             if (U_FAILURE(status)) {
-                delete newRule;
-                goto cleanupParse;
+                return;
             }
         }
     }
 
-    while (!rules->isEmpty()) {
-        TimeZoneRule *tzr = (TimeZoneRule*)rules->orphanElementAt(0);
+    while (!rules.isEmpty()) {
+        TimeZoneRule *tzr = (TimeZoneRule*)rules.orphanElementAt(0);
         rbtz->addTransitionRule(tzr, status);
         if (U_FAILURE(status)) {
-            goto cleanupParse;
+            return;
         }
     }
     rbtz->complete(status);
     if (U_FAILURE(status)) {
-        goto cleanupParse;
+        return;
     }
-    delete rules;
-    delete dates;
 
-    tz = rbtz;
+    tz = rbtz.orphan();
     setID(tzid);
-    return;
-
-cleanupParse:
-    if (rules != nullptr) {
-        while (!rules->isEmpty()) {
-            TimeZoneRule *r = (TimeZoneRule*)rules->orphanElementAt(0);
-            delete r;
-        }
-        delete rules;
-    }
-    if (dates != nullptr) {
-        delete dates;
-    }
-    if (initialRule != nullptr) {
-        delete initialRule;
-    }
-    if (rbtz != nullptr) {
-        delete rbtz;
-    }
-    return;
 }
 
 void
@@ -1809,7 +1742,7 @@
             icutzprop.append(u'[');
             icutzprop.append(icutzver);
             icutzprop.append(u']');
-            customProps.addElementX(&icutzprop, status);
+            customProps.addElement(&icutzprop, status);
         }
         writeZone(writer, *tz, &customProps, status);
     }
@@ -1827,6 +1760,8 @@
 
     // Extract rules applicable to dates after the start time
     getTimeZoneRulesAfter(start, initial, transitionRules, status);
+    LocalPointer<InitialTimeZoneRule> lpInitial(initial);
+    LocalPointer<UVector> lpTransitionRules(transitionRules);
     if (U_FAILURE(status)) {
         return;
     }
@@ -1833,21 +1768,20 @@
 
     // Create a RuleBasedTimeZone with the subset rule
     getID(tzid);
-    RuleBasedTimeZone rbtz(tzid, initial);
-    if (transitionRules != nullptr) {
-        while (!transitionRules->isEmpty()) {
-            TimeZoneRule *tr = (TimeZoneRule*)transitionRules->orphanElementAt(0);
+    RuleBasedTimeZone rbtz(tzid, lpInitial.orphan());
+    if (lpTransitionRules.isValid()) {
+        U_ASSERT(transitionRules->hasDeleter());  // Assumed for U_FAILURE early return, below.
+        while (!lpTransitionRules->isEmpty()) {
+            TimeZoneRule *tr = (TimeZoneRule*)lpTransitionRules->orphanElementAt(0);
             rbtz.addTransitionRule(tr, status);
             if (U_FAILURE(status)) {
-                goto cleanupWritePartial;
+                return;
             }
         }
-        delete transitionRules;
-        transitionRules = nullptr;
     }
     rbtz.complete(status);
     if (U_FAILURE(status)) {
-        goto cleanupWritePartial;
+        return;
     }
 
     if (olsonzid.length() > 0 && icutzver.length() > 0) {
@@ -1854,7 +1788,7 @@
         UnicodeString *icutzprop = new UnicodeString(ICU_TZINFO_PROP);
         if (icutzprop == nullptr) {
             status = U_MEMORY_ALLOCATION_ERROR;
-            goto cleanupWritePartial;
+            return;
         }
         icutzprop->append(olsonzid);
         icutzprop->append((UChar)0x005B/*'['*/);
@@ -1862,23 +1796,12 @@
         icutzprop->append(ICU_TZINFO_PARTIAL, -1);
         appendMillis(start, *icutzprop);
         icutzprop->append((UChar)0x005D/*']'*/);
-        customProps.addElementX(icutzprop, status);
+        customProps.adoptElement(icutzprop, status);
         if (U_FAILURE(status)) {
-            delete icutzprop;
-            goto cleanupWritePartial;
+            return;
         }
     }
     writeZone(writer, rbtz, &customProps, status);
-    return;
-
-cleanupWritePartial:
-    if (initial != nullptr) {
-        delete initial;
-    }
-    if (transitionRules != nullptr) {
-        U_ASSERT(transitionRules->hasDeleter());
-        delete transitionRules;
-    }
 }
 
 void

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -98,20 +98,12 @@
 }
 
 /**
- * Deleter for UVector
- */
-static void U_CALLCONV
-deleteUVector(void *obj) {
-   delete (icu::UVector*) obj;
-}
-
-/**
  * Deleter for OlsonToMetaMappingEntry
  */
 static void U_CALLCONV
 deleteOlsonToMetaMappingEntry(void *obj) {
     icu::OlsonToMetaMappingEntry *entry = (icu::OlsonToMetaMappingEntry*)obj;
-    uprv_free(entry);
+    delete entry;
 }
 
 U_CDECL_END
@@ -477,11 +469,11 @@
                 UErrorCode ec = U_ZERO_ERROR;
                 if (singleZone) {
                     if (!gSingleZoneCountries->contains((void*)region)) {
-                        gSingleZoneCountries->addElementX((void*)region, ec);
+                        gSingleZoneCountries->addElement((void*)region, ec);
                     }
                 } else {
                     if (!gMultiZonesCountries->contains((void*)region)) {
-                        gMultiZonesCountries->addElementX((void*)region, ec);
+                        gMultiZonesCountries->addElement((void*)region, ec);
                     }
                 }
             }
@@ -550,7 +542,7 @@
         gOlsonToMeta = NULL;
     } else {
         uhash_setKeyDeleter(gOlsonToMeta, deleteUCharString);
-        uhash_setValueDeleter(gOlsonToMeta, deleteUVector);
+        uhash_setValueDeleter(gOlsonToMeta, uprv_deleteUObject);
     }
 }
 
@@ -625,7 +617,7 @@
 
 UVector*
 ZoneMeta::createMetazoneMappings(const UnicodeString &tzid) {
-    UVector *mzMappings = NULL;
+    LocalPointer <UVector> mzMappings;
     UErrorCode status = U_ZERO_ERROR;
 
     UnicodeString canonicalID;
@@ -677,9 +669,8 @@
                     continue;
                 }
 
-                OlsonToMetaMappingEntry *entry = (OlsonToMetaMappingEntry*)uprv_malloc(sizeof(OlsonToMetaMappingEntry));
-                if (entry == NULL) {
-                    status = U_MEMORY_ALLOCATION_ERROR;
+                LocalPointer<OlsonToMetaMappingEntry> entry(new OlsonToMetaMappingEntry, status);
+                if (U_FAILURE(status)) {
                     break;
                 }
                 entry->mzid = mz_name;
@@ -686,32 +677,24 @@
                 entry->from = from;
                 entry->to = to;
 
-                if (mzMappings == NULL) {
-                    mzMappings = new UVector(deleteOlsonToMetaMappingEntry, NULL, status);
+                if (mzMappings.isNull()) {
+                    mzMappings.adoptInsteadAndCheckErrorCode(
+                        new UVector(deleteOlsonToMetaMappingEntry, nullptr, status), status);
                     if (U_FAILURE(status)) {
-                        delete mzMappings;
-                        mzMappings = NULL;
-                        uprv_free(entry);
                         break;
                     }
                 }
 
-                mzMappings->addElementX(entry, status);
+                mzMappings->adoptElement(entry.orphan(), status);
                 if (U_FAILURE(status)) {
                     break;
                 }
             }
             ures_close(mz);
-            if (U_FAILURE(status)) {
-                if (mzMappings != NULL) {
-                    delete mzMappings;
-                    mzMappings = NULL;
-                }
-            }
         }
     }
     ures_close(rb);
-    return mzMappings;
+    return U_SUCCESS(status) ? mzMappings.orphan() : nullptr;
 }
 
 UnicodeString& U_EXPORT2
@@ -775,6 +758,7 @@
     // No valueDeleter, because the vector maintain the value objects
     gMetaZoneIDs = new UVector(NULL, uhash_compareUChars, status);
     if (U_FAILURE(status) || gMetaZoneIDs == NULL) {
+        delete gMetaZoneIDs;
         gMetaZoneIDs = NULL;
         uhash_close(gMetaZoneIDTable);
         gMetaZoneIDTable = NULL;
@@ -792,21 +776,23 @@
         }
         const char *mzID = ures_getKey(res.getAlias());
         int32_t len = static_cast<int32_t>(uprv_strlen(mzID));
-        UChar *uMzID = (UChar*)uprv_malloc(sizeof(UChar) * (len + 1));
-        if (uMzID == NULL) {
+        LocalMemory<UChar> uMzID((UChar*)uprv_malloc(sizeof(UChar) * (len + 1)));
+        if (uMzID.isNull()) {
             status = U_MEMORY_ALLOCATION_ERROR;
             break;
         }
-        u_charsToUChars(mzID, uMzID, len);
+        u_charsToUChars(mzID, uMzID.getAlias(), len);
         uMzID[len] = 0;
-        UnicodeString *usMzID = new UnicodeString(uMzID);
-        if (uhash_get(gMetaZoneIDTable, usMzID) == NULL) {
-            gMetaZoneIDs->addElementX((void *)uMzID, status);
-            uhash_put(gMetaZoneIDTable, (void *)usMzID, (void *)uMzID, &status);
-        } else {
-            uprv_free(uMzID);
-            delete usMzID;
+        LocalPointer<UnicodeString> usMzID(new UnicodeString(uMzID.getAlias()), status);
+        if (U_FAILURE(status)) {
+            break;
         }
+        if (uhash_get(gMetaZoneIDTable, usMzID.getAlias()) == NULL) {
+            // Note: gMetaZoneIDTable adopts its keys, but not its values.
+            //       gMetaZoneIDs adopts its values.
+            uhash_put(gMetaZoneIDTable, usMzID.orphan(), uMzID.getAlias(), &status);
+            gMetaZoneIDs->adoptElement(uMzID.orphan(), status);
+        }
     }
     ures_close(bundle);
     ures_close(rb);

Modified: trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/i18n/zonemeta.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -18,11 +18,11 @@
 
 U_NAMESPACE_BEGIN
 
-typedef struct OlsonToMetaMappingEntry {
+struct OlsonToMetaMappingEntry : public UMemory {
     const UChar *mzid; // const because it's a reference to a resource bundle string.
     UDate from;
     UDate to;
-} OlsonToMetaMappingEntry;
+};
 
 class UVector;
 class TimeZone;

Modified: trunk/Build/source/libs/icu/icu-src/source/io/io.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/io/io.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/io/io.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -60,7 +60,7 @@
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuio70d.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuio71d.dll</OutputFile>
       <ProgramDatabaseFile>..\..\$(IcuLibOutputDir)\icuiod.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuiod.lib</ImportLibrary>
       <AdditionalDependencies>icuucd.lib;icuind.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -73,7 +73,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\$(IcuBinOutputDir)\icuio70.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icuio71.dll</OutputFile>
       <ProgramDatabaseFile>..\..\$(IcuLibOutputDir)\icuio.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icuio.lib</ImportLibrary>
       <AdditionalDependencies>icuuc.lib;icuin.lib;%(AdditionalDependencies)</AdditionalDependencies>

Modified: trunk/Build/source/libs/icu/icu-src/source/io/sprintf.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/io/sprintf.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/io/sprintf.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -41,6 +41,12 @@
                 int32_t     count)
 {
     u_localized_print_string *output = (u_localized_print_string *)context;
+
+    /* just calculating buffer size */
+    if (output->str == 0) {
+        return count;
+    }
+
     int32_t size = ufmt_min(count, output->available);
 
     u_strncpy(output->str + (output->len - output->available), str, size);
@@ -58,6 +64,12 @@
     int32_t written = 0;
     int32_t lengthOfResult = resultLen;
 
+    /* just calculating buffer size */
+    if (output->str == 0 &&
+        info->fWidth != -1 && resultLen < info->fWidth) {
+        return info->fWidth;
+    }
+
     resultLen = ufmt_min(resultLen, output->available);
 
     /* pad and justify, if needed */

Modified: trunk/Build/source/libs/icu/icu-src/source/io/ustdio.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/io/ustdio.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/io/ustdio.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -628,7 +628,7 @@
 
     /* Fill the buffer if it is empty */
     str = &f->str;
-    if (f && str->fPos + 1 >= str->fLimit) {
+    if (str->fPos + 1 >= str->fLimit) {
         ufile_fill_uchar_buffer(f);
     }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/layoutex/layoutex.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -54,7 +54,7 @@
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin\iculx70.dll</OutputFile>
+      <OutputFile>..\..\bin\iculx71.dll</OutputFile>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib\iculx.pdb</ProgramDatabaseFile>
@@ -79,7 +79,7 @@
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin\iculx70d.dll</OutputFile>
+      <OutputFile>..\..\bin\iculx71d.dll</OutputFile>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>.\..\..\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -104,7 +104,7 @@
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64\iculx70.dll</OutputFile>
+      <OutputFile>..\..\bin64\iculx71.dll</OutputFile>
       <AdditionalDependencies>icuuc.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <ProgramDatabaseFile>.\..\..\lib64\iculx.pdb</ProgramDatabaseFile>
@@ -127,7 +127,7 @@
       <CompileAs>Default</CompileAs>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\bin64\iculx70d.dll</OutputFile>
+      <OutputFile>..\..\bin64\iculx71d.dll</OutputFile>
       <AdditionalDependencies>icuucd.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>.\..\..\lib64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
       <GenerateDebugInformation>true</GenerateDebugInformation>

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/Makefile.in
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/Makefile.in	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/Makefile.in	2022-05-31 01:17:15 UTC (rev 63452)
@@ -23,7 +23,7 @@
 CLEANFILES = *~
 
 SUBDIRS = date cal
-ALLSUBDIRS = break case csdet datefmt msgfmt numfmt props translit ucnv udata ufortune uresb ustring citer uciter8 ugrep
+ALLSUBDIRS = cal citer coll csdet date datecal ufortune uresb datefmt msgfmt numfmt props strsrch translit uciter8 ucnv udata ustring dtitvfmtsample dtptngsample plurfmtsample
 
 ## List of phony targets
 .PHONY : all all-local all-recursive install install-local		\

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/case/ucase.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/case/ucase.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/case/ucase.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -17,6 +17,9 @@
 *******************************************************************************
 */
 
+#include <stdio.h>
+#include <stdlib.h>
+
 #include "unicode/uchar.h"
 #include "unicode/ustring.h"
 #include "unicode/utypes.h"

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/citer/citer.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -73,7 +73,7 @@
     test2->getText(result2);
     if (result1 != result2) {
         u_fprintf(out, "iter.getText() != clone.getText()\n");
-    } 
+    }
 
     u_fprintf(out, "\n");
 
@@ -95,7 +95,7 @@
             u_fprintf(out, "Iterator reached end prematurely");
         }
         else if (c != testText[i]) {
-            u_fprintf(out, "Character mismatch at position %d\n" + i);
+          u_fprintf(out, "Character mismatch at position %d\n", i);
         }
         if (iter.current() != c) {
             u_fprintf(out, "current() isn't working right");
@@ -111,7 +111,7 @@
         u_fprintf(out, "|");
         printUChar(c);
 
-    } while (c != CharacterIterator::DONE);        
+    } while (c != CharacterIterator::DONE);
 
     delete test2;
     u_fprintf(out, "\n");
@@ -146,7 +146,7 @@
     int32_t i = iter.endIndex();
 
     printUChar(c);
-    i--; // already printed out the last char 
+    i--; // already printed out the last char
 
     if (iter.startIndex() != 0 || iter.endIndex() != u_strlen(testText)) {
         u_fprintf(out, "startIndex() or endIndex() failed\n");

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/coll/coll.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/coll/coll.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/coll/coll.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -45,8 +45,8 @@
  *    These global variables are set according to the options specified
  *    on the command line by the user.
  */
-char * opt_locale     = "en_US";
-char * opt_rules      = 0;
+char const *opt_locale     = "en_US";
+char *opt_rules      = 0;
 UBool  opt_help       = false;
 UBool  opt_norm       = false;
 UBool  opt_french     = false;
@@ -55,8 +55,8 @@
 UBool  opt_upper      = false;
 UBool  opt_case       = false;
 int    opt_level      = 0;
-char * opt_source     = "abc";
-char * opt_target     = "abd";
+char const *opt_source     = "abc";
+char const *opt_target     = "abd";
 UCollator * collator  = 0;
 
 /** 

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/datecal/cal.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/datecal/cal.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/datecal/cal.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -17,6 +17,8 @@
 #include "unicode/gregocal.h"
 #include <stdio.h>
 
+using namespace icu;
+
 extern "C" void c_main();
 
 void cpp_main()

Added: trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/Makefile
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/Makefile	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/Makefile	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,27 @@
+# Copyright (C) 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+#
+# Copyright (c) 2000-2006 IBM, Inc. and others
+# sample code makefile
+
+# Usage:
+#  - configure, build, install ICU (make install)
+#  - make sure "icu-config" (in the ICU installed bin directory) is on
+#     the path
+#  - do 'make' in this directory
+
+#### definitions
+# Name of your target
+TARGET=dtitvfmtsample
+
+# All object files (C or C++)
+OBJECTS=dtitvfmtsample.o
+
+#### rules
+# Load in standard makefile definitions
+include ../defs.mk
+
+LDFLAGS += $(LDFLAGS_USTDIO)
+
+# the actual rules (this is a simple sample)
+include ../rules.mk


Property changes on: trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/dtitvfmtsample/dtitvfmtsample.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -15,130 +15,130 @@
 using namespace icu;
 
 static void dtitvfmtPreDefined() {
-	  
-	u_printf("===============================================================================\n");
-	u_printf(" dtitvfmtPreDefined()\n");
+
+    u_printf("===============================================================================\n");
+    u_printf(" dtitvfmtPreDefined()\n");
     u_printf("\n");
     u_printf(" Use DateIntervalFormat to get date interval format for pre-defined skeletons:\n");
     u_printf(" yMMMd, MMMMd, jm per locale\n");
     u_printf("===============================================================================\n");
-	
-	//! [dtitvfmtPreDefined] 
-	UFILE *out = u_finit(stdout, NULL, "UTF-8");
-	UErrorCode status =U_ZERO_ERROR;
-	// create 3 Date Intervals
-	UnicodeString data[] = {
-		UnicodeString("2007-10-10 10:10:10"),
-		UnicodeString("2008-10-10 10:10:10"),
-		UnicodeString("2008-11-10 10:10:10"),
-		UnicodeString("2008-11-10 15:10:10")
-		};
-	Calendar *cal = Calendar::createInstance(status);
-	cal->set(2007,10,10,10,10,10);
-	UDate date1 = cal->getTime(status);
-	cal->set(2008,10,10,10,10,10);
-	UDate date2 = cal->getTime(status);
-	cal->set(2008,11,10,10,10,10);
-	UDate date3 = cal->getTime(status);
-	cal->set(2008,11,10,15,10,10);
-	UDate date4 = cal->getTime(status);
+
+    //! [dtitvfmtPreDefined]
+    UFILE *out = u_finit(stdout, NULL, "UTF-8");
+    UErrorCode status =U_ZERO_ERROR;
+    // create 3 Date Intervals
+    UnicodeString data[] = {
+        UnicodeString("2007-10-10 10:10:10"),
+        UnicodeString("2008-10-10 10:10:10"),
+        UnicodeString("2008-11-10 10:10:10"),
+        UnicodeString("2008-11-10 15:10:10")
+        };
+    Calendar *cal = Calendar::createInstance(status);
+    cal->set(2007,10,10,10,10,10);
+    UDate date1 = cal->getTime(status);
+    cal->set(2008,10,10,10,10,10);
+    UDate date2 = cal->getTime(status);
+    cal->set(2008,11,10,10,10,10);
+    UDate date3 = cal->getTime(status);
+    cal->set(2008,11,10,15,10,10);
+    UDate date4 = cal->getTime(status);
     DateInterval* dtitvsample[] = {
-			new DateInterval(date1,date2),
+            new DateInterval(date1,date2),
             new DateInterval(date2,date3),
-			new DateInterval(date3,date4),
+            new DateInterval(date3,date4),
         };
- 	UnicodeString skeletons[] = {
+    UnicodeString skeletons[] = {
             UnicodeString("yMMMd"),
             UnicodeString("MMMMd"),
             UnicodeString("jm"),
-			0,
-		};
+            UnicodeString("")
+        };
     u_fprintf(out,"%-10s%-22s%-22s%-35s%-35s\n", "Skeleton","from","to","Date Interval in en_US","Date Interval in Ja");
-	int i=0;
-	UnicodeString formatEn,formatJa;
-	FieldPosition pos=0;
-    for (int j=0;skeletons[j]!=NULL ;j++) {
- 		 u_fprintf(out,"%-10S%-22S%-22S",skeletons[j].getTerminatedBuffer(),data[i].getTerminatedBuffer(),data[i+1].getTerminatedBuffer());
+    int i=0;
+    UnicodeString formatEn,formatJa;
+    FieldPosition pos=0;
+    for (int j=0; !skeletons[j].isEmpty() ;j++) {
+         u_fprintf(out,"%-10S%-22S%-22S",skeletons[j].getTerminatedBuffer(),data[i].getTerminatedBuffer(),data[i+1].getTerminatedBuffer());
          //create a DateIntervalFormat instance for given skeleton, locale
-		 DateIntervalFormat* dtitvfmtEn = DateIntervalFormat::createInstance(skeletons[j], Locale::getEnglish(),status);
+         DateIntervalFormat* dtitvfmtEn = DateIntervalFormat::createInstance(skeletons[j], Locale::getEnglish(),status);
          DateIntervalFormat* dtitvfmtJa = DateIntervalFormat::createInstance(skeletons[j], Locale::getJapanese(),status);
-		 formatEn.remove();
-		 formatJa.remove();
-		 //get the DateIntervalFormat
-		 dtitvfmtEn->format(dtitvsample[i],formatEn,pos,status);
-		 dtitvfmtJa->format(dtitvsample[i],formatJa,pos,status);
-         u_fprintf(out,"%-35S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());     
-		 delete dtitvfmtEn;
-		 delete dtitvfmtJa;
+         formatEn.remove();
+         formatJa.remove();
+         //get the DateIntervalFormat
+         dtitvfmtEn->format(dtitvsample[i],formatEn,pos,status);
+         dtitvfmtJa->format(dtitvsample[i],formatJa,pos,status);
+         u_fprintf(out,"%-35S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());
+         delete dtitvfmtEn;
+         delete dtitvfmtJa;
          i++;
         }
-	u_fclose(out);
-	//! [dtitvfmtPreDefined]
+    u_fclose(out);
+    //! [dtitvfmtPreDefined]
 }
 
 static void dtitvfmtCustomized() {
-	   
-	u_printf("===============================================================================\n");
-	u_printf("\n");
-	u_printf(" dtitvfmtCustomized()\n");
-	u_printf("\n");
+
+    u_printf("===============================================================================\n");
+    u_printf("\n");
+    u_printf(" dtitvfmtCustomized()\n");
+    u_printf("\n");
     u_printf(" Use DateIntervalFormat to create customized date interval format for yMMMd, Hm");
-	u_printf("\n");
+    u_printf("\n");
     u_printf("================================================================================\n");
-	//! [dtitvfmtCustomized]
-	UFILE *out = u_finit(stdout, NULL, "UTF-8");
-	UErrorCode status =U_ZERO_ERROR;
-	UnicodeString data[] = {
-		UnicodeString("2007-9-10 10:10:10"),
-		UnicodeString("2007-10-10 10:10:10"),
-		UnicodeString("2007-10-10 22:10:10")
-		};
-	// to create 2 Date Intervals
+    //! [dtitvfmtCustomized]
+    UFILE *out = u_finit(stdout, NULL, "UTF-8");
+    UErrorCode status =U_ZERO_ERROR;
+    UnicodeString data[] = {
+        UnicodeString("2007-9-10 10:10:10"),
+        UnicodeString("2007-10-10 10:10:10"),
+        UnicodeString("2007-10-10 22:10:10")
+        };
+    // to create 2 Date Intervals
     Calendar *cal1 = Calendar::createInstance(status);
-	cal1->set(2007,9,10,10,10,10);
-	Calendar *cal2 = Calendar::createInstance(status);
-	cal2->set(2007,10,10,10,10,10);
-	Calendar *cal3 = Calendar::createInstance(status);
-	cal3->set(2007,10,10,22,10,10);
-	DateInterval* dtitvsample[] = {
-			new DateInterval(cal1->getTime(status),cal2->getTime(status)),
+    cal1->set(2007,9,10,10,10,10);
+    Calendar *cal2 = Calendar::createInstance(status);
+    cal2->set(2007,10,10,10,10,10);
+    Calendar *cal3 = Calendar::createInstance(status);
+    cal3->set(2007,10,10,22,10,10);
+    DateInterval* dtitvsample[] = {
+            new DateInterval(cal1->getTime(status),cal2->getTime(status)),
             new DateInterval(cal2->getTime(status),cal3->getTime(status))
-	      };
-	UnicodeString skeletons[] = {
+          };
+    UnicodeString skeletons[] = {
             UnicodeString("yMMMd"),
             UnicodeString("Hm"),
-			0,
+            UnicodeString("")
         };
-		u_printf("%-10s%-22s%-22s%-45s%-35s\n", "Skeleton", "from","to", "Date Interval in en_US","Date Interval in Ja");
-		// Create an empty DateIntervalInfo object
+        u_printf("%-10s%-22s%-22s%-45s%-35s\n", "Skeleton", "from","to", "Date Interval in en_US","Date Interval in Ja");
+        // Create an empty DateIntervalInfo object
         DateIntervalInfo dtitvinf =  DateIntervalInfo(status);
-		// Set Date Time internal pattern for MONTH, HOUR_OF_DAY
+        // Set Date Time internal pattern for MONTH, HOUR_OF_DAY
         dtitvinf.setIntervalPattern("yMMMd", UCAL_MONTH, "y 'Diff' MMM d --- MMM d",status);
         dtitvinf.setIntervalPattern("Hm", UCAL_HOUR_OF_DAY, "yyyy MMM d HH:mm ~ HH:mm",status);
-		// Set fallback interval pattern
+        // Set fallback interval pattern
         dtitvinf.setFallbackIntervalPattern("{0} ~~~ {1}",status);
-		// Get the DateIntervalFormat with the custom pattern
+        // Get the DateIntervalFormat with the custom pattern
         UnicodeString formatEn,formatJa;
-		FieldPosition pos=0;
-		for (int i=0;i<2;i++){
-            for (int j=0;skeletons[j]!=NULL;j++) {
-			u_fprintf(out,"%-10S%-22S%-22S", skeletons[i].getTerminatedBuffer(),data[j].getTerminatedBuffer(), data[j+1].getTerminatedBuffer());
+        FieldPosition pos=0;
+        for (int i=0;i<2;i++){
+          for (int j=0;!skeletons[j].isEmpty();j++) {
+            u_fprintf(out,"%-10S%-22S%-22S", skeletons[i].getTerminatedBuffer(),data[j].getTerminatedBuffer(), data[j+1].getTerminatedBuffer());
             DateIntervalFormat* dtitvfmtEn = DateIntervalFormat::createInstance(skeletons[i],Locale::getEnglish(),dtitvinf,status);
             DateIntervalFormat* dtitvfmtJa = DateIntervalFormat::createInstance(skeletons[i],Locale::getJapanese(),dtitvinf,status);
-			formatEn.remove();
-			formatJa.remove();
-			dtitvfmtEn->format(dtitvsample[j],formatEn,pos,status);
-			dtitvfmtJa->format(dtitvsample[j],formatJa,pos,status);
-			u_fprintf(out,"%-45S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());    
+            formatEn.remove();
+            formatJa.remove();
+            dtitvfmtEn->format(dtitvsample[j],formatEn,pos,status);
+            dtitvfmtJa->format(dtitvsample[j],formatJa,pos,status);
+            u_fprintf(out,"%-45S%-35S\n", formatEn.getTerminatedBuffer(),formatJa.getTerminatedBuffer());
             }
        }
-	u_fclose(out);
-	//! [dtitvfmtCustomized]
+    u_fclose(out);
+    //! [dtitvfmtCustomized]
 }
 
 int main (int argc, char* argv[])
 {
-	dtitvfmtPreDefined();
-	dtitvfmtCustomized();
-	return 0;
+    dtitvfmtPreDefined();
+    dtitvfmtCustomized();
+    return 0;
 }

Added: trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/Makefile
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/Makefile	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/Makefile	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,27 @@
+# Copyright (C) 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+#
+# Copyright (c) 2000-2006 IBM, Inc. and others
+# sample code makefile
+
+# Usage:
+#  - configure, build, install ICU (make install)
+#  - make sure "icu-config" (in the ICU installed bin directory) is on
+#     the path
+#  - do 'make' in this directory
+
+#### definitions
+# Name of your target
+TARGET=dtptngsample
+
+# All object files (C or C++)
+OBJECTS=dtptngsample.o
+
+#### rules
+# Load in standard makefile definitions
+include ../defs.mk
+
+LDFLAGS += $(LDFLAGS_USTDIO)
+
+# the actual rules (this is a simple sample)
+include ../rules.mk


Property changes on: trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/dtptngsample/dtptngsample.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,7 +1,7 @@
 // © 2016 and later: Unicode, Inc. and others.
 // License & terms of use: http://www.unicode.org/copyright.html
 /********************************************************************
- * COPYRIGHT: 
+ * COPYRIGHT:
  * Copyright (c) 2008-2014, International Business Machines Corporation and
  * others. All Rights Reserved.
  ********************************************************************/
@@ -16,151 +16,151 @@
 using namespace icu;
 
 static void getBestPatternExample() {
-	    
-		u_printf("========================================================================\n");
-		u_printf(" getBestPatternExample()\n");
+
+        u_printf("========================================================================\n");
+        u_printf(" getBestPatternExample()\n");
         u_printf("\n");
         u_printf(" Use DateTimePatternGenerator to create customized date/time pattern:\n");
         u_printf(" yQQQQ,yMMMM, MMMMd, hhmm, jjmm per locale\n");
         u_printf("========================================================================\n");
-		//! [getBestPatternExample]
-	UnicodeString skeletons [] = {
-		UnicodeString("yQQQQ"), // year + full name of quarter, i.e., 4th quarter 1999
+        //! [getBestPatternExample]
+    UnicodeString skeletons [] = {
+        UnicodeString("yQQQQ"), // year + full name of quarter, i.e., 4th quarter 1999
         UnicodeString("yMMMM"), // year + full name of month, i.e., October 1999
         UnicodeString("MMMMd"), // full name of month + day of the month, i.e., October 25
         UnicodeString("hhmm"),  // 12-hour-cycle format, i.e., 1:32 PM
         UnicodeString("jjmm"), // preferred hour format for the given locale, i.e., 24-hour-cycle format for fr_FR
-		0,
-	};
+        0,
+    };
 
-	Locale locales[] = {
-		Locale ("en_US"),
-		Locale ("fr_FR"),
-		Locale ("zh_CN"),
-	};
-	
-	const char* filename = "sample.txt";
-	/* open a UTF-8 file for writing */
-	UFILE* f = u_fopen(filename, "w", NULL,"UTF-8");
-	UnicodeString dateReturned;
-	UErrorCode status =U_ZERO_ERROR;
-	Calendar *cal = Calendar::createInstance(status);
-	cal->set (1999,9,13,23,58,59);
-	UDate date = cal->getTime(status);
-	u_fprintf(f, "%-20S%-20S%-20S%-20S\n", UnicodeString("Skeleton").getTerminatedBuffer(),UnicodeString("en_US").getTerminatedBuffer(),UnicodeString("fr_FR").getTerminatedBuffer(),UnicodeString("zh_CN").getTerminatedBuffer());
-	for (int i=0;skeletons[i]!=NULL;i++) {
-		u_fprintf(f, "%-20S",skeletons[i].getTerminatedBuffer());
-		for (int j=0;j<sizeof(locales)/sizeof(locales[0]);j++) {
-			// create a DateTimePatternGenerator instance for given locale
-			DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locales[j],status);
-			// use getBestPattern method to get the best pattern for the given skeleton
-			UnicodeString pattern = dtfg->getBestPattern(skeletons[i],status);
-			// Constructs a SimpleDateFormat with the best pattern generated above and the given locale
-			SimpleDateFormat *sdf = new SimpleDateFormat(pattern,locales[j],status);
-			dateReturned.remove();
-			// Get the format of the given date
-			sdf->format(date,dateReturned,status);
-			/* write Unicode string to file */
-			u_fprintf(f, "%-20S", dateReturned.getTerminatedBuffer());
-			delete dtfg;
-			delete sdf;
-		} 
-		u_fprintf(f,"\n");
-	}
-	/* close the file resource */
-	u_fclose(f);
-	delete cal;
-	//! [getBestPatternExample]
+    Locale locales[] = {
+        Locale ("en_US"),
+        Locale ("fr_FR"),
+        Locale ("zh_CN"),
+    };
+
+    const char* filename = "sample.txt";
+    /* open a UTF-8 file for writing */
+    UFILE* f = u_fopen(filename, "w", NULL,"UTF-8");
+    UnicodeString dateReturned;
+    UErrorCode status =U_ZERO_ERROR;
+    Calendar *cal = Calendar::createInstance(status);
+    cal->set (1999,9,13,23,58,59);
+    UDate date = cal->getTime(status);
+    u_fprintf(f, "%-20S%-20S%-20S%-20S\n", UnicodeString("Skeleton").getTerminatedBuffer(),UnicodeString("en_US").getTerminatedBuffer(),UnicodeString("fr_FR").getTerminatedBuffer(),UnicodeString("zh_CN").getTerminatedBuffer());
+    for (int i=0;!skeletons[i].isEmpty();i++) {
+        u_fprintf(f, "%-20S",skeletons[i].getTerminatedBuffer());
+        for (int j=0;j<sizeof(locales)/sizeof(locales[0]);j++) {
+            // create a DateTimePatternGenerator instance for given locale
+            DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locales[j],status);
+            // use getBestPattern method to get the best pattern for the given skeleton
+            UnicodeString pattern = dtfg->getBestPattern(skeletons[i],status);
+            // Constructs a SimpleDateFormat with the best pattern generated above and the given locale
+            SimpleDateFormat *sdf = new SimpleDateFormat(pattern,locales[j],status);
+            dateReturned.remove();
+            // Get the format of the given date
+            sdf->format(date,dateReturned,status);
+            /* write Unicode string to file */
+            u_fprintf(f, "%-20S", dateReturned.getTerminatedBuffer());
+            delete dtfg;
+            delete sdf;
+        }
+        u_fprintf(f,"\n");
+    }
+    /* close the file resource */
+    u_fclose(f);
+    delete cal;
+    //! [getBestPatternExample]
 }
 
 static void addPatternExample() {
-		
-		u_printf("========================================================================\n");
+
+        u_printf("========================================================================\n");
         u_printf(" addPatternExample()\n");
-		u_printf("\n");
+        u_printf("\n");
         u_printf(" Use addPattern API to add new '. von' to existing pattern\n");
         u_printf("========================================================================\n");
-		//! [addPatternExample]
-		UErrorCode status =U_ZERO_ERROR;
-		UnicodeString conflictingPattern,dateReturned, pattern;
-		Locale locale=Locale::getFrance();
-		Calendar *cal = Calendar::createInstance(status);
-		cal->set (1999,9,13,23,58,59);
-		UDate date = cal->getTime(status);
+        //! [addPatternExample]
+        UErrorCode status =U_ZERO_ERROR;
+        UnicodeString conflictingPattern,dateReturned, pattern;
+        Locale locale=Locale::getFrance();
+        Calendar *cal = Calendar::createInstance(status);
+        cal->set (1999,9,13,23,58,59);
+        UDate date = cal->getTime(status);
         // Create an DateTimePatternGenerator instance for the given locale
-		DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locale,status);
-		SimpleDateFormat *sdf = new SimpleDateFormat(dtfg->getBestPattern("MMMMddHmm",status),locale,status);
+        DateTimePatternGenerator *dtfg= DateTimePatternGenerator::createInstance(locale,status);
+        SimpleDateFormat *sdf = new SimpleDateFormat(dtfg->getBestPattern("MMMMddHmm",status),locale,status);
         // Add '. von' to the existing pattern
         dtfg->addPattern("dd'. von' MMMM", true, conflictingPattern,status);
         // Apply the new pattern
         sdf->applyPattern(dtfg->getBestPattern("MMMMddHmm",status));
-		dateReturned = sdf->format(date, dateReturned, status);
-		pattern =sdf->toPattern(pattern);
-		u_printf("%s\n", "New Pattern for FRENCH: ");
-      	u_printf("%S\n", pattern.getTerminatedBuffer());
-		u_printf("%s\n", "Date Time in new Pattern: ");
-		u_printf("%S\n", dateReturned.getTerminatedBuffer());
-		delete dtfg;
-		delete sdf;
-		delete cal;
+        dateReturned = sdf->format(date, dateReturned, status);
+        pattern =sdf->toPattern(pattern);
+        u_printf("%s\n", "New Pattern for FRENCH: ");
+        u_printf("%S\n", pattern.getTerminatedBuffer());
+        u_printf("%s\n", "Date Time in new Pattern: ");
+        u_printf("%S\n", dateReturned.getTerminatedBuffer());
+        delete dtfg;
+        delete sdf;
+        delete cal;
 
-		//! [addPatternExample]
+        //! [addPatternExample]
         /* output of the sample code:
         ************************************************************************************************
          New Pattern for FRENCH: dd. 'von' MMMM HH:mm
          Date Time in new Pattern: 13. von octobre 23:58
-     
+
         *************************************************************************************************/
- 	}
+    }
 
 static void replaceFieldTypesExample() {
-		// Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
+        // Use repalceFieldTypes API to replace zone 'zzzz' with 'vvvv'
        u_printf("========================================================================\n");
        u_printf(" replaceFieldTypeExample()\n");
        u_printf("\n");
        u_printf(" Use replaceFieldTypes API to replace zone 'zzzz' with 'vvvv'\n");
        u_printf("========================================================================\n");
-	   //! [replaceFieldTypesExample]
-		UFILE *out = u_finit(stdout, NULL, "UTF-8");
-		UErrorCode status =U_ZERO_ERROR;
-		UnicodeString pattern,dateReturned;
-		Locale locale =Locale::getFrance();
-		Calendar *cal = Calendar::createInstance(status);
-		cal->set (1999,9,13,23,58,59);
-		UDate date = cal->getTime(status);
-		TimeZone *zone = TimeZone::createTimeZone(UnicodeString("Europe/Paris"));
-		DateTimePatternGenerator *dtfg = DateTimePatternGenerator::createInstance(locale,status);
-	    SimpleDateFormat *sdf = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz",locale,status);
-		sdf->setTimeZone(*zone);
-		pattern = sdf->toPattern(pattern);
-		u_fprintf(out, "%S\n", UnicodeString("Pattern before replacement:").getTerminatedBuffer());
-      	u_fprintf(out, "%S\n", pattern.getTerminatedBuffer());
-		dateReturned.remove();
-		dateReturned = sdf->format(date, dateReturned, status);
-		u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
-		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
+       //! [replaceFieldTypesExample]
+        UFILE *out = u_finit(stdout, NULL, "UTF-8");
+        UErrorCode status =U_ZERO_ERROR;
+        UnicodeString pattern,dateReturned;
+        Locale locale =Locale::getFrance();
+        Calendar *cal = Calendar::createInstance(status);
+        cal->set (1999,9,13,23,58,59);
+        UDate date = cal->getTime(status);
+        TimeZone *zone = TimeZone::createTimeZone(UnicodeString("Europe/Paris"));
+        DateTimePatternGenerator *dtfg = DateTimePatternGenerator::createInstance(locale,status);
+        SimpleDateFormat *sdf = new SimpleDateFormat("EEEE d MMMM y HH:mm:ss zzzz",locale,status);
+        sdf->setTimeZone(*zone);
+        pattern = sdf->toPattern(pattern);
+        u_fprintf(out, "%S\n", UnicodeString("Pattern before replacement:").getTerminatedBuffer());
+        u_fprintf(out, "%S\n", pattern.getTerminatedBuffer());
+        dateReturned.remove();
+        dateReturned = sdf->format(date, dateReturned, status);
+        u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
+        u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
         // Replace zone "zzzz" in the pattern with "vvvv"
-		UnicodeString newPattern = dtfg->replaceFieldTypes(pattern, "vvvv", status);
-		// Apply the new pattern
-		sdf->applyPattern(newPattern);
-		dateReturned.remove();
-		dateReturned = sdf->format(date, dateReturned, status);
-		u_fprintf(out, "%S\n", UnicodeString("Pattern after replacement:").getTerminatedBuffer());
-     	u_fprintf(out, "%S\n", newPattern.getTerminatedBuffer());
-     	u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
-		u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
-		delete sdf;
-		delete dtfg;
-		delete zone;
-		delete cal;
-		u_fclose(out);
-	//! [replaceFieldTypesExample]
+        UnicodeString newPattern = dtfg->replaceFieldTypes(pattern, "vvvv", status);
+        // Apply the new pattern
+        sdf->applyPattern(newPattern);
+        dateReturned.remove();
+        dateReturned = sdf->format(date, dateReturned, status);
+        u_fprintf(out, "%S\n", UnicodeString("Pattern after replacement:").getTerminatedBuffer());
+        u_fprintf(out, "%S\n", newPattern.getTerminatedBuffer());
+        u_fprintf(out, "%S\n", UnicodeString("Date/Time format in fr_FR:").getTerminatedBuffer());
+        u_fprintf(out, "%S\n", dateReturned.getTerminatedBuffer());
+        delete sdf;
+        delete dtfg;
+        delete zone;
+        delete cal;
+        u_fclose(out);
+    //! [replaceFieldTypesExample]
     }
 
 int main (int argc, char* argv[])
 {
-	getBestPatternExample();
-	addPatternExample();
-	replaceFieldTypesExample();
-	return 0;
+    getBestPatternExample();
+    addPatternExample();
+    replaceFieldTypesExample();
+    return 0;
 }

Added: trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/Makefile
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/Makefile	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/Makefile	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,27 @@
+# Copyright (C) 2016 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+#
+# Copyright (c) 2000-2006 IBM, Inc. and others
+# sample code makefile
+
+# Usage:
+#  - configure, build, install ICU (make install)
+#  - make sure "icu-config" (in the ICU installed bin directory) is on
+#     the path
+#  - do 'make' in this directory
+
+#### definitions
+# Name of your target
+TARGET=plurfmtsample
+
+# All object files (C or C++)
+OBJECTS=plurfmtsample.o
+
+#### rules
+# Load in standard makefile definitions
+include ../defs.mk
+
+LDFLAGS += $(LDFLAGS_USTDIO)
+
+# the actual rules (this is a simple sample)
+include ../rules.mk


Property changes on: trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/plurfmtsample/plurfmtsample.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -19,17 +19,17 @@
 using namespace icu;
 
 static void PluralFormatExample() {
-	  
-	u_printf("=============================================================================\n");
-	u_printf(" PluralFormatExample()\n");
+
+    u_printf("=============================================================================\n");
+    u_printf(" PluralFormatExample()\n");
     u_printf("\n");
     u_printf(" Use PluralFormat and Messageformat to get Plural Form for languages below:\n");
     u_printf(" English, Slovenian\n");
     u_printf("=============================================================================\n");
-	
-	//! [PluralFormatExample] 
-	UErrorCode status =U_ZERO_ERROR; 
-	Locale locEn = Locale("en");
+
+    //! [PluralFormatExample]
+    UErrorCode status =U_ZERO_ERROR;
+    Locale locEn = Locale("en");
     Locale locSl = Locale("sl");
 
     UnicodeString patEn = UnicodeString("one{dog} other{dogs}");                      // English 'dog'
@@ -42,19 +42,19 @@
     MessageFormat* msgfmtEn =  new MessageFormat("{0,number} {1}", locEn,status);
     MessageFormat* msgfmtSl =  new MessageFormat("{0,number} {1}", locSl,status);
 
-	int numbers[] = {0, 1, 2, 3, 4, 5, 10, 100, 101, 102};
-	u_printf("Output by using PluralFormat and MessageFormat API\n");
+    int numbers[] = {0, 1, 2, 3, 4, 5, 10, 100, 101, 102};
+    u_printf("Output by using PluralFormat and MessageFormat API\n");
     u_printf("%-16s%-16s%-16s\n","Number", "English","Slovenian");
- 
+
     // Use MessageFormat.format () to format the objects and append to the given StringBuffer
     for (int i=0;i<sizeof(numbers)/sizeof(int);i++) {
-	      UnicodeString msgEn,msgSl;
-		  FieldPosition fpos = 0;
-		  Formattable argEn[]={Formattable(numbers[i]), Formattable(plfmtEn.format(numbers[i],status))};
-		  Formattable argSl[]={Formattable(numbers[i]), Formattable(plfmtSl.format(numbers[i],status))};
-		  msgfmtEn->format(argEn,2,msgEn,fpos,status);
-		  msgfmtSl->format(argSl,2,msgSl,fpos,status);
-  		  u_printf("%-16d%-16S%-16S\n", numbers[i], msgEn.getTerminatedBuffer(),msgSl.getTerminatedBuffer());
+          UnicodeString msgEn,msgSl;
+          FieldPosition fpos = 0;
+          Formattable argEn[]={Formattable(numbers[i]), Formattable(plfmtEn.format(numbers[i],status))};
+          Formattable argSl[]={Formattable(numbers[i]), Formattable(plfmtSl.format(numbers[i],status))};
+          msgfmtEn->format(argEn,2,msgEn,fpos,status);
+          msgfmtSl->format(argSl,2,msgSl,fpos,status);
+          u_printf("%-16d%-16S%-16S\n", numbers[i], msgEn.getTerminatedBuffer(),msgSl.getTerminatedBuffer());
       }
 
      u_printf("\n");
@@ -62,27 +62,27 @@
       // Equivalent code with message format pattern
       UnicodeString msgPatEn = "{0,plural, one{# dog} other{# dogs}}";
       UnicodeString msgPatSl = "{0,plural, one{# pes} two{# psa} few{# psi} other{# psov}}";
- 
-	  MessageFormat* altMsgfmtEn = new MessageFormat(msgPatEn, locEn,status);
+
+      MessageFormat* altMsgfmtEn = new MessageFormat(msgPatEn, locEn,status);
       MessageFormat* altMsgfmtSl = new MessageFormat(msgPatSl, locSl,status);
       u_printf("Same Output by using MessageFormat API only\n");
       u_printf("%-16s%-16s%-16s\n","Number", "English","Slovenian");
       for (int i=0;i<sizeof(numbers)/sizeof(int);i++) {
           UnicodeString msgEn,msgSl;
-		  Formattable arg[] = {numbers[i]};
-		  FieldPosition fPos =0;
-		  altMsgfmtEn->format(arg, 1, msgEn, fPos, status);
+          Formattable arg[] = {numbers[i]};
+          FieldPosition fPos =0;
+          altMsgfmtEn->format(arg, 1, msgEn, fPos, status);
           altMsgfmtSl->format(arg, 1, msgSl, fPos,status);
           u_printf("%-16d%-16S%-16S\n", numbers[i], msgEn.getTerminatedBuffer(), msgSl.getTerminatedBuffer());
       }
 
- 	delete msgfmtEn;
-	delete msgfmtSl;
-	delete altMsgfmtEn;
-	delete altMsgfmtSl;
-	//! [PluralFormatExample]
+    delete msgfmtEn;
+    delete msgfmtSl;
+    delete altMsgfmtEn;
+    delete altMsgfmtSl;
+    //! [PluralFormatExample]
 
-	  /*  output of the sample code:
+      /*  output of the sample code:
        ********************************************************************
         Number			English			Slovenian
         0				0 dogs			0 psov
@@ -100,6 +100,6 @@
 }
 int main (int argc, char* argv[])
 {
-	PluralFormatExample();
-	return 0;
+    PluralFormatExample();
+    return 0;
 }

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/readme.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/readme.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/readme.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -4,29 +4,39 @@
 ## Copyright (c) 2002-2010, International Business Machines Corporation 
 ## and others. All Rights Reserved.
 
-This directory contains sample code
-Below is a short description of the contents of this directory.
+This directory contains sample code using ICU4C routines. Below is a
+short description of the contents of this directory.
 
-break - demonstrates how to use BreakIterators in C and C++.
+break   - demonstrates how to use BreakIterators in C and C++.
 
-cal      - prints out a calendar. 
+cal     - prints out a calendar. 
 
 case    - demonstrates how to do Unicode case conversion in C and C++.
 
+coll    - shows how collation compares strings
+
 csdet   -  demonstrates using ICU's CharSet Detection API
 
-date     - prints out the current date, localized. 
+date    - prints out the current date, localized. 
 
-datefmt  - an exercise using the date formatting API
+datecal - demonstrates how a calendar object provides information
+    
+datefmt - an exercise using the date formatting API
 
-layout   - demonstrates the ICU LayoutEngine
+dtitvfmtsample - shows how date interval format uses predefined skeletons
 
-legacy   - demonstrates using two versions of ICU in one application
+dtptngsample - uses DateTimePatternGenerator to create customized date/time pattern
+       
+layout   - demonstrates the ICU LayoutEngine (obsolete)
 
+legacy   - demonstrates using two versions of ICU in one application (obsolete)
+
 msgfmt   - demonstrates the use of the Message Format
 
 numfmt   - demonstrates the use of the number format
 
+plurfmtsample - uses PluralFormat and Messageformat to get Plural Form
+    
 props    - demonstrates the use of Unicode properties
 
 strsrch - demonstrates how to search for patterns in Unicode text using the usearch interface.
@@ -33,7 +43,7 @@
 
 translit - demonstrates the use of ICU transliteration
 
-uciter8.c - demonstrates how to leniently read 8-bit Unicode text.
+uciter8 - demonstrates how to leniently read 8-bit Unicode text.
 
 ucnv     - demonstrates the use of ICU codepage conversion
 
@@ -41,7 +51,7 @@
 
 ufortune - demonstrates packaging and use of resources in an application
 
-ugrep  - demonstrates ICU Regular Expressions. 
+ugrep    - demonstrates ICU Regular Expressions. 
 
 uresb    - demonstrates building and loading resource bundles
 
@@ -52,12 +62,11 @@
 * Where can I find more sample code?
 
  - The "uconv" utility is a full-featured command line application.
-    It is normally built with ICU, and is located in icu/source/extra/uconv
+   It is normally built with ICU, and is located in icu/source/extra/uconv
 
- - The "icuapps" CVS module contains other applications and libraries not
-    included with ICU.  You can check it out from the CVS command line
-    by using for example,  "cvs co icuapps" instead of "cvs co icu",
-   or through WebCVS at http://dev.icu-project.org/cgi-bin/viewcvs.cgi/icuapps/
+ - The "icu-demos" contains other applications and libraries not
+   included with ICU.  You can check it out from https://github.com/unicode-org/icu-demos
+   using github clone. See the README file for additional information.
 
 ==
 * How do I build the samples?
@@ -76,7 +85,7 @@
             - be sure 'icu-config' is accessible from the PATH
             - type 'make all-samples' from this directory 
                (other targets:  clean-samples, check-samples)
-           Note: 'make all-samples' won't work correctly in out of source builds.
+      Note: 'make all-samples' won't work correctly in out of source builds.
 
-            - legacy and layout are not included in these lists,
-                   please see their individual readmes.
+      Note that legacy and layout are obsolete samples that may not compile or run without
+            adjustments to their makefiles.

Modified: trunk/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/samples/strsrch/strsrch.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -47,7 +47,7 @@
  *    These global variables are set according to the options specified
  *    on the command line by the user.
  */
-char * opt_locale      = "en_US";
+char const *opt_locale      = "en_US";
 char * opt_rules       = 0;
 UBool  opt_help        = false;
 UBool  opt_norm        = false;
@@ -59,8 +59,8 @@
 UBool  opt_overlap     = false;
 UBool  opt_canonical   = false;
 int    opt_level       = 0;
-char * opt_source      = "International Components for Unicode";
-char * opt_pattern     = "Unicode";
+char const *opt_source      = "International Components for Unicode";
+char const *opt_pattern     = "Unicode";
 UCollator * collator   = 0;
 UStringSearch * search = 0;
 UChar rules[100];

Deleted: trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,23 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This file defines Bazel targets for the ICU4C "stubdata" library header and source files.
-
-load("@rules_cc//cc:defs.bzl", "cc_library")
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-# When compiling code in the `common` dir, the constant
-# `U_COMMON_IMPLEMENTATION` needs to be defined. See 
-# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
-
-cc_library(
-    name = "stubdata",
-    srcs = ["stubdata.cpp"],
-    deps = ["//icu4c/source/common:headers"],
-    local_defines = [
-        "U_COMMON_IMPLEMENTATION",
-    ],
-)

Added: trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/stubdata/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,23 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This file defines Bazel targets for the ICU4C "stubdata" library header and source files.
+
+load("@rules_cc//cc:defs.bzl", "cc_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+# When compiling code in the `common` dir, the constant
+# `U_COMMON_IMPLEMENTATION` needs to be defined. See 
+# https://unicode-org.github.io/icu/userguide/howtouseicu#c-with-your-own-build-system .
+
+cc_library(
+    name = "stubdata",
+    srcs = ["stubdata.cpp"],
+    deps = ["//icu4c/source/common:headers"],
+    local_defines = [
+        "U_COMMON_IMPLEMENTATION",
+    ],
+)

Modified: trunk/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/stubdata/stubdata.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -56,7 +56,7 @@
       <SetChecksum>true</SetChecksum>
       <TurnOffAssemblyGeneration>true</TurnOffAssemblyGeneration>
       <!-- Note: stubdata is somewhat odd in that it doesn't suffix the Debug output DLL/LIB with a "d" like common/i18n/etc. -->
-      <OutputFile>..\..\$(IcuBinOutputDir)\icudt70.dll</OutputFile>
+      <OutputFile>..\..\$(IcuBinOutputDir)\icudt71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\$(IcuLibOutputDir)\icudt.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\$(IcuLibOutputDir)\icudt.lib</ImportLibrary>
     </Link>

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -73,6 +73,7 @@
     /*addTest(root, &TestGetDefaultRules, "tscoll/capitst/TestGetDefaultRules");*/
     addTest(root, &TestDecomposition, "tscoll/capitst/TestDecomposition");
     addTest(root, &TestSafeClone, "tscoll/capitst/TestSafeClone");
+    addTest(root, &TestClone, "tscoll/capitst/TestClone");
     addTest(root, &TestCloneBinary, "tscoll/capitst/TestCloneBinary");
     addTest(root, &TestGetSetAttr, "tscoll/capitst/TestGetSetAttr");
     addTest(root, &TestBounds, "tscoll/capitst/TestBounds");
@@ -806,6 +807,124 @@
     }
 }
 
+void TestClone() {
+    UChar test1[6];
+    UChar test2[6];
+    static const UChar umlautUStr[] = {0x00DC, 0};
+    static const UChar oeStr[] = {0x0055, 0x0045, 0};
+    UCollator * someCollators [CLONETEST_COLLATOR_COUNT];
+    UCollator * someClonedCollators [CLONETEST_COLLATOR_COUNT];
+    UCollator * col = NULL;
+    UErrorCode err = U_ZERO_ERROR;
+    int8_t idx = 6;    /* Leave this here to test buffer alignment in memory*/
+    const char sampleRuleChars[] = "&Z < CH";
+    UChar sampleRule[sizeof(sampleRuleChars)];
+
+    u_uastrcpy(test1, "abCda");
+    u_uastrcpy(test2, "abcda");
+    u_uastrcpy(sampleRule, sampleRuleChars);
+
+    /* one default collator & two complex ones */
+    someCollators[0] = ucol_open("en_US", &err);
+    someCollators[1] = ucol_open("ko", &err);
+    someCollators[2] = ucol_open("ja_JP", &err);
+    someCollators[3] = ucol_openRules(sampleRule, -1, UCOL_ON, UCOL_TERTIARY, NULL, &err);
+    if(U_FAILURE(err)) {
+        for (idx = 0; idx < CLONETEST_COLLATOR_COUNT; idx++) {
+            ucol_close(someCollators[idx]);
+        }
+        log_data_err("Couldn't open one or more collators\n");
+        return;
+    }
+
+    /* Check the various error & informational states: */
+
+    /* Null status - just returns NULL */
+    if (NULL != ucol_clone(someCollators[0], NULL))
+    {
+        log_err("FAIL: Cloned Collator failed to deal correctly with null status\n");
+    }
+    /* error status - should return 0 & keep error the same */
+    err = U_MEMORY_ALLOCATION_ERROR;
+    if (NULL != ucol_clone(someCollators[0], &err) || err != U_MEMORY_ALLOCATION_ERROR)
+    {
+        log_err("FAIL: Cloned Collator failed to deal correctly with incoming error status\n");
+    }
+    err = U_ZERO_ERROR;
+
+    /* Verify we can use this run-time calculated size */
+    if (NULL == (col = ucol_clone(someCollators[0], &err)) || U_FAILURE(err))
+    {
+        log_err("FAIL: Collator can't be cloned.\n");
+    }
+    if (col) ucol_close(col);
+
+    if (NULL == (col = ucol_clone(someCollators[0], &err)) || err != U_ZERO_ERROR)
+    {
+        log_err("FAIL: Cloned Collator failed to deal correctly\n");
+    }
+    if (col) ucol_close(col);
+    err = U_ZERO_ERROR;
+
+    /* Null Collator - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
+    if (NULL != ucol_clone(NULL, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
+    {
+        log_err("FAIL: Cloned Collator failed to deal correctly with null Collator pointer\n");
+    }
+    err = U_ZERO_ERROR;
+
+    /* Test that a cloned collator doesn't accidentally use UCA. */
+    col=ucol_open("de at collation=phonebook", &err);
+    someClonedCollators[0] = ucol_clone(col, &err);
+    doAssert( (ucol_greater(col, umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Original German phonebook collation sorts differently than expected");
+    doAssert( (ucol_greater(someClonedCollators[0], umlautUStr, u_strlen(umlautUStr), oeStr, u_strlen(oeStr))), "Cloned German phonebook collation sorts differently than expected");
+    if (!ucol_equals(someClonedCollators[0], col)) {
+        log_err("FAIL: Cloned German phonebook collator is not equal to original.\n");
+    }
+    ucol_close(col);
+    ucol_close(someClonedCollators[0]);
+
+    err = U_ZERO_ERROR;
+
+    /* change orig & clone & make sure they are independent */
+
+    for (idx = 0; idx < CLONETEST_COLLATOR_COUNT; idx++)
+    {
+        ucol_setStrength(someCollators[idx], UCOL_IDENTICAL);
+        err = U_ZERO_ERROR;
+        ucol_close(ucol_clone(someCollators[idx], &err));
+        if (err != U_ZERO_ERROR) {
+            log_err("FAIL: collator number %d was not allocated.\n", idx);
+            log_err("FAIL: status of Collator[%d] is %d  (hex: %x).\n", idx, err, err);
+        }
+
+        err = U_ZERO_ERROR;
+        someClonedCollators[idx] = ucol_clone(someCollators[idx], &err);
+        if (U_FAILURE(err)) {
+            log_err("FAIL: Unable to clone collator %d - %s\n", idx, u_errorName(err));
+            continue;
+        }
+        if (!ucol_equals(someClonedCollators[idx], someCollators[idx])) {
+            log_err("FAIL: Cloned collator is not equal to original at index = %d.\n", idx);
+        }
+
+        /* Check the usability */
+        ucol_setStrength(someCollators[idx], UCOL_PRIMARY);
+        ucol_setAttribute(someCollators[idx], UCOL_CASE_LEVEL, UCOL_OFF, &err);
+
+        doAssert( (ucol_equal(someCollators[idx], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abcda\" == \"abCda\"");
+
+        /* Close the original to make sure that the clone is usable. */
+        ucol_close(someCollators[idx]);
+
+        ucol_setStrength(someClonedCollators[idx], UCOL_TERTIARY);
+        ucol_setAttribute(someClonedCollators[idx], UCOL_CASE_LEVEL, UCOL_OFF, &err);
+        doAssert( (ucol_greater(someClonedCollators[idx], test1, u_strlen(test1), test2, u_strlen(test2))), "Result should be \"abCda\" >>> \"abcda\" ");
+
+        ucol_close(someClonedCollators[idx]);
+    }
+}
+
 void TestCloneBinary(){
     UErrorCode err = U_ZERO_ERROR;
     UCollator * col = ucol_open("en_US", &err);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/capitst.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -75,6 +75,11 @@
     void TestSafeClone(void);
 
     /**
+     * Test ucol_clone ()
+     **/
+    void TestClone(void);
+
+    /**
      * Test ucol_cloneBinary(), ucol_openBinary()
      **/
     void TestCloneBinary(void);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cbiditst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -4591,6 +4591,15 @@
         ubidi_close(pBiDi);
         return;
     }
+    // Quick callback test (API coverage).
+    if (ubidi_getCustomizedClass(pBiDi, u'A')!=AL ||
+            ubidi_getCustomizedClass(pBiDi, u'H')!=R ||
+            ubidi_getCustomizedClass(pBiDi, u'^')!=PDF ||
+            ubidi_getCustomizedClass(pBiDi, u'~')!=BN) {
+        log_err("ubidi_getCustomizedClass() returns different values than "
+                "expected from overrideBidiClass() customClasses[]\n");
+    }
+
     verifyCallbackParams(oldFn, oldContext, NULL, NULL, 0);
 
     ubidi_getClassCallback(pBiDi, &oldFn, &oldContext);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ccapitst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -64,6 +64,7 @@
 static void TestLMBCSMaxChar(void);
 #endif
 
+static void TestConvertClone(void);
 #if !UCONFIG_NO_LEGACY_CONVERSION
 static void TestConvertSafeCloneCallback(void);
 #endif
@@ -94,6 +95,7 @@
     addTest(root, &TestAlias,                   "tsconv/ccapitst/TestAlias"); 
     addTest(root, &TestDuplicateAlias,          "tsconv/ccapitst/TestDuplicateAlias"); 
     addTest(root, &TestConvertSafeClone,        "tsconv/ccapitst/TestConvertSafeClone");
+    addTest(root, &TestConvertClone,            "tsconv/ccapitst/TestConvertClone");
 #if !UCONFIG_NO_LEGACY_CONVERSION
     addTest(root, &TestConvertSafeCloneCallback,"tsconv/ccapitst/TestConvertSafeCloneCallback");
 #endif
@@ -1901,6 +1903,138 @@
     }
 }
 
+
+static void TestConvertClone()
+{
+    /* one 'regular' & all the 'private stateful' converters */
+    static const char *const names[] = {
+#if !UCONFIG_NO_LEGACY_CONVERSION
+        "ibm-1047",
+        "ISO_2022,locale=zh,version=1",
+#endif
+        "SCSU",
+#if !UCONFIG_NO_LEGACY_CONVERSION
+        "HZ",
+        "lmbcs",
+        "ISCII,version=0",
+        "ISO_2022,locale=kr,version=1",
+        "ISO_2022,locale=jp,version=2",
+#endif
+        "BOCU-1",
+        "UTF-7",
+#if !UCONFIG_NO_LEGACY_CONVERSION
+        "IMAP-mailbox-name",
+        "ibm-1047-s390"
+#else
+        "IMAP=mailbox-name"
+#endif
+    };
+
+    char charBuffer[21];   /* Leave at an odd number for alignment testing */
+    UConverter * cnv, *cnv2;
+    UErrorCode err;
+
+    char *pCharBuffer;
+    const char *pConstCharBuffer;
+    const char *charBufferLimit = charBuffer + UPRV_LENGTHOF(charBuffer);
+    UChar uniBuffer[] = {0x0058, 0x0059, 0x005A}; /* "XYZ" */
+    UChar uniCharBuffer[20];
+    char  charSourceBuffer[] = { 0x1b, 0x24, 0x42 };
+    const char *pCharSource = charSourceBuffer;
+    const char *pCharSourceLimit = charSourceBuffer + sizeof(charSourceBuffer);
+    UChar *pUCharTarget = uniCharBuffer;
+    UChar *pUCharTargetLimit = uniCharBuffer + UPRV_LENGTHOF(uniCharBuffer);
+    const UChar * pUniBuffer;
+    const UChar *uniBufferLimit = uniBuffer + UPRV_LENGTHOF(uniBuffer);
+    int32_t idx;
+
+    err = U_ZERO_ERROR;
+    cnv = ucnv_open(names[0], &err);
+    if(U_SUCCESS(err)) {
+        /* Check the various error & informational states: */
+
+        /* Null status - just returns NULL */
+        if (NULL != ucnv_clone(cnv, NULL))
+        {
+            log_err("FAIL: Cloned converter failed to deal correctly with null status\n");
+        }
+        /* error status - should return 0 & keep error the same */
+        err = U_MEMORY_ALLOCATION_ERROR;
+        if (NULL != ucnv_clone(cnv, &err) || err != U_MEMORY_ALLOCATION_ERROR)
+        {
+            log_err("FAIL: Cloned converter failed to deal correctly with incoming error status\n");
+        }
+        err = U_ZERO_ERROR;
+
+        /* Null buffer size pointer is ok */
+        if (NULL == (cnv2 = ucnv_clone(cnv, &err)) || U_FAILURE(err))
+        {
+            log_err("FAIL: Failed to clone.\n");
+        }
+        ucnv_close(cnv2);
+        err = U_ZERO_ERROR;
+
+        /* Null converter - return NULL & set U_ILLEGAL_ARGUMENT_ERROR */
+        if (NULL != ucnv_clone(NULL, &err) || err != U_ILLEGAL_ARGUMENT_ERROR)
+        {
+            log_err("FAIL: Cloned converter failed to deal correctly with null converter pointer\n");
+        }
+
+        ucnv_close(cnv);
+    }
+
+    /* Do these cloned converters work at all - shuffle UChars to chars & back again..*/
+    for (idx = 0; idx < UPRV_LENGTHOF(names); idx++)
+    {
+        err = U_ZERO_ERROR;
+        cnv = ucnv_open(names[idx], &err);
+        if(U_FAILURE(err)) {
+            log_data_err("ucnv_open(\"%s\") failed - %s\n", names[idx], u_errorName(err));
+            continue;
+        }
+
+        cnv2 = ucnv_clone(cnv, &err);
+
+        /* close the original immediately to make sure that the clone works by itself */
+        ucnv_close(cnv);
+
+        pCharBuffer = charBuffer;
+        pUniBuffer = uniBuffer;
+
+        ucnv_fromUnicode(cnv2,
+                        &pCharBuffer,
+                        charBufferLimit,
+                        &pUniBuffer,
+                        uniBufferLimit,
+                        NULL,
+                        TRUE,
+                        &err);
+        if(U_FAILURE(err)){
+            log_err("FAIL: cloned converter failed to do fromU conversion. Error: %s\n",u_errorName(err));
+        }
+        ucnv_toUnicode(cnv2,
+                        &pUCharTarget,
+                        pUCharTargetLimit,
+                        &pCharSource,
+                        pCharSourceLimit,
+                        NULL,
+                        TRUE,
+                        &err
+                        );
+
+        if(U_FAILURE(err)){
+            log_err("FAIL: cloned converter failed to do toU conversion. Error: %s\n",u_errorName(err));
+        }
+
+        pConstCharBuffer = charBuffer;
+        if (uniBuffer [0] != ucnv_getNextUChar(cnv2, &pConstCharBuffer, pCharBuffer, &err))
+        {
+            log_err("FAIL: Cloned converter failed to do conversion. Error: %s\n",u_errorName(err));
+        }
+        ucnv_close(cnv2);
+    }
+}
+
 static void TestCCSID() {
 #if !UCONFIG_NO_LEGACY_CONVERSION
     UConverter *cnv;

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdateintervalformattest.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -368,23 +368,23 @@
 
     {
         const char* message = "Field position test 1";
-        const UChar* expectedString = u"27. September 2010, 15:00 – 2. März 2011, 18:30";
+        const UChar* expectedString = u"27. September 2010 um 15:00 – 2. März 2011 um 18:30";
         udtitvfmt_formatToResult(fmt, Date201009270800, Date201103021030, fdi, &ec);
         assertSuccess("Formatting", &ec);
         static const UFieldPositionWithCategory expectedFieldPositions[] = {
             // category, field, begin index, end index
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 25},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 27},
             {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 2},
             {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 4, 13},
             {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 20, 22},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 23, 25},
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 28, 47},
-            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 28, 29},
-            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 31, 35},
-            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 36, 40},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 42, 44},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 45, 47}};
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 22, 24},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 25, 27},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 30, 51},
+            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 30, 31},
+            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 33, 37},
+            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 38, 42},
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 46, 48},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 49, 51}};
         checkMixedFormattedValue(
             message,
             udtitvfmt_resultAsValue(fdi, &ec),
@@ -438,23 +438,23 @@
 
     {
         const char* message = "Field position test 1";
-        const UChar* expectedString = u"27. September 2010, 15:00 – 2. März 2011, 18:30";
+        const UChar* expectedString = u"27. September 2010 um 15:00 – 2. März 2011 um 18:30";
         udtitvfmt_formatCalendarToResult(fmt, ucal1, ucal2, fdi, &ec);
         assertSuccess("Formatting", &ec);
         static const UFieldPositionWithCategory expectedFieldPositions[] = {
             // category, field, begin index, end index
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 25},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 27},
             {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 2},
             {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 4, 13},
             {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 14, 18},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 20, 22},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 23, 25},
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 28, 47},
-            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 28, 29},
-            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 31, 35},
-            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 36, 40},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 42, 44},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 45, 47}};
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 22, 24},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 25, 27},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 30, 51},
+            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 30, 31},
+            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 33, 37},
+            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 38, 42},
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 46, 48},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 49, 51}};
         checkMixedFormattedValue(
             message,
             udtitvfmt_resultAsValue(fdi, &ec),
@@ -493,23 +493,23 @@
         ucal_setMillis(ucal5, Date158210160000, &ec);
         //                                        1         2         3         4
         //                              012345678901234567890123456789012345678901234567890
-        const UChar* expectedString = u"4. Oktober 1582, 00:00 – 16. Oktober 1582, 00:00";
+        const UChar* expectedString = u"4. Oktober 1582 um 00:00 – 16. Oktober 1582 um 00:00";
         udtitvfmt_formatCalendarToResult(fmt, ucal4, ucal5, fdi, &ec);
         assertSuccess("Formatting", &ec);
         static const UFieldPositionWithCategory expectedFieldPositions[] = {
             // category, field, begin index, end index
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 22},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 24},
             {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 1},
             {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 3, 10},
             {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 11, 15},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 17, 19},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 20, 22},
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 25, 48},
-            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 25, 27},
-            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 29, 36},
-            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 37, 41},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 43, 45},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 46, 48}};
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 19, 21},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 22, 24},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 27, 52},
+            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 27, 29},
+            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 31, 38},
+            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 39, 43},
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 47, 49},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 50, 52}};
         checkMixedFormattedValue(
             message,
             udtitvfmt_resultAsValue(fdi, &ec),
@@ -527,23 +527,23 @@
         const char* message = "Field position test 4";
         //                                        1         2         3         4
         //                              012345678901234567890123456789012345678901234567890
-        const UChar* expectedString = u"14. Oktober 1582, 00:00 – 16. Oktober 1582, 00:00";
+        const UChar* expectedString = u"14. Oktober 1582 um 00:00 – 16. Oktober 1582 um 00:00";
         udtitvfmt_formatCalendarToResult(fmt, ucal4, ucal5, fdi, &ec);
         assertSuccess("Formatting", &ec);
         static const UFieldPositionWithCategory expectedFieldPositions[] = {
             // category, field, begin index, end index
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 23},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 0, 0, 25},
             {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 0, 2},
             {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 4, 11},
             {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 12, 16},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 18, 20},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 21, 23},
-            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 26, 49},
-            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 26, 28},
-            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 30, 37},
-            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 38, 42},
-            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 44, 46},
-            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 47, 49}};
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 20, 22},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 23, 25},
+            {UFIELD_CATEGORY_DATE_INTERVAL_SPAN, 1, 28, 53},
+            {UFIELD_CATEGORY_DATE, UDAT_DATE_FIELD, 28, 30},
+            {UFIELD_CATEGORY_DATE, UDAT_MONTH_FIELD, 32, 39},
+            {UFIELD_CATEGORY_DATE, UDAT_YEAR_FIELD, 40, 44},
+            {UFIELD_CATEGORY_DATE, UDAT_HOUR_OF_DAY0_FIELD, 48, 50},
+            {UFIELD_CATEGORY_DATE, UDAT_MINUTE_FIELD, 51, 53}};
         checkMixedFormattedValue(
             message,
             udtitvfmt_resultAsValue(fdi, &ec),

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cdattst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -45,6 +45,7 @@
 static void TestForceGannenNumbering(void);
 static void TestMapDateToCalFields(void);
 static void TestNarrowQuarters(void);
+static void TestExtraneousCharacters(void);
 
 void addDateForTest(TestNode** root);
 
@@ -67,6 +68,7 @@
     TESTCASE(TestForceGannenNumbering);
     TESTCASE(TestMapDateToCalFields);
     TESTCASE(TestNarrowQuarters);
+    TESTCASE(TestExtraneousCharacters);
 }
 /* Testing the DateFormat API */
 static void TestDateFormat()
@@ -2017,4 +2019,24 @@
     }
 }
 
+static void TestExtraneousCharacters(void) {
+    // regression test for ICU-21802
+    UErrorCode err = U_ZERO_ERROR;
+    UCalendar* cal = ucal_open(u"UTC", -1, "en_US", UCAL_GREGORIAN, &err);
+    UDateFormat* df = udat_open(UDAT_PATTERN, UDAT_PATTERN, "en_US", u"UTC", -1, u"yyyyMMdd", -1, &err);
+    
+    if (assertSuccess("Failed to create date formatter and calendar", &err)) {
+        udat_setLenient(df, false);
+
+        udat_parseCalendar(df, cal, u"2021", -1, NULL, &err);
+        assertTrue("Success parsing '2021'", err == U_PARSE_ERROR);
+        
+        err = U_ZERO_ERROR;
+        udat_parseCalendar(df, cal, u"2021-", -1, NULL, &err);
+        assertTrue("Success parsing '2021-'", err == U_PARSE_ERROR);
+    }
+    udat_close(df);
+    ucal_close(cal);
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cldrtest.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1002,6 +1002,10 @@
                         log_knownIssue("cldrbug:14995", "mai/sd_Deva day names use chars not in exemplars")) {
                     end = 0;
                 }
+                if (uprv_strncmp(currLoc,"ks_Deva",7) == 0 && 
+                        log_knownIssue("cldrbug:15355", "ks_Deva day names use chars not in exemplars")) {
+                    end = 0;
+                }
 
                 for (idx = 0; idx < end; idx++) {
                     const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);
@@ -1035,6 +1039,10 @@
                         log_knownIssue("cldrbug:14995", "sd_Deva month names use chars not in exemplars")) {
                     end = 0;
                 }
+                if (uprv_strncmp(currLoc,"ks_Deva",7) == 0 && 
+                        log_knownIssue("cldrbug:15355", "ks_Deva month names use chars not in exemplars")) {
+                    end = 0;
+                }
 
                 for (idx = 0; idx < end; idx++) {
                     const UChar *fromBundleStr = ures_getStringByIndex(resArray, idx, &langSize, &errorCode);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cloctst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1552,18 +1552,18 @@
 static void TestUninstalledISO3Names()
 {
   /* This test checks to make sure getISO3Language and getISO3Country work right
-     even for locales that are not installed. */
+     even for locales that are not installed (and some installed ones). */
     static const char iso2Languages [][4] = {     "am", "ba", "fy", "mr", "rn",
-                                        "ss", "tw", "zu" };
+                                        "ss", "tw", "zu", "sr" };
     static const char iso3Languages [][5] = {     "amh", "bak", "fry", "mar", "run",
-                                        "ssw", "twi", "zul" };
+                                        "ssw", "twi", "zul", "srp" };
     static const char iso2Countries [][6] = {     "am_AF", "ba_BW", "fy_KZ", "mr_MO", "rn_MN",
-                                        "ss_SB", "tw_TC", "zu_ZW" };
+                                        "ss_SB", "tw_TC", "zu_ZW", "sr_XK" };
     static const char iso3Countries [][4] = {     "AFG", "BWA", "KAZ", "MAC", "MNG",
-                                        "SLB", "TCA", "ZWE" };
+                                        "SLB", "TCA", "ZWE", "XKK" };
     int32_t i;
 
-    for (i = 0; i < 8; i++) {
+    for (i = 0; i < 9; i++) {
       UErrorCode err = U_ZERO_ERROR;
       const char *test;
       test = uloc_getISO3Language(iso2Languages[i]);
@@ -1571,7 +1571,7 @@
          log_err("Got wrong ISO3 code for %s : Expected \"%s\", got \"%s\". %s\n",
                      iso2Languages[i], iso3Languages[i], test, myErrorName(err));
     }
-    for (i = 0; i < 8; i++) {
+    for (i = 0; i < 9; i++) {
       UErrorCode err = U_ZERO_ERROR;
       const char *test;
       test = uloc_getISO3Country(iso2Countries[i]);
@@ -3207,6 +3207,18 @@
             }
         }
     }
+
+    // API coverage
+    status = U_ZERO_ERROR;
+    static const char *const supported[] = { "en-US", "en-GB", "de-DE", "ja-JP" };
+    const char * desired[] = { "de-LI", "en-IN", "zu", "fr" };
+    available = uenum_openCharStringsEnumeration(supported, UPRV_LENGTHOF(supported), &status);
+    tmp[0]=0;
+    rc = uloc_acceptLanguage(tmp, 199, &outResult, desired, UPRV_LENGTHOF(desired), available, &status);
+    if (U_FAILURE(status) || rc != 5 || uprv_strcmp(tmp, "de_DE") != 0 || outResult == ULOC_ACCEPT_FAILED) {
+        log_err("uloc_acceptLanguage() failed to do a simple match\n");
+    }
+    uenum_close(available);
 }
 
 static const char* LOCALE_ALIAS[][2] = {
@@ -7053,6 +7065,14 @@
                     u_errorName(status) );
             continue;
         }
+        // API coverage: Expect to get back the dialect handling which is
+        // the first item in the displayOptions test data.
+        UDialectHandling dh = uldn_getDialectHandling(uldn);
+        UDisplayContext dhContext = (UDisplayContext)dh;  // same numeric values
+        if (dhContext != uloPtr->displayOptions[0]) {
+            log_err("uldn_getDialectHandling()=%03X != expected UDisplayContext %03X\n",
+                    dhContext, uloPtr->displayOptions[0]);
+        }
         const UldnItem * itemPtr = uloPtr->testItems;
         int32_t itemCount = uloPtr->countItems;
         for (; itemCount-- > 0; itemPtr++) {

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/cnormtst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -65,6 +65,7 @@
 
 static void TestAppendRestoreMiddle(void);
 static void TestGetEasyToUseInstance(void);
+static void TestAPICoverage(void);
 
 static const char* const canonTests[][3] = {
     /* Input*/                    /*Decomposed*/                /*Composed*/
@@ -156,6 +157,7 @@
     addTest(root, &TestGetRawDecomposition, "tsnorm/cnormtst/TestGetRawDecomposition");
     addTest(root, &TestAppendRestoreMiddle, "tsnorm/cnormtst/TestAppendRestoreMiddle");
     addTest(root, &TestGetEasyToUseInstance, "tsnorm/cnormtst/TestGetEasyToUseInstance");
+    addTest(root, &TestAPICoverage, "tsnorm/cnormtst/TestAPICoverage");
 }
 
 static const char* const modeStrings[]={
@@ -1698,4 +1700,55 @@
     }
 }
 
+static void
+TestAPICoverage() {
+    UErrorCode errorCode = U_ZERO_ERROR;
+    const UNormalizer2 *n2 = unorm2_getNFDInstance(&errorCode);
+    if (U_FAILURE(errorCode)) {
+        log_err_status(errorCode, "unorm2_getNFDInstance() failed: %s\n", u_errorName(errorCode));
+        return;
+    }
+
+    if (!unorm2_hasBoundaryBefore(n2, u'C') || unorm2_hasBoundaryBefore(n2, 0x300)) {
+        log_err("unorm2_hasBoundaryBefore() returns unexpected results\n");
+    }
+
+    if (!unorm2_hasBoundaryAfter(n2, u'C') || unorm2_hasBoundaryAfter(n2, 0x300)) {
+        log_err("unorm2_hasBoundaryAfter() returns unexpected results\n");
+    }
+
+    if (!unorm2_isInert(n2, 0x50005) || unorm2_isInert(n2, 0x300)) {
+        log_err("unorm2_isInert() returns unexpected results\n");
+    }
+
+    errorCode = U_ZERO_ERROR;
+    if (!unorm2_isNormalized(n2, u"c\u0327\u0300", 3, &errorCode) ||
+            unorm2_isNormalized(n2, u"c\u0300\u0327", 3, &errorCode) ||
+            U_FAILURE(errorCode)) {
+        log_err("unorm2_isNormalized() returns unexpected results\n");
+    }
+
+    errorCode = U_ZERO_ERROR;
+    if (unorm2_quickCheck(n2, u"c\u0327\u0300", 3, &errorCode) == UNORM_NO ||
+            unorm2_quickCheck(n2, u"c\u0300\u0327", 3, &errorCode) == UNORM_YES ||
+            U_FAILURE(errorCode)) {
+        log_err("unorm2_quickCheck() returns unexpected results\n");
+    }
+
+    errorCode = U_ZERO_ERROR;
+    if (unorm2_spanQuickCheckYes(n2, u"c\u0327\u0300", 3, &errorCode) != 3 ||
+            unorm2_spanQuickCheckYes(n2, u"c\u0300\u0327", 3, &errorCode) != 1 ||
+            U_FAILURE(errorCode)) {
+        log_err("unorm2_spanQuickCheckYes() returns unexpected results\n");
+    }
+
+    errorCode = U_ZERO_ERROR;
+    UChar first[10] = { u'c', 0x300, 0, 0, 0, 0, 0, 0, 0, 0 };
+    int32_t length = unorm2_normalizeSecondAndAppend(
+        n2, first, 2, UPRV_LENGTHOF(first), u"\u0327d", 2, &errorCode);
+    if (U_FAILURE(errorCode) || length != 4 || u_strcmp(first, u"c\u0327\u0300d") != 0) {
+        log_err("unorm2_normalizeSecondAndAppend() returns unexpected results\n");
+    }
+}
+
 #endif /* #if !UCONFIG_NO_NORMALIZATION */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/creststn.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2180,7 +2180,7 @@
         UResourceBundle* myResB = ures_open(NULL,"no_NO_NY",&err);
         UResourceBundle* resLocID = ures_getByKey(myResB, "Version", NULL, &err);
         const UChar* version = NULL;
-        static const UChar versionStr[] = u"40"; // 40 in nn_NO or in a parent bundle/root
+        static const UChar versionStr[] = u"41"; // 41 in nn_NO or in a parent bundle/root
 
         if(U_FAILURE(err)) {
             log_data_err("Expected success when trying to test no_NO_NY aliased to nn_NO for Version "

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ucsdetst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ucsdetst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ucsdetst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -402,6 +402,7 @@
     }
 
     for (idx = 0; idx < UPRV_LENGTHOF(testStrings); idx++) {
+        status = U_ZERO_ERROR;
         ucsdet_setText(csd, testStrings[idx], -1, &status);
         match = ucsdet_detect(csd, &status);
 

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/udatpg_test.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/udatpg_test.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/udatpg_test.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -46,6 +46,7 @@
 static void TestGetDefaultHourCycle(void);
 static void TestGetDefaultHourCycleOnEmptyInstance(void);
 static void TestEras(void);
+static void TestDateTimePatterns(void);
 
 void addDateTimePatternGeneratorTest(TestNode** root) {
     TESTCASE(TestOpenClose);
@@ -56,6 +57,7 @@
     TESTCASE(TestGetDefaultHourCycle);
     TESTCASE(TestGetDefaultHourCycleOnEmptyInstance);
     TESTCASE(TestEras);
+    TESTCASE(TestDateTimePatterns);
 }
 
 /*
@@ -614,4 +616,178 @@
     }
 }
 
+enum { kNumDateTimePatterns = 4 };
+
+typedef struct {
+    const char* localeID;
+    const UChar* expectPat[kNumDateTimePatterns];
+} DTPLocaleAndResults;
+
+static void doDTPatternTest(UDateTimePatternGenerator* udtpg,
+                            const UChar** skeletons,
+                            DTPLocaleAndResults* localeAndResultsPtr);
+
+static void TestDateTimePatterns(void) {
+    const UChar* skeletons[kNumDateTimePatterns] = {
+        u"yMMMMEEEEdjmm", // full date, short time
+        u"yMMMMdjmm",     // long date, short time
+        u"yMMMdjmm",      // medium date, short time
+        u"yMdjmm"         // short date, short time
+    };
+    // The following tests some locales in which there are differences between the
+    // DateTimePatterns of various length styles.
+    DTPLocaleAndResults localeAndResults[] = {
+        { "en", { u"EEEE, MMMM d, y 'at' h:mm a", // long != medium
+                  u"MMMM d, y 'at' h:mm a",
+                  u"MMM d, y, h:mm a",
+                  u"M/d/y, h:mm a" } },
+        { "fr", { u"EEEE d MMMM y 'à' HH:mm", // medium != short
+                  u"d MMMM y 'à' HH:mm",
+                  u"d MMM y, HH:mm",
+                  u"dd/MM/y HH:mm" } },
+        { "ha", { u"EEEE d MMMM, y HH:mm", // full != long
+                  u"d MMMM, y 'da' HH:mm",
+                  u"d MMM, y, HH:mm",
+                  u"y-MM-dd, HH:mm" } },
+        { NULL, { NULL, NULL, NULL, NULL } } // terminator
+    };
+
+    const UChar* enDTPatterns[kNumDateTimePatterns] = {
+        u"{1} 'at' {0}",
+        u"{1} 'at' {0}",
+        u"{1}, {0}",
+        u"{1}, {0}"
+    };
+    const UChar* modDTPatterns[kNumDateTimePatterns] = {
+        u"{1} _0_ {0}",
+        u"{1} _1_ {0}",
+        u"{1} _2_ {0}",
+        u"{1} _3_ {0}"
+    };
+    DTPLocaleAndResults enModResults = { "en", { u"EEEE, MMMM d, y _0_ h:mm a",
+                                                 u"MMMM d, y _1_ h:mm a",
+                                                 u"MMM d, y _2_ h:mm a",
+                                                 u"M/d/y _3_ h:mm a" }
+    };
+
+    // Test various locales with standard data
+    UErrorCode status;
+    UDateTimePatternGenerator* udtpg;
+    DTPLocaleAndResults* localeAndResultsPtr = localeAndResults;
+    for (; localeAndResultsPtr->localeID != NULL; localeAndResultsPtr++) {
+        status = U_ZERO_ERROR;
+        udtpg = udatpg_open(localeAndResultsPtr->localeID, &status);
+        if (U_FAILURE(status)) {
+            log_data_err("FAIL: udatpg_open for locale %s: %s", localeAndResultsPtr->localeID, myErrorName(status));
+        } else {
+            doDTPatternTest(udtpg, skeletons, localeAndResultsPtr);
+            udatpg_close(udtpg);
+        }
+    }
+    // Test getting and modifying date-time combining patterns
+    status = U_ZERO_ERROR;
+    udtpg = udatpg_open("en", &status);
+    if (U_FAILURE(status)) {
+        log_data_err("FAIL: udatpg_open #2 for locale en: %s", myErrorName(status));
+    } else {
+        char bExpect[64];
+        char bGet[64];
+        const UChar* uGet;
+        int32_t uGetLen, uExpectLen;
+
+        // Test error: style out of range
+        status = U_ZERO_ERROR;
+        uGet = udatpg_getDateTimeFormatForStyle(udtpg, UDAT_NONE, &uGetLen, &status);
+        if (status != U_ILLEGAL_ARGUMENT_ERROR || uGetLen != 0 || uGet==NULL || *uGet!= 0) {
+            if (uGet==NULL) {
+                log_err("FAIL: udatpg_getDateTimeFormatForStyle with invalid style, expected U_ILLEGAL_ARGUMENT_ERROR "
+                        "and ptr to empty string but got %s, len %d, ptr = NULL\n", myErrorName(status), uGetLen);
+            } else {
+                log_err("FAIL: udatpg_getDateTimeFormatForStyle with invalid style, expected U_ILLEGAL_ARGUMENT_ERROR "
+                        "and ptr to empty string but got %s, len %d, *ptr = %04X\n", myErrorName(status), uGetLen, *uGet);
+            }
+        }
+
+        // Test normal getting and setting
+        for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+            status = U_ZERO_ERROR;
+            uExpectLen = u_strlen(enDTPatterns[patStyle]);
+            uGet = udatpg_getDateTimeFormatForStyle(udtpg, patStyle, &uGetLen, &status);
+            if (U_FAILURE(status)) {
+                log_err("FAIL udatpg_getDateTimeFormatForStyle %d (en before mod), get %s\n", patStyle, myErrorName(status));
+            } else if (uGetLen != uExpectLen || u_strncmp(uGet, enDTPatterns[patStyle], uExpectLen) != 0) {
+                u_austrcpy(bExpect, enDTPatterns[patStyle]);
+                u_austrcpy(bGet, uGet);
+                log_err("ERROR udatpg_getDateTimeFormatForStyle %d (en before mod), expect %d:\"%s\", get %d:\"%s\"\n",
+                        patStyle, uExpectLen, bExpect, uGetLen, bGet);
+            }
+            status = U_ZERO_ERROR;
+            udatpg_setDateTimeFormatForStyle(udtpg, patStyle, modDTPatterns[patStyle], -1, &status);
+            if (U_FAILURE(status)) {
+                log_err("FAIL udatpg_setDateTimeFormatForStyle %d (en), get %s\n", patStyle, myErrorName(status));
+            } else {
+                uExpectLen = u_strlen(modDTPatterns[patStyle]);
+                uGet = udatpg_getDateTimeFormatForStyle(udtpg, patStyle, &uGetLen, &status);
+                if (U_FAILURE(status)) {
+                    log_err("FAIL udatpg_getDateTimeFormatForStyle %d (en after  mod), get %s\n", patStyle, myErrorName(status));
+                } else if (uGetLen != uExpectLen || u_strncmp(uGet, modDTPatterns[patStyle], uExpectLen) != 0) {
+                    u_austrcpy(bExpect, modDTPatterns[patStyle]);
+                    u_austrcpy(bGet, uGet);
+                    log_err("ERROR udatpg_getDateTimeFormatForStyle %d (en after  mod), expect %d:\"%s\", get %d:\"%s\"\n",
+                            patStyle, uExpectLen, bExpect, uGetLen, bGet);
+                }
+            }
+        }
+        // Test result of setting
+        doDTPatternTest(udtpg, skeletons, &enModResults);
+        // Test old get/set functions
+        uExpectLen = u_strlen(modDTPatterns[UDAT_MEDIUM]);
+        uGet = udatpg_getDateTimeFormat(udtpg, &uGetLen);
+        if (uGetLen != uExpectLen || u_strncmp(uGet, modDTPatterns[UDAT_MEDIUM], uExpectLen) != 0) {
+            u_austrcpy(bExpect, modDTPatterns[UDAT_MEDIUM]);
+            u_austrcpy(bGet, uGet);
+            log_err("ERROR udatpg_getDateTimeFormat (en after  mod), expect %d:\"%s\", get %d:\"%s\"\n",
+                    uExpectLen, bExpect, uGetLen, bGet);
+        }
+        udatpg_setDateTimeFormat(udtpg, modDTPatterns[UDAT_SHORT], -1); // set all dateTimePatterns to the short format
+        uExpectLen = u_strlen(modDTPatterns[UDAT_SHORT]);
+        u_austrcpy(bExpect, modDTPatterns[UDAT_SHORT]);
+        for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+            status = U_ZERO_ERROR;
+            uGet = udatpg_getDateTimeFormatForStyle(udtpg, patStyle, &uGetLen, &status);
+            if (U_FAILURE(status)) {
+                log_err("FAIL udatpg_getDateTimeFormatForStyle %d (en after second mod), get %s\n", patStyle, myErrorName(status));
+            } else if (uGetLen != uExpectLen || u_strncmp(uGet, modDTPatterns[UDAT_SHORT], uExpectLen) != 0) {
+                u_austrcpy(bGet, uGet);
+                log_err("ERROR udatpg_getDateTimeFormatForStyle %d (en after second mod), expect %d:\"%s\", get %d:\"%s\"\n",
+                        patStyle, uExpectLen, bExpect, uGetLen, bGet);
+            }
+        }
+
+        udatpg_close(udtpg);
+    }
+}
+
+static void doDTPatternTest(UDateTimePatternGenerator* udtpg,
+                            const UChar** skeletons,
+                            DTPLocaleAndResults* localeAndResultsPtr) {
+    for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+        UChar uGet[64];
+        int32_t uGetLen, uExpectLen;
+        UErrorCode status = U_ZERO_ERROR;
+        uExpectLen = u_strlen(localeAndResultsPtr->expectPat[patStyle]);
+        uGetLen = udatpg_getBestPattern(udtpg, skeletons[patStyle], -1, uGet, 64, &status);
+        if (U_FAILURE(status)) {
+            log_err("FAIL udatpg_getBestPattern locale %s style %d: %s\n", localeAndResultsPtr->localeID, patStyle, myErrorName(status));
+        } else if (uGetLen != uExpectLen || u_strncmp(uGet, localeAndResultsPtr->expectPat[patStyle], uExpectLen) != 0) {
+            char bExpect[64];
+            char bGet[64];
+            u_austrcpy(bExpect, localeAndResultsPtr->expectPat[patStyle]);
+            u_austrcpy(bGet, uGet);
+            log_err("ERROR udatpg_getBestPattern locale %s style %d, expect %d:\"%s\", get %d:\"%s\"\n",
+                    localeAndResultsPtr->localeID, patStyle, uExpectLen, bExpect, uGetLen, bGet);
+        }
+    }
+}
+
 #endif

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/ulistfmttest.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -20,6 +20,8 @@
 static void TestUListFmt(void);
 static void TestUListFmtToValue(void);
 static void TestUListOpenStyled(void);
+static void TestUList21871_A(void);
+static void TestUList21871_B(void);
 
 void addUListFmtTest(TestNode** root);
 
@@ -30,6 +32,8 @@
     TESTCASE(TestUListFmt);
     TESTCASE(TestUListFmtToValue);
     TESTCASE(TestUListOpenStyled);
+    TESTCASE(TestUList21871_A);
+    TESTCASE(TestUList21871_B);
 }
 
 static const UChar str0[] = { 0x41,0 }; /* "A" */
@@ -250,5 +254,103 @@
     ulistfmt_closeResult(fl);
 }
 
+#include <stdio.h>
 
+static void TestUList21871_A() {
+    UErrorCode status = U_ZERO_ERROR;
+    UListFormatter *fmt = ulistfmt_openForType("en", ULISTFMT_TYPE_AND, ULISTFMT_WIDTH_WIDE, &status);
+    assertSuccess("ulistfmt_openForType", &status);
+
+    const UChar *strs[] = {u"A", u""};
+    const int32_t lens[] = {1, 0};
+
+    UFormattedList *fl = ulistfmt_openResult(&status);
+    assertSuccess("ulistfmt_openResult", &status);
+
+    ulistfmt_formatStringsToResult(fmt, strs, lens, 2, fl, &status);
+    assertSuccess("ulistfmt_formatStringsToResult", &status);
+
+    const UFormattedValue *value = ulistfmt_resultAsValue(fl, &status);
+    assertSuccess("ulistfmt_resultAsValue", &status);
+
+    {
+        int32_t len;
+        const UChar *str = ufmtval_getString(value, &len, &status);
+        assertUEquals("TEST ufmtval_getString", u"A and ", str);
+    }
+
+    UConstrainedFieldPosition *fpos = ucfpos_open(&status);
+    assertSuccess("ucfpos_open", &status);
+
+    ucfpos_constrainField(fpos, UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, &status);
+    assertSuccess("ucfpos_constrainField", &status);
+
+    bool hasMore = ufmtval_nextPosition(value, fpos, &status);
+    assertSuccess("ufmtval_nextPosition", &status);
+    assertTrue("hasMore 1", hasMore);
+
+    int32_t beginIndex, endIndex;
+    ucfpos_getIndexes(fpos, &beginIndex, &endIndex, &status);
+    assertSuccess("ufmtval_nextPosition", &status);
+    assertIntEquals("TEST beginIndex", 0, beginIndex);
+    assertIntEquals("TEST endIndex", 1, endIndex);
+
+    hasMore = ufmtval_nextPosition(value, fpos, &status);
+    assertSuccess("ufmtval_nextPosition", &status);
+    assertTrue("hasMore 2", !hasMore);
+
+    ucfpos_close(fpos);
+    ulistfmt_closeResult(fl);
+    ulistfmt_close(fmt);
+}
+
+static void TestUList21871_B() {
+    UErrorCode status = U_ZERO_ERROR;
+    UListFormatter *fmt = ulistfmt_openForType("en", ULISTFMT_TYPE_AND, ULISTFMT_WIDTH_WIDE, &status);
+    assertSuccess("ulistfmt_openForType", &status);
+
+    const UChar *strs[] = {u"", u"B"};
+    const int32_t lens[] = {0, 1};
+
+    UFormattedList *fl = ulistfmt_openResult(&status);
+    assertSuccess("ulistfmt_openResult", &status);
+
+    ulistfmt_formatStringsToResult(fmt, strs, lens, 2, fl, &status);
+    assertSuccess("ulistfmt_formatStringsToResult", &status);
+
+    const UFormattedValue *value = ulistfmt_resultAsValue(fl, &status);
+    assertSuccess("ulistfmt_resultAsValue", &status);
+
+    {
+        int32_t len;
+        const UChar *str = ufmtval_getString(value, &len, &status);
+        assertUEquals("TEST ufmtval_getString", u" and B", str);
+    }
+
+    UConstrainedFieldPosition *fpos = ucfpos_open(&status);
+    assertSuccess("ucfpos_open", &status);
+
+    ucfpos_constrainField(fpos, UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD, &status);
+    assertSuccess("ucfpos_constrainField", &status);
+
+    bool hasMore = ufmtval_nextPosition(value, fpos, &status);
+    assertSuccess("ufmtval_nextPosition", &status);
+    assertTrue("hasMore 1", hasMore);
+
+    int32_t beginIndex, endIndex;
+    ucfpos_getIndexes(fpos, &beginIndex, &endIndex, &status);
+    assertSuccess("ucfpos_getIndexes", &status);
+    assertIntEquals("TEST beginIndex", 5, beginIndex);
+    assertIntEquals("TEST endIndex", 6, endIndex);
+
+    hasMore = ufmtval_nextPosition(value, fpos, &status);
+    assertSuccess("ufmtval_nextPosition", &status);
+    assertTrue("hasMore 2", !hasMore);
+
+    ucfpos_close(fpos);
+    ulistfmt_closeResult(fl);
+    ulistfmt_close(fmt);
+}
+
+
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/cintltst/utexttst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -292,6 +292,22 @@
         utext_close(uta);
     }
 
-
+    {
+        // utext_equals() checks for the same type of text provider,
+        // same string pointer(!), and same index.
+        status = U_ZERO_ERROR;
+        const UChar *s = u"aßカ🚲";
+        UText *ut1 = utext_openUChars(NULL, s, -1, &status);
+        UText *ut2 = utext_openUChars(NULL, s, 5, &status);
+        TEST_SUCCESS(status);
+        TEST_ASSERT(utext_equals(ut1, ut2));
+        UChar32 c = utext_next32(ut1);
+        TEST_ASSERT(c == u'a');
+        TEST_ASSERT(!utext_equals(ut1, ut2));  // indexes out of sync
+        c = utext_next32(ut2);
+        TEST_ASSERT(c == u'a');
+        TEST_ASSERT(utext_equals(ut1, ut2));  // back in sync
+        utext_close(ut1);
+        utext_close(ut2);
+    }
 }
-

Modified: trunk/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/depstest/dependencies.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -224,6 +224,7 @@
     normlzr  # for dictbe.o, should switch to Normalizer2
     uvector32 # for dictbe.o
     exp_and_tanhf # for lstmbe.o
+    usetiter # for dictbe.o
 
 group: unormcmp  # unorm_compare()
     unormcmp.o

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -109,6 +109,10 @@
             if (exec) Ticket6954Test();
             break;
 
+       case 10: name = "Ticket21823Test";
+            if (exec) Ticket21823Test();
+            break;
+
         default: name = "";
             break; //needed to end loop
     }
@@ -839,3 +843,22 @@
     TEST_ASSERT(strcmp(name1, "windows-1252")==0);
 #endif
 }
+
+
+// Ticket 21823 - Issue with Charset Detector for ill-formed input strings. 
+//                Its fix involves returning a failure based error code 
+//                (U_INVALID_CHAR_FOUND) incase no charsets appear to match the input data.
+void CharsetDetectionTest::Ticket21823Test() {
+    UErrorCode status = U_ZERO_ERROR;
+    std::string str = "\x80";
+    UCharsetDetector* csd = ucsdet_open(&status);
+
+    ucsdet_setText(csd, str.data(), str.length(), &status);
+    const UCharsetMatch* match = ucsdet_detect(csd, &status);
+
+    if (match == NULL) {
+        TEST_ASSERT(U_FAILURE(status));
+    }
+
+    ucsdet_close(csd);
+}

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/csdetest.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -33,6 +33,7 @@
     virtual void IBM420Test();
     virtual void Ticket6394Test();
     virtual void Ticket6954Test();
+    virtual void Ticket21823Test();
 
 private:
     void checkEncoding(const UnicodeString &testString,

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtfmttst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -190,7 +190,7 @@
         {UDAT_ABBR_UTC_TZ, "ZZZZ", "en", "ZZZZ"},
 
         {UDAT_YEAR_NUM_MONTH_DAY UDAT_ABBR_UTC_TZ, "yMdZZZZ", "en", "M/d/y, ZZZZ"},
-        {UDAT_MONTH_DAY UDAT_LOCATION_TZ, "MMMMdVVVV", "en", "MMMM d, VVVV"}
+        {UDAT_MONTH_DAY UDAT_LOCATION_TZ, "MMMMdVVVV", "en", "MMMM d 'at' VVVV"}
     };
 
     IcuTestErrorCode errorCode(*this, "TestPatterns()");

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtifmtts.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1107,8 +1107,23 @@
         "de", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "HH", "00\\u201301 Uhr",
         
         // k and K (ICU-21154 and ICU-21156)
-        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "0 \\u2013 1 AM",
-        "de", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "kk", "24\\u201301 Uhr",
+        // (should behave the same as h and H if not overridden in locale ID)
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "12 \\u2013 1 AM",
+        "de", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "kk", "00\\u201301 Uhr",
+        // (overriding hour cycle in locale ID should affect both h and K [or both H and k])
+        "en-u-hc-h11", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hh", "0 \\u2013 1 AM",
+        "en-u-hc-h11", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "0 \\u2013 1 AM",
+        "de-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "HH", "24\\u201301 Uhr",
+        "de-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "kk", "24\\u201301 Uhr",
+        // (overriding hour cycle to h11 should NOT affect H and k; overriding to h24 should NOT affect h and K)
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "HH", "00 \\u2013 01",
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "kk", "00 \\u2013 01",
+        "en-u-hc-h11", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "HH", "00 \\u2013 01",
+        "en-u-hc-h11", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "kk", "00 \\u2013 01",
+        "de", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hh", "12 \\u2013 1 Uhr AM",
+        "de", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "12 \\u2013 1 Uhr AM",
+        "de-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hh", "12 \\u2013 1 Uhr AM",
+        "de-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "12 \\u2013 1 Uhr AM",
 
         // different lengths of the 'a' field
         "en", "CE 2010 09 27 10:00:00", "CE 2010 09 27 13:00:00", "ha", "10 AM \\u2013 1 PM",
@@ -1163,14 +1178,22 @@
         "hi_IN", "CE 2010 09 27 10:00:00", "CE 2010 09 27 13:00:00", "CC", "\\u0938\\u0941\\u092C\\u0939 10 \\u2013 \\u0926\\u094B\\u092A\\u0939\\u0930 1",
         "hi_IN", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "CC", "\\u0930\\u093E\\u0924 12\\u20131",
 
-         // regression test for ICU-21342
-         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 10:00:00", "kk", "24\\u201310",
-         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 11:00:00", "kk", "24\\u201311",
-         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 12:00:00", "kk", "24\\u201312",
-         "en_GB", "CE 2010 09 27 00:00:00", "CE 2010 09 27 13:00:00", "kk", "24\\u201313",
+        // regression test for ICU-21342
+        "en-gb-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 10:00:00", "kk", "24\\u201310",
+        "en-gb-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 11:00:00", "kk", "24\\u201311",
+        "en-gb-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 12:00:00", "kk", "24\\u201312",
+        "en-gb-u-hc-h24", "CE 2010 09 27 00:00:00", "CE 2010 09 27 13:00:00", "kk", "24\\u201313",
 
-         // regression test for ICU-21343
-         "de", "CE 2010 09 27 01:00:00", "CE 2010 09 27 10:00:00", "KK", "1 \\u2013 10 Uhr AM",
+        // regression test for ICU-21343
+        "de", "CE 2010 09 27 01:00:00", "CE 2010 09 27 10:00:00", "KK", "1 \\u2013 10 Uhr AM",
+        
+        // regression test for ICU-21154 (single-date ranges should use the same hour cycle as multi-date ranges)
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 00:00:00", "hh", "12 AM",
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "hh", "12 \\u2013 1 AM",
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 00:00:00", "KK", "12 AM",
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "KK", "12 \\u2013 1 AM", // (this was producing "0 - 1 AM" before)
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 00:00:00", "jj", "12 AM",
+        "en", "CE 2010 09 27 00:00:00", "CE 2010 09 27 01:00:00", "jj", "12 \\u2013 1 AM",
     };
     expect(DATA, UPRV_LENGTHOF(DATA));
 }

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -46,6 +46,7 @@
         TESTCASE(10, testGetDefaultHourCycle_OnEmptyInstance);
         TESTCASE(11, test_jConsistencyOddLocales);
         TESTCASE(12, testBestPattern);
+        TESTCASE(13, testDateTimePatterns);
         default: name = ""; break;
     }
 }
@@ -530,7 +531,7 @@
     format->applyPattern(gen->getBestPattern(UnicodeString("MMMMdHmm"), status));
     dateReturned.remove();
     dateReturned = format->format(sampleDate, dateReturned, status);
-    expectedResult=UnicodeString("14. von Oktober, 08:58", -1, US_INV);
+    expectedResult=UnicodeString("14. von Oktober um 08:58", -1, US_INV);
     if ( dateReturned != expectedResult ) {
         errln(UnicodeString("ERROR: Simple test addPattern failed!: d\'. von\' MMMM   Got: ") + dateReturned + UnicodeString(" Expected: ") + expectedResult);
     }
@@ -1631,4 +1632,150 @@
     }
 }
 
+void IntlTestDateTimePatternGeneratorAPI::testDateTimePatterns() {
+    UnicodeString skeletons[kNumDateTimePatterns] = {
+        UnicodeString("yMMMMEEEEdjmm"), // full date, short time
+        UnicodeString("yMMMMdjmm"),     // long date, short time
+        UnicodeString("yMMMdjmm"),      // medium date, short time
+        UnicodeString("yMdjmm")         // short date, short time
+    };
+    // The following tests some locales in which there are differences between the
+    // DateTimePatterns of various length styles.
+    DTPLocaleAndResults localeAndResults[] = {
+        { "en", { UnicodeString(u"EEEE, MMMM d, y 'at' h:mm a"), // long != medium
+                  UnicodeString(u"MMMM d, y 'at' h:mm a"),
+                  UnicodeString(u"MMM d, y, h:mm a"),
+                  UnicodeString(u"M/d/y, h:mm a") } },
+        { "fr", { UnicodeString(u"EEEE d MMMM y 'à' HH:mm"), // medium != short
+                  UnicodeString(u"d MMMM y 'à' HH:mm"),
+                  UnicodeString(u"d MMM y, HH:mm"),
+                  UnicodeString(u"dd/MM/y HH:mm") } },
+        { "ha", { UnicodeString(u"EEEE d MMMM, y HH:mm"), // full != long
+                  UnicodeString(u"d MMMM, y 'da' HH:mm"),
+                  UnicodeString(u"d MMM, y, HH:mm"),
+                  UnicodeString(u"y-MM-dd, HH:mm") } },
+        { nullptr, { UnicodeString(""), UnicodeString(""), // terminator
+                    UnicodeString(""), UnicodeString("") } },
+    };
+
+    UnicodeString enDTPatterns[kNumDateTimePatterns] = {
+        UnicodeString(u"{1} 'at' {0}"),
+        UnicodeString(u"{1} 'at' {0}"),
+        UnicodeString(u"{1}, {0}"),
+        UnicodeString(u"{1}, {0}")
+    };
+    UnicodeString modDTPatterns[kNumDateTimePatterns] = {
+        UnicodeString(u"{1} _0_ {0}"),
+        UnicodeString(u"{1} _1_ {0}"),
+        UnicodeString(u"{1} _2_ {0}"),
+        UnicodeString(u"{1} _3_ {0}")
+    };
+    DTPLocaleAndResults enModResults = { "en", { UnicodeString(u"EEEE, MMMM d, y _0_ h:mm a"),
+                                                 UnicodeString(u"MMMM d, y _1_ h:mm a"),
+                                                 UnicodeString(u"MMM d, y _2_ h:mm a"),
+                                                 UnicodeString(u"M/d/y _3_ h:mm a") }
+    };
+
+    // Test various locales with standard data
+    UErrorCode status;
+    LocalPointer<DateTimePatternGenerator> dtpg;
+    DTPLocaleAndResults* localeAndResultsPtr = localeAndResults;
+    for (; localeAndResultsPtr->localeID != nullptr; localeAndResultsPtr++) {
+        status = U_ZERO_ERROR;
+        Locale locale(localeAndResultsPtr->localeID);
+        dtpg.adoptInstead(DateTimePatternGenerator::createInstance(locale, status));
+        if (U_FAILURE(status)) {
+            dataerrln("FAIL: DateTimePatternGenerator::createInstance for locale %s: %s",
+                        localeAndResultsPtr->localeID, u_errorName(status));
+        } else {
+            doDTPatternTest(dtpg.getAlias(), skeletons, localeAndResultsPtr);
+        }
+    }
+    // Test getting and modifying date-time combining patterns
+    status = U_ZERO_ERROR;
+    dtpg.adoptInstead(DateTimePatternGenerator::createInstance(Locale::getEnglish(), status));
+    if (U_FAILURE(status)) {
+        dataerrln("FAIL: DateTimePatternGenerator::createInstance #2 for locale en: %s", u_errorName(status));
+    } else {
+        char bExpect[64];
+        char bGet[64];
+        // Test style out of range
+        status = U_ZERO_ERROR;
+        const UnicodeString& dtFormat0 = dtpg->getDateTimeFormat(UDAT_NONE, status);
+        int32_t dtFormat0Len = dtFormat0.length();
+        if (status != U_ILLEGAL_ARGUMENT_ERROR || dtFormat0Len != 0) {
+            errln("ERROR: getDateTimeFormat with invalid style, expected U_ILLEGAL_ARGUMENT_ERROR and lero-length string, "
+                  "got %s with length %d", u_errorName(status), dtFormat0Len);
+        }
+        // Test normal getting and setting
+        for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+            status = U_ZERO_ERROR;
+            const UnicodeString& dtFormat1 = dtpg->getDateTimeFormat((UDateFormatStyle)patStyle, status);
+            if (U_FAILURE(status)) {
+                errln("FAIL: getDateTimeFormat for en before mod, style %d, get %s", patStyle, u_errorName(status));
+            } else  if (dtFormat1 != enDTPatterns[patStyle]) {
+                enDTPatterns[patStyle].extract(0, enDTPatterns[patStyle].length(), bExpect, 64);
+                dtFormat1.extract(0, dtFormat1.length(), bGet, 64);
+                errln("ERROR: getDateTimeFormat for en before mod, style %d, expect \"%s\", get \"%s\"",
+                        patStyle, bExpect, bGet);
+            }
+            status = U_ZERO_ERROR;
+            dtpg->setDateTimeFormat((UDateFormatStyle)patStyle, modDTPatterns[patStyle], status);
+            if (U_FAILURE(status)) {
+                errln("FAIL: setDateTimeFormat for en, style %d, get %s", patStyle, u_errorName(status));
+            } else {
+                const UnicodeString& dtFormat2 = dtpg->getDateTimeFormat((UDateFormatStyle)patStyle, status);
+                if (U_FAILURE(status)) {
+                    errln("FAIL: getDateTimeFormat for en after  mod, style %d, get %s", patStyle, u_errorName(status));
+                } else if (dtFormat2 != modDTPatterns[patStyle]) {
+                    modDTPatterns[patStyle].extract(0, modDTPatterns[patStyle].length(), bExpect, 64);
+                    dtFormat2.extract(0, dtFormat2.length(), bGet, 64);
+                    errln("ERROR: getDateTimeFormat for en after mod, style %d, expect \"%s\", get \"%s\"",
+                            patStyle, bExpect, bGet);
+                }
+            }
+        }
+        // Test result of setting
+        doDTPatternTest(dtpg.getAlias(), skeletons, &enModResults);
+        // Test old get/set functions
+        const UnicodeString& dtFormat3 = dtpg->getDateTimeFormat();
+        if (dtFormat3 != modDTPatterns[UDAT_MEDIUM]) {
+            modDTPatterns[UDAT_MEDIUM].extract(0, modDTPatterns[UDAT_MEDIUM].length(), bExpect, 64);
+            dtFormat3.extract(0, dtFormat3.length(), bGet, 64);
+            errln("ERROR: old getDateTimeFormat for en after mod, expect \"%s\", get \"%s\"", bExpect, bGet);
+        }
+        dtpg->setDateTimeFormat(modDTPatterns[UDAT_SHORT]); // set all dateTimePatterns to the short format
+        modDTPatterns[UDAT_SHORT].extract(0, modDTPatterns[UDAT_SHORT].length(), bExpect, 64);
+        for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+            status = U_ZERO_ERROR;
+            const UnicodeString& dtFormat4 = dtpg->getDateTimeFormat((UDateFormatStyle)patStyle, status);
+            if (U_FAILURE(status)) {
+                errln("FAIL: getDateTimeFormat for en after second mod, style %d, get %s", patStyle, u_errorName(status));
+            } else if (dtFormat4 != modDTPatterns[UDAT_SHORT]) {
+                dtFormat4.extract(0, dtFormat4.length(), bGet, 64);
+                errln("ERROR: getDateTimeFormat for en after second mod, style %d, expect \"%s\", get \"%s\"",
+                        patStyle, bExpect, bGet);
+            }
+        }
+    }
+}
+
+void IntlTestDateTimePatternGeneratorAPI::doDTPatternTest(DateTimePatternGenerator* dtpg, UnicodeString* skeletons, DTPLocaleAndResults* localeAndResultsPtr) {
+    for (int32_t patStyle = 0; patStyle < kNumDateTimePatterns; patStyle++) {
+        UErrorCode status = U_ZERO_ERROR;
+        UnicodeString getPat = dtpg->getBestPattern(skeletons[patStyle], UDATPG_MATCH_NO_OPTIONS, status);
+        if (U_FAILURE(status)) {
+            errln("FAIL: DateTimePatternGenerator::getBestPattern locale %s, style %d: %s",
+                        localeAndResultsPtr->localeID, patStyle, u_errorName(status));
+        } else if (getPat != localeAndResultsPtr->expectPat[patStyle]) {
+            char bExpect[64];
+            char bGet[64];
+            localeAndResultsPtr->expectPat[patStyle].extract(0, localeAndResultsPtr->expectPat[patStyle].length(), bExpect, 64);
+            getPat.extract(0, getPat.length(), bGet, 64);
+            errln("ERROR: DateTimePatternGenerator::getBestPattern locale %s, style %d, expect \"%s\", get \"%s\"",
+                        localeAndResultsPtr->localeID, patStyle, bExpect, bGet);
+        }
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/dtptngts.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -13,6 +13,8 @@
 
 #if !UCONFIG_NO_FORMATTING
 
+#include "unicode/dtptngen.h"
+#include "unicode/ustring.h"
 #include "intltest.h"
 
 /**
@@ -38,6 +40,14 @@
     void testGetDefaultHourCycle_OnEmptyInstance();
     void test_jConsistencyOddLocales();
     void testBestPattern();
+    void testDateTimePatterns();
+
+    enum { kNumDateTimePatterns = 4 };
+    typedef struct {
+        const char* localeID;
+        const UnicodeString expectPat[kNumDateTimePatterns];
+    } DTPLocaleAndResults;
+    void doDTPatternTest(DateTimePatternGenerator* dtpg, UnicodeString* skeletons, DTPLocaleAndResults* localeAndResultsPtr);
 };
 
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/icusvtst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/icusvtst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/icusvtst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -558,7 +558,7 @@
         , _factoryID(factoryID + ": ") 
     {
         for (int i = 0; i < count; ++i) {
-            _ids.addElementX(new UnicodeString(ids[i]), _status);
+            _ids.adoptElement(new UnicodeString(ids[i]), _status);
         }
     }
   

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/incaltst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -988,7 +988,7 @@
 }
 void IntlCalendarTest::checkConsistency(const char* locale) {
     // Check 2.5 years in quick mode and 8000 years in exhaustive mode.
-    int32_t numOfDaysToTest = (quick ? 2.5 : 8000) * 365;
+    int32_t numOfDaysToTest = static_cast<int32_t>((quick ? 2.5 : 8000) * 365);
     constexpr int32_t msInADay = 1000*60*60*24;
     std::string msg("TestConsistency");
     IcuTestErrorCode status(*this, (msg + locale).c_str());

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/intltest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2188,14 +2188,20 @@
                                  double expected,
                                  double actual,
                                  double delta) {
+    bool bothNaN = std::isnan(expected) && std::isnan(actual);
+    bool bothPosInf = uprv_isPositiveInfinity(expected) && uprv_isPositiveInfinity(actual);
+    bool bothNegInf = uprv_isNegativeInfinity(expected) && uprv_isNegativeInfinity(actual);
+    if (bothPosInf || bothNegInf || bothNaN) {
+        // We don't care about delta in these cases
+        return TRUE;
+    }
     if (std::isnan(delta) || std::isinf(delta)) {
         errln((UnicodeString)("FAIL: ") + message + "; nonsensical delta " + delta +
-              " - delta may not be NaN or Inf");
+              " - delta may not be NaN or Inf. (Got " + actual + "; expected " + expected + ".)");
         return FALSE;
     }
-    bool bothNaN = std::isnan(expected) && std::isnan(actual);
     double difference = std::abs(expected - actual);
-    if (expected != actual && (difference > delta || std::isnan(difference)) && !bothNaN) {
+    if (expected != actual && (difference > delta || std::isnan(difference))) {
         errln((UnicodeString)("FAIL: ") + message + "; got " + actual + "; expected " + expected +
               "; acceptable delta " + delta);
         return FALSE;

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -49,6 +49,7 @@
     TESTCASE_AUTO(TestContextual);
     TESTCASE_AUTO(TestNextPosition);
     TESTCASE_AUTO(TestInt32Overflow);
+    TESTCASE_AUTO(Test21871);
     TESTCASE_AUTO_END;
 }
 
@@ -276,7 +277,7 @@
         const char* testName) {
     IcuTestErrorCode errorCode(*this, testName);
     LocalPointer<ListFormatter> formatter(ListFormatter::createInstance(
-        Locale("ur", "IN"),
+        Locale("ur", "IN"), // in CLDR 41 alpha1 the "backwards order" patterns in this and other locales were removed.
         ULISTFMT_TYPE_UNITS,
         ULISTFMT_WIDTH_NARROW,
         errorCode));
@@ -329,21 +330,21 @@
 }
 
 void ListFormatterTest::TestFieldPositionIteratorWith3ItemsPatternShift() {
-    //  0         1
-    //  012345678901234
-    // "cc bbb a"
+    // Note: In CLDR 41 alpha1 the "backwards order" patterns in ur_IN (and one or two
+    // other locales) were removed, ur_IN now just inherits list patterns from ur.
+    // So this test may no longer be interesting.
     UnicodeString data[3] = {"a", "bbb", "cc"};
     int32_t expected[] = {
-        ULISTFMT_ELEMENT_FIELD, 7, 8,
-        ULISTFMT_LITERAL_FIELD, 6, 7,
+        ULISTFMT_ELEMENT_FIELD, 0, 1,
+        ULISTFMT_LITERAL_FIELD, 1, 3,
         ULISTFMT_ELEMENT_FIELD, 3, 6,
-        ULISTFMT_LITERAL_FIELD, 2, 3,
-        ULISTFMT_ELEMENT_FIELD, 0, 2
+        ULISTFMT_LITERAL_FIELD, 6, 12,
+        ULISTFMT_ELEMENT_FIELD, 12, 14
     };
     int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected));
     RunTestFieldPositionIteratorWithNItemsPatternShift(
         data, 3, expected, tupleCount,
-        u"cc bbb a",
+        u"a، bbb، اور cc",
         "TestFieldPositionIteratorWith3ItemsPatternShift");
 }
 
@@ -365,19 +366,19 @@
 }
 
 void ListFormatterTest::TestFieldPositionIteratorWith2ItemsPatternShift() {
-    //  0         1
-    //  01234567890
-    // "cc bbb"
+    // Note: In CLDR 41 alpha1 the "backwards order" patterns in ur_IN (and one or two
+    // other locales) were removed, ur_IN now just inherits list patterns from ur.
+    // So this test may no longer be interesting.
     UnicodeString data[2] = {"bbb", "cc"};
     int32_t expected[] = {
-        ULISTFMT_ELEMENT_FIELD, 3, 6,
-        ULISTFMT_LITERAL_FIELD, 2, 3,
-        ULISTFMT_ELEMENT_FIELD, 0, 2
+        ULISTFMT_ELEMENT_FIELD, 0, 3,
+        ULISTFMT_LITERAL_FIELD, 3, 8,
+        ULISTFMT_ELEMENT_FIELD, 8, 10
     };
     int32_t tupleCount = sizeof(expected)/(3 * sizeof(*expected));
     RunTestFieldPositionIteratorWithNItemsPatternShift(
         data, 2, expected, tupleCount,
-        u"cc bbb",
+        u"bbb اور cc",
         "TestFieldPositionIteratorWith2ItemsPatternShift");
 }
 
@@ -840,4 +841,30 @@
     status.expectErrorAndReset(U_INPUT_TOO_LONG_ERROR);
 }
 
+
+void ListFormatterTest::Test21871() {
+    IcuTestErrorCode status(*this, "Test21871");
+    LocalPointer<ListFormatter> fmt(ListFormatter::createInstance("en", status), status);
+    {
+        UnicodeString strings[] = {{u"A"}, {u""}};
+        FormattedList result = fmt->formatStringsToValue(strings, 2, status);
+        ConstrainedFieldPosition cfp;
+        cfp.constrainField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD);
+        assertTrue("nextPosition 1", result.nextPosition(cfp, status));
+        assertEquals("start", cfp.getStart(), 0);
+        assertEquals("limit", cfp.getLimit(), 1);
+        assertFalse("nextPosition 2", result.nextPosition(cfp, status));
+    }
+    {
+        UnicodeString strings[] = {{u""}, {u"B"}};
+        FormattedList result = fmt->formatStringsToValue(strings, 2, status);
+        ConstrainedFieldPosition cfp;
+        cfp.constrainField(UFIELD_CATEGORY_LIST, ULISTFMT_ELEMENT_FIELD);
+        assertTrue("nextPosition 1", result.nextPosition(cfp, status));
+        assertEquals("start", cfp.getStart(), 5);
+        assertEquals("limit", cfp.getLimit(), 6);
+        assertFalse("nextPosition 2", result.nextPosition(cfp, status));
+    }
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/listformattertest.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -56,6 +56,7 @@
     void TestContextual();
     void TestNextPosition();
     void TestInt32Overflow();
+    void Test21871();
 
   private:
     void CheckFormatting(

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/lstmbetst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/lstmbetst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/lstmbetst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -153,7 +153,7 @@
                     dataerrln("%s:%d Error %s Could not allocate UVextor32", __FILE__, __LINE__, u_errorName(status));
                     return;
                 }
-                engine->findBreaks(&ut, 0, value.length(), actual, status);
+                engine->findBreaks(&ut, 0, value.length(), actual, false, status);
                 if (U_FAILURE(status)) {
                     dataerrln("%s:%d Error %s findBreaks failed", __FILE__, __LINE__, u_errorName(status));
                     return;
@@ -288,7 +288,7 @@
             return;
         }
 
-        engine->findBreaks(&ut, 0, text.length(), actual, status);
+        engine->findBreaks(&ut, 0, text.length(), actual, false, status);
         utext_close(&ut);
         text += text;
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/measfmttest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2683,7 +2683,7 @@
     assertSuccess("", status);
 }
 
-void MeasureFormatTest::TestCompatible70() {
+void MeasureFormatTest::TestCompatible70() { // TestCompatible71 would be identical
     UErrorCode status = U_ZERO_ERROR;
     LocalPointer<MeasureUnit> measureUnit;
     MeasureUnit measureUnitValue;
@@ -3064,6 +3064,9 @@
     assertSuccess("", status);
 }
 
+// TestCompatible71 would be identical to TestCompatible70,
+// no need to add it
+
 void MeasureFormatTest::TestBasic() {
     UErrorCode status = U_ZERO_ERROR;
     MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -66,6 +66,7 @@
     void unitUsageSkeletons();
     void unitCurrency();
     void unitInflections();
+    void unitNounClass();
     void unitGender();
     void unitNotConvertible();
     void unitPercent();
@@ -75,6 +76,7 @@
     void roundingFractionFigures();
     void roundingOther();
     void roundingIncrementRegressionTest();
+    void roundingPriorityCoverageTest();
     void grouping();
     void padding();
     void integerWidth();
@@ -99,7 +101,8 @@
     void toObject();
     void toDecimalNumber();
     void microPropsInternals();
-
+    void formatUnitsAliases();
+    
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) override;
 
   private:
@@ -206,6 +209,7 @@
     void testNickelRounding();
     void testScientificAndCompactSuppressedExponent();
     void testSuppressedExponentUnchangedByInitialScaling();
+    void testDecimalQuantityParseFormatRoundTrip();
 
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) override;
 

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_api.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -87,6 +87,7 @@
         TESTCASE_AUTO(unitUsageSkeletons);
         TESTCASE_AUTO(unitCurrency);
         TESTCASE_AUTO(unitInflections);
+        TESTCASE_AUTO(unitNounClass);
         TESTCASE_AUTO(unitGender);
         TESTCASE_AUTO(unitNotConvertible);
         TESTCASE_AUTO(unitPercent);
@@ -99,6 +100,7 @@
         TESTCASE_AUTO(roundingFractionFigures);
         TESTCASE_AUTO(roundingOther);
         TESTCASE_AUTO(roundingIncrementRegressionTest);
+        TESTCASE_AUTO(roundingPriorityCoverageTest);
         TESTCASE_AUTO(grouping);
         TESTCASE_AUTO(padding);
         TESTCASE_AUTO(integerWidth);
@@ -127,6 +129,7 @@
         TESTCASE_AUTO(toObject);
         TESTCASE_AUTO(toDecimalNumber);
         TESTCASE_AUTO(microPropsInternals);
+        TESTCASE_AUTO(formatUnitsAliases);
     TESTCASE_AUTO_END;
 }
 
@@ -1747,6 +1750,46 @@
             30500,
             u"350 m");
 
+    assertFormatSingle(u"Fuel consumption: inverted units",                                     //
+                       u"unit/liter-per-100-kilometer usage/vehicle-fuel",                      //
+                       u"unit/liter-per-100-kilometer usage/vehicle-fuel",                      //
+                       NumberFormatter::with()                                                  //
+                           .unit(MeasureUnit::forIdentifier("liter-per-100-kilometer", status)) //
+                           .usage("vehicle-fuel"),                                              //
+                       Locale("en-US"),                                                         //
+                       6.6,                                                                     //
+                       "36 mpg");
+
+    assertFormatSingle(u"Fuel consumption: inverted units, divide-by-zero, en-US",              //
+                       u"unit/liter-per-100-kilometer usage/vehicle-fuel",                      //
+                       u"unit/liter-per-100-kilometer usage/vehicle-fuel",                      //
+                       NumberFormatter::with()                                                  //
+                           .unit(MeasureUnit::forIdentifier("liter-per-100-kilometer", status)) //
+                           .usage("vehicle-fuel"),                                              //
+                       Locale("en-US"),                                                         //
+                       0,                                                                       //
+                       u"∞ mpg");
+
+    assertFormatSingle(u"Fuel consumption: inverted units, divide-by-zero, en-ZA",      //
+                       u"unit/mile-per-gallon usage/vehicle-fuel",                      //
+                       u"unit/mile-per-gallon usage/vehicle-fuel",                      //
+                       NumberFormatter::with()                                          //
+                           .unit(MeasureUnit::forIdentifier("mile-per-gallon", status)) //
+                           .usage("vehicle-fuel"),                                      //
+                       Locale("en-ZA"),                                                 //
+                       0,                                                               //
+                       u"∞ l/100 km");
+
+    assertFormatSingle(u"Fuel consumption: inverted units, divide-by-inf",              //
+                       u"unit/mile-per-gallon usage/vehicle-fuel",                      //
+                       u"unit/mile-per-gallon usage/vehicle-fuel",                      //
+                       NumberFormatter::with()                                          //
+                           .unit(MeasureUnit::forIdentifier("mile-per-gallon", status)) //
+                           .usage("vehicle-fuel"),                                      //
+                       Locale("de-CH"),                                                 //
+                       uprv_getInfinity(),                                              //
+                       u"0 L/100 km");
+
     // Test calling `.usage("")` should unset the existing usage.
     // First: without usage
     assertFormatSingle(u"Rounding Mode propagates: rounding up",
@@ -1853,10 +1896,6 @@
                        Locale("en-US"),                                                 //
                        1,                                                               //
                        "0.019 psi");
-
-    // TODO(icu-units#38): improve unit testing coverage. E.g. add vehicle-fuel
-    // triggering inversion conversion code. Test with 0 too, to see
-    // divide-by-zero behaviour.
 }
 
 void NumberFormatterApiTest::unitUsageErrorCodes() {
@@ -2384,7 +2423,7 @@
             {"centimeter", "de", nullptr, 1, u"1 Zentimeter"},
             {"centimeter", "de", "genitive", 1, u"1 Zentimeters"},
             {"centimeter", "de", "dative", 10, u"10 Zentimetern"},
-            // TODO(CLDR-14502): check that these inflections are correct, and
+            // TODO(CLDR-14582): check that these inflections are correct, and
             // whether CLDR needs any rules for them (presumably CLDR spec
             // should mention it, if it's a consistent rule):
             {"meter-and-centimeter", "de", nullptr, 1.01, u"1 Meter, 1 Zentimeter"},
@@ -2401,6 +2440,307 @@
     // TODO: look at "↑↑↑" cases: check that inheritance is done right.
 }
 
+using icu::NounClass;
+void NumberFormatterApiTest::unitNounClass() {
+    IcuTestErrorCode status(*this, "unitNounClass");
+    const struct TestCase {
+        const char *locale;
+        const char *unitIdentifier;
+        const NounClass expectedNounClass;
+    } cases[] = {
+        {"de", "inch", NounClass::MASCULINE},
+        {"de", "yard", NounClass::NEUTER},
+        {"de", "meter", NounClass::MASCULINE},
+        {"de", "liter", NounClass::MASCULINE},
+        {"de", "second", NounClass::FEMININE},
+        {"de", "minute", NounClass::FEMININE},
+        {"de", "hour", NounClass::FEMININE},
+        {"de", "day", NounClass::MASCULINE},
+        {"de", "year", NounClass::NEUTER},
+        {"de", "gram", NounClass::NEUTER},
+        {"de", "watt", NounClass::NEUTER},
+        {"de", "bit", NounClass::NEUTER},
+        {"de", "byte", NounClass::NEUTER},
+
+        {"fr", "inch", NounClass::MASCULINE},
+        {"fr", "yard", NounClass::MASCULINE},
+        {"fr", "meter", NounClass::MASCULINE},
+        {"fr", "liter", NounClass::MASCULINE},
+        {"fr", "second", NounClass::FEMININE},
+        {"fr", "minute", NounClass::FEMININE},
+        {"fr", "hour", NounClass::FEMININE},
+        {"fr", "day", NounClass::MASCULINE},
+        {"fr", "year", NounClass::MASCULINE},
+        {"fr", "gram", NounClass::MASCULINE},
+
+        // grammaticalFeatures deriveCompound "per" rule takes the gender of the
+        // numerator unit:
+        {"de", "meter-per-hour", NounClass::MASCULINE},
+        {"fr", "meter-per-hour", NounClass::MASCULINE},
+        {"af", "meter-per-hour", NounClass::OTHER}, // ungendered language
+
+        // French "times" takes gender from first value, German takes the
+        // second. Prefix and power does not have impact on gender for these
+        // languages:
+        {"de", "square-decimeter-square-second", NounClass::FEMININE},
+        {"fr", "square-decimeter-square-second", NounClass::MASCULINE},
+
+        // TODO(icu-units#149): percent and permille bypasses LongNameHandler
+        // when unitWidth is not FULL_NAME:
+        // // Gender of per-second might be that of percent? TODO(icu-units#28)
+        // {"de", "percent", NounClass::NEUTER},
+        // {"fr", "percent", NounClass::MASCULINE},
+
+        // Built-in units whose simple units lack gender in the CLDR data file
+        {"de", "kilopascal", NounClass::NEUTER},
+        {"fr", "kilopascal", NounClass::MASCULINE},
+        // {"de", "pascal", NounClass::OTHER},
+        // {"fr", "pascal", NounClass::OTHER},
+
+        // Built-in units that lack gender in the CLDR data file
+        // {"de", "revolution", NounClass::OTHER},
+        // {"de", "radian", NounClass::OTHER},
+        // {"de", "arc-minute", NounClass::OTHER},
+        // {"de", "arc-second", NounClass::OTHER},
+        {"de", "square-yard", NounClass::NEUTER},    // POWER
+        {"de", "square-inch", NounClass::MASCULINE}, // POWER
+        // {"de", "dunam", NounClass::OTHER},
+        // {"de", "karat", NounClass::OTHER},
+        // {"de", "milligram-ofglucose-per-deciliter", NounClass::OTHER}, // COMPOUND, ofglucose
+        // {"de", "millimole-per-liter", NounClass::OTHER},               // COMPOUND, mole
+        // {"de", "permillion", NounClass::OTHER},
+        // {"de", "permille", NounClass::OTHER},
+        // {"de", "permyriad", NounClass::OTHER},
+        // {"de", "mole", NounClass::OTHER},
+        {"de", "liter-per-kilometer", NounClass::MASCULINE}, // COMPOUND
+        {"de", "petabyte", NounClass::NEUTER},               // PREFIX
+        {"de", "terabit", NounClass::NEUTER},                // PREFIX
+        // {"de", "century", NounClass::OTHER},
+        // {"de", "decade", NounClass::OTHER},
+        {"de", "millisecond", NounClass::FEMININE}, // PREFIX
+        {"de", "microsecond", NounClass::FEMININE}, // PREFIX
+        {"de", "nanosecond", NounClass::FEMININE},  // PREFIX
+        // {"de", "ampere", NounClass::OTHER},
+        // {"de", "milliampere", NounClass::OTHER}, // PREFIX, ampere
+        // {"de", "ohm", NounClass::OTHER},
+        // {"de", "calorie", NounClass::OTHER},
+        // {"de", "kilojoule", NounClass::OTHER}, // PREFIX, joule
+        // {"de", "joule", NounClass::OTHER},
+        {"de", "kilowatt-hour", NounClass::FEMININE}, // COMPOUND
+        // {"de", "electronvolt", NounClass::OTHER},
+        // {"de", "british-thermal-unit", NounClass::OTHER},
+        // {"de", "therm-us", NounClass::OTHER},
+        // {"de", "pound-force", NounClass::OTHER},
+        // {"de", "newton", NounClass::OTHER},
+        // {"de", "gigahertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"de", "megahertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"de", "kilohertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"de", "hertz", NounClass::OTHER},
+        // {"de", "em", NounClass::OTHER},
+        // {"de", "pixel", NounClass::OTHER},
+        // {"de", "megapixel", NounClass::OTHER},
+        // {"de", "pixel-per-centimeter", NounClass::OTHER}, // COMPOUND, pixel
+        // {"de", "pixel-per-inch", NounClass::OTHER},       // COMPOUND, pixel
+        // {"de", "dot-per-centimeter", NounClass::OTHER},   // COMPOUND, dot
+        // {"de", "dot-per-inch", NounClass::OTHER},         // COMPOUND, dot
+        // {"de", "dot", NounClass::OTHER},
+        // {"de", "earth-radius", NounClass::OTHER},
+        {"de", "decimeter", NounClass::MASCULINE},  // PREFIX
+        {"de", "micrometer", NounClass::MASCULINE}, // PREFIX
+        {"de", "nanometer", NounClass::MASCULINE},  // PREFIX
+        // {"de", "light-year", NounClass::OTHER},
+        // {"de", "astronomical-unit", NounClass::OTHER},
+        // {"de", "furlong", NounClass::OTHER},
+        // {"de", "fathom", NounClass::OTHER},
+        // {"de", "nautical-mile", NounClass::OTHER},
+        // {"de", "mile-scandinavian", NounClass::OTHER},
+        // {"de", "point", NounClass::OTHER},
+        // {"de", "lux", NounClass::OTHER},
+        // {"de", "candela", NounClass::OTHER},
+        // {"de", "lumen", NounClass::OTHER},
+        // {"de", "metric-ton", NounClass::OTHER},
+        // {"de", "microgram", NounClass::NEUTER}, // PREFIX
+        // {"de", "ton", NounClass::OTHER},
+        // {"de", "stone", NounClass::OTHER},
+        // {"de", "ounce-troy", NounClass::OTHER},
+        // {"de", "carat", NounClass::OTHER},
+        {"de", "gigawatt", NounClass::NEUTER},  // PREFIX
+        {"de", "milliwatt", NounClass::NEUTER}, // PREFIX
+        // {"de", "horsepower", NounClass::OTHER},
+        // {"de", "millimeter-ofhg", NounClass::OTHER},
+        // {"de", "pound-force-per-square-inch", NounClass::OTHER}, // COMPOUND, pound-force
+        // {"de", "inch-ofhg", NounClass::OTHER},
+        // {"de", "bar", NounClass::OTHER},
+        // {"de", "millibar", NounClass::OTHER}, // PREFIX, bar
+        // {"de", "atmosphere", NounClass::OTHER},
+        // {"de", "pascal", NounClass::OTHER},      // PREFIX, kilopascal? neuter?
+        // {"de", "hectopascal", NounClass::OTHER}, // PREFIX, pascal, neuter?
+        // {"de", "megapascal", NounClass::OTHER},  // PREFIX, pascal, neuter?
+        // {"de", "knot", NounClass::OTHER},
+        {"de", "pound-force-foot", NounClass::MASCULINE}, // COMPOUND
+        {"de", "newton-meter", NounClass::MASCULINE},     // COMPOUND
+        {"de", "cubic-kilometer", NounClass::MASCULINE},  // POWER
+        {"de", "cubic-yard", NounClass::NEUTER},          // POWER
+        {"de", "cubic-inch", NounClass::MASCULINE},       // POWER
+        {"de", "megaliter", NounClass::MASCULINE},        // PREFIX
+        {"de", "hectoliter", NounClass::MASCULINE},       // PREFIX
+        // {"de", "pint-metric", NounClass::OTHER},
+        // {"de", "cup-metric", NounClass::OTHER},
+        {"de", "acre-foot", NounClass::MASCULINE}, // COMPOUND
+        // {"de", "bushel", NounClass::OTHER},
+        // {"de", "barrel", NounClass::OTHER},
+        // Units missing gender in German also misses gender in French:
+        // {"fr", "revolution", NounClass::OTHER},
+        // {"fr", "radian", NounClass::OTHER},
+        // {"fr", "arc-minute", NounClass::OTHER},
+        // {"fr", "arc-second", NounClass::OTHER},
+        {"fr", "square-yard", NounClass::MASCULINE}, // POWER
+        {"fr", "square-inch", NounClass::MASCULINE}, // POWER
+        // {"fr", "dunam", NounClass::OTHER},
+        // {"fr", "karat", NounClass::OTHER},
+        {"fr", "milligram-ofglucose-per-deciliter", NounClass::MASCULINE}, // COMPOUND
+        // {"fr", "millimole-per-liter", NounClass::OTHER},                        // COMPOUND, mole
+        // {"fr", "permillion", NounClass::OTHER},
+        // {"fr", "permille", NounClass::OTHER},
+        // {"fr", "permyriad", NounClass::OTHER},
+        // {"fr", "mole", NounClass::OTHER},
+        {"fr", "liter-per-kilometer", NounClass::MASCULINE}, // COMPOUND
+        // {"fr", "petabyte", NounClass::OTHER},                     // PREFIX
+        // {"fr", "terabit", NounClass::OTHER},                      // PREFIX
+        // {"fr", "century", NounClass::OTHER},
+        // {"fr", "decade", NounClass::OTHER},
+        {"fr", "millisecond", NounClass::FEMININE}, // PREFIX
+        {"fr", "microsecond", NounClass::FEMININE}, // PREFIX
+        {"fr", "nanosecond", NounClass::FEMININE},  // PREFIX
+        // {"fr", "ampere", NounClass::OTHER},
+        // {"fr", "milliampere", NounClass::OTHER}, // PREFIX, ampere
+        // {"fr", "ohm", NounClass::OTHER},
+        // {"fr", "calorie", NounClass::OTHER},
+        // {"fr", "kilojoule", NounClass::OTHER}, // PREFIX, joule
+        // {"fr", "joule", NounClass::OTHER},
+        // {"fr", "kilowatt-hour", NounClass::OTHER}, // COMPOUND
+        // {"fr", "electronvolt", NounClass::OTHER},
+        // {"fr", "british-thermal-unit", NounClass::OTHER},
+        // {"fr", "therm-us", NounClass::OTHER},
+        // {"fr", "pound-force", NounClass::OTHER},
+        // {"fr", "newton", NounClass::OTHER},
+        // {"fr", "gigahertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"fr", "megahertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"fr", "kilohertz", NounClass::OTHER}, // PREFIX, hertz
+        // {"fr", "hertz", NounClass::OTHER},
+        // {"fr", "em", NounClass::OTHER},
+        // {"fr", "pixel", NounClass::OTHER},
+        // {"fr", "megapixel", NounClass::OTHER},
+        // {"fr", "pixel-per-centimeter", NounClass::OTHER}, // COMPOUND, pixel
+        // {"fr", "pixel-per-inch", NounClass::OTHER},       // COMPOUND, pixel
+        // {"fr", "dot-per-centimeter", NounClass::OTHER},   // COMPOUND, dot
+        // {"fr", "dot-per-inch", NounClass::OTHER},         // COMPOUND, dot
+        // {"fr", "dot", NounClass::OTHER},
+        // {"fr", "earth-radius", NounClass::OTHER},
+        {"fr", "decimeter", NounClass::MASCULINE},  // PREFIX
+        {"fr", "micrometer", NounClass::MASCULINE}, // PREFIX
+        {"fr", "nanometer", NounClass::MASCULINE},  // PREFIX
+        // {"fr", "light-year", NounClass::OTHER},
+        // {"fr", "astronomical-unit", NounClass::OTHER},
+        // {"fr", "furlong", NounClass::OTHER},
+        // {"fr", "fathom", NounClass::OTHER},
+        // {"fr", "nautical-mile", NounClass::OTHER},
+        // {"fr", "mile-scandinavian", NounClass::OTHER},
+        // {"fr", "point", NounClass::OTHER},
+        // {"fr", "lux", NounClass::OTHER},
+        // {"fr", "candela", NounClass::OTHER},
+        // {"fr", "lumen", NounClass::OTHER},
+        // {"fr", "metric-ton", NounClass::OTHER},
+        // {"fr", "microgram", NounClass::MASCULINE}, // PREFIX
+        // {"fr", "ton", NounClass::OTHER},
+        // {"fr", "stone", NounClass::OTHER},
+        // {"fr", "ounce-troy", NounClass::OTHER},
+        // {"fr", "carat", NounClass::OTHER},
+        // {"fr", "gigawatt", NounClass::OTHER}, // PREFIX
+        // {"fr", "milliwatt", NounClass::OTHER},
+        // {"fr", "horsepower", NounClass::OTHER},
+        {"fr", "millimeter-ofhg", NounClass::MASCULINE},
+        // {"fr", "pound-force-per-square-inch", NounClass::OTHER}, // COMPOUND, pound-force
+        {"fr", "inch-ofhg", NounClass::MASCULINE},
+        // {"fr", "bar", NounClass::OTHER},
+        // {"fr", "millibar", NounClass::OTHER}, // PREFIX, bar
+        // {"fr", "atmosphere", NounClass::OTHER},
+        // {"fr", "pascal", NounClass::OTHER},      // PREFIX, kilopascal?
+        // {"fr", "hectopascal", NounClass::OTHER}, // PREFIX, pascal
+        // {"fr", "megapascal", NounClass::OTHER},  // PREFIX, pascal
+        // {"fr", "knot", NounClass::OTHER},
+        // {"fr", "pound-force-foot", NounClass::OTHER},
+        // {"fr", "newton-meter", NounClass::OTHER},
+        {"fr", "cubic-kilometer", NounClass::MASCULINE}, // POWER
+        {"fr", "cubic-yard", NounClass::MASCULINE},      // POWER
+        {"fr", "cubic-inch", NounClass::MASCULINE},      // POWER
+        {"fr", "megaliter", NounClass::MASCULINE},       // PREFIX
+        {"fr", "hectoliter", NounClass::MASCULINE},      // PREFIX
+        // {"fr", "pint-metric", NounClass::OTHER},
+        // {"fr", "cup-metric", NounClass::OTHER},
+        {"fr", "acre-foot", NounClass::FEMININE}, // COMPOUND
+        // {"fr", "bushel", NounClass::OTHER},
+        // {"fr", "barrel", NounClass::OTHER},
+        // Some more French units missing gender:
+        // {"fr", "degree", NounClass::OTHER},
+        {"fr", "square-meter", NounClass::MASCULINE}, // POWER
+        // {"fr", "terabyte", NounClass::OTHER},              // PREFIX, byte
+        // {"fr", "gigabyte", NounClass::OTHER},              // PREFIX, byte
+        // {"fr", "gigabit", NounClass::OTHER},               // PREFIX, bit
+        // {"fr", "megabyte", NounClass::OTHER},              // PREFIX, byte
+        // {"fr", "megabit", NounClass::OTHER},               // PREFIX, bit
+        // {"fr", "kilobyte", NounClass::OTHER},              // PREFIX, byte
+        // {"fr", "kilobit", NounClass::OTHER},               // PREFIX, bit
+        // {"fr", "byte", NounClass::OTHER},
+        // {"fr", "bit", NounClass::OTHER},
+        // {"fr", "volt", NounClass::OTHER},
+        // {"fr", "watt", NounClass::OTHER},
+        {"fr", "cubic-meter", NounClass::MASCULINE}, // POWER
+
+        // gender-lacking builtins within compound units
+        {"de", "newton-meter-per-second", NounClass::MASCULINE},
+
+        // TODO(ICU-21494): determine whether list genders behave as follows,
+        // and implement proper getListGender support (covering more than just
+        // two genders):
+        // // gender rule for lists of people: de "neutral", fr "maleTaints"
+        // {"de", "day-and-hour-and-minute", NounClass::NEUTER},
+        // {"de", "hour-and-minute", NounClass::FEMININE},
+        // {"fr", "day-and-hour-and-minute", NounClass::MASCULINE},
+        // {"fr", "hour-and-minute", NounClass::FEMININE},
+    };
+
+    LocalizedNumberFormatter formatter;
+    FormattedNumber fn;
+    for (const TestCase &t : cases) {
+        formatter = NumberFormatter::with()
+                        .unit(MeasureUnit::forIdentifier(t.unitIdentifier, status))
+                        .locale(Locale(t.locale));
+        fn = formatter.formatDouble(1.1, status);
+        assertEquals(UnicodeString("Testing NounClass with default width, unit: ") + t.unitIdentifier +
+                         ", locale: " + t.locale,
+                     t.expectedNounClass, fn.getNounClass(status));
+        status.assertSuccess();
+
+        formatter = NumberFormatter::with()
+                        .unit(MeasureUnit::forIdentifier(t.unitIdentifier, status))
+                        .unitWidth(UNUM_UNIT_WIDTH_FULL_NAME)
+                        .locale(Locale(t.locale));
+        fn = formatter.formatDouble(1.1, status);
+        assertEquals(UnicodeString("Testing NounClass with UNUM_UNIT_WIDTH_FULL_NAME, unit: ") +
+                         t.unitIdentifier + ", locale: " + t.locale,
+                     t.expectedNounClass, fn.getNounClass(status));
+        status.assertSuccess();
+    }
+
+    // Make sure getNounClass does not return garbage for languages without noun classes.
+    formatter = NumberFormatter::with().locale(Locale::getEnglish());
+    fn = formatter.formatDouble(1.1, status);
+    status.assertSuccess();
+    assertEquals("getNounClasses for a not supported language", NounClass::OTHER,
+                 fn.getNounClass(status));
+}
+
 void NumberFormatterApiTest::unitGender() {
     IcuTestErrorCode status(*this, "unitGender");
 
@@ -2975,6 +3315,28 @@
             Locale::getEnglish(),
             1,
             "1");
+
+    assertFormatSingle(
+            u"Hide If Whole with Rounding Mode A (ICU-21881)",
+            u".00/w rounding-mode-floor",
+            u".00/w rounding-mode-floor",
+            NumberFormatter::with().precision(Precision::fixedFraction(2)
+                .trailingZeroDisplay(UNUM_TRAILING_ZERO_HIDE_IF_WHOLE))
+                .roundingMode(UNUM_ROUND_FLOOR),
+            Locale::getEnglish(),
+            3.009,
+            "3");
+
+    assertFormatSingle(
+            u"Hide If Whole with Rounding Mode B (ICU-21881)",
+            u".00/w rounding-mode-half-up",
+            u".00/w rounding-mode-half-up",
+            NumberFormatter::with().precision(Precision::fixedFraction(2)
+                .trailingZeroDisplay(UNUM_TRAILING_ZERO_HIDE_IF_WHOLE))
+                .roundingMode(UNUM_ROUND_HALFUP),
+            Locale::getEnglish(),
+            3.001,
+            "3");
 }
 
 void NumberFormatterApiTest::roundingFigures() {
@@ -2997,6 +3359,15 @@
             u"-98.8");
 
     assertFormatSingle(
+            u"Fixed Significant at rounding boundary",
+            u"@@@",
+            u"@@@",
+            NumberFormatter::with().precision(Precision::fixedSignificantDigits(3)),
+            Locale::getEnglish(),
+            9.999,
+            u"10.0");
+
+    assertFormatSingle(
             u"Fixed Significant Zero",
             u"@@@",
             u"@@@",
@@ -3156,7 +3527,7 @@
     assertFormatDescending(
             u"FracSig withSignificantDigits STRICT",
             u"precision-integer/@#s",
-            u"./@#",
+            u"./@#s",
             NumberFormatter::with().precision(Precision::maxFraction(0)
                 .withSignificantDigits(1, 2, UNUM_ROUNDING_PRIORITY_STRICT)),
             Locale::getEnglish(),
@@ -3180,7 +3551,7 @@
             1,
             u"1.00");
 
-    // Trailing zeros are always retained:
+    // Trailing zeros follow the strategy that was chosen:
     assertFormatSingle(
             u"FracSig withSignificantDigits Trailing Zeros STRICT",
             u".0/@@@s",
@@ -3189,7 +3560,7 @@
                 .withSignificantDigits(3, 3, UNUM_ROUNDING_PRIORITY_STRICT)),
             Locale::getEnglish(),
             1,
-            u"1.00");
+            u"1.0");
 
     assertFormatSingle(
             u"FracSig withSignificantDigits at rounding boundary",
@@ -3199,7 +3570,7 @@
                     .withSignificantDigits(3, 3, UNUM_ROUNDING_PRIORITY_STRICT)),
             Locale::getEnglish(),
             9.99,
-            u"10.0");
+            u"10");
 
     assertFormatSingle(
             u"FracSig with Trailing Zero Display",
@@ -3397,6 +3768,42 @@
             u"0.0",
             u"0.0");
 
+    assertFormatSingle(
+            u"Large integer increment",
+            u"precision-increment/24000000000000000000000",
+            u"precision-increment/24000000000000000000000",
+            NumberFormatter::with().precision(Precision::incrementExact(24, 21)),
+            Locale::getEnglish(),
+            3.1e22,
+            u"24,000,000,000,000,000,000,000");
+
+    assertFormatSingle(
+            u"Quarter rounding",
+            u"precision-increment/250",
+            u"precision-increment/250",
+            NumberFormatter::with().precision(Precision::incrementExact(250, 0)),
+            Locale::getEnglish(),
+            700,
+            u"750");
+
+    assertFormatSingle(
+            u"ECMA-402 limit",
+            u"precision-increment/.00000000000000000020",
+            u"precision-increment/.00000000000000000020",
+            NumberFormatter::with().precision(Precision::incrementExact(20, -20)),
+            Locale::getEnglish(),
+            333e-20,
+            u"0.00000000000000000340");
+
+    assertFormatSingle(
+            u"ECMA-402 limit with increment = 1",
+            u"precision-increment/.00000000000000000001",
+            u"precision-increment/.00000000000000000001",
+            NumberFormatter::with().precision(Precision::incrementExact(1, -20)),
+            Locale::getEnglish(),
+            4321e-21,
+            u"0.00000000000000000432");
+
     assertFormatDescending(
             u"Currency Standard",
             u"currency/CZK precision-currency-standard",
@@ -3583,6 +3990,67 @@
     assertEquals("ICU-21668", u"5,000", increment);
 }
 
+void NumberFormatterApiTest::roundingPriorityCoverageTest() {
+    IcuTestErrorCode status(*this, "roundingPriorityCoverageTest");
+    struct TestCase {
+        double input;
+        const char16_t* expectedRelaxed0113;
+        const char16_t* expectedStrict0113;
+        const char16_t* expectedRelaxed1133;
+        const char16_t* expectedStrict1133;
+    } cases[] = {
+        { 0.9999, u"1",      u"1",     u"1.00",    u"1.0" },
+        { 9.9999, u"10",     u"10",    u"10.0",    u"10.0" },
+        { 99.999, u"100",    u"100",   u"100.0",   u"100" },
+        { 999.99, u"1000",   u"1000",  u"1000.0",  u"1000" },
+
+        { 0, u"0", u"0", u"0.00", u"0.0" },
+
+        { 9.876,  u"9.88",   u"9.9",   u"9.88",   u"9.9" },
+        { 9.001,  u"9",      u"9",     u"9.00",   u"9.0" },
+    };
+    for (const auto& cas : cases) {
+        auto precisionRelaxed0113 = Precision::minMaxFraction(0, 1)
+            .withSignificantDigits(1, 3, UNUM_ROUNDING_PRIORITY_RELAXED);
+        auto precisionStrict0113 = Precision::minMaxFraction(0, 1)
+            .withSignificantDigits(1, 3, UNUM_ROUNDING_PRIORITY_STRICT);
+        auto precisionRelaxed1133 = Precision::minMaxFraction(1, 1)
+            .withSignificantDigits(3, 3, UNUM_ROUNDING_PRIORITY_RELAXED);
+        auto precisionStrict1133 = Precision::minMaxFraction(1, 1)
+            .withSignificantDigits(3, 3, UNUM_ROUNDING_PRIORITY_STRICT);
+
+        auto messageBase = DoubleToUnicodeString(cas.input);
+
+        auto check = [&](
+            const char16_t* name,
+            const UnicodeString& expected,
+            const Precision& precision
+        ) {
+            assertEquals(
+                messageBase + name,
+                expected,
+                NumberFormatter::withLocale(Locale::getEnglish())
+                    .precision(precision)
+                    .grouping(UNUM_GROUPING_OFF)
+                    .formatDouble(cas.input, status)
+                    .toString(status)
+            );
+        };
+
+        check(u" Relaxed 0113", cas.expectedRelaxed0113, precisionRelaxed0113);
+        if (status.errIfFailureAndReset()) continue;
+
+        check(u" Strict 0113", cas.expectedStrict0113, precisionStrict0113);
+        if (status.errIfFailureAndReset()) continue;
+
+        check(u" Relaxed 1133", cas.expectedRelaxed1133, precisionRelaxed1133);
+        if (status.errIfFailureAndReset()) continue;
+
+        check(u" Strict 1133", cas.expectedStrict1133, precisionStrict1133);
+        if (status.errIfFailureAndReset()) continue;
+    }
+}
+
 void NumberFormatterApiTest::grouping() {
     assertFormatDescendingBig(
             u"Western Grouping",
@@ -5707,6 +6175,37 @@
     assertEquals("Copy Assigned capacity", 4, copyAssigned.mixedMeasures.getCapacity());
 }
 
+void NumberFormatterApiTest::formatUnitsAliases() {
+    IcuTestErrorCode status(*this, "formatUnitsAliases");
+
+    struct TestCase {
+        const MeasureUnit measureUnit;
+        const UnicodeString expectedFormat;
+    } testCases[]{
+        // Aliases
+        {MeasureUnit::getMilligramPerDeciliter(), u"2 milligrams per deciliter"},
+        {MeasureUnit::getLiterPer100Kilometers(), u"2 liters per 100 kilometers"},
+        {MeasureUnit::getPartPerMillion(), u"2 parts per million"},
+        {MeasureUnit::getMillimeterOfMercury(), u"2 millimeters of mercury"},
+
+        // Replacements
+        {MeasureUnit::getMilligramOfglucosePerDeciliter(), u"2 milligrams per deciliter"},
+        {MeasureUnit::forIdentifier("millimeter-ofhg", status), u"2 millimeters of mercury"},
+        {MeasureUnit::forIdentifier("liter-per-100-kilometer", status), u"2 liters per 100 kilometers"},
+        {MeasureUnit::forIdentifier("permillion", status), u"2 parts per million"},
+    };
+
+    for (const auto &testCase : testCases) {
+        UnicodeString actualFormat = NumberFormatter::withLocale(icu::Locale::getEnglish())
+                                         .unit(testCase.measureUnit)
+                                         .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
+                                         .formatDouble(2.0, status)
+                                         .toString(status);
+
+        assertEquals("test unit aliases", testCase.expectedFormat, actualFormat);
+    }
+}
+
 /* For skeleton comparisons: this checks the toSkeleton output for `f` and for
  * `conciseSkeleton` against the normalized version of `uskeleton` - this does
  * not round-trip uskeleton itself.
@@ -5882,7 +6381,7 @@
         // Only compare normalized skeletons: the tests need not provide the normalized forms.
         // Use the normalized form to construct the testing formatter to ensure no loss of info.
         UnicodeString normalized = NumberFormatter::forSkeleton(skeleton, status).toSkeleton(status);
-        assertEquals(message + ": Skeleton:", normalized, f.toSkeleton(status));
+        assertEquals(message + ": Skeleton", normalized, f.toSkeleton(status));
         LocalizedNumberFormatter l3 = NumberFormatter::forSkeleton(normalized, status).locale(locale);
         UnicodeString actual3 = l3.formatDouble(input, status).toString(status);
         assertEquals(message + ": Skeleton Path: '" + normalized + "': " + input, expected, actual3);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_decimalquantity.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -33,6 +33,7 @@
         TESTCASE_AUTO(testNickelRounding);
         TESTCASE_AUTO(testScientificAndCompactSuppressedExponent);
         TESTCASE_AUTO(testSuppressedExponentUnchangedByInitialScaling);
+        TESTCASE_AUTO(testDecimalQuantityParseFormatRoundTrip);
     TESTCASE_AUTO_END;
 }
 
@@ -101,8 +102,11 @@
     assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987654321E-6>");
     fq.roundToInfinity();
     assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987654321E-6>");
-    fq.roundToIncrement(0.005, RoundingMode::UNUM_ROUND_HALFEVEN, status);
+    fq.roundToIncrement(4, -3, RoundingMode::UNUM_ROUND_HALFEVEN, status);
     assertSuccess("Rounding to increment", status);
+    assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987656E-3>");
+    fq.roundToNickel(-3, RoundingMode::UNUM_ROUND_HALFEVEN, status);
+    assertSuccess("Rounding to nickel", status);
     assertToStringAndHealth(fq, u"<DecimalQuantity 2:-3 long 987655E-3>");
     fq.roundToMagnitude(-2, RoundingMode::UNUM_ROUND_HALFEVEN, status);
     assertSuccess("Rounding to magnitude", status);
@@ -317,7 +321,7 @@
                  {1.235, 3, RoundingMode::UNUM_ROUND_CEILING, true}};
 
     UErrorCode status = U_ZERO_ERROR;
-    for (TestCase cas : cases) {
+    for (const TestCase& cas : cases) {
         DecimalQuantity fq;
         fq.setToDouble(cas.d);
         assertTrue("Should be using approximate double", !fq.isExplicitExactDouble());
@@ -623,7 +627,7 @@
         // test the actual computed values of the plural operands
 
         double expectedNOperand = cas.expectedDouble;
-        double expectedIOperand = cas.expectedLong;
+        double expectedIOperand = static_cast<double>(cas.expectedLong);
         double expectedEOperand = cas.expectedSuppressedScientificExponent;
         double expectedCOperand = cas.expectedSuppressedCompactExponent;
         double actualNOperand = dq.getPluralOperand(PLURAL_OPERAND_N);
@@ -721,4 +725,52 @@
     }
 }
 
+
+void DecimalQuantityTest::testDecimalQuantityParseFormatRoundTrip() {
+    IcuTestErrorCode status(*this, "testDecimalQuantityParseFormatRoundTrip");
+    
+    struct TestCase {
+        UnicodeString numberString;
+    } cases[] = {
+        // number string
+        { u"0" },
+        { u"1" },
+        { u"1.0" },
+        { u"1.00" },
+        { u"1.1" },
+        { u"1.10" },
+        { u"-1.10" },
+        { u"0.0" },
+        { u"1c5" },
+        { u"1.0c5" },
+        { u"1.1c5" },
+        { u"1.10c5" },
+        { u"0.00" },
+        { u"0.1" },
+        { u"1c-1" },
+        { u"1.0c-1" }
+    };
+
+    for (const auto& cas : cases) {
+        UnicodeString numberString = cas.numberString;
+
+        DecimalQuantity dq = DecimalQuantity::fromExponentString(numberString, status);
+        UnicodeString roundTrip = dq.toExponentString();
+
+        assertEquals("DecimalQuantity format(parse(s)) should equal original s", numberString, roundTrip);
+    }
+
+    DecimalQuantity dq = DecimalQuantity::fromExponentString(u"1c0", status);
+    assertEquals("Zero ignored for visible exponent",
+                u"1",
+                dq.toExponentString());
+
+    dq.clear();
+    dq = DecimalQuantity::fromExponentString(u"1.0c0", status);
+    assertEquals("Zero ignored for visible exponent",
+                u"1.0",
+                dq.toExponentString());
+
+}
+
 #endif /* #if !UCONFIG_NO_FORMATTING */

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/numbertest_range.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -811,6 +811,28 @@
             expectedFieldPositions,
             UPRV_LENGTHOF(expectedFieldPositions));
     }
+
+    {
+        const char16_t* message = u"Field position with approximately sign";
+        const char16_t* expectedString = u"~-100";
+        FormattedNumberRange result = assertFormattedRangeEquals(
+            message,
+            NumberRangeFormatter::withLocale("en-us"),
+            -100,
+            -100,
+            expectedString);
+        static const UFieldPositionWithCategory expectedFieldPositions[] = {
+            // category, field, begin index, end index
+            {UFIELD_CATEGORY_NUMBER, UNUM_APPROXIMATELY_SIGN_FIELD, 0, 1},
+            {UFIELD_CATEGORY_NUMBER, UNUM_SIGN_FIELD, 1, 2},
+            {UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, 2, 5}};
+        checkMixedFormattedValue(
+            message,
+            result,
+            expectedString,
+            expectedFieldPositions,
+            UPRV_LENGTHOF(expectedFieldPositions));
+    }
 }
 
 void NumberRangeFormatterTest::testCopyMove() {

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/numfmtst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -3357,6 +3357,7 @@
 
 void NumberFormatTest::checkRounding(DecimalFormat* df, double base, int iterations, double increment) {
     df->setRoundingIncrement(increment);
+    assertEquals("Rounding increment round-trip", increment, df->getRoundingIncrement());
     double lastParsed=INT32_MIN; //Intger.MIN_VALUE
     for (int i=-iterations; i<=iterations;i++) {
         double iValue=base+(increment*(i*0.1));
@@ -4889,9 +4890,9 @@
         "Peruvian soles1.00",
         "Peruvian sol (1863\\u20131965)1.00",
         "Peruvian soles (1863\\u20131965)1.00",
-        "Philippine Piso1.00",
-        "Philippine piso1.00",
-        "Philippine pisos1.00",
+        "Philippine Peso1.00",
+        "Philippine peso1.00",
+        "Philippine pesos1.00",
         "Platinum1.00",
         "Platinum1.00",
         "Polish Zloty (1950\\u20131995)1.00",
@@ -5826,9 +5827,9 @@
         "1.00 Peruvian soles random",
         "1.00 Peruvian sol (1863\\u20131965) random",
         "1.00 Peruvian soles (1863\\u20131965) random",
-        "1.00 Philippine Piso random",
-        "1.00 Philippine piso random",
-        "1.00 Philippine pisos random",
+        "1.00 Philippine Peso random",
+        "1.00 Philippine peso random",
+        "1.00 Philippine pesos random",
         "1.00 Platinum random",
         "1.00 Platinum random",
         "1.00 Polish Zloty (1950\\u20131995) random",

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/plurults.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -919,7 +919,7 @@
         const int64_t inputNum = cas.inputNum;
         const double expVal = cas.expVal;
 
-        FixedDecimal fd(inputNum);
+        FixedDecimal fd(static_cast<double>(inputNum));
         UnicodeString message(u"FixedDecimal::doubleValue() for" + Int64ToUnicodeString(inputNum));
         assertEquals(message, expVal, fd.doubleValue());
     }
@@ -963,7 +963,7 @@
         const int64_t inputNum = cas.inputNum;
         const int64_t expVal = cas.expVal;
 
-        FixedDecimal fd(inputNum);
+        FixedDecimal fd(static_cast<double>(inputNum));
         UnicodeString message(u"FixedDecimal::longValue() for" + Int64ToUnicodeString(inputNum));
         assertEquals(message, expVal, fd.longValue());
     }
@@ -982,7 +982,7 @@
         const double inputNum = cas.inputNum;
         const int64_t expVal = cas.expVal;
 
-        FixedDecimal fd(inputNum);
+        FixedDecimal fd(static_cast<double>(inputNum));
         UnicodeString message(u"FixedDecimal::longValue() for" + DoubleToUnicodeString(inputNum));
         assertEquals(message, expVal, fd.longValue());
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -149,6 +149,10 @@
     TESTCASE_AUTO(TestTraceCreateLineNormal);
     TESTCASE_AUTO(TestTraceCreateLineLoose);
     TESTCASE_AUTO(TestTraceCreateLineStrict);
+    TESTCASE_AUTO(TestTraceCreateLineNormalPhrase);
+    TESTCASE_AUTO(TestTraceCreateLineLoosePhrase);
+    TESTCASE_AUTO(TestTraceCreateLineStrictPhrase);
+    TESTCASE_AUTO(TestTraceCreateLinePhrase);
     TESTCASE_AUTO(TestTraceCreateBreakEngine);
 #endif
 
@@ -5144,7 +5148,7 @@
     LocalPointer<BreakIterator> brkitr(
         BreakIterator::createLineInstance("zh-CN", status));
     status.errIfFailureAndReset();
-    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "");
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line");
 }
 
 void RBBITest::TestTraceCreateLineStrict(void) {
@@ -5153,7 +5157,7 @@
     LocalPointer<BreakIterator> brkitr(
         BreakIterator::createLineInstance("zh-CN-u-lb-strict", status));
     status.errIfFailureAndReset();
-    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "strict");
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_strict");
 }
 
 void RBBITest::TestTraceCreateLineNormal(void) {
@@ -5162,7 +5166,7 @@
     LocalPointer<BreakIterator> brkitr(
         BreakIterator::createLineInstance("zh-CN-u-lb-normal", status));
     status.errIfFailureAndReset();
-    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "normal");
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_normal");
 }
 
 void RBBITest::TestTraceCreateLineLoose(void) {
@@ -5171,9 +5175,45 @@
     LocalPointer<BreakIterator> brkitr(
         BreakIterator::createLineInstance("zh-CN-u-lb-loose", status));
     status.errIfFailureAndReset();
-    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "loose");
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_loose");
 }
 
+void RBBITest::TestTraceCreateLineLoosePhrase(void) {
+    SetupTestTrace();
+    IcuTestErrorCode status(*this, "TestTraceCreateLineLoosePhrase");
+    LocalPointer<BreakIterator> brkitr(
+        BreakIterator::createLineInstance("ja-u-lb-loose-lw-phrase", status));
+    status.errIfFailureAndReset();
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_loose_phrase");
+}
+
+void RBBITest::TestTraceCreateLineNormalPhrase(void) {
+    SetupTestTrace();
+    IcuTestErrorCode status(*this, "TestTraceCreateLineNormalPhrase");
+    LocalPointer<BreakIterator> brkitr(
+        BreakIterator::createLineInstance("ja-u-lb-normal-lw-phrase", status));
+    status.errIfFailureAndReset();
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_normal_phrase");
+}
+
+void RBBITest::TestTraceCreateLineStrictPhrase(void) {
+    SetupTestTrace();
+    IcuTestErrorCode status(*this, "TestTraceCreateLineStrictPhrase");
+    LocalPointer<BreakIterator> brkitr(
+        BreakIterator::createLineInstance("ja-u-lb-strict-lw-phrase", status));
+    status.errIfFailureAndReset();
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_strict_phrase");
+}
+
+void RBBITest::TestTraceCreateLinePhrase(void) {
+    SetupTestTrace();
+    IcuTestErrorCode status(*this, "TestTraceCreateLinePhrase");
+    LocalPointer<BreakIterator> brkitr(
+        BreakIterator::createLineInstance("ja-u-lw-phrase", status));
+    status.errIfFailureAndReset();
+    assertTestTraceResult(UTRACE_UBRK_CREATE_LINE, "line_phrase");
+}
+
 void RBBITest::TestTraceCreateBreakEngine(void) {
     rbbi_cleanup();
     SetupTestTrace();

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/rbbitst.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -105,6 +105,10 @@
     void TestTraceCreateLineNormal();
     void TestTraceCreateLineStrict();
     void TestTraceCreateLineLoose();
+    void TestTraceCreateLineNormalPhrase();
+    void TestTraceCreateLineLoosePhrase();
+    void TestTraceCreateLineStrictPhrase();
+    void TestTraceCreateLinePhrase();
     void TestTraceCreateBreakEngine();
 #endif
 

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/strcase.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -51,6 +51,7 @@
                         void *iter, const char *localeID, uint32_t options);
     void TestCasing();
     void TestTitleOptions();
+    void TestDutchTitle();
     void TestFullCaseFoldingIterator();
     void TestGreekUpper();
     void TestArmenian();
@@ -95,6 +96,7 @@
 #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
     TESTCASE_AUTO(TestCasing);
     TESTCASE_AUTO(TestTitleOptions);
+    TESTCASE_AUTO(TestDutchTitle);
 #endif
     TESTCASE_AUTO(TestFullCaseFoldingIterator);
     TESTCASE_AUTO(TestGreekUpper);
@@ -451,6 +453,7 @@
     }
     if(result!=output) {
         dataerrln("error: UnicodeString.%s() got a wrong result for a test case from casing.res", name);
+        dataerrln(UnicodeString("input = [") + input + "], expected = [" + output + "], actual = [" + result + "]");
     }
 #if !UCONFIG_NO_BREAK_ITERATION
     if(whichCase==TEST_TITLE && options==0) {
@@ -667,6 +670,106 @@
 #endif
 }
 
+#if !UCONFIG_NO_BREAK_ITERATION
+void StringCaseTest::TestDutchTitle() {
+    IcuTestErrorCode errorCode(*this, "TestDutchTitle");
+
+    Locale nl("nl");  // Dutch
+    LocalPointer<BreakIterator> iter(
+        BreakIterator::createWordInstance(nl, errorCode));
+    
+    // Dutch titlecase check in English
+    TestCasingImpl(
+        u"ijssel igloo IJMUIDEN",
+        u"Ijssel Igloo Ijmuiden",
+        TEST_TITLE,
+        nullptr, 
+        "en",
+        0);
+
+    // Dutch titlecase check in Dutch
+    TestCasingImpl(
+        u"ijssel igloo IJMUIDEN", 
+        u"IJssel Igloo IJmuiden", 
+        TEST_TITLE,
+        nullptr, 
+        "nl",
+        0);
+
+    // Dutch titlecase check in Dutch with nolowercase option
+    if (U_SUCCESS(errorCode)) {
+        iter->setText(u"ijssel igloo IjMUIdEN iPoD ijenough");
+        TestCasingImpl(
+            u"ijssel igloo IjMUIdEN iPoD ijenough", 
+            u"IJssel Igloo IJMUIdEN IPoD IJenough", 
+            TEST_TITLE,
+            nullptr, 
+            "nl",
+            U_TITLECASE_NO_LOWERCASE);
+    }
+
+    errorCode.reset();
+
+    // Accented IJ testing
+
+    struct dutchTitleTestCase {
+        const UnicodeString input;
+        const UnicodeString expectedFull;
+        const UnicodeString expectedOnlyChanged;
+    } dutchTitleTestCases[] = {
+        // input,            expectedFull,      expectedOnlyChanged
+        {u"ij",              u"IJ",             u"IJ"},
+        {u"IJ",              u"IJ",             u""},
+        {u"íj́",              u"ÍJ́",             u"ÍJ"},
+        {u"ÍJ́",              u"ÍJ́",             u""},
+        {u"íJ́",              u"ÍJ́",             u"Í"},
+        {u"Ij́",              u"Ij́",             u""},
+        {u"ij́",              u"Ij́",             u"I"},
+        {u"ïj́",              u"Ïj́",             u"Ï"},
+        {u"íj\u0308",        u"Íj\u0308",       u"Í"},
+        {u"íj́\U0001D16E",    u"Íj́\U0001D16E",   u"Í"},
+        {u"íj\u1ABE",        u"Íj\u1ABE",       u"Í"},
+
+        {u"ijabc",              u"IJabc",             u"IJ"},
+        {u"IJabc",              u"IJabc",             u""},
+        {u"íj́abc",              u"ÍJ́abc",             u"ÍJ"},
+        {u"ÍJ́abc",              u"ÍJ́abc",             u""},
+        {u"íJ́abc",              u"ÍJ́abc",             u"Í"},
+        {u"Ij́abc",              u"Ij́abc",             u""},
+        {u"ij́abc",              u"Ij́abc",             u"I"},
+        {u"ïj́abc",              u"Ïj́abc",             u"Ï"},
+        {u"íjabc\u0308",        u"Íjabc\u0308",       u"Í"},
+        {u"íj́abc\U0001D16E",    u"ÍJ́abc\U0001D16E",   u"ÍJ"},
+        {u"íjabc\u1ABE",        u"Íjabc\u1ABE",       u"Í"},
+
+        // Bug ICU-21919
+        {u"Í",                  u"Í",                 u""},
+    };
+
+    for (const auto& cas : dutchTitleTestCases) {
+        const UnicodeString &input = cas.input;
+        const UnicodeString &expectedFull = cas.expectedFull;
+        const UnicodeString &expectedOnlyChanged = cas.expectedOnlyChanged;
+
+        for (const auto& isOnlyChanged : {true, false}) {
+            uint32_t testOptions = U_TITLECASE_NO_LOWERCASE
+                | (isOnlyChanged ? U_OMIT_UNCHANGED_TEXT : 0);
+            
+            const UnicodeString &expected = isOnlyChanged ? expectedOnlyChanged : expectedFull;
+            
+            TestCasingImpl(
+                input,
+                expected,
+                TEST_TITLE,
+                nullptr,
+                "nl",
+                testOptions
+            );
+        }
+    }
+}
+#endif
+
 void
 StringCaseTest::TestFullCaseFoldingIterator() {
     UnicodeString ffi=UNICODE_STRING_SIMPLE("ffi");

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/tmsgfmt.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -2051,7 +2051,7 @@
     UDate date = LocaleTest::date(2021-1900, UCAL_NOVEMBER, 23, 16, 42, 55);
 
     doTheRealDateTimeSkeletonTesting(date, u"{0,date,::MMMMd}", "en", u"November 23", status);
-    doTheRealDateTimeSkeletonTesting(date, u"{0,date,::yMMMMdjm}", "en", u"November 23, 2021, 4:42 PM", status);
+    doTheRealDateTimeSkeletonTesting(date, u"{0,date,::yMMMMdjm}", "en", u"November 23, 2021 at 4:42 PM", status);
     doTheRealDateTimeSkeletonTesting(date, u"{0,date,   ::   yMMMMd   }", "en", u"November 23, 2021", status);
     doTheRealDateTimeSkeletonTesting(date, u"{0,date,::yMMMMd}", "fr", u"23 novembre 2021", status);
     doTheRealDateTimeSkeletonTesting(date, u"Expiration: {0,date,::yMMM}!", "en", u"Expiration: Nov 2021!", status);
@@ -2065,7 +2065,7 @@
     UDate date = LocaleTest::date(2021-1900, UCAL_NOVEMBER, 23, 16, 42, 55);
 
     doTheRealDateTimeSkeletonTesting(date, u"{0,time,::MMMMd}", "en", u"November 23", status);
-    doTheRealDateTimeSkeletonTesting(date, u"{0,time,::yMMMMdjm}", "en", u"November 23, 2021, 4:42 PM", status);
+    doTheRealDateTimeSkeletonTesting(date, u"{0,time,::yMMMMdjm}", "en", u"November 23, 2021 at 4:42 PM", status);
     doTheRealDateTimeSkeletonTesting(date, u"{0,time,   ::   yMMMMd   }", "en", u"November 23, 2021", status);
     doTheRealDateTimeSkeletonTesting(date, u"{0,time,::yMMMMd}", "fr", u"23 novembre 2021", status);
     doTheRealDateTimeSkeletonTesting(date, u"Expiration: {0,time,::yMMM}!", "en", u"Expiration: Nov 2021!", status);

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/transtst.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -3639,7 +3639,7 @@
                 
                 Transliterator *t = Transliterator::createInstance(id, UTRANS_FORWARD, err, status);
                 if (U_FAILURE(status)) {
-                    dataerrln((UnicodeString)"FAIL: Could not create " + id);
+                    dataerrln((UnicodeString)"FAIL: Could not create " + id + ", status " + u_errorName(status));
                     delete t;
                     continue;
                 }
@@ -3654,19 +3654,38 @@
                     // 1. Devanagari-Arabic
                     // 2. Any-*/BGN
                     // 2a. Any-*/BGN_1981
-                    // 3. Any-*/UNGEGN
-                    // 4. Any-*/MNS
-                    // If UCONFIG_NO_BREAK_ITERATION is on, Latin-Thai is also not expected to work.
+                    // 3. Any-*/MNS
+                    //
+                    // 4. If UCONFIG_NO_BREAK_ITERATION is on, Latin-Thai is also not expected to work.
+                    //
+                    // The following are direction="both" transforms with variants, inverting the Any-Xxxx/Variant for
+                    // any of these does not work; see ICU-21911 (not sure whether this is intentional or an ICU bug).
+                    // Unfortunately we do not easily have the info at this point as to whether the original transform
+                    // had direction="both" specified.
+                    // 5. Any-*/UNGEGN
+                    // 6. Any-Ethiopic/*
+                    // 7. Any-Braille/*
+                    // 8. Any-*/Gurage_2013
+                    // 9. Any-*/Gutgarts
+                    // 10. Any-*/Tekie_Alibekit
+                    // 11. Any-*/Xaleget
+                    //
                     if (    id.compare((UnicodeString)"Devanagari-Arabic/") != 0
                          && !(id.startsWith((UnicodeString)"Any-") &&
-                                (id.endsWith((UnicodeString)"/BGN") || id.endsWith((UnicodeString)"/BGN_1981") || id.endsWith((UnicodeString)"/UNGEGN") || id.endsWith((UnicodeString)"/MNS"))
+                                (id.endsWith((UnicodeString)"/BGN") || id.endsWith((UnicodeString)"/BGN_1981") || id.endsWith((UnicodeString)"/MNS"))
                              )
 #if UCONFIG_NO_BREAK_ITERATION
                          && id.compare((UnicodeString)"Latin-Thai/") != 0
 #endif
+                         && !(logKnownIssue("21911", "ICU4C cannot create inverse of Any-Xxxx/Variant transform created from both-direction transform") &&
+                                id.startsWith((UnicodeString)"Any-") &&
+                                (id.endsWith((UnicodeString)"/UNGEGN") || id.startsWith((UnicodeString)"Any-Ethiopic/") || id.startsWith((UnicodeString)"Any-Braille/") ||
+                                 id.endsWith((UnicodeString)"/Gurage_2013") || id.endsWith((UnicodeString)"/Gutgarts") || id.endsWith((UnicodeString)"/Tekie_Alibekit") ||
+                                 id.endsWith((UnicodeString)"/Xaleget"))
+                             )
                        )
                     {
-                        errln((UnicodeString)"FAIL: Could not create inverse of " + id);
+                        errln((UnicodeString)"FAIL: Could not create inverse of " + id + ", status " + u_errorName(status));
                     }
                     delete t;
                     delete inv;

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/tztest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -906,7 +906,7 @@
         {"AET", 600, TRUE},   // ICU Link - Australia/Sydney
         {"SST", 660, FALSE},  // ICU Link - Pacific/Guadalcanal
         {"NST", 720, TRUE},   // ICU Link - Pacific/Auckland
-        {"MIT", 780, TRUE},   // ICU Link - Pacific/Apia
+        {"MIT", 780, FALSE},  // ICU Link - Pacific/Apia
 
         {"Etc/Unknown", 0, FALSE},  // CLDR
 
@@ -2036,12 +2036,20 @@
 
 void TimeZoneTest::TestCanonicalID() {
 
-    // Some canonical IDs in CLDR are defined as "Link"
-    // in Olson tzdata.
+    // Olson (IANA) tzdata used to have very few "Link"s long time ago.
+    // This test case was written when most of CLDR canonical time zones are
+    // defined as independent "Zone" in the TZ database.
+    // Since then, the TZ maintainer found some historic rules in mid 20th century
+    // were not really reliable, and many zones are now sharing rules.
+    // As of TZ database release 2022a, there are quite a lot of zones defined
+    // by "Link" to another zone, so the exception table below becomes really
+    // big. It might be still useful to make sure CLDR zone aliases are consistent
+    // with zone rules.
     static const struct {
-        const char *alias;
-        const char *zone;
+        const char *alias;  // link-from
+        const char *zone;   // link-to (A zone ID with "Zone" rule)
     } excluded1[] = {
+        {"Africa/Accra", "Africa/Abidjan"},
         {"Africa/Addis_Ababa", "Africa/Nairobi"},
         {"Africa/Asmera", "Africa/Nairobi"},
         {"Africa/Bamako", "Africa/Abidjan"},
@@ -2076,35 +2084,43 @@
         {"Africa/Ouagadougou", "Africa/Abidjan"},
         {"Africa/Porto-Novo", "Africa/Lagos"},
         {"Africa/Sao_Tome", "Africa/Abidjan"},
-        {"America/Antigua", "America/Port_of_Spain"},
-        {"America/Anguilla", "America/Port_of_Spain"},
+        {"America/Antigua", "America/Puerto_Rico"},
+        {"America/Anguilla", "America/Puerto_Rico"},
+        {"America/Aruba", "America/Puerto_Rico"},
+        {"America/Atikokan", "America/Panama"},
+        {"America/Blanc-Sablon", "America/Puerto_Rico"},
         {"America/Cayman", "America/Panama"},
         {"America/Coral_Harbour", "America/Panama"},
-        {"America/Curacao", "America/Aruba"},
-        {"America/Dominica", "America/Port_of_Spain"},
-        {"America/Grenada", "America/Port_of_Spain"},
-        {"America/Guadeloupe", "America/Port_of_Spain"},
-        {"America/Kralendijk", "America/Aruba"},
-        {"America/Lower_Princes", "America/Aruba"},
-        {"America/Marigot", "America/Port_of_Spain"},
-        {"America/Montserrat", "America/Port_of_Spain"},
+        {"America/Creston", "America/Phoenix"},
+        {"America/Curacao", "America/Puerto_Rico"},
+        {"America/Dominica", "America/Puerto_Rico"},
+        {"America/Grenada", "America/Puerto_Rico"},
+        {"America/Guadeloupe", "America/Puerto_Rico"},
+        {"America/Kralendijk", "America/Puerto_Rico"},
+        {"America/Lower_Princes", "America/Puerto_Rico"},
+        {"America/Marigot", "America/Puerto_Rico"},
+        {"America/Montreal", "America/Toronto"},
+        {"America/Montserrat", "America/Puerto_Rico"},
+        {"America/Nassau", "America/Toronto"},
+        {"America/Port_of_Spain", "America/Puerto_Rico"},
         {"America/Santa_Isabel", "America/Tijuana"},
         {"America/Shiprock", "America/Denver"},
-        {"America/St_Barthelemy", "America/Port_of_Spain"},
-        {"America/St_Kitts", "America/Port_of_Spain"},
-        {"America/St_Lucia", "America/Port_of_Spain"},
-        {"America/St_Thomas", "America/Port_of_Spain"},
-        {"America/St_Vincent", "America/Port_of_Spain"},
-        {"America/Toronto", "America/Montreal"},
-        {"America/Tortola", "America/Port_of_Spain"},
+        {"America/St_Barthelemy", "America/Puerto_Rico"},
+        {"America/St_Kitts", "America/Puerto_Rico"},
+        {"America/St_Lucia", "America/Puerto_Rico"},
+        {"America/St_Thomas", "America/Puerto_Rico"},
+        {"America/St_Vincent", "America/Puerto_Rico"},
+        {"America/Tortola", "America/Puerto_Rico"},
         {"America/Virgin", "America/Puerto_Rico"},
+        {"Antarctica/DumontDUrville", "Pacific/Port_Moresby"},
         {"Antarctica/South_Pole", "Antarctica/McMurdo"},
+        {"Antarctica/Syowa", "Asia/Riyadh"},
         {"Arctic/Longyearbyen", "Europe/Oslo"},
-        {"Asia/Kuwait", "Asia/Aden"},
+        {"Asia/Aden", "Asia/Riyadh"},
+        {"Asia/Kuwait", "Asia/Riyadh"},
         {"Asia/Muscat", "Asia/Dubai"},
         {"Asia/Phnom_Penh", "Asia/Bangkok"},
         {"Asia/Qatar", "Asia/Bahrain"},
-        {"Asia/Riyadh", "Asia/Aden"},
         {"Asia/Vientiane", "Asia/Bangkok"},
         {"Atlantic/Jan_Mayen", "Europe/Oslo"},
         {"Atlantic/St_Helena", "Africa/Abidjan"},

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/units_test.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/units_test.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/units_test.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -325,6 +325,12 @@
         // Fuel Consumption
         {"cubic-meter-per-meter", "mile-per-gallon", 2.1383143939394E-6, 1.1},
         {"cubic-meter-per-meter", "mile-per-gallon", 2.6134953703704E-6, 0.9},
+        {"liter-per-100-kilometer", "mile-per-gallon", 6.6, 35.6386},
+        {"liter-per-100-kilometer", "mile-per-gallon", 0, uprv_getInfinity()},
+        {"mile-per-gallon", "liter-per-100-kilometer", 0, uprv_getInfinity()},
+        {"mile-per-gallon", "liter-per-100-kilometer", uprv_getInfinity(), 0},
+        // We skip testing -Inf, because the inverse conversion loses the sign:
+        // {"mile-per-gallon", "liter-per-100-kilometer", -uprv_getInfinity(), 0},
 
         // Test Aliases
         // Alias is just another name to the same unit. Therefore, converting
@@ -348,33 +354,31 @@
             continue;
         }
 
+        double maxDelta = 1e-6 * uprv_fabs(testCase.expectedValue);
+        if (testCase.expectedValue == 0) {
+            maxDelta = 1e-12;
+        }
+        double inverseMaxDelta = 1e-6 * uprv_fabs(testCase.inputValue);
+        if (testCase.inputValue == 0) {
+            inverseMaxDelta = 1e-12;
+        }
+
         ConversionRates conversionRates(status);
         if (status.errIfFailureAndReset("conversionRates(status)")) {
             continue;
         }
+
         UnitsConverter converter(source, target, conversionRates, status);
         if (status.errIfFailureAndReset("UnitsConverter(<%s>, <%s>, ...)", testCase.source,
                                         testCase.target)) {
             continue;
         }
-
-        double maxDelta = 1e-6 * uprv_fabs(testCase.expectedValue);
-        if (testCase.expectedValue == 0) {
-            maxDelta = 1e-12;
-        }
         assertEqualsNear(UnicodeString("testConverter: ") + testCase.source + " to " + testCase.target,
                          testCase.expectedValue, converter.convert(testCase.inputValue), maxDelta);
-
-        maxDelta = 1e-6 * uprv_fabs(testCase.inputValue);
-        if (testCase.inputValue == 0) {
-            maxDelta = 1e-12;
-        }
         assertEqualsNear(
             UnicodeString("testConverter inverse: ") + testCase.target + " back to " + testCase.source,
-            testCase.inputValue, converter.convertInverse(testCase.expectedValue), maxDelta);
+            testCase.inputValue, converter.convertInverse(testCase.expectedValue), inverseMaxDelta);
 
-
-        // TODO: Test UnitsConverter created using CLDR separately.
         // Test UnitsConverter created by CLDR unit identifiers
         UnitsConverter converter2(testCase.source, testCase.target, status);
         if (status.errIfFailureAndReset("UnitsConverter(<%s>, <%s>, ...)", testCase.source,
@@ -381,21 +385,11 @@
                                         testCase.target)) {
             continue;
         }
-
-        maxDelta = 1e-6 * uprv_fabs(testCase.expectedValue);
-        if (testCase.expectedValue == 0) {
-            maxDelta = 1e-12;
-        }
         assertEqualsNear(UnicodeString("testConverter2: ") + testCase.source + " to " + testCase.target,
                          testCase.expectedValue, converter2.convert(testCase.inputValue), maxDelta);
-
-        maxDelta = 1e-6 * uprv_fabs(testCase.inputValue);
-        if (testCase.inputValue == 0) {
-            maxDelta = 1e-12;
-        }
         assertEqualsNear(
             UnicodeString("testConverter2 inverse: ") + testCase.target + " back to " + testCase.source,
-            testCase.inputValue, converter2.convertInverse(testCase.expectedValue), maxDelta);
+            testCase.inputValue, converter2.convertInverse(testCase.expectedValue), inverseMaxDelta);
     }
 }
 
@@ -647,6 +641,16 @@
           Measure(2.1, MeasureUnit::createMeter(status), status)},
          2,
          0.001},
+
+        // Negative numbers
+        {"Negative number conversion",
+         "yard",
+         "mile-and-yard",
+         -1800,
+         {Measure(-1, MeasureUnit::createMile(status), status),
+          Measure(-40, MeasureUnit::createYard(status), status)},
+         2,
+         1e-10},
     };
     status.assertSuccess();
 
@@ -694,11 +698,7 @@
         ComplexUnitsConverter converter2( testCase.input, testCase.output, status);
         testATestCase(converter2, "ComplexUnitsConverter #1 " , testCase);
     }
-    
-    
     status.assertSuccess();
-
-    // TODO(icu-units#63): test negative numbers!
 }
 
 void UnitsTest::testComplexUnitsConverterSorting() {

Modified: trunk/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/intltest/ustrtest.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1653,6 +1653,16 @@
     if(test1>=test2 || !(test2>test1) || test1.compare(test2)>=0 || !(test2.compare(test1)>0)) {
         errln("bogus<empty failed");
     }
+
+    // test that copy constructor of bogus is bogus & clone of bogus is nullptr
+    {
+        test3.setToBogus();
+        UnicodeString test3Copy(test3);
+        UnicodeString *test3Clone = test3.clone();
+        assertTrue(WHERE, test3.isBogus());
+        assertTrue(WHERE, test3Copy.isBogus());
+        assertTrue(WHERE, test3Clone == nullptr);
+    }
 }
 
 // StringEnumeration ------------------------------------------------------- ***
@@ -2354,7 +2364,7 @@
         } else if (total <= INT32_MAX) {
             // Check that a string of exactly the maximum size works
             UnicodeString str2;
-            int32_t remain = INT32_MAX - total;
+            int32_t remain = static_cast<int32_t>(INT32_MAX - total);
             char16_t *buf2 = str2.getBuffer(remain);
             if (buf2 == nullptr) {
                 // if somehow memory allocation fail, return the test

Modified: trunk/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/iotest/strtst.c	2022-05-31 01:17:15 UTC (rev 63452)
@@ -315,9 +315,10 @@
 #if !UCONFIG_NO_FORMATTING
 #define Test_u_snprintf(limit, format, value, expectedSize, expectedStr) UPRV_BLOCK_MACRO_BEGIN { \
     u_uastrncpy(testStr, "xxxxxxxxxxxxxx", UPRV_LENGTHOF(testStr));\
-    size = u_snprintf(testStr, limit, format, value);\
+    size = u_snprintf(0, 0, format, value);\
+    written = u_snprintf(testStr, limit, format, value);\
     u_austrncpy(cTestResult, testStr, UPRV_LENGTHOF(cTestResult));\
-    if (size != expectedSize || strcmp(cTestResult, expectedStr) != 0) {\
+    if (size != written || size != expectedSize || strcmp(cTestResult, expectedStr) != 0) {\
         log_err("Unexpected formatting. size=%d expectedSize=%d cTestResult=%s expectedStr=%s\n",\
             size, expectedSize, cTestResult, expectedStr);\
     }\
@@ -332,7 +333,7 @@
 #if !UCONFIG_NO_FORMATTING
     UChar testStr[256];
     char cTestResult[256];
-    int32_t size;
+    int32_t size, written;
 
     Test_u_snprintf(0, "%d", 123, 3, "xxxxxxxxxxxxxx");
     Test_u_snprintf(2, "%d", 123, 3, "12xxxxxxxxxxxx");

Modified: trunk/Build/source/libs/icu/icu-src/source/test/perf/Makefile.in
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/perf/Makefile.in	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/perf/Makefile.in	2022-05-31 01:17:15 UTC (rev 63452)
@@ -22,7 +22,7 @@
 ## Files to remove for 'make clean'
 CLEANFILES = *~
 
-SUBDIRS = collationperf collperf collperf2 charperf dicttrieperf localecanperf normperf ubrkperf unisetperf usetperf ustrperf utfperf utrie2perf DateFmtPerf howExpensiveIs
+SUBDIRS = collationperf collperf collperf2 charperf dicttrieperf localecanperf normperf strsrchperf ubrkperf unisetperf usetperf ustrperf utfperf utrie2perf DateFmtPerf howExpensiveIs
 
 # Subdirs that support 'xperf'
 XSUBDIRS = DateFmtPerf
@@ -38,10 +38,7 @@
 
 ## List of standard targets
 everything: all-recursive all-local
-all:
-ifneq ($(RECURSIVE),YES)
-	@echo simply use \`make\' \(or \`make everything\'\) to do all
-endif
+all: everything
 
 install: install-recursive install-local
 clean: clean-recursive clean-local

Modified: trunk/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/perf/charperf/charperf.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -81,7 +81,6 @@
     else {
         MAX_ = 0xffff;
     }
-    printf("MAX_ size will be 0x%x\n", MAX_);
     if (options[MIN_OPTION_].doesOccur) {
         MIN_ = atoi(options[MIN_OPTION_].value);
     }

Modified: trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/Makefile.in
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/Makefile.in	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/Makefile.in	2022-05-31 01:17:15 UTC (rev 63452)
@@ -20,7 +20,7 @@
 CLEANFILES = *~ $(DEPS)
 
 ## Target information
-TARGET = stringperf
+TARGET = ustrperf
 
 CPPFLAGS += -I$(top_srcdir)/common -I$(top_srcdir)/tools/toolutil -I$(top_srcdir)/tools/ctestfw
 LIBS = $(LIBCTESTFW) $(LIBICUI18N) $(LIBICUUC) $(LIBICUTOOLUTIL) $(DEFAULT_LIBS) $(LIB_M)

Modified: trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.h
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.h	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/perf/ustrperf/stringperf.h	2022-05-31 01:17:15 UTC (rev 63452)
@@ -444,7 +444,6 @@
 
     utimer_getTime(&mystop);
     double mytime = utimer_getDeltaSeconds(&mystart,&mystop);
-    printf("\nmytime=%f \n", mytime);
 
     *catICU += uCatenate_STR;
 }
@@ -533,7 +532,6 @@
 
     utimer_getTime(&mystop);
     double mytime = utimer_getDeltaSeconds(&mystart,&mystop);
-    printf("\nmytime=%f \n", mytime);
 
 }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_loose_cj.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -20,7 +20,8 @@
 #         line-break=loose (BCP47 -u-lb-loose) as defined for Chinese & Japanese.
 #         It sets characters of class CJ to behave like ID.
 #         In addition, it allows breaks:
-#         * before hyphens 2010 & 2013 (both BA) and 301C, 30A0 (both NS)
+#         * between ID and hyphens 2010 & 2013 (both BA)
+#         * before 301C, 30A0 (both NS)
 #         * before iteration marks 3005, 303B, 309D, 309E, 30FD, 30FE (all NS)
 #         * between characters of LineBreak class IN such as 2026
 #         * before some centered punct 203C, 2047, 2048, 2049, 30FB, FF1A, FF1B,
@@ -200,8 +201,9 @@
 
 LB21a:       HL CM* (HY | BA | BAX) CM* [^CM CB]?;
 
-LB21.1:      . CM* [BA HY NS];
-LB21.2:      BB CM* [^CM CB];
+LB21.1:      [^ID] CM* [BA BAX HY NS];
+LB21.2:      ID CM* [BA HY NS];
+LB21.3:      BB CM* [^CM CB];
 
 LB21b:       SY CM* HL;
 
@@ -236,9 +238,9 @@
 LB30.2:      CP30 CM* (AL | HL | NU);
 
 # LB30a  keep pairs of RI together.
-LB30a.1:     RI CM* RI         ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HY NS IN CM];
-LB30a.2:     RI CM* RI CM* CMS ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA HY NS IN CM];
-LB30a.3:     RI CM* RI CM* [BK CR LF NL SP ZW WJ GL CL CP EX IS SY QU BA HY NS IN ZWJ]?;
+LB30a.1:     RI CM* RI         ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA BAX HY NS IN CM];
+LB30a.2:     RI CM* RI CM* CMS ÷ [^BK CR LF NL SP ZW WJ CL CP EX IS SY GL QU BA BAX HY NS IN CM];
+LB30a.3:     RI CM* RI CM* [BK CR LF NL SP ZW WJ GL CL CP EX IS SY QU BA BAX HY NS IN ZWJ]?;
 
 # LB30b Do not break between Emoji Base (or potential emoji) and Emoji Modifier
 LB30b.1:       EB CM* EM;

Modified: trunk/Build/source/libs/icu/icu-src/source/test/testdata/break_rules/line_normal_cj.txt
===================================================================
(Binary files differ)

Modified: trunk/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/testdata/rbbitst.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -796,6 +796,9 @@
 <word>
 <data>•ジョージア<400> •</data>
 
+<word>
+<data>•[<0>携帯<400>電話<400>]<0>お金<400>が<400>かかる<400>ん<400>です<400>。<0></data>
+
 # Test for #11723
 <word>
 <data>•アレルギー性<400>結膜炎<400></data>
@@ -1445,6 +1448,9 @@
 <data>•ກວາກຊວາກ•ກະເຈາະກະຈອກ•</data>
 <data>•ກະຊວງປ້ອງກັນຄວາມສະຫງົບ•</data>
 <data>•ໄຮ•ໄຮ່•ໄຮ້•</data>
+# Checks for ICU-21409 (and ICU-21384)
+<line>
+<data>•ຣະຄັງ•ຣະມາ•ລູຊີເຟີ•</data>
 
 ##########################################################################################
 #
@@ -1643,11 +1649,17 @@
 #     •brk OK before 3063               •brk OK before 301C •no brk btw 2026   •no brk before FF01•
 <data>•\u3084•\u3063•\u3071•\u308A\u0020•\u0031•\u301C\u0020•\u2026\u2026\u0020•\u30A2\uFF01\u0020•</data>
 
+#     •no brk before 2010                                 •
+<data>•\u3042\u2010•\u0031\u0020•\u0061\u2010•\u0031\u0020•</data>
+
 <locale ja at lb=loose>
 <line>
 #     •brk OK before 3063               •brk OK before 301C •brk OK btw 2026    •brk OK before FF01•
 <data>•\u3084•\u3063•\u3071•\u308A\u0020•\u0031•\u301C\u0020•\u2026•\u2026\u0020•u30A2•\uFF01\u0020•</data>
 
+#     •no brk before 2010 except ok after ID               •
+<data>•\u3042•\u2010•\u0031\u0020•\u0061\u2010•\u0031\u0020•</data>
+
 <locale en at lb=strict>
 <line>
 #     •no brk before 3063              •no brk before 301C•no brk btw 2026   •no brk before FF01•
@@ -1881,6 +1893,48 @@
 # woman astronaut, woman astronaut / fitz4
 <data>•\U0001F469\u200D\U0001F680•\U0001F469\U0001F3FD\u200D\U0001F680\u0020•</data>
 
+<locale ja at lw=phrase>
+<line>
+#[京都観光]時雨殿に行った。-> [京都•観光]•時雨•殿に•行った。•
+<data>•\uff3b\u4eac\u90fd•\u89b3\u5149\uff3d•\u6642\u96e8•\u6bbf\u306b•\u884c\u3063\u305f\u3002•</data>
+#9月に東京から友達が遊びに来た -> 9月に•東京から•友達が•遊びに•来た•
+<data>•\uff19\u6708\u306b•\u6771\u4eac\u304b\u3089•\u53cb\u9054\u304c•\u904a\u3073\u306b•\u6765\u305f•</data>
+#る文字「そうだ、京都」-> る•文字•「そうだ、•京都」•
+<data>•\u308b•\u6587\u5b57•\u300c\u305d\u3046\u3060\u3001•\u4eac\u90fd\u300d•</data>
+#乗車率90%程度だろうか。 -> 乗車•率•90%•程度だろうか。•
+<data>•\u4e57\u8eca•\u7387•\uff19\uff10\uff05•\u7a0b\u5ea6\u3060\u308d\u3046\u304b\u3002•</data>
+#[携帯電話]正しい選択 -> [携帯•電話]•正しい•選択•
+<data>•\uff3b\u643a\u5e2f•\u96fb\u8a71\uff3d•\u6b63\u3057\u3044•\u9078\u629e•</data>
+#純金製百人一首にサッカーボール -> 純金•製•百人一首に•サッカーボール
+<data>•\u7D14\u91D1•\u88FD•\u767E\u4EBA\u4E00\u9996\u306B•\u30B5\u30C3\u30AB\u30FC\u30DC\u30FC\u30EB•</data>
+#Kana supplement: 𛁈(U+1B048) -> \uD82C\uDC48, 𛀸(U+1B038) -> \uD82C\uDC38, 𛀙(U+1B019)-> \uD82C\uDC19</data>
+#𛁈る𛀸(しるこ)、あ𛀙よろし(あかよろし) -> 𛁈る𛀸•(しるこ)、•あ𛀙よろし•(あ•かよろし)
+<data>•\uD82C\uDC48\u308B\uD82C\uDC38•\uFF08\u3057\u308B\u3053\uFF09\u3001•\u3042\uD82C\uDC19\u3088\u308D\u3057•\uFF08\u3042•\u304B\u3088\u308D\u3057\uFF09•</data>
+#最初に目に入るのは、「許諾なき写真禁止」のサインである。 -> 最初に▁目に▁入るのは、▁「許諾なき▁写真▁禁止」▁の▁サインで▁ある。
+<data>•\u6700\u521D\u306B•\u76EE\u306B•\u5165\u308B\u306E\u306F\u3001•\u300C\u8A31\u8AFE\u306A\u304D•\u5199\u771F•\u7981\u6B62\u300D•\u306E•\u30B5\u30A4\u30F3\u3067•\u3042\u308B\u3002•</data>
+#docomoのサイト情報によると、78000パケット以上▁使うならパケ放題がいいとか -> docomoの▁サイト▁情報によると、▁78000パケット▁以上▁使うなら▁パケ▁放題が▁いい▁とか
+<data>•\uFF44\uFF4F\uFF43\uFF4F\uFF4D\uFF4F\u306E•\u30B5\u30A4\u30C8•\u60C5\u5831\u306B\u3088\u308B\u3068\u3001•\uFF17\uFF18\uFF10\uFF10\uFF10\u30D1\u30B1\u30C3\u30C8•\u4EE5\u4E0A•\u4F7F\u3046\u306A\u3089•\u30D1\u30B1•\u653E\u984C\u304C•\u3044\u3044•\u3068\u304B•</data>
+#日本の携帯はCDMAの形だといわれています -> 日本の▁携帯は▁CDMAの▁形だと▁いわれ▁ています
+<data>•\u65E5\u672C\u306E•\u643A\u5E2F\u306F•\uFF23\uFF24\uFF2D\uFF21\u306E•\u5F62\u3060\u3068•\u3044\u308F\u308C•\u3066\u3044\u307E\u3059•</data>
+#中国の携帯は約500元から5000元です -> 中国の▁携帯は▁約▁500元から▁5000元です
+<data>•\u4E2D\u56FD\u306E•\u643A\u5E2F\u306F•\u7D04•\uFF15\uFF10\uFF10\u5143\u304B\u3089•\uFF15\uFF10\uFF10\uFF10\u5143\u3067\u3059•</data>
+#プリペイドカード携帯布教 -> プリペイドカード▁携帯▁布教
+<data>•\u30D7\u30EA\u30DA\u30A4\u30C9\u30AB\u30FC\u30C9•\u643A\u5E2F•\u5E03\u6559•</data>
+#しかもロゴがUnicode!! -> しかも▁ロゴが▁Unicode!!
+<data>•\u3057\u304B\u3082•\u30ED\u30B4\u304C•\uFF35\uFF4E\uFF49\uFF43\uFF4F\uFF44\uFF45\uFF01\uFF01•</data>
+#しかし、これらのサービスは6年間使ってこなかった自分にとっては特に必要でないものであり、これからこの機能が加わったからといって特別ハッピーなわけでもない。
+#-> しかし、▁これらの▁サービスは▁6年間▁使ってこなかった▁自分にとっては▁特に▁必要でない▁もので▁あり、▁これから▁この▁機能が▁加わったから▁といって▁特別▁ハッピーな▁わけでもない。
+<data>•\u3057\u304B\u3057\u3001•\u3053\u308C\u3089\u306E•\u30B5\u30FC\u30D3\u30B9\u306F•\uFF16\u5E74\u9593•\u4F7F\u3063\u3066\u3053\u306A\u304B\u3063\u305F•\u81EA\u5206\u306B\u3068\u3063\u3066\u306F•\u7279\u306B•\u5FC5\u8981\u3067\u306A\u3044•\u3082\u306E\u3067•\u3042\u308A\u3001•\u3053\u308C\u304B\u3089•\u3053\u306E•\u6A5F\u80FD\u304C•\u52A0\u308F\u3063\u305F\u304B\u3089•\u3068\u3044\u3063\u3066•\u7279\u5225•\u30CF\u30C3\u30D4\u30FC\u306A•\u308F\u3051\u3067\u3082\u306A\u3044\u3002•</data>
+#自由が丘での三ヶ月の生活を通して得られる経験 -> 自由が丘での▁三ヶ月の▁生活を通して▁得られる▁経験
+<data>•\u81EA\u7531\u304C\u4E18\u3067\u306E•\u4E09\u30F6\u6708\u306E•\u751F\u6D3B\u3092\u901A\u3057\u3066•\u5F97\u3089\u308C\u308B•\u7D4C\u9A13•</data>
+#幕の内弁当がよく買われるらしいです。 -> 幕の内▁弁当が▁よく▁買われるらしいです。
+<data>•\u5E55\u306E\u5185•\u5F01\u5F53\u304C•\u3088\u304F•\u8CB7\u308F\u308C\u308B\u3089\u3057\u3044\u3067\u3059\u3002•</data>
+#その名の通りに伝われと望まれています。 -> その▁名の通りに▁伝われと▁望まれ▁ています。
+<data>•\u305D\u306E•\u540D\u306E\u901A\u308A\u306B•\u4F1D\u308F\u308C\u3068•\u671B\u307E\u308C•\u3066\u3044\u307E\u3059\u3002•</data>
+#下鴨神社の糺の森は、静かだし、ちょっとした空き時間の散歩にいいですよ♪  -> 下鴨▁神社の▁糺の森は、▁静か▁だし、▁ちょっとした▁空き▁時間の▁散歩に▁いいですよ♪
+<data>•\u4E0B\u9D28•\u795E\u793E\u306E•\u7CFA\u306E\u68EE\u306F\u3001•\u9759\u304B•\u3060\u3057\u3001•\u3061\u3087\u3063\u3068\u3057\u305F•\u7A7A\u304D•\u6642\u9593\u306E•\u6563\u6B69\u306B•\u3044\u3044\u3067\u3059\u3088\u266A•</data>
+#この論理は、別の弱点から逃避するためによく使われるので注意が必要ですが。 ->  この▁論理は、▁別の▁弱点から▁逃避▁する▁ために▁よく▁使われるので▁注意が▁必要▁ですが。
+<data>•\u3053\u306E•\u8AD6\u7406\u306F\u3001•\u5225\u306E•\u5F31\u70B9\u304B\u3089•\u9003\u907F•\u3059\u308B•\u305F\u3081\u306B•\u3088\u304F•\u4F7F\u308F\u308C\u308B\u306E\u3067•\u6CE8\u610F\u304C•\u5FC5\u8981•\u3067\u3059\u304C\u3002•</data>
 
 ####################################################################################
 #

Modified: trunk/Build/source/libs/icu/icu-src/source/test/testdata/root.txt
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/test/testdata/root.txt	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/test/testdata/root.txt	2022-05-31 01:17:15 UTC (rev 63452)
@@ -13,8 +13,8 @@
 root
 {
     Version { 44.0 }
-    ExpectCLDRVersionAtLeast { 40.0 } // 'base' cldr version. Allow up to version =.=.* of this
-    CurrentCLDRVersion { 40.0 } // Current CLDR version as of the test update. Warn if not an exact match.
+    ExpectCLDRVersionAtLeast { 41.0 } // 'base' cldr version. Allow up to version =.=.* of this
+    CurrentCLDRVersion { 41.0 } // Current CLDR version as of the test update. Warn if not an exact match.
 
     ShortLanguage { xxx }
 

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/ctestfw.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -53,7 +53,7 @@
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest70d.exe</OutputFile>
+      <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest71d.exe</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\$(IcuLibOutputDir)\icutestd.pdb</ProgramDatabaseFile>
       <ImportLibrary>.\..\..\..\$(IcuLibOutputDir)\icutestd.lib</ImportLibrary>
       <AdditionalDependencies>icuucd.lib;icutud.lib;%(AdditionalDependencies)</AdditionalDependencies>
@@ -66,7 +66,7 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest70.exe</OutputFile>
+      <OutputFile>..\..\..\$(IcuBinOutputDir)\icutest71.exe</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\$(IcuLibOutputDir)\icutest.pdb</ProgramDatabaseFile>
       <ImportLibrary>.\..\..\..\$(IcuLibOutputDir)\icutest.lib</ImportLibrary>
       <AdditionalDependencies>icuuc.lib;icutu.lib;%(AdditionalDependencies)</AdditionalDependencies>

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/uperf.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/uperf.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/ctestfw/uperf.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -390,7 +390,7 @@
                         loops = failsafe;
                         failsafe *= 10;
                     } else {
-                        //System.out.println("# " + meth.getName() + " x " + loops + " = " + t);                            
+                        //System.out.println("# " + meth.getName() + " x " + loops + " = " + t);
                         loops = (int)((double)n / t * loops + 0.5);
                         if (loops == 0) {
                             fprintf(stderr,"Unable to converge on desired duration");
@@ -412,15 +412,13 @@
             long events = -1;
 
             for(int32_t ps =0; ps < passes; ps++){
-                fprintf(stdout,"= %s begin " ,name);
                 if(verbose==TRUE){
+                    fprintf(stdout,"= %s begin " ,name);
                     if(iterations > 0) {
                         fprintf(stdout, "%i\n", (int)loops);
                     } else {
                         fprintf(stdout, "%i\n", (int)n);
                     }
-                } else {
-                    fprintf(stdout, "\n");
                 }
                 t = testFunction->time(loops, &status);
                 if(U_FAILURE(status)){
@@ -439,12 +437,6 @@
                     }else{
                         fprintf(stdout, "= %s end: %f loops: %i operations: %li events: %li\n", name, t, (int)loops, ops, events);
                     }
-                }else{
-                    if(events == -1){
-                        fprintf(stdout,"= %s end %f %i %li\n", name, t, (int)loops, ops);
-                    }else{
-                        fprintf(stdout,"= %s end %f %i %li %li\n", name, t, (int)loops, ops, events);
-                    }
                 }
             }
             if(verbose && U_SUCCESS(status)) {
@@ -465,6 +457,12 @@
                             name, min_t, (int)loops, (min_t*1E9)/(loops*ops), (min_t*1E9)/(loops*events));
                 }
             }
+            else if(U_SUCCESS(status)) {
+                // Print results in ndjson format for GHA Benchmark to process.
+                fprintf(stdout,
+                        "{\"biggerIsBetter\":false,\"name\":\"%s\",\"unit\":\"ns/iter\",\"value\":%.4f}\n",
+                        name, (min_t*1E9)/(loops*ops));
+            }
             delete testFunction;
         }
         index++;

Deleted: trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,39 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This Bazel build file defines a target for the gennorm2 binary that generates
-# headers needed for bootstrapping the ICU4C build process in a way that
-# integrates the normalization data.
-
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-cc_binary(
-    name = "gennorm2",
-    srcs = glob([
-        "*.c",
-        "*.cpp",
-        "*.h",   # cannot have hdrs section in cc_binary
-    ]),
-    deps = [
-        "//icu4c/source/common:uhash",
-        "//icu4c/source/common:umutablecptrie",
-        "//icu4c/source/common:ucptrie",
-        "//icu4c/source/common:errorcode",
-        "//icu4c/source/common:uniset",
-        "//icu4c/source/common:uvector32",
-
-        "//icu4c/source/common:platform",
-        "//icu4c/source/common:headers",
-        
-        "//icu4c/source/tools/toolutil:toolutil",
-        "//icu4c/source/tools/toolutil:unewdata",
-        "//icu4c/source/tools/toolutil:writesrc",
-        "//icu4c/source/tools/toolutil:uoptions",
-        "//icu4c/source/tools/toolutil:uparse",
-    ],
-    linkopts = ["-pthread"],
-)

Added: trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/gennorm2/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,39 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This Bazel build file defines a target for the gennorm2 binary that generates
+# headers needed for bootstrapping the ICU4C build process in a way that
+# integrates the normalization data.
+
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+cc_binary(
+    name = "gennorm2",
+    srcs = glob([
+        "*.c",
+        "*.cpp",
+        "*.h",   # cannot have hdrs section in cc_binary
+    ]),
+    deps = [
+        "//icu4c/source/common:uhash",
+        "//icu4c/source/common:umutablecptrie",
+        "//icu4c/source/common:ucptrie",
+        "//icu4c/source/common:errorcode",
+        "//icu4c/source/common:uniset",
+        "//icu4c/source/common:uvector32",
+
+        "//icu4c/source/common:platform",
+        "//icu4c/source/common:headers",
+        
+        "//icu4c/source/tools/toolutil:toolutil",
+        "//icu4c/source/tools/toolutil:unewdata",
+        "//icu4c/source/tools/toolutil:writesrc",
+        "//icu4c/source/tools/toolutil:uoptions",
+        "//icu4c/source/tools/toolutil:uparse",
+    ],
+    linkopts = ["-pthread"],
+)

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/icuexportdata/icuexportdata.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/icuexportdata/icuexportdata.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/icuexportdata/icuexportdata.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -3,6 +3,7 @@
 
 #include <iostream>
 #include <vector>
+#include <algorithm>
 #include "toolutil.h"
 #include "uoptions.h"
 #include "cmemory.h"
@@ -11,8 +12,10 @@
 #include "unicode/uchar.h"
 #include "unicode/errorcode.h"
 #include "unicode/uniset.h"
+#include "unicode/uscript.h"
 #include "unicode/putil.h"
 #include "unicode/umutablecptrie.h"
+#include "ucase.h"
 #include "writesrc.h"
 
 U_NAMESPACE_USE
@@ -27,6 +30,75 @@
 UCPTrieType trieType = UCPTRIE_TYPE_SMALL;
 const char* destdir = "";
 
+// Mask constants for modified values in the Script CodePointTrie, values are logically 12-bits.
+int16_t DATAEXPORT_SCRIPT_X_WITH_COMMON    = 0x0400;
+int16_t DATAEXPORT_SCRIPT_X_WITH_INHERITED = 0x0800;
+int16_t DATAEXPORT_SCRIPT_X_WITH_OTHER     = 0x0c00;
+
+// TODO(ICU-21821): Replace this with a call to a library function
+int32_t scxCodePoints[] = {
+      7415, 7377, 7380, 7387, 7390, 7391, 7394, 7395, 7396, 7397,
+      7398, 7399, 7400, 7403, 7404, 7406, 7407, 7408, 7409, 113824,
+      113825, 113826, 113827, 834, 837, 7616, 7617, 12294, 12350, 12351,
+      12688, 12689, 12690, 12691, 12692, 12693, 12694, 12695, 12696, 12697,
+      12698, 12699, 12700, 12701, 12702, 12703, 12736, 12737, 12738, 12739,
+      12740, 12741, 12742, 12743, 12744, 12745, 12746, 12747, 12748, 12749,
+      12750, 12751, 12752, 12753, 12754, 12755, 12756, 12757, 12758, 12759,
+      12760, 12761, 12762, 12763, 12764, 12765, 12766, 12767, 12768, 12769,
+      12770, 12771, 12832, 12833, 12834, 12835, 12836, 12837, 12838, 12839,
+      12840, 12841, 12842, 12843, 12844, 12845, 12846, 12847, 12848, 12849,
+      12850, 12851, 12852, 12853, 12854, 12855, 12856, 12857, 12858, 12859,
+      12860, 12861, 12862, 12863, 12864, 12865, 12866, 12867, 12868, 12869,
+      12870, 12871, 12928, 12929, 12930, 12931, 12932, 12933, 12934, 12935,
+      12936, 12937, 12938, 12939, 12940, 12941, 12942, 12943, 12944, 12945,
+      12946, 12947, 12948, 12949, 12950, 12951, 12952, 12953, 12954, 12955,
+      12956, 12957, 12958, 12959, 12960, 12961, 12962, 12963, 12964, 12965,
+      12966, 12967, 12968, 12969, 12970, 12971, 12972, 12973, 12974, 12975,
+      12976, 12992, 12993, 12994, 12995, 12996, 12997, 12998, 12999, 13000,
+      13001, 13002, 13003, 13055, 13144, 13145, 13146, 13147, 13148, 13149,
+      13150, 13151, 13152, 13153, 13154, 13155, 13156, 13157, 13158, 13159,
+      13160, 13161, 13162, 13163, 13164, 13165, 13166, 13167, 13168, 13179,
+      13180, 13181, 13182, 13183, 13280, 13281, 13282, 13283, 13284, 13285,
+      13286, 13287, 13288, 13289, 13290, 13291, 13292, 13293, 13294, 13295,
+      13296, 13297, 13298, 13299, 13300, 13301, 13302, 13303, 13304, 13305,
+      13306, 13307, 13308, 13309, 13310, 119648, 119649, 119650, 119651, 119652,
+      119653, 119654, 119655, 119656, 119657, 119658, 119659, 119660, 119661, 119662,
+      119663, 119664, 119665, 127568, 127569, 867, 868, 869, 870, 871,
+      872, 873, 874, 875, 876, 877, 878, 879, 7418, 7674,
+      66272, 66273, 66274, 66275, 66276, 66277, 66278, 66279, 66280, 66281,
+      66282, 66283, 66284, 66285, 66286, 66287, 66288, 66289, 66290, 66291,
+      66292, 66293, 66294, 66295, 66296, 66297, 66298, 66299, 1748, 64830,
+      64831, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619,
+      1620, 1621, 1648, 65010, 65021, 7381, 7382, 7384, 7393, 7402,
+      7405, 7413, 7414, 43249, 12330, 12331, 12332, 12333, 43471, 65794,
+      65847, 65848, 65849, 65850, 65851, 65852, 65853, 65854, 65855, 1156,
+      1159, 11843, 42607, 1157, 1158, 1155, 7672, 7379, 7411, 7416,
+      7417, 7401, 7383, 7385, 7388, 7389, 7392, 43251, 4347, 3046,
+      3047, 3048, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 3056,
+      3057, 3058, 3059, 70401, 70403, 70459, 70460, 73680, 73681, 73683,
+      2790, 2791, 2792, 2793, 2794, 2795, 2796, 2797, 2798, 2799,
+      2662, 2663, 2664, 2665, 2666, 2667, 2668, 2669, 2670, 2671,
+      42752, 42753, 42754, 42755, 42756, 42757, 42758, 42759, 12337, 12338,
+      12339, 12340, 12341, 12441, 12442, 12443, 12444, 12448, 12540, 65392,
+      65438, 65439, 3302, 3303, 3304, 3305, 3306, 3307, 3308, 3309,
+      3310, 3311, 8239, 68338, 6146, 6147, 6149, 1564, 1632, 1633,
+      1634, 1635, 1636, 1637, 1638, 1639, 1640, 1641, 2534, 2535,
+      2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543, 4160, 4161,
+      4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 65792, 65793,
+      65799, 65800, 65801, 65802, 65803, 65804, 65805, 65806, 65807, 65808,
+      65809, 65810, 65811, 65812, 65813, 65814, 65815, 65816, 65817, 65818,
+      65819, 65820, 65821, 65822, 65823, 65824, 65825, 65826, 65827, 65828,
+      65829, 65830, 65831, 65832, 65833, 65834, 65835, 65836, 65837, 65838,
+      65839, 65840, 65841, 65842, 65843, 7412, 8432, 12348, 12349, 43310,
+      7376, 7378, 5941, 5942, 2406, 2407, 2408, 2409, 2410, 2411,
+      2412, 2413, 2414, 2415, 12291, 12307, 12316, 12317, 12318, 12319,
+      12336, 12343, 65093, 65094, 1548, 1563, 12289, 12290, 12296, 12297,
+      12298, 12299, 12300, 12301, 12302, 12303, 12304, 12305, 12308, 12309,
+      12310, 12311, 12312, 12313, 12314, 12315, 12539, 65377, 65378, 65379,
+      65380, 65381, 7386, 1567, 7410, 1600, 43062, 43063, 43064, 43065,
+      2386, 2385, 43059, 43060, 43061, 43056, 43057, 43058, 2404, 2405
+    };
+
 void handleError(ErrorCode& status, const char* context) {
     if (status.isFailure()) {
         std::cerr << "Error: " << context << ": " << status.errorName() << std::endl;
@@ -96,6 +168,110 @@
     usrc_writeUCPTrie(f, shortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML);
 }
 
+void dumpScriptExtensions(FILE* f) {
+    IcuToolErrorCode status("icuexportdata: dumpScriptExtensions");
+
+    fputs("[[script_extensions]]\n", f);
+    const char* scxFullPropName = u_getPropertyName(UCHAR_SCRIPT_EXTENSIONS, U_LONG_PROPERTY_NAME);
+    const char* scxShortPropName = u_getPropertyName(UCHAR_SCRIPT_EXTENSIONS, U_SHORT_PROPERTY_NAME);
+    fprintf(f, "long_name = \"%s\"\n", scxFullPropName);
+    if (scxShortPropName) fprintf(f, "short_name = \"%s\"\n", scxShortPropName);
+
+    // We want to use 16 bits for our exported trie of sc/scx data because we
+    // need 12 bits to match the 12 bits of data stored for sc/scx in the trie
+    // in the uprops.icu data file.
+    UCPTrieValueWidth scWidth = UCPTRIE_VALUE_BITS_16;
+
+    // Create a mutable UCPTrie builder populated with Script property values data.
+    const UCPMap* scInvMap = u_getIntPropertyMap(UCHAR_SCRIPT, status);
+    handleError(status, scxFullPropName);
+    LocalUMutableCPTriePointer builder(umutablecptrie_fromUCPMap(scInvMap, status));
+    handleError(status, scxFullPropName);
+
+    // The values for the output scx companion array.
+    // Invariant is that all subvectors are distinct.
+    std::vector< std::vector<uint16_t> > outputDedupVec;
+
+    // The sc/scx companion array is an array of arrays (of script codes)
+    fputs("script_code_array = [\n", f);
+    for(const UChar32 cp : scxCodePoints) {
+        // Get the Script value
+        uint32_t scVal = umutablecptrie_get(builder.getAlias(), cp);
+        // Get the Script_Extensions value (array of Script codes)
+        const int32_t SCX_ARRAY_CAPACITY = 32;
+        UScriptCode scxValArray[SCX_ARRAY_CAPACITY];
+        int32_t numScripts = uscript_getScriptExtensions(cp, scxValArray, SCX_ARRAY_CAPACITY, status);
+        handleError(status, scxFullPropName);
+
+        // Convert the scx array into a vector
+        std::vector<uint16_t> scxValVec;
+        for(int i = 0; i < numScripts; i++) {
+            scxValVec.push_back(scxValArray[i]);
+        }
+        // Ensure that it is sorted
+        std::sort(scxValVec.begin(), scxValVec.end());
+        // Copy the Script value into the first position of the scx array only
+        // if we have the "other" case (Script value is not Common nor Inherited).
+        // This offers faster access when users want only the Script value.
+        if (scVal != USCRIPT_COMMON && scVal != USCRIPT_INHERITED) {
+            scxValVec.insert(scxValVec.begin(), scVal);
+        }
+
+        // See if there is already an scx value array matching the newly built one.
+        // If there is, then use its index.
+        // If not, then append the new value array.
+        bool isScxValUnique = true;
+        size_t outputIndex = 0;
+        for (outputIndex = 0; outputIndex < outputDedupVec.size(); outputIndex++) {
+            if (outputDedupVec[outputIndex] == scxValVec) {
+                isScxValUnique = false;
+                break;
+            }
+        }
+
+        if (isScxValUnique) {
+            outputDedupVec.push_back(scxValVec);
+            usrc_writeArray(f, "  [", scxValVec.data(), 16, scxValVec.size(), "    ", "],\n");
+        }
+
+        // We must update the value in the UCPTrie for the code point to contain:
+        // 9..0 the Script code in the lower 10 bits when 11..10 is 0, else it is
+        //   the index into the companion array
+        // 11..10 the same higher-order 2 bits in the trie in uprops.icu indicating whether
+        //   3: other
+        //   2: Script=Inherited
+        //   1: Script=Common
+        //   0: Script=value in 9..0 (N/A because we are in this loop to create the companion array for non-0 cases)
+        uint16_t mask = 0;
+        if (scVal == USCRIPT_COMMON) {
+            mask = DATAEXPORT_SCRIPT_X_WITH_COMMON;
+        } else if (scVal == USCRIPT_INHERITED) {
+            mask = DATAEXPORT_SCRIPT_X_WITH_INHERITED;
+        } else {
+            mask = DATAEXPORT_SCRIPT_X_WITH_OTHER;
+        }
+
+        // The new trie value is the index into the new array with the high order bits set
+        uint32_t newScVal = outputIndex | mask;
+
+        // Update the code point in the mutable trie builder with the trie value
+        umutablecptrie_set(builder.getAlias(), cp, newScVal, status);
+        handleError(status, scxFullPropName);
+    }
+    fputs("]\n\n", f);  // Print the TOML close delimiter for the outer array.
+
+    // Convert from mutable trie builder to immutable trie.
+    LocalUCPTriePointer utrie(umutablecptrie_buildImmutable(
+        builder.getAlias(),
+        trieType,
+        scWidth,
+        status));
+    handleError(status, scxFullPropName);
+
+    fputs("[script_extensions.code_point_trie]\n", f);
+    usrc_writeUCPTrie(f, scxShortPropName, utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML);
+}
+
 FILE* prepareOutputFile(const char* basename) {
     IcuToolErrorCode status("icuexportdata");
     CharString outFileName;
@@ -158,35 +334,25 @@
     UOPTION_QUIET,
 };
 
-int main(int argc, char* argv[]) {
-    U_MAIN_INIT_ARGS(argc, argv);
+void printHelp(FILE* stdfile, const char* program) {
+  fprintf(stdfile,
+          "usage: %s -m mode [-options] [--all | properties...]\n"
+          "\tdump Unicode property data to .toml files\n"
+          "options:\n"
+          "\t-h or -? or --help  this usage text\n"
+          "\t-V or --version     show a version message\n"
+          "\t-m or --mode        mode: currently only 'uprops' and 'ucase', but more may be added\n"
+          "\t      --trie-type   set the trie type (small or fast, default small)\n"
+          "\t-d or --destdir     destination directory, followed by the path\n"
+          "\t      --all         write out all properties known to icuexportdata\n"
+          "\t      --index       write an _index.toml summarizing all data exported\n"
+          "\t-c or --copyright   include a copyright notice\n"
+          "\t-v or --verbose     Turn on verbose output\n"
+          "\t-q or --quiet       do not display warnings and progress\n",
+          program);
+}
 
-    /* preset then read command line options */
-    options[OPT_DESTDIR].value=u_getDataDirectory();
-    argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options);
-
-    if(options[OPT_VERSION].doesOccur) {
-        printf("icuexportdata version %s, ICU tool to dump data files for external consumers\n",
-               U_ICU_DATA_VERSION);
-        printf("%s\n", U_COPYRIGHT_STRING);
-        exit(0);
-    }
-
-    /* error handling, printing usage message */
-    if(argc<0) {
-        fprintf(stderr,
-            "error in command line argument \"%s\"\n",
-            argv[-argc]);
-    } else if(argc<2) {
-        argc=-1;
-    }
-
-    /* get the options values */
-    haveCopyright = options[OPT_COPYRIGHT].doesOccur;
-    destdir = options[OPT_DESTDIR].value;
-    VERBOSE = options[OPT_VERBOSE].doesOccur;
-    QUIET = options[OPT_QUIET].doesOccur;
-
+int exportUprops(int argc, char* argv[]) {
     // Load list of Unicode properties
     std::vector<const char*> propNames;
     for (int i=1; i<argc; i++) {
@@ -193,10 +359,17 @@
         propNames.push_back(argv[i]);
     }
     if (options[OPT_ALL].doesOccur) {
-        for (int i=UCHAR_BINARY_START; i<UCHAR_INT_LIMIT; i++) {
+        int i = UCHAR_BINARY_START;
+        while (true) {
             if (i == UCHAR_BINARY_LIMIT) {
                 i = UCHAR_INT_START;
             }
+            if (i == UCHAR_INT_LIMIT) {
+                i = UCHAR_SCRIPT_EXTENSIONS;
+            }
+            if (i == UCHAR_SCRIPT_EXTENSIONS + 1) {
+                break;
+            }
             UProperty uprop = static_cast<UProperty>(i);
             const char* propName = u_getPropertyName(uprop, U_SHORT_PROPERTY_NAME);
             if (propName == NULL) {
@@ -207,50 +380,13 @@
             }
             if (propName != NULL) {
                 propNames.push_back(propName);
+            } else {
+                std::cerr << "Warning: Could not find name for: " << uprop << std::endl;
             }
+            i++;
         }
     }
 
-    if (propNames.empty()
-            || options[OPT_HELP_H].doesOccur
-            || options[OPT_HELP_QUESTION_MARK].doesOccur
-            || !options[OPT_MODE].doesOccur) {
-        FILE *stdfile=argc<0 ? stderr : stdout;
-        fprintf(stdfile,
-            "usage: %s -m uprops [-options] [--all | properties...]\n"
-            "\tdump Unicode property data to .toml files\n"
-            "options:\n"
-            "\t-h or -? or --help  this usage text\n"
-            "\t-V or --version     show a version message\n"
-            "\t-m or --mode        mode: currently only 'uprops', but more may be added\n"
-            "\t      --trie-type   set the trie type (small or fast, default small)\n"
-            "\t-d or --destdir     destination directory, followed by the path\n"
-            "\t      --all         write out all properties known to icuexportdata\n"
-            "\t      --index       write an _index.toml summarizing all data exported\n"
-            "\t-c or --copyright   include a copyright notice\n"
-            "\t-v or --verbose     Turn on verbose output\n"
-            "\t-q or --quiet       do not display warnings and progress\n",
-            argv[0]);
-        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
-    }
-
-    const char* mode = options[OPT_MODE].value;
-    if (uprv_strcmp(mode, "uprops") != 0) {
-        fprintf(stderr, "Invalid option for --mode (must be uprops)\n");
-        return U_ILLEGAL_ARGUMENT_ERROR;
-    }
-
-    if (options[OPT_TRIE_TYPE].doesOccur) {
-        if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "fast") == 0) {
-            trieType = UCPTRIE_TYPE_FAST;
-        } else if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "small") == 0) {
-            trieType = UCPTRIE_TYPE_SMALL;
-        } else {
-            fprintf(stderr, "Invalid option for --trie-type (must be small or fast)\n");
-            return U_ILLEGAL_ARGUMENT_ERROR;
-        }
-    }
-
     for (const char* propName : propNames) {
         UProperty propEnum = u_getPropertyEnum(propName);
         if (propEnum == UCHAR_INVALID_CODE) {
@@ -272,6 +408,8 @@
             dumpBinaryProperty(propEnum, f);
         } else if (UCHAR_INT_START <= propEnum && propEnum <= UCHAR_INT_LIMIT) {
             dumpEnumeratedProperty(propEnum, f);
+        } else if (propEnum == UCHAR_SCRIPT_EXTENSIONS) {
+            dumpScriptExtensions(f);
         } else {
             std::cerr << "Don't know how to write property: " << propEnum << std::endl;
             return U_INTERNAL_PROGRAM_ERROR;
@@ -293,3 +431,134 @@
 
     return 0;
 }
+
+struct AddRangeHelper {
+    UMutableCPTrie* ucptrie;
+};
+
+static UBool U_CALLCONV
+addRangeToUCPTrie(const void* context, UChar32 start, UChar32 end, uint32_t value) {
+    IcuToolErrorCode status("addRangeToUCPTrie");
+    UMutableCPTrie* ucptrie = ((const AddRangeHelper*) context)->ucptrie;
+    umutablecptrie_setRange(ucptrie, start, end, value, status);
+    handleError(status, "setRange");
+
+    return TRUE;
+}
+
+int exportCase(int argc, char* argv[]) {
+    if (argc > 1) {
+        fprintf(stderr, "ucase mode does not expect additional arguments\n");
+        return U_ILLEGAL_ARGUMENT_ERROR;
+    }
+    (void) argv; // Suppress unused variable warning
+
+    IcuToolErrorCode status("icuexportdata");
+    LocalUMutableCPTriePointer builder(umutablecptrie_open(0, 0, status));
+    handleError(status, "exportCase");
+
+    int32_t exceptionsLength, unfoldLength;
+    const UCaseProps *caseProps = ucase_getSingleton(&exceptionsLength, &unfoldLength);
+    const UTrie2* caseTrie = &caseProps->trie;
+
+    AddRangeHelper helper = { builder.getAlias() };
+    utrie2_enum(caseTrie, NULL, addRangeToUCPTrie, &helper);
+
+    UCPTrieValueWidth width = UCPTRIE_VALUE_BITS_16;
+    LocalUCPTriePointer utrie(umutablecptrie_buildImmutable(
+        builder.getAlias(),
+        trieType,
+        width,
+        status));
+    handleError(status, "exportCase");
+
+    FILE* f = prepareOutputFile("ucase");
+
+    UVersionInfo versionInfo;
+    u_getUnicodeVersion(versionInfo);
+    char uvbuf[U_MAX_VERSION_STRING_LENGTH];
+    u_versionToString(versionInfo, uvbuf);
+    fprintf(f, "icu_version = \"%s\"\nunicode_version = \"%s\"\n\n",
+            U_ICU_VERSION,
+            uvbuf);
+
+    fputs("[ucase.code_point_trie]\n", f);
+    usrc_writeUCPTrie(f, "case_trie", utrie.getAlias(), UPRV_TARGET_SYNTAX_TOML);
+    fputs("\n", f);
+
+    const char* indent = "  ";
+    const char* suffix = "\n]\n";
+
+    fputs("[ucase.exceptions]\n", f);
+    const char* exceptionsPrefix = "exceptions = [\n  ";
+    int32_t exceptionsWidth = 16;
+    usrc_writeArray(f, exceptionsPrefix, caseProps->exceptions, exceptionsWidth,
+                    exceptionsLength, indent, suffix);
+    fputs("\n", f);
+
+    fputs("[ucase.unfold]\n", f);
+    const char* unfoldPrefix = "unfold = [\n  ";
+    int32_t unfoldWidth = 16;
+    usrc_writeArray(f, unfoldPrefix, caseProps->unfold, unfoldWidth,
+                    unfoldLength, indent, suffix);
+
+    return 0;
+}
+
+int main(int argc, char* argv[]) {
+    U_MAIN_INIT_ARGS(argc, argv);
+
+    /* preset then read command line options */
+    options[OPT_DESTDIR].value=u_getDataDirectory();
+    argc=u_parseArgs(argc, argv, UPRV_LENGTHOF(options), options);
+
+    if(options[OPT_VERSION].doesOccur) {
+        printf("icuexportdata version %s, ICU tool to dump data files for external consumers\n",
+               U_ICU_DATA_VERSION);
+        printf("%s\n", U_COPYRIGHT_STRING);
+        exit(0);
+    }
+
+    /* error handling, printing usage message */
+    if(argc<0) {
+        fprintf(stderr,
+            "error in command line argument \"%s\"\n",
+            argv[-argc]);
+    }
+
+    if (argc < 0
+            || options[OPT_HELP_H].doesOccur
+            || options[OPT_HELP_QUESTION_MARK].doesOccur
+            || !options[OPT_MODE].doesOccur) {
+        FILE *stdfile=argc<0 ? stderr : stdout;
+        printHelp(stdfile, argv[0]);
+        return argc<0 ? U_ILLEGAL_ARGUMENT_ERROR : U_ZERO_ERROR;
+    }
+
+    /* get the options values */
+    haveCopyright = options[OPT_COPYRIGHT].doesOccur;
+    destdir = options[OPT_DESTDIR].value;
+    VERBOSE = options[OPT_VERBOSE].doesOccur;
+    QUIET = options[OPT_QUIET].doesOccur;
+
+    if (options[OPT_TRIE_TYPE].doesOccur) {
+        if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "fast") == 0) {
+            trieType = UCPTRIE_TYPE_FAST;
+        } else if (uprv_strcmp(options[OPT_TRIE_TYPE].value, "small") == 0) {
+            trieType = UCPTRIE_TYPE_SMALL;
+        } else {
+            fprintf(stderr, "Invalid option for --trie-type (must be small or fast)\n");
+            return U_ILLEGAL_ARGUMENT_ERROR;
+        }
+    }
+
+    const char* mode = options[OPT_MODE].value;
+    if (uprv_strcmp(mode, "uprops") == 0) {
+        return exportUprops(argc, argv);
+    } else if (uprv_strcmp(mode, "ucase") == 0) {
+        return exportCase(argc, argv);
+    }
+
+    fprintf(stderr, "Invalid option for --mode (must be uprops or ucase)\n");
+    return U_ILLEGAL_ARGUMENT_ERROR;
+}

Deleted: trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD	2022-05-31 01:17:15 UTC (rev 63452)
@@ -1,126 +0,0 @@
-# © 2021 and later: Unicode, Inc. and others.
-# License & terms of use: http://www.unicode.org/copyright.html
-
-# This Bazel build file defines targets that are dependencies for building
-# the gennorm2 and genprops binaries.
-
-load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
-
-package(
-    default_visibility = ["//visibility:public"],
-)
-
-cc_library(
-    name = "toolutil",
-    includes = ["."],
-    hdrs = ["toolutil.h"],
-    srcs = ["toolutil.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = ["//icu4c/source/common:platform"],
-)
-
-cc_library(
-    name = "unewdata",
-    includes = ["."],
-    hdrs = ["unewdata.h"],
-    srcs = ["unewdata.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = [
-        ":filestrm",
-        "//icu4c/source/common:platform",
-    ],
-)
-
-cc_library(
-    name = "uoptions",
-    includes = ["."],
-    hdrs = ["uoptions.h"],
-    srcs = ["uoptions.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = ["//icu4c/source/common:platform"],
-)
-
-cc_library(
-    name = "writesrc",
-    includes = ["."],
-    hdrs = ["writesrc.h"],
-    srcs = ["writesrc.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = [
-        "//icu4c/source/common:bytestream",
-        "//icu4c/source/common:platform",
-        "//icu4c/source/common:uniset_core",
-    ],
-)
-
-cc_library(
-    name = "uparse",
-    includes = ["."],
-    hdrs = ["uparse.h"],
-    srcs = ["uparse.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = [
-        ":filestrm",
-        "//icu4c/source/common:platform",
-        ],
-)
-
-cc_library(
-    name = "filestrm",
-    includes = ["."],
-    hdrs = ["filestrm.h"],
-    srcs = ["filestrm.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = ["//icu4c/source/common:platform"],
-)
-
-cc_library(
-    name = "ppucd",
-    includes = ["."],
-    hdrs = ["ppucd.h"],
-    srcs = ["ppucd.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = [
-        ":uparse",
-        "//icu4c/source/common:platform",
-    ],
-)
-
-cc_library(
-    name = "denseranges",
-    includes = ["."],
-    hdrs = ["denseranges.h"],
-    srcs = ["denseranges.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = ["//icu4c/source/common:platform"],
-)
-
-cc_library(
-    name = "collationinfo",
-    includes = ["."],
-    hdrs = ["collationinfo.h"],
-    srcs = ["collationinfo.cpp"],
-    local_defines = [
-        "U_TOOLUTIL_IMPLEMENTATION",
-    ],
-    deps = [
-        "//icu4c/source/common:platform",
-        "//icu4c/source/i18n:headers",
-    ],
-)

Added: trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD.bazel
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD.bazel	                        (rev 0)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/BUILD.bazel	2022-05-31 01:17:15 UTC (rev 63452)
@@ -0,0 +1,126 @@
+# © 2021 and later: Unicode, Inc. and others.
+# License & terms of use: http://www.unicode.org/copyright.html
+
+# This Bazel build file defines targets that are dependencies for building
+# the gennorm2 and genprops binaries.
+
+load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
+
+package(
+    default_visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "toolutil",
+    includes = ["."],
+    hdrs = ["toolutil.h"],
+    srcs = ["toolutil.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = ["//icu4c/source/common:platform"],
+)
+
+cc_library(
+    name = "unewdata",
+    includes = ["."],
+    hdrs = ["unewdata.h"],
+    srcs = ["unewdata.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = [
+        ":filestrm",
+        "//icu4c/source/common:platform",
+    ],
+)
+
+cc_library(
+    name = "uoptions",
+    includes = ["."],
+    hdrs = ["uoptions.h"],
+    srcs = ["uoptions.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = ["//icu4c/source/common:platform"],
+)
+
+cc_library(
+    name = "writesrc",
+    includes = ["."],
+    hdrs = ["writesrc.h"],
+    srcs = ["writesrc.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = [
+        "//icu4c/source/common:bytestream",
+        "//icu4c/source/common:platform",
+        "//icu4c/source/common:uniset_core",
+    ],
+)
+
+cc_library(
+    name = "uparse",
+    includes = ["."],
+    hdrs = ["uparse.h"],
+    srcs = ["uparse.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = [
+        ":filestrm",
+        "//icu4c/source/common:platform",
+        ],
+)
+
+cc_library(
+    name = "filestrm",
+    includes = ["."],
+    hdrs = ["filestrm.h"],
+    srcs = ["filestrm.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = ["//icu4c/source/common:platform"],
+)
+
+cc_library(
+    name = "ppucd",
+    includes = ["."],
+    hdrs = ["ppucd.h"],
+    srcs = ["ppucd.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = [
+        ":uparse",
+        "//icu4c/source/common:platform",
+    ],
+)
+
+cc_library(
+    name = "denseranges",
+    includes = ["."],
+    hdrs = ["denseranges.h"],
+    srcs = ["denseranges.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = ["//icu4c/source/common:platform"],
+)
+
+cc_library(
+    name = "collationinfo",
+    includes = ["."],
+    hdrs = ["collationinfo.h"],
+    srcs = ["collationinfo.cpp"],
+    local_defines = [
+        "U_TOOLUTIL_IMPLEMENTATION",
+    ],
+    deps = [
+        "//icu4c/source/common:platform",
+        "//icu4c/source/i18n:headers",
+    ],
+)

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.cpp	2022-05-31 01:17:15 UTC (rev 63452)
@@ -228,18 +228,19 @@
     std::ifstream ifs(goldenFilePath, std::ifstream::in);
     int32_t pos = 0;
     char c;
-    while ((c = ifs.get()) != std::char_traits<char>::eof() && pos < bufferLen) {
+    while (ifs.get(c) && pos < bufferLen) {
         if (c != buffer[pos]) {
             // Files differ at this position
-            return pos;
+            break;
         }
         pos++;
     }
-    if (pos < bufferLen || c != std::char_traits<char>::eof()) {
-        // Files are different lengths
-        return pos;
+    if (pos == bufferLen && ifs.eof()) {
+        // Files are same lengths
+        pos = -1;
     }
-    return -1;
+    ifs.close();
+    return pos;
 }
 
 /*U_CAPI UDate U_EXPORT2

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/toolutil/toolutil.vcxproj	2022-05-31 01:17:15 UTC (rev 63452)
@@ -74,7 +74,7 @@
       <TypeLibraryName>.\..\..\..\lib\icutu.tlb</TypeLibraryName>
     </Midl>
     <Link>
-      <OutputFile>..\..\..\bin\icutu70.dll</OutputFile>
+      <OutputFile>..\..\..\bin\icutu71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\lib\icutu.pdb</ProgramDatabaseFile>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -86,7 +86,7 @@
       <TypeLibraryName>.\..\..\..\lib\icutud.tlb</TypeLibraryName>
     </Midl>
     <Link>
-      <OutputFile>..\..\..\bin\icutu70d.dll</OutputFile>
+      <OutputFile>..\..\..\bin\icutu71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\lib\icutud.pdb</ProgramDatabaseFile>
       <DataExecutionPrevention>
       </DataExecutionPrevention>
@@ -113,7 +113,7 @@
       <WholeProgramOptimization>true</WholeProgramOptimization>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\..\bin64\icutu70.dll</OutputFile>
+      <OutputFile>..\..\..\bin64\icutu71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutu.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\lib64\icutu.lib</ImportLibrary>
     </Link>
@@ -123,7 +123,7 @@
       <TypeLibraryName>.\..\..\..\lib64\icutud.tlb</TypeLibraryName>
     </Midl>
     <Link>
-      <OutputFile>..\..\..\bin64\icutu70d.dll</OutputFile>
+      <OutputFile>..\..\..\bin64\icutu71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\lib64\icutud.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\lib64\icutud.lib</ImportLibrary>
     </Link>
@@ -144,7 +144,7 @@
       <TypeLibraryName>..\..\..\libARM\icutu.tlb</TypeLibraryName>
     </Midl>
     <Link>
-      <OutputFile>..\..\..\binARM\icutu70.dll</OutputFile>
+      <OutputFile>..\..\..\binARM\icutu71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\libARM\icutu.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\libARM\icutu.lib</ImportLibrary>
     </Link>
@@ -157,7 +157,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\..\binARM\icutu70d.dll</OutputFile>
+      <OutputFile>..\..\..\binARM\icutu71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\libARM\icutud.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\libARM\icutud.lib</ImportLibrary>
     </Link>
@@ -178,7 +178,7 @@
       <TypeLibraryName>.\..\..\..\libARM64\icutu.tlb</TypeLibraryName>
     </Midl>
     <Link>
-      <OutputFile>..\..\..\binARM64\icutu70.dll</OutputFile>
+      <OutputFile>..\..\..\binARM64\icutu71.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\libARM64\icutu.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\libARM64\icutu.lib</ImportLibrary>
     </Link>
@@ -191,7 +191,7 @@
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
     </ClCompile>
     <Link>
-      <OutputFile>..\..\..\binARM64\icutu70d.dll</OutputFile>
+      <OutputFile>..\..\..\binARM64\icutu71d.dll</OutputFile>
       <ProgramDatabaseFile>.\..\..\..\libARM64\icutud.pdb</ProgramDatabaseFile>
       <ImportLibrary>..\..\..\libARM64\icutud.lib</ImportLibrary>
     </Link>

Modified: trunk/Build/source/libs/icu/icu-src/source/tools/tzcode/icuregions
===================================================================
--- trunk/Build/source/libs/icu/icu-src/source/tools/tzcode/icuregions	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/icu-src/source/tools/tzcode/icuregions	2022-05-31 01:17:15 UTC (rev 63452)
@@ -12,6 +12,7 @@
 Africa/Asmera ER
 America/Coral_Harbour CA
 America/Montreal CA
+America/Virgin VI
 Europe/Simferopol UA
 Pacific/Johnston UM
 

Modified: trunk/Build/source/libs/icu/version.ac
===================================================================
--- trunk/Build/source/libs/icu/version.ac	2022-05-30 23:52:18 UTC (rev 63451)
+++ trunk/Build/source/libs/icu/version.ac	2022-05-31 01:17:15 UTC (rev 63452)
@@ -7,4 +7,4 @@
 dnl   with or without modifications, as long as this notice is preserved.
 dnl
 dnl  m4-include this file to define the current ICU version as icu_version.
-m4_define([icu_version], [70.1])
+m4_define([icu_version], [71.1])



More information about the tex-live-commits mailing list.