diff --git a/.gitignore b/.gitignore index 92fcb5c..6f44884 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ /node-v14.15.0-stripped.tar.gz /node-v14.15.4-stripped.tar.gz /node-v14.16.0-stripped.tar.gz +/node-v16.1.0-stripped.tar.gz +/icu4c-69_1-src.tgz diff --git a/0002-Install-both-binaries-and-use-libdir.patch b/0002-Install-both-binaries-and-use-libdir.patch deleted file mode 100644 index b3441a7..0000000 --- a/0002-Install-both-binaries-and-use-libdir.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 0b315d55b13d098ce8f3e96d501aeb33152a9e00 Mon Sep 17 00:00:00 2001 -From: Elliott Sales de Andrade -Date: Tue, 19 Mar 2019 23:22:40 -0400 -Subject: [PATCH 2/2] Install both binaries and use libdir. - -This allows us to build with a shared library for other users while -still providing the normal executable. - -Signed-off-by: Elliott Sales de Andrade ---- - configure.py | 7 +++++++ - tools/install.py | 29 +++++++++++++---------------- - 2 files changed, 20 insertions(+), 16 deletions(-) - -diff --git a/configure.py b/configure.py -index beb08df0884f7693b6c07d7fb5e85ae7bdcd1d7d..9e364586d4f79322fe53f41915ed7aad0e23a30d 100755 ---- a/configure.py -+++ b/configure.py -@@ -582,6 +582,12 @@ parser.add_option('--shared', - help='compile shared library for embedding node in another project. ' + - '(This mode is not officially supported for regular applications)') - -+parser.add_option('--libdir', -+ action='store', -+ dest='libdir', -+ default='lib', -+ help='a directory to install the shared library into') -+ - parser.add_option('--without-v8-platform', - action='store_true', - dest='without_v8_platform', -@@ -1124,6 +1130,7 @@ def configure_node(o): - o['variables']['node_no_browser_globals'] = b(options.no_browser_globals) - - o['variables']['node_shared'] = b(options.shared) -+ o['variables']['libdir'] = options.libdir - node_module_version = getmoduleversion.get_version() - - if options.dest_os == 'android': -diff --git a/tools/install.py b/tools/install.py -index 655802980a6ea94d1d4ca1dc63c8c8e905fbb83a..fe4723bf15012c8aacacb0393dc8294c049b0503 100755 ---- a/tools/install.py -+++ b/tools/install.py -@@ -121,26 +121,23 @@ def subdir_files(path, dest, action): - - def files(action): - is_windows = sys.platform == 'win32' -- output_file = 'node' - output_prefix = 'out/Release/' -+ output_libprefix = output_prefix - -- if 'false' == variables.get('node_shared'): -- if is_windows: -- output_file += '.exe' -+ if is_windows: -+ output_bin = 'node.exe' -+ output_lib = 'node.dll' - else: -- if is_windows: -- output_file += '.dll' -- else: -- output_file = 'lib' + output_file + '.' + variables.get('shlib_suffix') -- # GYP will output to lib.target except on OS X, this is hardcoded -- # in its source - see the _InstallableTargetInstallPath function. -- if sys.platform != 'darwin': -- output_prefix += 'lib.target/' -+ output_bin = 'node' -+ output_lib = 'libnode.' + variables.get('shlib_suffix') -+ # GYP will output to lib.target except on OS X, this is hardcoded -+ # in its source - see the _InstallableTargetInstallPath function. -+ if sys.platform != 'darwin': -+ output_libprefix += 'lib.target/' - -- if 'false' == variables.get('node_shared'): -- action([output_prefix + output_file], 'bin/' + output_file) -- else: -- action([output_prefix + output_file], 'lib/' + output_file) -+ action([output_prefix + output_bin], 'bin/' + output_bin) -+ if 'true' == variables.get('node_shared'): -+ action([output_libprefix + output_lib], variables.get('libdir') + '/' + output_lib) - - if 'true' == variables.get('node_use_dtrace'): - action(['out/Release/node.d'], 'lib/dtrace/node.d') --- -2.24.1 - diff --git a/0004-CVE-2020-7774-nodejs-y18n-prototype-pollution-vulnerability.patch b/0004-CVE-2020-7774-nodejs-y18n-prototype-pollution-vulnerability.patch deleted file mode 100644 index 88a9d75..0000000 --- a/0004-CVE-2020-7774-nodejs-y18n-prototype-pollution-vulnerability.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/deps/npm/node_modules/y18n/index.js b/deps/npm/node_modules/y18n/index.js -index d720681628..727362aac0 100644 ---- a/deps/npm/node_modules/y18n/index.js -+++ b/deps/npm/node_modules/y18n/index.js -@@ -11,7 +11,7 @@ function Y18N (opts) { - this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true - - // internal stuff. -- this.cache = {} -+ this.cache = Object.create(null) - this.writeQueue = [] - } - diff --git a/nodejs-tarball.sh b/nodejs-tarball.sh index a055ccb..a439469 100755 --- a/nodejs-tarball.sh +++ b/nodejs-tarball.sh @@ -171,6 +171,14 @@ echo "nghttp2" echo "=========================" grep "define NGHTTP2_VERSION " node-v${version}/deps/nghttp2/lib/includes/nghttp2/nghttp2ver.h echo +echo "nghttp3" +echo "=========================" +grep "define NGHTTP3_VERSION " node-v${version}/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +echo +echo "ngtcp2" +echo "=========================" +grep "define NGTCP2_VERSION " node-v${version}/deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +echo echo "ICU" echo "=========================" grep "url" node-v${version}/tools/icu/current_ver.dep diff --git a/nodejs.spec b/nodejs.spec index 038308f..df9bdbc 100644 --- a/nodejs.spec +++ b/nodejs.spec @@ -1,5 +1,4 @@ %global with_debug 0 -%global with_libs 0 # PowerPC, s390x and aarch64 segfault during Debug builds # https://github.com/nodejs/node/issues/20642 @@ -15,7 +14,7 @@ # This is used by both the nodejs package and the npm subpackage thar # has a separate version - the name is special so that rpmdev-bumpspec # will bump this rather than adding .1 to the end. -%global baserelease 2 +%global baserelease 1 %{?!_pkgdocdir:%global _pkgdocdir %{_docdir}/%{name}-%{version}} @@ -25,14 +24,12 @@ # feature releases that are only supported for nine months, which is shorter # than a Fedora release lifecycle. %global nodejs_epoch 1 -%global nodejs_major 14 -%global nodejs_minor 16 +%global nodejs_major 16 +%global nodejs_minor 1 %global nodejs_patch 0 %global nodejs_abi %{nodejs_major}.%{nodejs_minor} -%if %{?with_libs} == 1 # nodejs_soversion - from NODE_MODULE_VERSION in src/node_version.h -%global nodejs_soversion 83 -%endif +%global nodejs_soversion 93 %global nodejs_version %{nodejs_major}.%{nodejs_minor}.%{nodejs_patch} %global nodejs_release %{baserelease} @@ -42,10 +39,10 @@ # v8 - from deps/v8/include/v8-version.h # Epoch is set to ensure clean upgrades from the old v8 package %global v8_epoch 2 -%global v8_major 8 -%global v8_minor 4 -%global v8_build 371 -%global v8_patch 19 +%global v8_major 9 +%global v8_minor 0 +%global v8_build 257 +%global v8_patch 24 # V8 presently breaks ABI at least every x.y release while never bumping SONAME %global v8_abi %{v8_major}.%{v8_minor} %global v8_version %{v8_major}.%{v8_minor}.%{v8_build}.%{v8_patch} @@ -54,14 +51,14 @@ # c-ares - from deps/cares/include/ares_version.h # https://github.com/nodejs/node/pull/9332 %global c_ares_major 1 -%global c_ares_minor 16 +%global c_ares_minor 17 %global c_ares_patch 1 %global c_ares_version %{c_ares_major}.%{c_ares_minor}.%{c_ares_patch} # llhttp - from deps/llhttp/include/llhttp.h -%global llhttp_major 2 -%global llhttp_minor 1 -%global llhttp_patch 3 +%global llhttp_major 6 +%global llhttp_minor 0 +%global llhttp_patch 1 %global llhttp_version %{llhttp_major}.%{llhttp_minor}.%{llhttp_patch} # libuv - from deps/uv/include/uv/version.h @@ -76,8 +73,20 @@ %global nghttp2_patch 0 %global nghttp2_version %{nghttp2_major}.%{nghttp2_minor}.%{nghttp2_patch} +# nghttp3 - from deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h +%global nghttp3_major 0 +%global nghttp3_minor 1 +%global nghttp3_patch 0-DEV +%global nghttp3_version %{nghttp3_major}.%{nghttp3_minor}.%{nghttp3_patch} + +# ngtcp2 from deps/ngtcp2/ngtcp2/lib/includes/ngtcp2/version.h +%global ngtcp2_major 0 +%global ngtcp2_minor 1 +%global ngtcp2_patch 0-DEV +%global ngtcp2_version %{ngtcp2_major}.%{ngtcp2_minor}.%{ngtcp2_patch} + # ICU - from tools/icu/current_ver.dep -%global icu_major 67 +%global icu_major 69 %global icu_minor 1 %global icu_version %{icu_major}.%{icu_minor} @@ -108,9 +117,9 @@ # npm - from deps/npm/package.json %global npm_epoch 1 -%global npm_major 6 -%global npm_minor 14 -%global npm_patch 11 +%global npm_major 7 +%global npm_minor 11 +%global npm_patch 2 %global npm_version %{npm_major}.%{npm_minor}.%{npm_patch} # uvwasi - from deps/uvwasi/include/uvwasi.h @@ -160,36 +169,27 @@ Source7: nodejs_native.attr # Disable running gyp on bundled deps we don't use Patch1: 0001-Disable-running-gyp-on-shared-deps.patch -%if %{?with_libs} == 1 -# Patch to install both node and libnode.so, using the correct libdir -Patch2: 0002-Install-both-binaries-and-use-libdir.patch -%endif - # RHBZ#1915296 - yarn install crashes with nodejs:14 on aarch64 -Patch3: 0003-yarn-not-installable-on-aarch64.patch - -# CVE-2020-7774 -Patch4: 0004-CVE-2020-7774-nodejs-y18n-prototype-pollution-vulnerability.patch - +# Patch3: 0003-yarn-not-installable-on-aarch64.patch BuildRequires: make BuildRequires: python3-devel BuildRequires: zlib-devel BuildRequires: brotli-devel -BuildRequires: gcc >= 6.3.0 -BuildRequires: gcc-c++ >= 6.3.0 +BuildRequires: gcc >= 8.3.0 +BuildRequires: gcc-c++ >= 8.3.0 # needed to generate bundled provides for npm dependencies # https://src.fedoraproject.org/rpms/nodejs/pull-request/2 # https://pagure.io/nodejs-packaging/pull-request/10 BuildRequires: nodejs-packaging BuildRequires: chrpath BuildRequires: libatomic +BuildRequires: systemtap-sdt-devel %if %{with bootstrap} Provides: bundled(libuv) = %{libuv_version} Provides: bundled(nghttp2) = %{nghttp2_version} %else -BuildRequires: systemtap-sdt-devel BuildRequires: libuv-devel >= 1:%{libuv_version} Requires: libuv >= 1:%{libuv_version} BuildRequires: libnghttp2-devel >= %{nghttp2_version} @@ -199,6 +199,8 @@ Requires: libnghttp2 >= %{nghttp2_version} # Temporarily bundle llhttp because the upstream doesn't # provide releases for it. Provides: bundled(llhttp) = %{llhttp_version} +Provides: bundled(nghttp3) = %{nghttp3_version} +Provides: bundled(ngtcp2) = %{ngtcp2_version} BuildRequires: openssl-devel >= %{openssl_minimum} Requires: openssl >= %{openssl_minimum} @@ -206,10 +208,6 @@ Requires: openssl >= %{openssl_minimum} # we need the system certificate store Requires: ca-certificates -%if %{?with_libs} == 1 -Requires: nodejs-libs%{?_isa} = %{nodejs_epoch}:%{version}-%{release} -%endif - # Pull in the full-icu data by default Recommends: nodejs-full-i18n%{?_isa} = %{nodejs_epoch}:%{version}-%{release} @@ -297,31 +295,6 @@ Requires: libuv-devel%{?_isa} Development headers for the Node.js JavaScript runtime. -%if %{?with_libs} == 1 -%package libs -Summary: Node.js and v8 libraries - -# Compatibility for obsolete v8 package -%if 0%{?__isa_bits} == 64 -Provides: libv8.so.%{v8_major}()(64bit) -Provides: libv8_libbase.so.%{v8_major}()(64bit) -Provides: libv8_libplatform.so.%{v8_major}()(64bit) -%else -# 32-bits -Provides: libv8.so.%{v8_major} -Provides: libv8_libbase.so.%{v8_major} -Provides: libv8_libplatform.so.%{v8_major} -%endif - -Provides: v8 = %{v8_epoch}:%{v8_version}-%{nodejs_release}%{?dist} -Provides: v8%{?_isa} = %{v8_epoch}:%{v8_version}-%{nodejs_release}%{?dist} -Obsoletes: v8 < 1:6.7.17-10 - -%description libs -Libraries to support Node.js and provide stable v8 interfaces. -%endif - - %package full-i18n Summary: Non-English locale data for Node.js Requires: %{name}%{?_isa} = %{nodejs_epoch}:%{nodejs_version}-%{nodejs_release}%{?dist} @@ -331,19 +304,6 @@ Optional data files to provide full-icu support for Node.js. Remove this package to save space if non-English locales are not needed. -%if %{?with_libs} == 1 -%package -n v8-devel -Summary: v8 - development headers -Epoch: %{v8_epoch} -Version: %{v8_version} -Release: %{v8_release}%{?dist} -Requires: %{name}-devel%{?_isa} = %{nodejs_epoch}:%{nodejs_version}-%{nodejs_release}%{?dist} - -%description -n v8-devel -Development headers for the v8 runtime. -%endif - - %package -n npm Summary: Node.js Package Manager Epoch: %{npm_epoch} @@ -433,39 +393,13 @@ export CXXFLAGS="$(echo ${CXXFLAGS} | tr '\n\\' ' ')" export LDFLAGS="%{build_ldflags}" -%if %{?with_libs} == 1 %if %{with bootstrap} %{__python3} configure.py --prefix=%{_prefix} \ - --shared \ - --libdir=%{_lib} \ --shared-openssl \ --shared-zlib \ --shared-brotli \ - --without-dtrace \ - --with-intl=small-icu \ - --openssl-use-def-ca-store -%else -%{__python3} configure.py --prefix=%{_prefix} \ - --shared \ - --libdir=%{_lib} \ - --shared-openssl \ - --shared-zlib \ - --shared-brotli \ - --shared-libuv \ - --shared-nghttp2 \ --with-dtrace \ --with-intl=small-icu \ - --with-icu-default-data-dir=%{icudatadir} \ - --openssl-use-def-ca-store -%endif -%else -%if %{with bootstrap} -%{__python3} configure.py --prefix=%{_prefix} \ - --shared-openssl \ - --shared-zlib \ - --shared-brotli \ - --without-dtrace \ - --with-intl=small-icu \ --openssl-use-def-ca-store %else %{__python3} configure.py --prefix=%{_prefix} \ @@ -479,7 +413,6 @@ export LDFLAGS="%{build_ldflags}" --with-icu-default-data-dir=%{icudatadir} \ --openssl-use-def-ca-store %endif -%endif %if %{?with_debug} == 1 # Setting BUILDTYPE=Debug builds both release and debug binaries @@ -532,22 +465,6 @@ chrpath --delete %{buildroot}%{_bindir}/node install -Dpm0755 out/Debug/node %{buildroot}/%{_bindir}/node_g %endif -%if %{?with_libs} == 1 -# Install library symlink -ln -s %{_libdir}/libnode.so.%{nodejs_soversion} %{buildroot}%{_libdir}/libnode.so - -# Install v8 compatibility symlinks -for header in %{buildroot}%{_includedir}/node/libplatform %{buildroot}%{_includedir}/node/v8*.h; do - header=$(basename ${header}) - ln -s %{_includedir}/node/${header} %{buildroot}%{_includedir}/${header} -done -ln -s ./node/cppgc %{buildroot}%{_includedir}/cppgc -for soname in libv8 libv8_libbase libv8_libplatform; do - ln -s %{_libdir}/libnode.so.%{nodejs_soversion} %{buildroot}%{_libdir}/${soname}.so - ln -s %{_libdir}/libnode.so.%{nodejs_soversion} %{buildroot}%{_libdir}/${soname}.so.%{v8_major} -done -%endif - # own the sitelib directory mkdir -p %{buildroot}%{_prefix}/lib/node_modules @@ -602,7 +519,7 @@ find %{buildroot}%{_prefix}/lib/node_modules/npm \ -exec chmod -x {} \; # The above command is a little overzealous. Add a few permissions back. -chmod 0755 %{buildroot}%{_prefix}/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin/node-gyp +chmod 0775 %{buildroot}%{_prefix}/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node-gyp chmod 0755 %{buildroot}%{_prefix}/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js # Drop the NPM default configuration in place @@ -619,18 +536,6 @@ install -Dpm0644 -t %{buildroot}%{icudatadir} deps/icu/source/converted/* %check -%if %{?with_libs} == 1 -# Fail the build if the versions don't match -LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node -e "require('assert').equal(process.versions.node, '%{nodejs_version}')" -LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node -e "require('assert').equal(process.versions.v8.replace(/-node\.\d+$/, ''), '%{v8_version}')" -LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node -e "require('assert').equal(process.versions.ares.replace(/-DEV$/, ''), '%{c_ares_version}')" - -# Ensure we have punycode and that the version matches -LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node -e "require(\"assert\").equal(require(\"punycode\").version, '%{punycode_version}')" - -# Ensure we have npm and that the version matches -NODE_PATH=%{buildroot}%{_prefix}/lib/node_modules:%{buildroot}%{_prefix}/lib/node_modules/npm/node_modules LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node -e "require(\"assert\").equal(require(\"npm\").version, '%{npm_version}')" -%else # Fail the build if the versions don't match %{buildroot}/%{_bindir}/node -e "require('assert').equal(process.versions.node, '%{nodejs_version}')" %{buildroot}/%{_bindir}/node -e "require('assert').equal(process.versions.v8.replace(/-node\.\d+$/, ''), '%{v8_version}')" @@ -641,7 +546,6 @@ NODE_PATH=%{buildroot}%{_prefix}/lib/node_modules:%{buildroot}%{_prefix}/lib/nod # Ensure we have npm and that the version matches NODE_PATH=%{buildroot}%{_prefix}/lib/node_modules:%{buildroot}%{_prefix}/lib/node_modules/npm/node_modules %{buildroot}/%{_bindir}/node -e "require(\"assert\").equal(require(\"npm\").version, '%{npm_version}')" -%endif # Make sure i18n support is working NODE_PATH=%{buildroot}%{_prefix}/lib/node_modules:%{buildroot}%{_prefix}/lib/node_modules/npm/node_modules LD_LIBRARY_PATH=%{buildroot}%{_libdir} %{buildroot}/%{_bindir}/node --icu-data-dir=%{buildroot}%{icudatadir} %{SOURCE2} @@ -711,26 +615,6 @@ if st and st.type == "directory" then end -%if %{?with_libs} == 1 -%pretrans -n v8-devel -p --- Replace the v8 libplatform include directory with a symlink --- Drop this scriptlet when F30 is EOL -path = "%{_includedir}/libplatform" -st = posix.stat(path) -if st and st.type == "directory" then - status = os.rename(path, path .. ".rpmmoved") - if not status then - suffix = 0 - while not status do - suffix = suffix + 1 - status = os.rename(path .. ".rpmmoved", path .. ".rpmmoved." .. suffix) - end - os.rename(path, path .. ".rpmmoved") - end -end -%endif - - %files %{_bindir}/node %dir %{_prefix}/lib/node_modules @@ -739,12 +623,8 @@ end %dir %{_datadir}/systemtap/tapset %{_datadir}/systemtap/tapset/node.stp -%if %{with bootstrap} -# no dtrace -%else %dir %{_usr}/lib/dtrace %{_usr}/lib/dtrace/node.d -%endif %{_rpmconfigdir}/fileattrs/nodejs_native.attr %{_rpmconfigdir}/nodejs_native.req @@ -758,9 +638,6 @@ end %{_bindir}/node_g %endif %{_includedir}/node -%if %{?with_libs} == 1 -%{_libdir}/libnode.so -%endif %{_datadir}/node/common.gypi %{_pkgdocdir}/gdbinit @@ -770,26 +647,6 @@ end %{icudatadir}/icudt%{icu_major}*.dat -%if %{?with_libs} == 1 -%files libs -%{_libdir}/libnode.so.%{nodejs_soversion} -%{_libdir}/libv8.so.%{v8_major} -%{_libdir}/libv8_libbase.so.%{v8_major} -%{_libdir}/libv8_libplatform.so.%{v8_major} -%dir %{nodejs_datadir}/ - - -%files -n v8-devel -%{_includedir}/libplatform -%{_includedir}/v8*.h -%{_includedir}/cppgc -%{_libdir}/libv8.so -%{_libdir}/libv8_libbase.so -%{_libdir}/libv8_libplatform.so -%ghost %{_includedir}/libplatform.rpmmoved -%endif - - %files -n npm %{_bindir}/npm %{_bindir}/npx @@ -804,17 +661,15 @@ end %doc %{_mandir}/man5/npmrc.5* %doc %{_mandir}/man5/package-json.5* %doc %{_mandir}/man5/package-lock-json.5* -%doc %{_mandir}/man5/package-locks.5* -%doc %{_mandir}/man5/shrinkwrap-json.5* +%doc %{_mandir}/man5/npm-shrinkwrap-json.5* %doc %{_mandir}/man7/config.7* %doc %{_mandir}/man7/developers.7* -%doc %{_mandir}/man7/disputes.7* %doc %{_mandir}/man7/orgs.7* %doc %{_mandir}/man7/registry.7* %doc %{_mandir}/man7/removal.7* %doc %{_mandir}/man7/scope.7* %doc %{_mandir}/man7/scripts.7* -%doc %{_mandir}/man7/semver.7* +%doc %{_mandir}/man7/workspaces.7* %files docs @@ -825,6 +680,14 @@ end %changelog +* Tue May 11 2021 Zuzana Svetlikova - 1:16.1.0-1 +- Resolves: RHBZ#1953991 +- Rebase to v16.x +- Update version of gcc and gcc-c++ needed +- Remove libs conditionals +- Remove unused patches +- Bundle nghttp3 and ngtcp2 + * Mon Mar 01 2021 Zuzana Svetlikova - 1:14.16.0-2 - Resolves RHBZ#1930775 - remove --debug-nghttp2 option diff --git a/sources b/sources index 206bc38..bdf70ad 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (node-v14.16.0-stripped.tar.gz) = 57e761f5584f9239aaf6a77426578608fd8ab9a02ed6f676102dbf2aa7c914221800526e98839a5e4eaefe3e24810b24d70392caacb23c307e99208aa61b4663 -SHA512 (icu4c-67_1-src.tgz) = 4779f1ce1ca7976f6fad6768853ea8c540da54d11509e3b6cfd864a04b5f2db1c3d4b546387f91ad02fb90804525bc37d2543173f0d705d6ca11dc6f2b7640a8 +SHA512 (node-v16.1.0-stripped.tar.gz) = ab080a098b7c24866a9f7e39b026672d517efad5e8c17b44349c0e343a4121ca305bb470d89e28352e64a81ae88aa94de265c8c40c26db260c5053470ef6f610 +SHA512 (icu4c-69_1-src.tgz) = d4aeb781715144ea6e3c6b98df5bbe0490bfa3175221a1d667f3e6851b7bd4a638fa4a37d4a921ccb31f02b5d15a6dded9464d98051964a86f7b1cde0ff0aab7