Snap for 8426163 from 6f4c43260c44f347a44ab240299150851a409d8f to mainline-tzdata2-release

Change-Id: I94e1261d2db52a6b997aa0a9f4e599f04af8f663
diff --git a/Android.bp b/Android.bp
index ae055c0..a26de2e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -1,112 +1,9 @@
-package {
-    default_applicable_licenses: ["external_zlib_license"],
-}
-
-license {
-    name: "external_zlib_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-BSD",
-        "SPDX-license-identifier-Zlib",
-    ],
-    license_text: [
-        "LICENSE",
-    ],
-}
-
-srcs_opt = [
-    "adler32_simd.c",
-    // See https://chromium-review.googlesource.com/749732.
-// TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
-//    "contrib/optimizations/inffast_chunk.c",
-//    "contrib/optimizations/inflate.c",
-    // This file doesn't build for non-neon, so it can't be in the main srcs.
-    "crc32_simd.c",
-]
-
-cflags_arm = [
-    // Since we're building for the platform, we claim to be Linux rather than
-    // Android so we use getauxval() directly instead of the NDK
-    // android_getCpuFeatures which isn't available to us anyway.
-    "-DARMV8_OS_LINUX",
-    // Testing with zlib_bench shows -O3 is a win for ARM but a bit of a wash
-    // for x86, so match the BUILD file in only enabling this for ARM.
-    "-O3",
-    // We need a non-NEON libz.a for the NDK, and cpu_features.c won't build
-    // without this.
-    "-DCPU_NO_SIMD",
-]
-cflags_arm_neon = [
-    // Undo the -DCPU_NO_SIMD from the generic (non-NEON) ARM flags.
-    "-UCPU_NO_SIMD",
-    // We no longer support non-Neon platform builds, but the NDK just has one libz.
-    "-DADLER32_SIMD_NEON",
-// TODO: causes `atest org.apache.harmony.tests.java.util.zip.DeflaterTest` failures.
-//    "-DINFLATE_CHUNK_SIMD_NEON",
-    // HWCAP_CRC32 is checked at runtime, so it's okay to turn crc32
-    // acceleration on for both 32- and 64-bit.
-    "-DCRC32_ARMV8_CRC32",
-]
-cflags_arm64 = cflags_arm + cflags_arm_neon
-
-// The *host* x86 configuration (with *lower* CPU feature requirements).
-cflags_x86 = [
-    // See ARMV8_OS_LINUX above.
-    "-DX86_NOT_WINDOWS",
-// TODO: see arm above.
-//    "-DINFLATE_CHUNK_SIMD_SSE2",
-    // Android's host CPU feature requirements are *lower* than the
-    // corresponding device CPU feature requirements, so it's easier to just
-    // say "no SIMD for you" rather than specificially disable SSSE3.
-    // We should have a conversation about that, but not until we at least have
-    // data on how many Studio users have CPUs that don't make the grade...
-    // https://issuetracker.google.com/171235570
-    "-DCPU_NO_SIMD",
-]
-// The *device* x86 configuration (with *higher* CPU feature requirements).
-cflags_android_x86 = [
-    // Android's x86/x86-64 ABI includes SSE2 and SSSE3.
-    "-UCPU_NO_SIMD",
-    "-DADLER32_SIMD_SSSE3",
-    // PCLMUL isn't in the ABI, but it won't actually be used unless CPUID
-    // reports that the processor really does have the instruction.
-    "-mpclmul",
-    "-DCRC32_SIMD_SSE42_PCLMUL",
-]
-srcs_x86 = [
-    "crc_folding.c",
-    "fill_window_sse.c",
-] + srcs_opt
-
-// This optimization is applicable to arm64 and x86-64.
-cflags_64 = ["-DINFLATE_CHUNK_READ_64LE"]
-
-libz_srcs = [
-    "adler32.c",
-    "compress.c",
-    "cpu_features.c",
-    "crc32.c",
-    "deflate.c",
-    "gzclose.c",
-    "gzlib.c",
-    "gzread.c",
-    "gzwrite.c",
-    "infback.c",
-    "inffast.c",
-    "inflate.c",
-    "inftrees.c",
-    "trees.c",
-    "uncompr.c",
-    "zutil.c",
-]
-
 cc_defaults {
     name: "libz_defaults",
 
     cflags: [
-        // We do support hidden visibility, so turn that on.
+        "-O3",
         "-DHAVE_HIDDEN",
-        // We do support const, so turn that on.
         "-DZLIB_CONST",
         "-Wall",
         "-Werror",
@@ -115,40 +12,36 @@
     ],
     stl: "none",
     export_include_dirs: ["."],
-    srcs: libz_srcs,
+    srcs: [
+        "adler32.c",
+        "compress.c",
+        "cpu_features.c",
+        "crc32.c",
+        "deflate.c",
+        "gzclose.c",
+        "gzlib.c",
+        "gzread.c",
+        "gzwrite.c",
+        "infback.c",
+        "inflate.c",
+        "inftrees.c",
+        "inffast.c",
+        "trees.c",
+        "uncompr.c",
+        "zutil.c",
+    ],
 
     arch: {
         arm: {
+            // measurements show that the ARM version of ZLib is about x1.17 faster
+            // than the thumb one...
+            // TODO: re-test with zlib_bench after SIMD is enabled.
+            instruction_set: "arm",
+
             // TODO: This is to work around b/24465209. Remove after root cause
             // is fixed.
             pack_relocations: false,
             ldflags: ["-Wl,--hash-style=both"],
-
-            cflags: cflags_arm,
-            neon: {
-                cflags: cflags_arm_neon,
-                srcs: srcs_opt,
-            }
-        },
-        arm64: {
-            cflags: cflags_arm64 + cflags_64,
-            srcs: srcs_opt,
-        },
-        x86: {
-            cflags: cflags_x86,
-            srcs: srcs_x86,
-        },
-        x86_64: {
-            cflags: cflags_x86 + cflags_64,
-            srcs: srcs_x86,
-        },
-    },
-    target: {
-        android_x86: {
-            cflags: cflags_android_x86,
-        },
-        android_x86_64: {
-            cflags: cflags_android_x86,
         },
     },
 }
@@ -162,13 +55,11 @@
     static_ndk_lib: true,
 
     vendor_available: true,
-    product_available: true,
     vndk: {
         enabled: true,
         support_system_process: true,
     },
     ramdisk_available: true,
-    vendor_ramdisk_available: true,
     recovery_available: true,
     native_bridge_supported: true,
 
@@ -181,41 +72,19 @@
         },
     },
 
-    stubs: {
-        versions: [
-            "29",
-            "30",
-        ],
-        symbol_file: "libz.map.txt",
-    },
-}
+// TODO(b/155456180): make libz a stub-providing library by uncommenting below
+//    stubs: {
+//        versions: ["29", "30"],
+//        symbol_file: "libz.map.txt",
+//    },
 
-// A more stable build of libz. Build configuration of this library should be
-// the same for different targets. This is only used by imgdiff.
-
-cc_library {
-    name: "libz_stable",
-    visibility: [
-        "//bootable/recovery/applypatch",
-        "//bootable/recovery/tests",
+    apex_available: [
+        "//apex_available:platform",
+        "com.android.art.debug", // from libdexfile
+        "com.android.art.release",
+        "com.android.bluetooth.updatable",
+        "com.android.runtime",
     ],
-    cflags: [
-        // We do support hidden visibility, so turn that on.
-        "-DHAVE_HIDDEN",
-        // We do support const, so turn that on.
-        "-DZLIB_CONST",
-        "-Wall",
-        "-Werror",
-        "-Wno-unused",
-        "-Wno-unused-parameter",
-    ],
-    stl: "none",
-    export_include_dirs: ["."],
-    srcs: libz_srcs,
-
-    host_supported: true,
-    vendor_available: true,
-    recovery_available: true,
 }
 
 cc_binary_host {
@@ -232,40 +101,41 @@
     cflags: ["-Wall", "-Werror"],
     host_supported: true,
     shared_libs: ["libz"],
-    // We build zlib_bench32 and zlib_bench64 so it's easy to test LP32.
-    compile_multilib: "both",
-    multilib: {
-        lib32: { suffix: "32", },
-        lib64: { suffix: "64", },
-    },
 }
 
-cc_test {
-    name: "zlib_tests",
-    srcs: [
-        "contrib/tests/infcover.cc",
-        "contrib/tests/utils_unittest.cc",
-        "google/compression_utils_portable.cc",
-    ],
-    include_dirs: [
-        "external/zlib/google",
-        // These tests include "gtest.h" rather than the usual "gtest/gtest.h".
-        "external/googletest/googletest/include/gtest/",
-    ],
-    shared_libs: ["libz"],
-    host_supported: true,
-    test_suites: ["device-tests"],
-}
+// This module is defined in development/ndk/Android.bp. Updating these headers
+// to be usable for any API level is going to be some work (at the very least,
+// there's a ZLIB_VERNUM that will need to be handled since early versions of
+// Android did not have all the APIs that calling code will use if this is set
+// to the current value.
+//
+// The NDK never updated the zlib headers when the platform updated, so until we
+// solve this the NDK will continue shipping the old headers.
+//
+// ndk_headers {
+//     name: "libz_headers",
+//     from: "src",
+//     to: "",
+//     srcs: [
+//         "src/zconf.h",
+//         "src/zlib.h",
+//     ],
+//     license: "NOTICE",
+// }
 
-ndk_headers {
-    name: "libz_headers",
-    from: "",
-    to: "",
-    srcs: [
-        "zconf.h",
-        "zlib.h",
+// TODO(b/155351357) remove this library and let libtextclassifier to use libz
+// instead.
+// libz_current allows modules building against the NDK to have access to zlib
+// API that's not available from the NDK libz.
+cc_library_static {
+    name: "libz_current",
+    defaults: ["libz_defaults"],
+    sdk_version: "current",
+
+    apex_available: [
+        "//apex_available:platform", // indirectly from GoogleExtServices that gets installed to /system
+        "com.android.extservices", // indirectly via libtextclassifier
     ],
-    license: "LICENSE",
 }
 
 ndk_library {
diff --git a/BUILD.gn b/BUILD.gn
index d64cb38..2414c88 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -4,10 +4,6 @@
 
 import("//build/config/compiler/compiler.gni")
 
-if (build_with_chromium) {
-  import("//testing/test.gni")
-}
-
 if (current_cpu == "arm" || current_cpu == "arm64") {
   import("//build/config/arm.gni")
 }
@@ -18,36 +14,10 @@
 
 config("zlib_internal_config") {
   defines = [ "ZLIB_IMPLEMENTATION" ]
-
-  if (!is_debug) {
-    # Build code using -O3, see: crbug.com/1084371.
-    configs = [ "//build/config/compiler:optimize_speed" ]
-  }
-  if (is_debug || use_libfuzzer) {
-    # Enable zlib's asserts in debug and fuzzer builds.
-    defines += [ "ZLIB_DEBUG" ]
-  }
-}
-
-source_set("zlib_common_headers") {
-  sources = [
-    "chromeconf.h",
-    "deflate.h",
-    "inffast.h",
-    "inffixed.h",
-    "inflate.h",
-    "inftrees.h",
-    "zconf.h",
-    "zlib.h",
-    "zutil.h",
-  ]
 }
 
 use_arm_neon_optimizations = false
-if ((current_cpu == "arm" || current_cpu == "arm64") &&
-    !(is_win && !is_clang)) {
-  # TODO(richard.townsend@arm.com): Optimizations temporarily disabled for
-  # Windows on Arm MSVC builds, see http://crbug.com/v8/10012.
+if (current_cpu == "arm" || current_cpu == "arm64") {
   if (arm_use_neon) {
     use_arm_neon_optimizations = true
   }
@@ -64,9 +34,7 @@
     } else {
       defines += [ "X86_NOT_WINDOWS" ]
     }
-  }
-
-  if (use_arm_neon_optimizations) {
+  } else if (use_arm_neon_optimizations) {
     defines = [ "ADLER32_SIMD_NEON" ]
   }
 }
@@ -90,13 +58,16 @@
       "adler32_simd.c",
       "adler32_simd.h",
     ]
+    if (!is_debug) {
+      # Use optimize_speed (-O3) to output the _smallest_ code.
+      configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_speed" ]
+    }
   }
 
   configs += [ ":zlib_internal_config" ]
 
   public_configs = [ ":zlib_adler32_simd_config" ]
-
-  public_deps = [ ":zlib_common_headers" ]
 }
 
 if (use_arm_neon_optimizations) {
@@ -110,8 +81,6 @@
         defines += [ "ARMV8_OS_ANDROID" ]
       } else if (is_linux || is_chromeos) {
         defines += [ "ARMV8_OS_LINUX" ]
-      } else if (is_mac) {
-        defines += [ "ARMV8_OS_MACOS" ]
       } else if (is_fuchsia) {
         defines += [ "ARMV8_OS_FUCHSIA" ]
       } else if (is_win) {
@@ -138,13 +107,16 @@
         "crc32_simd.c",
         "crc32_simd.h",
       ]
+
+      if (!is_debug) {
+        configs -= [ "//build/config/compiler:default_optimization" ]
+        configs += [ "//build/config/compiler:optimize_speed" ]
+      }
     }
 
     configs += [ ":zlib_internal_config" ]
 
     public_configs = [ ":zlib_arm_crc32_config" ]
-
-    public_deps = [ ":zlib_common_headers" ]
   }
 }
 
@@ -159,7 +131,6 @@
 
   if (use_arm_neon_optimizations) {
     defines = [ "INFLATE_CHUNK_SIMD_NEON" ]
-
     if (current_cpu == "arm64") {
       defines += [ "INFLATE_CHUNK_READ_64LE" ]
     }
@@ -178,18 +149,22 @@
       "contrib/optimizations/inffast_chunk.h",
       "contrib/optimizations/inflate.c",
     ]
+
+    if (use_arm_neon_optimizations && !is_debug) {
+      # Here we trade better performance on newer/bigger ARMv8 cores
+      # for less perf on ARMv7, per crbug.com/772870#c40
+      configs -= [ "//build/config/compiler:default_optimization" ]
+      configs += [ "//build/config/compiler:optimize_speed" ]
+    }
   }
 
-  configs += [ ":zlib_internal_config" ]
-
-  # Needed for MSVC, which is still supported by V8 and PDFium. zlib uses K&R C
-  # style function declarations, which triggers warning C4131.
   configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
+  configs += [
+    ":zlib_internal_config",
+    "//build/config/compiler:no_chromium_code",
+  ]
 
   public_configs = [ ":zlib_inflate_chunk_simd_config" ]
-
-  public_deps = [ ":zlib_common_headers" ]
 }
 
 config("zlib_crc32_simd_config") {
@@ -218,16 +193,6 @@
   configs += [ ":zlib_internal_config" ]
 
   public_configs = [ ":zlib_crc32_simd_config" ]
-  public_deps = [ ":zlib_common_headers" ]
-}
-
-config("zlib_x86_simd_config") {
-  if (use_x86_x64_optimizations) {
-    defines = [
-      "CRC32_SIMD_SSE42_PCLMUL",
-      "DEFLATE_FILL_WINDOW_SSE2",
-    ]
-  }
 }
 
 source_set("zlib_x86_simd") {
@@ -247,11 +212,11 @@
     }
   }
 
-  configs += [ ":zlib_internal_config" ]
-
-  public_configs = [ ":zlib_x86_simd_config" ]
-
-  public_deps = [ ":zlib_common_headers" ]
+  configs -= [ "//build/config/compiler:chromium_code" ]
+  configs += [
+    ":zlib_internal_config",
+    "//build/config/compiler:no_chromium_code",
+  ]
 }
 
 config("zlib_warnings") {
@@ -300,7 +265,6 @@
 
   defines = []
   deps = []
-
   if (!use_x86_x64_optimizations && !use_arm_neon_optimizations) {
     # Apparently android_cronet bot builds with NEON disabled and
     # we also should disable optimizations for iOS@x86 (a.k.a. simulator).
@@ -310,8 +274,8 @@
   if (is_ios) {
     # iOS@ARM is a special case where we always have NEON but don't check
     # for crypto extensions.
-    # TODO(cavalcantii): verify what is the current state of CPU features
-    # shipped on latest iOS devices.
+    # TODO(cavalcantii): verify what is the current state of CPU features shipped
+    # on latest iOS devices.
     defines += [ "ARM_OS_IOS" ]
   }
 
@@ -331,8 +295,6 @@
     sources += [ "inflate.c" ]
   }
 
-  deps += [ ":zlib_x86_simd" ]
-
   if (is_android) {
     import("//build/config/android/config.gni")
     if (defined(android_ndk_root) && android_ndk_root != "") {
@@ -343,17 +305,17 @@
   }
 
   configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-
-  public_configs = [ ":zlib_config" ]
-
   configs += [
     ":zlib_internal_config",
+    "//build/config/compiler:no_chromium_code",
 
     # Must be after no_chromium_code for warning flags to be ordered correctly.
     ":zlib_warnings",
   ]
 
+  public_configs = [ ":zlib_config" ]
+
+  deps += [ ":zlib_x86_simd" ]
   allow_circular_includes_from = deps
 }
 
@@ -385,7 +347,7 @@
     ]
   }
 
-  if (is_apple || is_android || is_nacl) {
+  if (is_mac || is_ios || is_android || is_nacl) {
     # Mac, Android and the BSDs don't have fopen64, ftello64, or fseeko64. We
     # use fopen, ftell, and fseek instead on these systems.
     defines = [ "USE_FILE32API" ]
@@ -394,59 +356,28 @@
   deps = [ ":zlib" ]
 
   configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-
-  public_configs = [ ":zlib_config" ]
-
   configs += [
+    "//build/config/compiler:no_chromium_code",
+
     # Must be after no_chromium_code for warning flags to be ordered correctly.
     ":minizip_warnings",
   ]
+
+  public_configs = [ ":zlib_config" ]
 }
 
 executable("zlib_bench") {
   include_dirs = [ "." ]
 
   sources = [ "contrib/bench/zlib_bench.cc" ]
+
   if (!is_debug) {
     configs -= [ "//build/config/compiler:default_optimization" ]
     configs += [ "//build/config/compiler:optimize_speed" ]
   }
 
-  deps = [ ":zlib" ]
-
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
-}
 
-if (build_with_chromium) {
-  test("zlib_unittests") {
-    testonly = true
-
-    sources = [
-      "contrib/tests/infcover.cc",
-      "contrib/tests/infcover.h",
-      "contrib/tests/run_all_unittests.cc",
-      "contrib/tests/utils_unittest.cc",
-      "google/compression_utils_unittest.cc",
-      "google/zip_reader_unittest.cc",
-      "google/zip_unittest.cc",
-    ]
-
-    data = [ "google/test/data/" ]
-
-    deps = [
-      ":zlib",
-      "google:compression_utils",
-      "google:zip",
-      "//base/test:test_support",
-      "//testing/gtest",
-    ]
-
-    include_dirs = [
-      "//third_party/googletest/src/googletest/include/gtest",
-      ".",
-      "google",
-    ]
-  }
+  deps = [ ":zlib" ]
 }
diff --git a/DIR_METADATA b/DIR_METADATA
deleted file mode 100644
index d366dc7..0000000
--- a/DIR_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail: {
-  component: "Internals"
-}
diff --git a/METADATA b/METADATA
index 423792a..10f4685 100644
--- a/METADATA
+++ b/METADATA
@@ -5,11 +5,11 @@
     type: GIT
     value: "https://chromium.googlesource.com/chromium/src/third_party/zlib/"
   }
-  version: "eb9ce8c993117f27ea0e5bccc0f2fee2a5323066"
+  version: "b9b9a5af7cca2e683e5f2aead8418e5bf9d5a7d5"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2021
-    month: 5
-    day: 6
+    year: 2020
+    month: 2
+    day: 7
   }
 }
diff --git a/NOTICE b/NOTICE
new file mode 120000
index 0000000..7a694c9
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1 @@
+LICENSE
\ No newline at end of file
diff --git a/OWNERS b/OWNERS
index 632b3f9..22f4d89 100644
--- a/OWNERS
+++ b/OWNERS
@@ -3,3 +3,5 @@
 cblume@chromium.org
 mtklein@google.com
 scroggo@google.com
+
+# COMPONENT: Internals
diff --git a/README.chromium b/README.chromium
index c3c1ef6..3d90f79 100644
--- a/README.chromium
+++ b/README.chromium
@@ -2,7 +2,6 @@
 Short Name: zlib
 URL: http://zlib.net/
 Version: 1.2.11
-CPEPrefix: cpe:/a:zlib:zlib:1.2.11
 Security Critical: yes
 License: Custom license
 License File: LICENSE
diff --git a/TEST_MAPPING b/TEST_MAPPING
index b2c8b36..06f36fd 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -3,19 +3,18 @@
     {
       "name": "puffin_unittest"
     },
+    // recovery_host_test (imgdiff) relies on zlib for patch generation.
+    {
+      "name": "recovery_host_test",
+      "host": true
+    },
     {
       "name": "recovery_unit_test"
     },
     {
-      "name": "update_engine_unittests"
-    },
-    {
       "name": "ziparchive-tests"
     },
     {
-      "name": "zlib_tests"
-    },
-    {
       "name": "CtsLibcoreTestCases",
       "options": [
         {
diff --git a/adler32.c b/adler32.c
index 8f8fbb9..696773a 100644
--- a/adler32.c
+++ b/adler32.c
@@ -74,10 +74,10 @@
     unsigned n;
 
 #if defined(ADLER32_SIMD_SSSE3)
-    if (buf != Z_NULL && len >= 64 && x86_cpu_enable_ssse3)
+    if (x86_cpu_enable_ssse3 && buf && len >= 64)
         return adler32_simd_(adler, buf, len);
 #elif defined(ADLER32_SIMD_NEON)
-    if (buf != Z_NULL && len >= 64)
+    if (buf && len >= 64)
         return adler32_simd_(adler, buf, len);
 #endif
 
diff --git a/chromeconf.h b/chromeconf.h
index 5ecf29e..666093d 100644
--- a/chromeconf.h
+++ b/chromeconf.h
@@ -192,8 +192,4 @@
 #define arm_check_features Cr_z_arm_check_features
 #define armv8_crc32_little Cr_z_armv8_crc32_little
 
-/* Symbols added by cpu_features.c */
-#define cpu_check_features Cr_z_cpu_check_features
-#define x86_cpu_enable_sse2 Cr_z_x86_cpu_enable_sse2
-
 #endif /* THIRD_PARTY_ZLIB_CHROMECONF_H_ */
diff --git a/contrib/bench/zlib_bench.cc b/contrib/bench/zlib_bench.cc
index bd06ad3..5dcdef0 100644
--- a/contrib/bench/zlib_bench.cc
+++ b/contrib/bench/zlib_bench.cc
@@ -15,7 +15,7 @@
  * Note this code can be compiled outside of the Chromium build system against
  * the system zlib (-lz) with g++ or clang++ as follows:
  *
- *   g++|clang++ -O3 -Wall -std=c++11 zlib_bench.cc -lstdc++ -lz
+ *   g++|clang++ -O3 -Wall -std=c++11 -lstdc++ -lz zlib_bench.cc
  */
 
 #include <algorithm>
@@ -38,7 +38,7 @@
 }
 
 inline char* string_data(std::string* s) {
-  return s->empty() ? nullptr : &*s->begin();
+  return s->empty() ? 0 : &*s->begin();
 }
 
 struct Data {
@@ -99,25 +99,10 @@
   if (type == kWrapperZRAW)
     return "RAW";
   error_exit("bad wrapper type", int(type));
-  return nullptr;
+  return 0;
 }
 
-static int zlib_strategy = Z_DEFAULT_STRATEGY;
-
-const char* zlib_level_strategy_name(int compression_level) {
-  if (compression_level == 0)
-    return "";  // strategy is meaningless at level 0
-  if (zlib_strategy == Z_HUFFMAN_ONLY)
-    return "huffman ";
-  if (zlib_strategy == Z_RLE)
-    return "rle ";
-  if (zlib_strategy == Z_DEFAULT_STRATEGY)
-    return "";
-  error_exit("bad strategy", zlib_strategy);
-  return nullptr;
-}
-
-static int zlib_compression_level = Z_DEFAULT_COMPRESSION;
+static int zlib_compression_level;
 
 void zlib_compress(
     const zlib_wrapper type,
@@ -134,7 +119,7 @@
   memset(&stream, 0, sizeof(stream));
 
   int result = deflateInit2(&stream, zlib_compression_level, Z_DEFLATED,
-      zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, zlib_strategy);
+      zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY);
   if (result != Z_OK)
     error_exit("deflateInit2 failed", result);
 
@@ -200,12 +185,7 @@
   const auto file = read_file_data_or_exit(name);
   const int length = static_cast<int>(file.size);
   const char* data = file.data.get();
-
-  /*
-   * Report compression strategy and file name.
-   */
-  const char* strategy = zlib_level_strategy_name(zlib_compression_level);
-  printf("%s%-40s :\n", strategy, name);
+  printf("%-40s :\n", name);
 
   /*
    * Chop the data into blocks.
@@ -296,20 +276,18 @@
 
 char* get_option(int argc, char* argv[], const char* option) {
   if (argn < argc)
-    return !strcmp(argv[argn], option) ? argv[argn++] : nullptr;
-  return nullptr;
+    return !strcmp(argv[argn], option) ? argv[argn++] : 0;
+  return 0;
 }
 
 bool get_compression(int argc, char* argv[], int* value) {
   if (argn < argc)
-    *value = isdigit(argv[argn][0]) ? atoi(argv[argn++]) : -1;
-  return *value >= 0 && *value <= 9;
+    *value = atoi(argv[argn++]);
+  return *value >= 1 && *value <= 9;
 }
 
-const char* options = "gzip|zlib|raw [--compression 0:9] [--huffman|--rle]";
-
 void usage_exit(const char* program) {
-  printf("usage: %s %s files...", program, options);
+  printf("usage: %s gzip|zlib|raw [--compression 1:9] files...\n", program);
   exit(1);
 }
 
@@ -324,18 +302,10 @@
   else
     usage_exit(argv[0]);
 
-  while (argn < argc && argv[argn][0] == '-') {
-    if (get_option(argc, argv, "--compression")) {
-      if (!get_compression(argc, argv, &zlib_compression_level))
-        usage_exit(argv[0]);
-    } else if (get_option(argc, argv, "--huffman")) {
-      zlib_strategy = Z_HUFFMAN_ONLY;
-    } else if (get_option(argc, argv, "--rle")) {
-      zlib_strategy = Z_RLE;
-    } else {
-      usage_exit(argv[0]);
-    }
-  }
+  if (!get_option(argc, argv, "--compression"))
+    zlib_compression_level = Z_DEFAULT_COMPRESSION;
+  else if (!get_compression(argc, argv, &zlib_compression_level))
+    usage_exit(argv[0]);
 
   if (argn >= argc)
     usage_exit(argv[0]);
diff --git a/contrib/minizip/iowin32.c b/contrib/minizip/iowin32.c
index c6bc314..246ceb9 100644
--- a/contrib/minizip/iowin32.c
+++ b/contrib/minizip/iowin32.c
@@ -31,12 +31,14 @@
 #define _WIN32_WINNT 0x601
 #endif
 
-#if !defined(IOWIN32_USING_WINRT_API)
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
-// Windows Store or Universal Windows Platform
+#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
+// see Include/shared/winapifamily.h in the Windows Kit
+#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
+#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
 #define IOWIN32_USING_WINRT_API 1
 #endif
 #endif
+#endif
 
 voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
 uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/contrib/optimizations/chunkcopy.h b/contrib/optimizations/chunkcopy.h
index 9c0b7cb..38ba0ed 100644
--- a/contrib/optimizations/chunkcopy.h
+++ b/contrib/optimizations/chunkcopy.h
@@ -112,10 +112,6 @@
   Assert(out + len <= limit, "chunk copy exceeds safety limit");
   if ((limit - out) < (ptrdiff_t)CHUNKCOPY_CHUNK_SIZE) {
     const unsigned char FAR* Z_RESTRICT rfrom = from;
-    Assert((uintptr_t)out - (uintptr_t)from >= len,
-           "invalid restrict in chunkcopy_core_safe");
-    Assert((uintptr_t)from - (uintptr_t)out >= len,
-           "invalid restrict in chunkcopy_core_safe");
     if (len & 8) {
       Z_BUILTIN_MEMCPY(out, rfrom, 8);
       out += 8;
@@ -342,10 +338,6 @@
     unsigned char FAR* Z_RESTRICT out,
     const unsigned char FAR* Z_RESTRICT from,
     unsigned len) {
-  Assert((uintptr_t)out - (uintptr_t)from >= len,
-         "invalid restrict in chunkcopy_relaxed");
-  Assert((uintptr_t)from - (uintptr_t)out >= len,
-         "invalid restrict in chunkcopy_relaxed");
   return chunkcopy_core(out, from, len);
 }
 
@@ -368,11 +360,6 @@
     unsigned len,
     unsigned char FAR* limit) {
   Assert(out + len <= limit, "chunk copy exceeds safety limit");
-  Assert((uintptr_t)out - (uintptr_t)from >= len,
-         "invalid restrict in chunkcopy_safe");
-  Assert((uintptr_t)from - (uintptr_t)out >= len,
-         "invalid restrict in chunkcopy_safe");
-
   return chunkcopy_core_safe(out, from, len, limit);
 }
 
@@ -419,26 +406,6 @@
   return chunkcopy_lapped_relaxed(out, dist, len);
 }
 
-/* TODO(cavalcanti): see crbug.com/1110083. */
-static inline unsigned char FAR* chunkcopy_safe_ugly(unsigned char FAR* out,
-                                                     unsigned dist,
-                                                     unsigned len,
-                                                     unsigned char FAR* limit) {
-#if defined(__GNUC__) && !defined(__clang__)
-  /* Speed is the same as using chunkcopy_safe
-     w/ GCC on ARM (tested gcc 6.3 and 7.5) and avoids
-     undefined behavior.
-  */
-  return chunkcopy_core_safe(out, out - dist, len, limit);
-#elif defined(__clang__) && defined(ARMV8_OS_ANDROID) && !defined(__aarch64__)
-  /* Seems to perform better on 32bit (i.e. Android). */
-  return chunkcopy_core_safe(out, out - dist, len, limit);
-#else
-  /* Seems to perform better on 64bit. */
-  return chunkcopy_lapped_safe(out, dist, len, limit);
-#endif
-}
-
 /*
  * The chunk-copy code above deals with writing the decoded DEFLATE data to
  * the output with SIMD methods to increase decode speed. Reading the input
diff --git a/contrib/optimizations/inffast_chunk.c b/contrib/optimizations/inffast_chunk.c
index 4bacbc4..4099edf 100644
--- a/contrib/optimizations/inffast_chunk.c
+++ b/contrib/optimizations/inffast_chunk.c
@@ -276,7 +276,7 @@
                            the main copy is near the end.
                           */
                         out = chunkunroll_relaxed(out, &dist, &len);
-                        out = chunkcopy_safe_ugly(out, dist, len, limit);
+                        out = chunkcopy_safe(out, out - dist, len, limit);
                     } else {
                         /* from points to window, so there is no risk of
                            overlapping pointers requiring memset-like behaviour
diff --git a/contrib/optimizations/insert_string.h b/contrib/optimizations/insert_string.h
index 9f634ae..1826601 100644
--- a/contrib/optimizations/insert_string.h
+++ b/contrib/optimizations/insert_string.h
@@ -4,51 +4,45 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the Chromium source repository LICENSE file.
  */
-
-#if defined(_MSC_VER)
+#ifdef _MSC_VER
 #define INLINE __inline
 #else
 #define INLINE inline
 #endif
 
 #include "cpu_features.h"
-
+/* Optimized insert_string block */
+#if defined(CRC32_SIMD_SSE42_PCLMUL) || defined(CRC32_ARMV8_CRC32)
+#define TARGET_CPU_WITH_CRC
 // clang-format off
 #if defined(CRC32_SIMD_SSE42_PCLMUL)
-  #include <smmintrin.h>  /* Required to make MSVC bot build pass. */
-
-  #if defined(__clang__) || defined(__GNUC__)
+  /* Required to make MSVC bot build pass. */
+  #include <smmintrin.h>
+  #if defined(__GNUC__) || defined(__clang__)
+    #undef TARGET_CPU_WITH_CRC
     #define TARGET_CPU_WITH_CRC __attribute__((target("sse4.2")))
-  #else
-    #define TARGET_CPU_WITH_CRC
   #endif
 
   #define _cpu_crc32_u32 _mm_crc32_u32
 
 #elif defined(CRC32_ARMV8_CRC32)
   #if defined(__clang__)
+    #undef TARGET_CPU_WITH_CRC
     #define __crc32cw __builtin_arm_crc32cw
-  #elif defined(__GNUC__)
-    #define __crc32cw __builtin_aarch64_crc32cw
   #endif
 
-  #if defined(__aarch64__) && defined(__clang__)
-    #define TARGET_CPU_WITH_CRC __attribute__((target("crc")))
-  #elif defined(__aarch64__) && defined(__GNUC__)
-    #define TARGET_CPU_WITH_CRC __attribute__((target("+crc")))
-  #elif defined(__clang__) // !defined(__aarch64__)
-    #define TARGET_CPU_WITH_CRC __attribute__((target("armv8-a,crc")))
-  #endif  // defined(__aarch64__)
-
   #define _cpu_crc32_u32 __crc32cw
 
+  #if defined(__aarch64__)
+    #define TARGET_CPU_WITH_CRC __attribute__((target("crc")))
+  #else  // !defined(__aarch64__)
+    #define TARGET_CPU_WITH_CRC __attribute__((target("armv8-a,crc")))
+  #endif  // defined(__aarch64__)
 #endif
 // clang-format on
-
-#if defined(TARGET_CPU_WITH_CRC)
-
 TARGET_CPU_WITH_CRC
-local INLINE Pos insert_string_simd(deflate_state* const s, const Pos str) {
+local INLINE Pos insert_string_optimized(deflate_state* const s,
+                                         const Pos str) {
   Pos ret;
   unsigned *ip, val, h = 0;
 
@@ -70,8 +64,7 @@
   s->prev[str & s->w_mask] = ret;
   return ret;
 }
-
-#endif // TARGET_CPU_WITH_CRC
+#endif /* Optimized insert_string block */
 
 /* ===========================================================================
  * Update a hash value with the given input byte
@@ -106,22 +99,24 @@
 }
 
 local INLINE Pos insert_string(deflate_state* const s, const Pos str) {
-/* insert_string_simd string dictionary insertion: this SIMD symbol hashing
- * significantly improves data compression speed.
+/* String dictionary insertion: faster symbol hashing has a positive impact
+ * on data compression speeds (around 20% on Intel and 36% on Arm Cortex big
+ * cores).
+ * A misfeature is that the generated compressed output will differ from
+ * vanilla zlib (even though it is still valid 'DEFLATE-d' content).
  *
- * Note: the generated compressed output is a valid DEFLATE stream but will
- * differ from vanilla zlib output ...
+ * We offer here a way to disable the optimization if there is the expectation
+ * that compressed content should match when compared to vanilla zlib.
  */
-#if defined(CHROMIUM_ZLIB_NO_CASTAGNOLI)
-/* ... so this build-time option can used to disable the SIMD symbol hasher
- * if matching vanilla zlib DEFLATE output is required.
- */ (;) /* FALLTHOUGH */
-#elif defined(TARGET_CPU_WITH_CRC) && defined(CRC32_SIMD_SSE42_PCLMUL)
-  if (x86_cpu_enable_simd)
-    return insert_string_simd(s, str);
-#elif defined(TARGET_CPU_WITH_CRC) && defined(CRC32_ARMV8_CRC32)
+#if !defined(CHROMIUM_ZLIB_NO_CASTAGNOLI)
+  /* TODO(cavalcantii): unify CPU features code. */
+#if defined(CRC32_ARMV8_CRC32)
   if (arm_cpu_enable_crc32)
-    return insert_string_simd(s, str);
+    return insert_string_optimized(s, str);
+#elif defined(CRC32_SIMD_SSE42_PCLMUL)
+  if (x86_cpu_enable_simd)
+    return insert_string_optimized(s, str);
+#endif
 #endif
   return insert_string_c(s, str);
 }
diff --git a/contrib/tests/DEPS b/contrib/tests/DEPS
deleted file mode 100644
index 4275174..0000000
--- a/contrib/tests/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-    "+testing/gtest",
-    "+base",
-]
diff --git a/contrib/tests/OWNERS b/contrib/tests/OWNERS
index aa6a2d1..9a2fb6f 100644
--- a/contrib/tests/OWNERS
+++ b/contrib/tests/OWNERS
@@ -1,2 +1 @@
 cblume@chromium.org
-cavalcantii@chromium.org
diff --git a/contrib/tests/fuzzers/BUILD.gn b/contrib/tests/fuzzers/BUILD.gn
index 10abe00..34c3b43 100644
--- a/contrib/tests/fuzzers/BUILD.gn
+++ b/contrib/tests/fuzzers/BUILD.gn
@@ -18,12 +18,6 @@
   deps = [ "../../../:zlib" ]
 }
 
-fuzzer_test("zlib_streaming_inflate_fuzzer") {
-  sources = [ "streaming_inflate_fuzzer.cc" ]
-  deps = [ "../../../:zlib" ]
-  libfuzzer_options = [ "max_len=256000" ]
-}
-
 fuzzer_test("zlib_deflate_set_dictionary_fuzzer") {
   sources = [ "deflate_set_dictionary_fuzzer.cc" ]
   deps = [ "../../../:zlib" ]
diff --git a/contrib/tests/fuzzers/OWNERS b/contrib/tests/fuzzers/OWNERS
index 9a2fb6f..6397ce6 100644
--- a/contrib/tests/fuzzers/OWNERS
+++ b/contrib/tests/fuzzers/OWNERS
@@ -1 +1,2 @@
 cblume@chromium.org
+mmoroz@chromium.org
diff --git a/contrib/tests/fuzzers/deflate_fuzzer.cc b/contrib/tests/fuzzers/deflate_fuzzer.cc
index c00e715..6098ff1 100644
--- a/contrib/tests/fuzzers/deflate_fuzzer.cc
+++ b/contrib/tests/fuzzers/deflate_fuzzer.cc
@@ -2,73 +2,46 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <fuzzer/FuzzedDataProvider.h>
 #include <stddef.h>
 #include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
+#include <cassert>
 #include <vector>
 
 #include "third_party/zlib/zlib.h"
 
-// Fuzzer builds often have NDEBUG set, so roll our own assert macro.
-#define ASSERT(cond)                                                           \
-  do {                                                                         \
-    if (!(cond)) {                                                             \
-      fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \
-      exit(1);                                                                 \
-    }                                                                          \
-  } while (0)
+static Bytef buffer[256 * 1024] = {0};
 
+// Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  FuzzedDataProvider fdp(data, size);
-  int level = fdp.PickValueInArray({0, 1, 2, 3, 4, 5, 6, 7, 8, 9});
-  int windowBits = fdp.PickValueInArray({9, 10, 11, 12, 13, 14, 15});
-  int memLevel = fdp.PickValueInArray({1, 2, 3, 4, 5, 6, 7, 8, 9});
-  int strategy = fdp.PickValueInArray(
-      {Z_DEFAULT_STRATEGY, Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED});
-  std::vector<uint8_t> src = fdp.ConsumeRemainingBytes<uint8_t>();
+  // zlib's deflate requires non-zero input sizes
+  if (!size)
+    return 0;
+
+  // We need to strip the 'const' for zlib.
+  std::vector<unsigned char> input_buffer{data, data+size};
+
+  uLongf buffer_length = static_cast<uLongf>(sizeof(buffer));
 
   z_stream stream;
+  stream.next_in = input_buffer.data();
+  stream.avail_in = size;
+  stream.total_in = size;
+  stream.next_out = buffer;
+  stream.avail_out = buffer_length;
+  stream.total_out = buffer_length;
   stream.zalloc = Z_NULL;
   stream.zfree = Z_NULL;
 
-  // Compress the data one byte at a time to exercise the streaming code.
-  int ret =
-      deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
-  ASSERT(ret == Z_OK);
-  std::vector<uint8_t> compressed(src.size() * 2 + 1000);
-  stream.next_out = compressed.data();
-  stream.avail_out = compressed.size();
-  for (uint8_t b : src) {
-    stream.next_in = &b;
-    stream.avail_in = 1;
-    ret = deflate(&stream, Z_NO_FLUSH);
-    ASSERT(ret == Z_OK);
+  if (Z_OK != deflateInit(&stream, Z_DEFAULT_COMPRESSION)) {
+    deflateEnd(&stream);
+    assert(false);
   }
-  stream.next_in = Z_NULL;
-  stream.avail_in = 0;
-  ret = deflate(&stream, Z_FINISH);
-  ASSERT(ret == Z_STREAM_END);
-  compressed.resize(compressed.size() - stream.avail_out);
+
+  auto deflate_result = deflate(&stream, Z_NO_FLUSH);
   deflateEnd(&stream);
-
-  // Verify that the data decompresses correctly.
-  ret = inflateInit2(&stream, windowBits);
-  ASSERT(ret == Z_OK);
-  // Make room for at least one byte so it's never empty.
-  std::vector<uint8_t> decompressed(src.size() + 1);
-  stream.next_in = compressed.data();
-  stream.avail_in = compressed.size();
-  stream.next_out = decompressed.data();
-  stream.avail_out = decompressed.size();
-  ret = inflate(&stream, Z_FINISH);
-  ASSERT(ret == Z_STREAM_END);
-  decompressed.resize(decompressed.size() - stream.avail_out);
-  inflateEnd(&stream);
-
-  ASSERT(decompressed == src);
+  if (Z_OK != deflate_result)
+    assert(false);
 
   return 0;
 }
diff --git a/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc b/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc
deleted file mode 100644
index de4d216..0000000
--- a/contrib/tests/fuzzers/streaming_inflate_fuzzer.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "third_party/zlib/zlib.h"
-
-// Fuzzer builds often have NDEBUG set, so roll our own assert macro.
-#define ASSERT(cond)                                                           \
-  do {                                                                         \
-    if (!(cond)) {                                                             \
-      fprintf(stderr, "%s:%d Assert failed: %s\n", __FILE__, __LINE__, #cond); \
-      exit(1);                                                                 \
-    }                                                                          \
-  } while (0)
-
-// Entry point for LibFuzzer.
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  // Deflate data.
-  z_stream comp_strm;
-  comp_strm.zalloc = Z_NULL;
-  comp_strm.zfree = Z_NULL;
-  comp_strm.opaque = Z_NULL;
-  int ret = deflateInit(&comp_strm, Z_DEFAULT_COMPRESSION);
-  ASSERT(ret == Z_OK);
-
-  size_t comp_buf_cap = deflateBound(&comp_strm, size);
-  uint8_t* comp_buf = (uint8_t*)malloc(comp_buf_cap);
-  ASSERT(comp_buf != nullptr);
-  comp_strm.next_out = comp_buf;
-  comp_strm.avail_out = comp_buf_cap;
-  comp_strm.next_in = (unsigned char*)data;
-  comp_strm.avail_in = size;
-  ret = deflate(&comp_strm, Z_FINISH);
-  ASSERT(ret == Z_STREAM_END);
-  size_t comp_sz = comp_buf_cap - comp_strm.avail_out;
-
-  // Inflate comp_buf one chunk at a time.
-  z_stream decomp_strm;
-  decomp_strm.zalloc = Z_NULL;
-  decomp_strm.zfree = Z_NULL;
-  decomp_strm.opaque = Z_NULL;
-  ret = inflateInit(&decomp_strm);
-  ASSERT(ret == Z_OK);
-  decomp_strm.next_in = comp_buf;
-  decomp_strm.avail_in = comp_sz;
-
-  while (decomp_strm.avail_in > 0) {
-    uint8_t decomp_buf[1024];
-    decomp_strm.next_out = decomp_buf;
-    decomp_strm.avail_out = sizeof(decomp_buf);
-    ret = inflate(&decomp_strm, Z_FINISH);
-    ASSERT(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR);
-
-    // Verify the output bytes.
-    size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out;
-    for (size_t i = 0; i < num_out; i++) {
-      ASSERT(decomp_buf[i] == data[decomp_strm.total_out - num_out + i]);
-    }
-  }
-
-  ret = deflateEnd(&comp_strm);
-  ASSERT(ret == Z_OK);
-  free(comp_buf);
-
-  inflateEnd(&decomp_strm);
-  ASSERT(ret == Z_OK);
-
-  return 0;
-}
diff --git a/contrib/tests/infcover.cc b/contrib/tests/infcover.cc
deleted file mode 100644
index c5300a5..0000000
--- a/contrib/tests/infcover.cc
+++ /dev/null
@@ -1,684 +0,0 @@
-/* infcover.c -- test zlib's inflate routines with full code coverage
- * Copyright (C) 2011, 2016 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* to use, do: ./configure --cover && make cover */
-// clang-format off
-#include "infcover.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "zlib.h"
-
-/* get definition of internal structure so we can mess with it (see pull()),
-   and so we can call inflate_trees() (see cover5()) */
-#define ZLIB_INTERNAL
-#include "inftrees.h"
-#include "inflate.h"
-
-/* XXX: use C++ streams instead of printf/fputs/etc due to portability
- * as type sizes can vary between platforms.
- */
-#include <iostream>
-#define local static
-
-/* XXX: hacking C assert and plugging into GTest. */
-#include "gtest.h"
-#if defined(assert)
-#undef assert
-#define assert EXPECT_TRUE
-#endif
-
-/* XXX: handle what is a reserved word in C++. */
-#define try try_f
-
-/* -- memory tracking routines -- */
-
-/*
-   These memory tracking routines are provided to zlib and track all of zlib's
-   allocations and deallocations, check for LIFO operations, keep a current
-   and high water mark of total bytes requested, optionally set a limit on the
-   total memory that can be allocated, and when done check for memory leaks.
-
-   They are used as follows:
-
-   z_stream strm;
-   mem_setup(&strm)         initializes the memory tracking and sets the
-                            zalloc, zfree, and opaque members of strm to use
-                            memory tracking for all zlib operations on strm
-   mem_limit(&strm, limit)  sets a limit on the total bytes requested -- a
-                            request that exceeds this limit will result in an
-                            allocation failure (returns NULL) -- setting the
-                            limit to zero means no limit, which is the default
-                            after mem_setup()
-   mem_used(&strm, "msg")   prints to stderr "msg" and the total bytes used
-   mem_high(&strm, "msg")   prints to stderr "msg" and the high water mark
-   mem_done(&strm, "msg")   ends memory tracking, releases all allocations
-                            for the tracking as well as leaked zlib blocks, if
-                            any.  If there was anything unusual, such as leaked
-                            blocks, non-FIFO frees, or frees of addresses not
-                            allocated, then "msg" and information about the
-                            problem is printed to stderr.  If everything is
-                            normal, nothing is printed. mem_done resets the
-                            strm members to Z_NULL to use the default memory
-                            allocation routines on the next zlib initialization
-                            using strm.
- */
-
-/* these items are strung together in a linked list, one for each allocation */
-struct mem_item {
-    void *ptr;                  /* pointer to allocated memory */
-    size_t size;                /* requested size of allocation */
-    struct mem_item *next;      /* pointer to next item in list, or NULL */
-};
-
-/* this structure is at the root of the linked list, and tracks statistics */
-struct mem_zone {
-    struct mem_item *first;     /* pointer to first item in list, or NULL */
-    size_t total, highwater;    /* total allocations, and largest total */
-    size_t limit;               /* memory allocation limit, or 0 if no limit */
-    int notlifo, rogue;         /* counts of non-LIFO frees and rogue frees */
-};
-
-/* memory allocation routine to pass to zlib */
-local void *mem_alloc(void *mem, unsigned count, unsigned size)
-{
-    void *ptr;
-    struct mem_item *item;
-    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
-    size_t len = count * (size_t)size;
-
-    /* induced allocation failure */
-    if (zone == NULL || (zone->limit && zone->total + len > zone->limit))
-        return NULL;
-
-    /* perform allocation using the standard library, fill memory with a
-       non-zero value to make sure that the code isn't depending on zeros */
-    ptr = malloc(len);
-    if (ptr == NULL)
-        return NULL;
-    memset(ptr, 0xa5, len);
-
-    /* create a new item for the list */
-    item = static_cast<struct mem_item *>(malloc(sizeof(struct mem_item)));
-    if (item == NULL) {
-        free(ptr);
-        return NULL;
-    }
-    item->ptr = ptr;
-    item->size = len;
-
-    /* insert item at the beginning of the list */
-    item->next = zone->first;
-    zone->first = item;
-
-    /* update the statistics */
-    zone->total += item->size;
-    if (zone->total > zone->highwater)
-        zone->highwater = zone->total;
-
-    /* return the allocated memory */
-    return ptr;
-}
-
-/* memory free routine to pass to zlib */
-local void mem_free(void *mem, void *ptr)
-{
-    struct mem_item *item, *next;
-    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
-
-    /* if no zone, just do a free */
-    if (zone == NULL) {
-        free(ptr);
-        return;
-    }
-
-    /* point next to the item that matches ptr, or NULL if not found -- remove
-       the item from the linked list if found */
-    next = zone->first;
-    if (next) {
-        if (next->ptr == ptr)
-            zone->first = next->next;   /* first one is it, remove from list */
-        else {
-            do {                        /* search the linked list */
-                item = next;
-                next = item->next;
-            } while (next != NULL && next->ptr != ptr);
-            if (next) {                 /* if found, remove from linked list */
-                item->next = next->next;
-                zone->notlifo++;        /* not a LIFO free */
-            }
-
-        }
-    }
-
-    /* if found, update the statistics and free the item */
-    if (next) {
-        zone->total -= next->size;
-        free(next);
-    }
-
-    /* if not found, update the rogue count */
-    else
-        zone->rogue++;
-
-    /* in any case, do the requested free with the standard library function */
-    free(ptr);
-}
-
-/* set up a controlled memory allocation space for monitoring, set the stream
-   parameters to the controlled routines, with opaque pointing to the space */
-local void mem_setup(z_stream *strm)
-{
-    struct mem_zone *zone;
-
-    zone = static_cast<struct mem_zone *>(malloc(sizeof(struct mem_zone)));
-    assert(zone != NULL);
-    zone->first = NULL;
-    zone->total = 0;
-    zone->highwater = 0;
-    zone->limit = 0;
-    zone->notlifo = 0;
-    zone->rogue = 0;
-    strm->opaque = zone;
-    strm->zalloc = mem_alloc;
-    strm->zfree = mem_free;
-}
-
-/* set a limit on the total memory allocation, or 0 to remove the limit */
-local void mem_limit(z_stream *strm, size_t limit)
-{
-    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
-
-    zone->limit = limit;
-}
-
-/* show the current total requested allocations in bytes */
-local void mem_used(z_stream *strm, const char *prefix)
-{
-    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
-
-    std::cout << prefix << ": " << zone->total << " allocated" << std::endl;
-}
-
-/* show the high water allocation in bytes */
-local void mem_high(z_stream *strm, const char *prefix)
-{
-    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
-
-    std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl;
-}
-
-/* release the memory allocation zone -- if there are any surprises, notify */
-local void mem_done(z_stream *strm, const char *prefix)
-{
-    int count = 0;
-    struct mem_item *item, *next;
-    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
-
-    /* show high water mark */
-    mem_high(strm, prefix);
-
-    /* free leftover allocations and item structures, if any */
-    item = zone->first;
-    while (item != NULL) {
-        free(item->ptr);
-        next = item->next;
-        free(item);
-        item = next;
-        count++;
-    }
-
-    /* issue alerts about anything unexpected */
-    if (count || zone->total)
-        std::cout << "** " << prefix << ": "
-                  << zone->total << " bytes in "
-                  << count << " blocks not freed"
-                  << std::endl;
-
-    if (zone->notlifo)
-        std::cout << "** " << prefix << ": "
-                  << zone->notlifo << " frees not LIFO"
-                  << std::endl;
-
-    if (zone->rogue)
-        std::cout << "** " << prefix << ": "
-                  << zone->rogue << " frees not recognized"
-                  << std::endl;
-
-    /* free the zone and delete from the stream */
-    free(zone);
-    strm->opaque = Z_NULL;
-    strm->zalloc = Z_NULL;
-    strm->zfree = Z_NULL;
-}
-
-/* -- inflate test routines -- */
-
-/* Decode a hexadecimal string, set *len to length, in[] to the bytes.  This
-   decodes liberally, in that hex digits can be adjacent, in which case two in
-   a row writes a byte.  Or they can be delimited by any non-hex character,
-   where the delimiters are ignored except when a single hex digit is followed
-   by a delimiter, where that single digit writes a byte.  The returned data is
-   allocated and must eventually be freed.  NULL is returned if out of memory.
-   If the length is not needed, then len can be NULL. */
-local unsigned char *h2b(const char *hex, unsigned *len)
-{
-    unsigned char *in, *re;
-    unsigned next, val;
-
-    in = static_cast<unsigned char *>(malloc((strlen(hex) + 1) >> 1));
-    if (in == NULL)
-        return NULL;
-    next = 0;
-    val = 1;
-    do {
-        if (*hex >= '0' && *hex <= '9')
-            val = (val << 4) + *hex - '0';
-        else if (*hex >= 'A' && *hex <= 'F')
-            val = (val << 4) + *hex - 'A' + 10;
-        else if (*hex >= 'a' && *hex <= 'f')
-            val = (val << 4) + *hex - 'a' + 10;
-        else if (val != 1 && val < 32)  /* one digit followed by delimiter */
-            val += 240;                 /* make it look like two digits */
-        if (val > 255) {                /* have two digits */
-            in[next++] = val & 0xff;    /* save the decoded byte */
-            val = 1;                    /* start over */
-        }
-    } while (*hex++);       /* go through the loop with the terminating null */
-    if (len != NULL)
-        *len = next;
-    re = static_cast<unsigned char *>(realloc(in, next));
-    return re == NULL ? in : re;
-}
-
-/* generic inflate() run, where hex is the hexadecimal input data, what is the
-   text to include in an error message, step is how much input data to feed
-   inflate() on each call, or zero to feed it all, win is the window bits
-   parameter to inflateInit2(), len is the size of the output buffer, and err
-   is the error code expected from the first inflate() call (the second
-   inflate() call is expected to return Z_STREAM_END).  If win is 47, then
-   header information is collected with inflateGetHeader().  If a zlib stream
-   is looking for a dictionary, then an empty dictionary is provided.
-   inflate() is run until all of the input data is consumed. */
-local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len,
-               int err)
-{
-    int ret;
-    unsigned have;
-    unsigned char *in, *out;
-    z_stream strm, copy;
-    gz_header head;
-
-    mem_setup(&strm);
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit2(&strm, win);
-    if (ret != Z_OK) {
-        mem_done(&strm, what);
-        return;
-    }
-    out = static_cast<unsigned char *>(malloc(len));                          assert(out != NULL);
-    if (win == 47) {
-        head.extra = out;
-        head.extra_max = len;
-        head.name = out;
-        head.name_max = len;
-        head.comment = out;
-        head.comm_max = len;
-        ret = inflateGetHeader(&strm, &head);   assert(ret == Z_OK);
-    }
-    in = h2b(hex, &have);                       assert(in != NULL);
-    if (step == 0 || step > have)
-        step = have;
-    strm.avail_in = step;
-    have -= step;
-    strm.next_in = in;
-    do {
-        strm.avail_out = len;
-        strm.next_out = out;
-        ret = inflate(&strm, Z_NO_FLUSH);       assert(err == 9 || ret == err);
-        if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT)
-            break;
-        if (ret == Z_NEED_DICT) {
-            ret = inflateSetDictionary(&strm, in, 1);
-                                                assert(ret == Z_DATA_ERROR);
-            mem_limit(&strm, 1);
-            ret = inflateSetDictionary(&strm, out, 0);
-                                                assert(ret == Z_MEM_ERROR);
-            mem_limit(&strm, 0);
-            ((struct inflate_state *)strm.state)->mode = DICT;
-            ret = inflateSetDictionary(&strm, out, 0);
-                                                assert(ret == Z_OK);
-            ret = inflate(&strm, Z_NO_FLUSH);   assert(ret == Z_BUF_ERROR);
-        }
-        ret = inflateCopy(&copy, &strm);        assert(ret == Z_OK);
-        ret = inflateEnd(&copy);                assert(ret == Z_OK);
-        err = 9;                        /* don't care next time around */
-        have += strm.avail_in;
-        strm.avail_in = step > have ? have : step;
-        have -= strm.avail_in;
-    } while (strm.avail_in);
-    free(in);
-    free(out);
-    ret = inflateReset2(&strm, -8);             assert(ret == Z_OK);
-    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
-    mem_done(&strm, what);
-}
-
-/* cover all of the lines in inflate.c up to inflate() */
-void cover_support(void)
-{
-    int ret;
-    z_stream strm;
-
-    mem_setup(&strm);
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit(&strm);                   assert(ret == Z_OK);
-    mem_used(&strm, "inflate init");
-    ret = inflatePrime(&strm, 5, 31);           assert(ret == Z_OK);
-    ret = inflatePrime(&strm, -1, 0);           assert(ret == Z_OK);
-    ret = inflateSetDictionary(&strm, Z_NULL, 0);
-                                                assert(ret == Z_STREAM_ERROR);
-    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
-    mem_done(&strm, "prime");
-
-    inf("63 0", "force window allocation", 0, -15, 1, Z_OK);
-    inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK);
-    inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK);
-    inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END);
-    inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR);
-
-    mem_setup(&strm);
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream));
-                                                assert(ret == Z_VERSION_ERROR);
-    mem_done(&strm, "wrong version");
-
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit(&strm);                   assert(ret == Z_OK);
-    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
-    std::cout << "inflate built-in memory routines" << std::endl;;
-}
-
-/* cover all inflate() header and trailer cases and code after inflate() */
-void cover_wrap(void)
-{
-    int ret;
-    z_stream strm, copy;
-    unsigned char dict[257];
-
-    ret = inflate(Z_NULL, 0);                   assert(ret == Z_STREAM_ERROR);
-    ret = inflateEnd(Z_NULL);                   assert(ret == Z_STREAM_ERROR);
-    ret = inflateCopy(Z_NULL, Z_NULL);          assert(ret == Z_STREAM_ERROR);
-    std::cout << "inflate bad parameters" << std::endl;
-
-    inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR);
-    inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR);
-    inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR);
-    inf("8 99", "set window size from header", 0, 0, 0, Z_OK);
-    inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR);
-    inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END);
-    inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1,
-        Z_DATA_ERROR);
-    inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length",
-        0, 47, 0, Z_STREAM_END);
-    inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR);
-    inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT);
-    inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK);
-
-    mem_setup(&strm);
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit2(&strm, -8);
-    strm.avail_in = 2;
-    strm.next_in = (Bytef *)"\x63";
-    strm.avail_out = 1;
-    strm.next_out = (Bytef *)&ret;
-    mem_limit(&strm, 1);
-    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
-    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
-    mem_limit(&strm, 0);
-    memset(dict, 0, 257);
-    ret = inflateSetDictionary(&strm, dict, 257);
-                                                assert(ret == Z_OK);
-    mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256);
-    ret = inflatePrime(&strm, 16, 0);           assert(ret == Z_OK);
-    strm.avail_in = 2;
-    strm.next_in = (Bytef *)"\x80";
-    ret = inflateSync(&strm);                   assert(ret == Z_DATA_ERROR);
-    ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_STREAM_ERROR);
-    strm.avail_in = 4;
-    strm.next_in = (Bytef *)"\0\0\xff\xff";
-    ret = inflateSync(&strm);                   assert(ret == Z_OK);
-    (void)inflateSyncPoint(&strm);
-    ret = inflateCopy(&copy, &strm);            assert(ret == Z_MEM_ERROR);
-    mem_limit(&strm, 0);
-    ret = inflateUndermine(&strm, 1);           assert(ret == Z_DATA_ERROR);
-    (void)inflateMark(&strm);
-    ret = inflateEnd(&strm);                    assert(ret == Z_OK);
-    mem_done(&strm, "miscellaneous, force memory errors");
-}
-
-/* input and output functions for inflateBack() */
-local unsigned pull(void *desc, unsigned char **buf)
-{
-    static unsigned int next = 0;
-    static unsigned char dat[] = {0x63, 0, 2, 0};
-    struct inflate_state *state;
-
-    if (desc == Z_NULL) {
-        next = 0;
-        return 0;   /* no input (already provided at next_in) */
-    }
-    state = reinterpret_cast<struct inflate_state *>(((z_stream *)desc)->state);
-    if (state != Z_NULL)
-        state->mode = SYNC;     /* force an otherwise impossible situation */
-    return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0;
-}
-
-local int push(void *desc, unsigned char *buf, unsigned len)
-{
-    buf += len;
-    return desc != Z_NULL;      /* force error if desc not null */
-}
-
-/* cover inflateBack() up to common deflate data cases and after those */
-void cover_back(void)
-{
-    int ret;
-    z_stream strm;
-    unsigned char win[32768];
-
-    ret = inflateBackInit_(Z_NULL, 0, win, 0, 0);
-                                                assert(ret == Z_VERSION_ERROR);
-    ret = inflateBackInit(Z_NULL, 0, win);      assert(ret == Z_STREAM_ERROR);
-    ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL);
-                                                assert(ret == Z_STREAM_ERROR);
-    ret = inflateBackEnd(Z_NULL);               assert(ret == Z_STREAM_ERROR);
-    std::cout << "inflateBack bad parameters" << std::endl;;
-
-    mem_setup(&strm);
-    ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
-    strm.avail_in = 2;
-    strm.next_in = (Bytef *)"\x03";
-    ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
-                                                assert(ret == Z_STREAM_END);
-        /* force output error */
-    strm.avail_in = 3;
-    strm.next_in = (Bytef *)"\x63\x00";
-    ret = inflateBack(&strm, pull, Z_NULL, push, &strm);
-                                                assert(ret == Z_BUF_ERROR);
-        /* force mode error by mucking with state */
-    ret = inflateBack(&strm, pull, &strm, push, Z_NULL);
-                                                assert(ret == Z_STREAM_ERROR);
-    ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
-    mem_done(&strm, "inflateBack bad state");
-
-    ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
-    ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
-    std::cout << "inflateBack built-in memory routines" << std::endl;;
-}
-
-/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */
-local int try(const char *hex, const char *id, int err)
-{
-    int ret;
-    unsigned len, size;
-    unsigned char *in, *out, *win;
-    char *prefix;
-    z_stream strm;
-
-    /* convert to hex */
-    in = h2b(hex, &len);
-    assert(in != NULL);
-
-    /* allocate work areas */
-    size = len << 3;
-    out = static_cast<unsigned char *>(malloc(size));
-    assert(out != NULL);
-    win = static_cast<unsigned char *>(malloc(32768));
-    assert(win != NULL);
-    prefix = static_cast<char *>(malloc(strlen(id) + 6));
-    assert(prefix != NULL);
-
-    /* first with inflate */
-    strcpy(prefix, id);
-    strcat(prefix, "-late");
-    mem_setup(&strm);
-    strm.avail_in = 0;
-    strm.next_in = Z_NULL;
-    ret = inflateInit2(&strm, err < 0 ? 47 : -15);
-    assert(ret == Z_OK);
-    strm.avail_in = len;
-    strm.next_in = in;
-    do {
-        strm.avail_out = size;
-        strm.next_out = out;
-        ret = inflate(&strm, Z_TREES);
-        assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR);
-        if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT)
-            break;
-    } while (strm.avail_in || strm.avail_out == 0);
-    if (err) {
-        assert(ret == Z_DATA_ERROR);
-        assert(strcmp(id, strm.msg) == 0);
-    }
-    inflateEnd(&strm);
-    mem_done(&strm, prefix);
-
-    /* then with inflateBack */
-    if (err >= 0) {
-        strcpy(prefix, id);
-        strcat(prefix, "-back");
-        mem_setup(&strm);
-        ret = inflateBackInit(&strm, 15, win);
-        assert(ret == Z_OK);
-        strm.avail_in = len;
-        strm.next_in = in;
-        ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
-        assert(ret != Z_STREAM_ERROR);
-        if (err) {
-            assert(ret == Z_DATA_ERROR);
-            assert(strcmp(id, strm.msg) == 0);
-        }
-        inflateBackEnd(&strm);
-        mem_done(&strm, prefix);
-    }
-
-    /* clean up */
-    free(prefix);
-    free(win);
-    free(out);
-    free(in);
-    return ret;
-}
-
-/* cover deflate data cases in both inflate() and inflateBack() */
-void cover_inflate(void)
-{
-    try("0 0 0 0 0", "invalid stored block lengths", 1);
-    try("3 0", "fixed", 0);
-    try("6", "invalid block type", 1);
-    try("1 1 0 fe ff 0", "stored", 0);
-    try("fc 0 0", "too many length or distance symbols", 1);
-    try("4 0 fe ff", "invalid code lengths set", 1);
-    try("4 0 24 49 0", "invalid bit length repeat", 1);
-    try("4 0 24 e9 ff ff", "invalid bit length repeat", 1);
-    try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1);
-    try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0",
-        "invalid literal/lengths set", 1);
-    try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1);
-    try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1);
-    try("2 7e ff ff", "invalid distance code", 1);
-    try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1);
-
-    /* also trailer mismatch just in inflate() */
-    try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1);
-    try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1",
-        "incorrect length check", -1);
-    try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0);
-    try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f",
-        "long code", 0);
-    try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0);
-    try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c",
-        "long distance and extra", 0);
-    try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
-        "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0);
-    inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258,
-        Z_STREAM_END);
-    inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK);
-}
-
-/* XXX(cavalcantii): fix linking error due inflate_table. */
-/* cover remaining lines in inftrees.c */
-/* void cover_trees(void) */
-/* { */
-/*     int ret; */
-/*     unsigned bits; */
-/*     unsigned short lens[16], work[16]; */
-/*     code *next, table[ENOUGH_DISTS]; */
-
-/*     /\* we need to call inflate_table() directly in order to manifest not- */
-/*        enough errors, since zlib insures that enough is always enough *\/ */
-/*     for (bits = 0; bits < 15; bits++) */
-/*         lens[bits] = (unsigned short)(bits + 1); */
-/*     lens[15] = 15; */
-/*     next = table; */
-/*     bits = 15; */
-/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
-/*                                                 assert(ret == 1); */
-/*     next = table; */
-/*     bits = 1; */
-/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
-/*                                                 assert(ret == 1); */
-/*     fputs("inflate_table not enough errors\n", stderr); */
-/* } */
-
-/* cover remaining inffast.c decoding and window copying */
-void cover_fast(void)
-{
-    inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68"
-        " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR);
-    inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49"
-        " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258,
-        Z_DATA_ERROR);
-    inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258,
-        Z_DATA_ERROR);
-    inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258,
-        Z_DATA_ERROR);
-    inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0",
-        "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR);
-    inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK);
-    inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0",
-        "contiguous and wrap around window", 6, -8, 259, Z_OK);
-    inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259,
-        Z_STREAM_END);
-}
-
-// clang-format on
diff --git a/contrib/tests/infcover.h b/contrib/tests/infcover.h
deleted file mode 100644
index b3e112f..0000000
--- a/contrib/tests/infcover.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#ifndef __INF_COVER_H__
-#define __INF_COVER_H__
-
-void cover_support(void);
-void cover_wrap(void);
-void cover_back(void);
-void cover_inflate(void);
-void cover_trees(void);
-void cover_fast(void);
-
-#endif
diff --git a/contrib/tests/run_all_unittests.cc b/contrib/tests/run_all_unittests.cc
deleted file mode 100644
index 65ed57e..0000000
--- a/contrib/tests/run_all_unittests.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
-
-int main(int argc, char** argv) {
-  base::TestSuite test_suite(argc, argv);
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/contrib/tests/utils_unittest.cc b/contrib/tests/utils_unittest.cc
deleted file mode 100644
index 468421e..0000000
--- a/contrib/tests/utils_unittest.cc
+++ /dev/null
@@ -1,521 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the Chromium source repository LICENSE file.
-
-#include "infcover.h"
-
-#include <cstddef>
-#include <vector>
-
-#include "compression_utils_portable.h"
-#include "gtest.h"
-#include "zlib.h"
-
-void TestPayloads(size_t input_size, zlib_internal::WrapperType type) {
-  std::vector<unsigned char> input;
-  input.reserve(input_size);
-  for (size_t i = 1; i <= input_size; ++i)
-    input.push_back(i & 0xff);
-
-  // If it is big enough for GZIP, will work for other wrappers.
-  std::vector<unsigned char> compressed(
-      zlib_internal::GzipExpectedCompressedSize(input.size()));
-  std::vector<unsigned char> decompressed(input.size());
-
-  // Libcores's java/util/zip/Deflater default settings: ZLIB,
-  // DEFAULT_COMPRESSION and DEFAULT_STRATEGY.
-  unsigned long compressed_size = static_cast<unsigned long>(compressed.size());
-  int result = zlib_internal::CompressHelper(
-      type, compressed.data(), &compressed_size, input.data(), input.size(),
-      Z_DEFAULT_COMPRESSION, nullptr, nullptr);
-  ASSERT_EQ(result, Z_OK);
-
-  unsigned long decompressed_size =
-      static_cast<unsigned long>(decompressed.size());
-  result = zlib_internal::UncompressHelper(type, decompressed.data(),
-                                           &decompressed_size,
-                                           compressed.data(), compressed_size);
-  ASSERT_EQ(result, Z_OK);
-  EXPECT_EQ(input, decompressed);
-}
-
-TEST(ZlibTest, ZlibWrapper) {
-  // Minimal ZLIB wrapped short stream size is about 8 bytes.
-  for (size_t i = 1; i < 1024; ++i)
-    TestPayloads(i, zlib_internal::WrapperType::ZLIB);
-}
-
-TEST(ZlibTest, GzipWrapper) {
-  // GZIP should be 12 bytes bigger than ZLIB wrapper.
-  for (size_t i = 1; i < 1024; ++i)
-    TestPayloads(i, zlib_internal::WrapperType::GZIP);
-}
-
-TEST(ZlibTest, RawWrapper) {
-  // RAW has no wrapper (V8 Blobs is a known user), size
-  // should be payload_size + 2 for short payloads.
-  for (size_t i = 1; i < 1024; ++i)
-    TestPayloads(i, zlib_internal::WrapperType::ZRAW);
-}
-
-TEST(ZlibTest, InflateCover) {
-  cover_support();
-  cover_wrap();
-  cover_back();
-  cover_inflate();
-  // TODO(cavalcantii): enable this last test.
-  // cover_trees();
-  cover_fast();
-}
-
-TEST(ZlibTest, DeflateStored) {
-  const int no_compression = 0;
-  const zlib_internal::WrapperType type = zlib_internal::WrapperType::GZIP;
-  std::vector<unsigned char> input(1 << 10, 42);
-  std::vector<unsigned char> compressed(
-      zlib_internal::GzipExpectedCompressedSize(input.size()));
-  std::vector<unsigned char> decompressed(input.size());
-  unsigned long compressed_size = static_cast<unsigned long>(compressed.size());
-  int result = zlib_internal::CompressHelper(
-      type, compressed.data(), &compressed_size, input.data(), input.size(),
-      no_compression, nullptr, nullptr);
-  ASSERT_EQ(result, Z_OK);
-
-  unsigned long decompressed_size =
-      static_cast<unsigned long>(decompressed.size());
-  result = zlib_internal::UncompressHelper(type, decompressed.data(),
-                                           &decompressed_size,
-                                           compressed.data(), compressed_size);
-  ASSERT_EQ(result, Z_OK);
-  EXPECT_EQ(input, decompressed);
-}
-
-TEST(ZlibTest, StreamingInflate) {
-  uint8_t comp_buf[4096], decomp_buf[4096];
-  z_stream comp_strm, decomp_strm;
-  int ret;
-
-  std::vector<uint8_t> src;
-  for (size_t i = 0; i < 1000; i++) {
-    for (size_t j = 0; j < 40; j++) {
-      src.push_back(j);
-    }
-  }
-
-  // Deflate src into comp_buf.
-  comp_strm.zalloc = Z_NULL;
-  comp_strm.zfree = Z_NULL;
-  comp_strm.opaque = Z_NULL;
-  ret = deflateInit(&comp_strm, Z_BEST_COMPRESSION);
-  ASSERT_EQ(ret, Z_OK);
-  comp_strm.next_out = comp_buf;
-  comp_strm.avail_out = sizeof(comp_buf);
-  comp_strm.next_in = src.data();
-  comp_strm.avail_in = src.size();
-  ret = deflate(&comp_strm, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  size_t comp_sz = sizeof(comp_buf) - comp_strm.avail_out;
-
-  // Inflate comp_buf one 4096-byte buffer at a time.
-  decomp_strm.zalloc = Z_NULL;
-  decomp_strm.zfree = Z_NULL;
-  decomp_strm.opaque = Z_NULL;
-  ret = inflateInit(&decomp_strm);
-  ASSERT_EQ(ret, Z_OK);
-  decomp_strm.next_in = comp_buf;
-  decomp_strm.avail_in = comp_sz;
-
-  while (decomp_strm.avail_in > 0) {
-    decomp_strm.next_out = decomp_buf;
-    decomp_strm.avail_out = sizeof(decomp_buf);
-    ret = inflate(&decomp_strm, Z_FINISH);
-    ASSERT_TRUE(ret == Z_OK || ret == Z_STREAM_END || ret == Z_BUF_ERROR);
-
-    // Verify the output bytes.
-    size_t num_out = sizeof(decomp_buf) - decomp_strm.avail_out;
-    for (size_t i = 0; i < num_out; i++) {
-      EXPECT_EQ(decomp_buf[i], src[decomp_strm.total_out - num_out + i]);
-    }
-  }
-
-  // Cleanup memory (i.e. makes ASAN bot happy).
-  ret = deflateEnd(&comp_strm);
-  EXPECT_EQ(ret, Z_OK);
-  ret = inflateEnd(&decomp_strm);
-  EXPECT_EQ(ret, Z_OK);
-}
-
-TEST(ZlibTest, CRCHashBitsCollision) {
-  // The CRC32c of the hex sequences 2a,14,14,14 and 2a,14,db,14 have the same
-  // lower 9 bits. Since longest_match doesn't check match[2], a bad match could
-  // be chosen when the number of hash bits is <= 9. For this reason, the number
-  // of hash bits must be set higher, regardless of the memlevel parameter, when
-  // using CRC32c hashing for string matching. See https://crbug.com/1113596
-
-  std::vector<uint8_t> src = {
-      // Random byte; zlib doesn't match at offset 0.
-      123,
-
-      // This will look like 5-byte match.
-      0x2a,
-      0x14,
-      0xdb,
-      0x14,
-      0x15,
-
-      // Offer a 4-byte match to bump the next expected match length to 5.
-      0x2a,
-      0x14,
-      0x14,
-      0x14,
-
-      0x2a,
-      0x14,
-      0x14,
-      0x14,
-      0x15,
-  };
-
-  z_stream stream;
-  stream.zalloc = nullptr;
-  stream.zfree = nullptr;
-
-  // Using a low memlevel to try to reduce the number of hash bits. Negative
-  // windowbits means raw deflate, i.e. without the zlib header.
-  int ret = deflateInit2(&stream, /*comp level*/ 2, /*method*/ Z_DEFLATED,
-                         /*windowbits*/ -15, /*memlevel*/ 2,
-                         /*strategy*/ Z_DEFAULT_STRATEGY);
-  ASSERT_EQ(ret, Z_OK);
-  std::vector<uint8_t> compressed(100, '\0');
-  stream.next_out = compressed.data();
-  stream.avail_out = compressed.size();
-  stream.next_in = src.data();
-  stream.avail_in = src.size();
-  ret = deflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  compressed.resize(compressed.size() - stream.avail_out);
-  deflateEnd(&stream);
-
-  ret = inflateInit2(&stream, /*windowbits*/ -15);
-  ASSERT_EQ(ret, Z_OK);
-  std::vector<uint8_t> decompressed(src.size(), '\0');
-  stream.next_in = compressed.data();
-  stream.avail_in = compressed.size();
-  stream.next_out = decompressed.data();
-  stream.avail_out = decompressed.size();
-  ret = inflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  EXPECT_EQ(0U, stream.avail_out);
-  inflateEnd(&stream);
-
-  EXPECT_EQ(src, decompressed);
-}
-
-TEST(ZlibTest, CRCHashAssert) {
-  // The CRC32c of the hex sequences ff,ff,5e,6f and ff,ff,13,ff have the same
-  // lower 15 bits. This means longest_match's assert that match[2] == scan[2]
-  // won't hold. However, such hash collisions are only possible when one of the
-  // other four bytes also mismatch. This tests that zlib's assert handles this
-  // case.
-
-  std::vector<uint8_t> src = {
-      // Random byte; zlib doesn't match at offset 0.
-      123,
-
-      // This has the same hash as the last byte sequence, and the first two and
-      // last two bytes match; though the third and the fourth don't.
-      0xff,
-      0xff,
-      0x5e,
-      0x6f,
-      0x12,
-      0x34,
-
-      // Offer a 5-byte match to bump the next expected match length to 6
-      // (because the two first and two last bytes need to match).
-      0xff,
-      0xff,
-      0x13,
-      0xff,
-      0x12,
-
-      0xff,
-      0xff,
-      0x13,
-      0xff,
-      0x12,
-      0x34,
-  };
-
-  z_stream stream;
-  stream.zalloc = nullptr;
-  stream.zfree = nullptr;
-
-  int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED,
-                         /*windowbits*/ -15, /*memlevel*/ 8,
-                         /*strategy*/ Z_DEFAULT_STRATEGY);
-  ASSERT_EQ(ret, Z_OK);
-  std::vector<uint8_t> compressed(100, '\0');
-  stream.next_out = compressed.data();
-  stream.avail_out = compressed.size();
-  stream.next_in = src.data();
-  stream.avail_in = src.size();
-  ret = deflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  compressed.resize(compressed.size() - stream.avail_out);
-  deflateEnd(&stream);
-
-  ret = inflateInit2(&stream, /*windowbits*/ -15);
-  ASSERT_EQ(ret, Z_OK);
-  std::vector<uint8_t> decompressed(src.size(), '\0');
-  stream.next_in = compressed.data();
-  stream.avail_in = compressed.size();
-  stream.next_out = decompressed.data();
-  stream.avail_out = decompressed.size();
-  ret = inflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  EXPECT_EQ(0U, stream.avail_out);
-  inflateEnd(&stream);
-
-  EXPECT_EQ(src, decompressed);
-}
-
-// Fuzzer generated.
-static const uint8_t checkMatchCrashData[] = {
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00,
-    0x6e, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x01, 0x39, 0x6e, 0x6e,
-    0x00, 0x00, 0x00, 0x00, 0xf7, 0xff, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x6e,
-    0x00, 0x00, 0x0a, 0x9a, 0x00, 0x00, 0x6e, 0x6e, 0x6e, 0x2a, 0x00, 0x00,
-    0x00, 0xd5, 0xf0, 0x00, 0x81, 0x02, 0xf3, 0xfd, 0xff, 0xab, 0xf3, 0x6e,
-    0x7e, 0x04, 0x5b, 0xf6, 0x2a, 0x2c, 0xf8, 0x00, 0x54, 0xf3, 0xa5, 0x0e,
-    0xfd, 0x6e, 0xff, 0x00, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0xa4, 0x0b, 0xa5, 0x2a, 0x0d, 0x10, 0x01, 0x26, 0xf6, 0x04, 0x0e,
-    0xff, 0x6e, 0x6e, 0x6e, 0x76, 0x00, 0x00, 0x87, 0x01, 0xfe, 0x0d, 0xb6,
-    0x6e, 0x6e, 0xf7, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0xfd, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x9b,
-    0x02, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
-    0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x6e, 0xff, 0xff, 0x00,
-    0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67, 0x01,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x40, 0x7e, 0x0b, 0xa5, 0x10, 0x67,
-    0x7e, 0x32, 0x6e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x40, 0x0b, 0xa5,
-    0x10, 0x67, 0x01, 0xfe, 0x0d, 0xb6, 0x2a, 0x00, 0x00, 0x58, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x6e, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x3d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0xd6, 0x2d, 0x2d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
-    0x8a, 0x8a, 0x8a, 0x8a, 0x66, 0x8a, 0x8a, 0x8a, 0xee, 0x1d, 0x00, 0x00,
-    0x00, 0x02, 0x00, 0x00, 0x00, 0xee, 0x0a, 0x00, 0x00, 0x00, 0x54, 0x40,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x23, 0x7e, 0x00, 0x1e,
-    0x00, 0x00, 0xd5, 0xf0, 0x00, 0xff, 0x40, 0x0b, 0xa5, 0x10, 0x67, 0x01,
-    0xfe, 0x0d, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
-    0x8a, 0x8a, 0x8a, 0x2d, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0e,
-    0xfb, 0x00, 0x10, 0x24, 0x00, 0x00, 0xfb, 0xff, 0x00, 0x00, 0xff, 0x1f,
-    0xb3, 0x00, 0x04, 0x3d, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
-    0x01, 0x45, 0x3d, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11, 0x21, 0x00, 0x1e,
-    0x00, 0x0c, 0xb3, 0xfe, 0x0e, 0xee, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x6e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6e, 0x00,
-    0x00, 0x87, 0x00, 0x33, 0x38, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x00, 0x00,
-    0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x3f, 0xff, 0xff, 0xff,
-    0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0xff, 0x00, 0x31, 0x13, 0x13, 0x13,
-    0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x30, 0x83, 0x33,
-    0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xff, 0x00, 0x01,
-    0x10, 0x0d, 0x2a, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x11,
-    0x21, 0x00, 0xa5, 0x00, 0x68, 0x68, 0x68, 0x67, 0x00, 0x00, 0xff, 0xff,
-    0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x00, 0x00, 0xfa, 0xff, 0xff,
-    0x03, 0x01, 0xff, 0x02, 0x00, 0x00, 0x68, 0x68, 0x68, 0x68, 0x0a, 0x10,
-    0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
-    0x06, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0xfa, 0xff, 0xff, 0x08, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04,
-    0x00, 0xf8, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00,
-    0x00, 0xff, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x78, 0x00, 0x00, 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0x06, 0x04, 0x6e,
-    0x7e, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00,
-    0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x6e, 0x6e, 0x6e,
-    0x00, 0x01, 0x38, 0xd5, 0xf0, 0x00, 0x00, 0x2a, 0xfe, 0x04, 0x5b, 0x0d,
-    0xfd, 0x6e, 0x92, 0x28, 0xf9, 0xfb, 0xff, 0x07, 0xd2, 0xd6, 0x2d, 0x2d,
-    0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a, 0x8a,
-    0x8a, 0x8a, 0xc2, 0x91, 0x00, 0x5b, 0xef, 0xde, 0xf2, 0x6e, 0x6e, 0xfd,
-    0x0c, 0x02, 0x91, 0x62, 0x91, 0xfd, 0x6e, 0x6e, 0xd3, 0x06, 0x00, 0x00,
-    0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
-    0xd5, 0xf0, 0x00, 0xff, 0x00, 0x00, 0x31, 0x13, 0x13, 0x13, 0x04, 0x00,
-    0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x04, 0x00, 0x13, 0x0a, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x6e, 0x00, 0x00, 0x01,
-    0x00, 0x00, 0x09, 0x00, 0x6a, 0x24, 0x26, 0x30, 0x01, 0x2e, 0x2a, 0xfe,
-    0x04, 0x5b, 0x0d, 0xfd, 0x6e, 0x6e, 0xd7, 0x06, 0x6e, 0x6e, 0x6e, 0x00,
-    0x00, 0xb1, 0xb1, 0xb1, 0xb1, 0x00, 0x00, 0x00, 0x6e, 0x5b, 0x00, 0x00,
-    0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x01, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x1e, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x0b,
-    0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x24, 0x2a, 0x6e, 0x5c, 0x24,
-    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-    0x05, 0x00, 0x00, 0x00, 0x5d, 0x10, 0x6e, 0x6e, 0xa5, 0x2f, 0x00, 0x00,
-    0x95, 0x87, 0x00, 0x6e};
-
-TEST(ZlibTest, CheckMatchCrash) {
-  // See https://crbug.com/1113142.
-  z_stream stream;
-  stream.zalloc = nullptr;
-  stream.zfree = nullptr;
-
-  // Low windowbits to hit window sliding also with a relatively small input.
-  int ret = deflateInit2(&stream, /*comp level*/ 5, /*method*/ Z_DEFLATED,
-                         /*windowbits*/ -9, /*memlevel*/ 8,
-                         /*strategy*/ Z_DEFAULT_STRATEGY);
-  ASSERT_EQ(ret, Z_OK);
-
-  uint8_t compressed[sizeof(checkMatchCrashData) * 2];
-  stream.next_out = compressed;
-  stream.avail_out = sizeof(compressed);
-
-  for (size_t i = 0; i < sizeof(checkMatchCrashData); i++) {
-    ASSERT_GT(stream.avail_out, 0U);
-    stream.next_in = (uint8_t*)&checkMatchCrashData[i];
-    stream.avail_in = 1;
-    ret = deflate(&stream, Z_NO_FLUSH);
-    ASSERT_EQ(ret, Z_OK);
-  }
-
-  stream.next_in = nullptr;
-  stream.avail_in = 0;
-  ASSERT_GT(stream.avail_out, 0U);
-  ret = deflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  size_t compressed_sz = sizeof(compressed) - stream.avail_out;
-  deflateEnd(&stream);
-
-  uint8_t decompressed[sizeof(checkMatchCrashData)];
-  ret = inflateInit2(&stream, -15);
-  ASSERT_EQ(ret, Z_OK);
-  stream.next_in = compressed;
-  stream.avail_in = compressed_sz;
-  stream.next_out = decompressed;
-  stream.avail_out = sizeof(decompressed);
-  ret = inflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  inflateEnd(&stream);
-  ASSERT_EQ(
-      memcmp(checkMatchCrashData, decompressed, sizeof(checkMatchCrashData)),
-      0);
-}
-
-TEST(ZlibTest, DeflateRLEUninitUse) {
-  // MSan would complain about use of uninitialized values in deflate_rle if the
-  // window isn't zero-initialized. See crbug.com/1137613. Similar problems
-  // exist in other places in zlib, e.g. longest_match (crbug.com/1144420) but
-  // we don't have as nice test cases.
-
-  int level = 9;
-  int windowBits = 9;
-  int memLevel = 8;
-  int strategy = Z_RLE;
-  const std::vector<uint8_t> src{
-      0x31, 0x64, 0x38, 0x32, 0x30, 0x32, 0x30, 0x36, 0x65, 0x35, 0x38, 0x35,
-      0x32, 0x61, 0x30, 0x36, 0x65, 0x35, 0x32, 0x66, 0x30, 0x34, 0x38, 0x37,
-      0x61, 0x31, 0x38, 0x36, 0x37, 0x37, 0x31, 0x39, 0x0a, 0x65, 0x62, 0x00,
-      0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff,
-      0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6,
-      0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0x95,
-      0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0e, 0x0a, 0x54, 0x52,
-      0x58, 0x56, 0xab, 0x26, 0x13, 0x53, 0x5a, 0xb5, 0x30, 0xbb, 0x96, 0x44,
-      0x80, 0xe6, 0xc5, 0x0a, 0xd0, 0x47, 0x7a, 0xa0, 0x4e, 0xbe, 0x30, 0xdc,
-      0xa1, 0x08, 0x54, 0xe1, 0x51, 0xd1, 0xea, 0xef, 0xdb, 0xa1, 0x2d, 0xb4,
-      0xb9, 0x58, 0xb1, 0x2f, 0xf0, 0xae, 0xbc, 0x07, 0xd1, 0xba, 0x7f, 0x14,
-      0xa4, 0xde, 0x99, 0x7f, 0x4d, 0x3e, 0x25, 0xd9, 0xef, 0xee, 0x4f, 0x38,
-      0x7b, 0xaf, 0x3f, 0x6b, 0x53, 0x5a, 0xcb, 0x1f, 0x97, 0xb5, 0x43, 0xa3,
-      0xe8, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff,
-      0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00,
-      0x62, 0x00, 0x9f, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00,
-      0x9f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x3c,
-      0x73, 0x70, 0x23, 0x87, 0xec, 0xf8, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0xc1, 0x00, 0x00, 0x9f, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f,
-      0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x09, 0x00, 0x62, 0x00, 0x9f, 0xff, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
-  };
-
-  z_stream stream;
-  stream.zalloc = Z_NULL;
-  stream.zfree = Z_NULL;
-
-  // Compress the data one byte at a time to exercise the streaming code.
-  int ret =
-      deflateInit2(&stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
-  ASSERT_EQ(ret, Z_OK);
-  std::vector<uint8_t> compressed(src.size() * 2 + 1000);
-  stream.next_out = compressed.data();
-  stream.avail_out = compressed.size();
-  for (uint8_t b : src) {
-    stream.next_in = &b;
-    stream.avail_in = 1;
-    ret = deflate(&stream, Z_NO_FLUSH);
-    ASSERT_EQ(ret, Z_OK);
-  }
-  stream.next_in = Z_NULL;
-  stream.avail_in = 0;
-  ret = deflate(&stream, Z_FINISH);
-  ASSERT_EQ(ret, Z_STREAM_END);
-  deflateEnd(&stream);
-}
diff --git a/cpu_features.c b/cpu_features.c
index 70f01be..8a25dd2 100644
--- a/cpu_features.c
+++ b/cpu_features.c
@@ -17,20 +17,11 @@
 
 /* TODO(cavalcantii): remove checks for x86_flags on deflate.
  */
-#if defined(ARMV8_OS_MACOS)
-/* crc32 is a baseline feature in ARMv8.1-A, and macOS running on arm64 is new
- * enough that this can be assumed without runtime detection. */
-int ZLIB_INTERNAL arm_cpu_enable_crc32 = 1;
-#else
 int ZLIB_INTERNAL arm_cpu_enable_crc32 = 0;
-#endif
 int ZLIB_INTERNAL arm_cpu_enable_pmull = 0;
-int ZLIB_INTERNAL x86_cpu_enable_sse2 = 0;
 int ZLIB_INTERNAL x86_cpu_enable_ssse3 = 0;
 int ZLIB_INTERNAL x86_cpu_enable_simd = 0;
 
-#ifndef CPU_NO_SIMD
-
 #if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA)
 #include <pthread.h>
 #endif
@@ -52,23 +43,15 @@
 #error cpu_features.c CPU feature detection in not defined for your platform
 #endif
 
-#if !defined(CPU_NO_SIMD) && !defined(ARMV8_OS_MACOS) && !defined(ARM_OS_IOS)
+#if !defined(CPU_NO_SIMD) && !defined(ARM_OS_IOS)
 static void _cpu_check_features(void);
 #endif
 
-#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_MACOS) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS)
-#if !defined(ARMV8_OS_MACOS)
-// _cpu_check_features() doesn't need to do anything on mac/arm since all
-// features are known at build time, so don't call it.
-// Do provide cpu_check_features() (with a no-op implementation) so that we
-// don't have to make all callers of it check for mac/arm.
+#if defined(ARMV8_OS_ANDROID) || defined(ARMV8_OS_LINUX) || defined(ARMV8_OS_FUCHSIA) || defined(X86_NOT_WINDOWS)
 static pthread_once_t cpu_check_inited_once = PTHREAD_ONCE_INIT;
-#endif
 void ZLIB_INTERNAL cpu_check_features(void)
 {
-#if !defined(ARMV8_OS_MACOS)
     pthread_once(&cpu_check_inited_once, _cpu_check_features);
-#endif
 }
 #elif defined(ARMV8_OS_WINDOWS) || defined(X86_WINDOWS)
 static INIT_ONCE cpu_check_inited_once = INIT_ONCE_STATIC_INIT;
@@ -89,7 +72,7 @@
  * iOS@ARM is a special case where we always have NEON but don't check
  * for crypto extensions.
  */
-#if !defined(ARMV8_OS_MACOS) && !defined(ARM_OS_IOS)
+#ifndef ARM_OS_IOS
 /*
  * See http://bit.ly/2CcoEsr for run-time detection of ARM features and also
  * crbug.com/931275 for android_getCpuFeatures() use in the Android sandbox.
@@ -142,20 +125,16 @@
     int x86_cpu_has_sse42;
     int x86_cpu_has_pclmulqdq;
     int abcd[4];
-
 #ifdef _MSC_VER
     __cpuid(abcd, 1);
 #else
     __cpuid(1, abcd[0], abcd[1], abcd[2], abcd[3]);
 #endif
-
     x86_cpu_has_sse2 = abcd[3] & 0x4000000;
     x86_cpu_has_ssse3 = abcd[2] & 0x000200;
     x86_cpu_has_sse42 = abcd[2] & 0x100000;
     x86_cpu_has_pclmulqdq = abcd[2] & 0x2;
 
-    x86_cpu_enable_sse2 = x86_cpu_has_sse2;
-
     x86_cpu_enable_ssse3 = x86_cpu_has_ssse3;
 
     x86_cpu_enable_simd = x86_cpu_has_sse2 &&
@@ -164,4 +143,3 @@
 }
 #endif
 #endif
-#endif
diff --git a/cpu_features.h b/cpu_features.h
index c7b15c5..2a4a797 100644
--- a/cpu_features.h
+++ b/cpu_features.h
@@ -11,7 +11,6 @@
  */
 extern int arm_cpu_enable_crc32;
 extern int arm_cpu_enable_pmull;
-extern int x86_cpu_enable_sse2;
 extern int x86_cpu_enable_ssse3;
 extern int x86_cpu_enable_simd;
 
diff --git a/crc32.c b/crc32.c
index d4c3248..bd69647 100644
--- a/crc32.c
+++ b/crc32.c
@@ -497,7 +497,7 @@
 
 ZLIB_INTERNAL void crc_reset(deflate_state *const s)
 {
-#ifdef CRC32_SIMD_SSE42_PCLMUL
+#ifdef ADLER32_SIMD_SSSE3
     if (x86_cpu_enable_simd) {
         crc_fold_init(s);
         return;
@@ -508,7 +508,7 @@
 
 ZLIB_INTERNAL void crc_finalize(deflate_state *const s)
 {
-#ifdef CRC32_SIMD_SSE42_PCLMUL
+#ifdef ADLER32_SIMD_SSSE3
     if (x86_cpu_enable_simd)
         s->strm->adler = crc_fold_512to32(s);
 #endif
@@ -516,7 +516,7 @@
 
 ZLIB_INTERNAL void copy_with_crc(z_streamp strm, Bytef *dst, long size)
 {
-#ifdef CRC32_SIMD_SSE42_PCLMUL
+#ifdef ADLER32_SIMD_SSSE3
     if (x86_cpu_enable_simd) {
         crc_fold_copy(strm->state, dst, strm->next_in, size);
         return;
diff --git a/crc_folding.c b/crc_folding.c
index ee31d49..48d7774 100644
--- a/crc_folding.c
+++ b/crc_folding.c
@@ -18,8 +18,6 @@
 
 #include "deflate.h"
 
-#ifdef CRC32_SIMD_SSE42_PCLMUL
-
 #include <inttypes.h>
 #include <emmintrin.h>
 #include <immintrin.h>
@@ -285,7 +283,7 @@
         goto partial;
     }
 
-    algn_diff = (0 - (uintptr_t)src) & 0xF;
+    algn_diff = 0 - (uintptr_t)src & 0xF;
     if (algn_diff) {
         xmm_crc_part = _mm_loadu_si128((__m128i *)src);
         _mm_storeu_si128((__m128i *)dst, xmm_crc_part);
@@ -493,5 +491,3 @@
     return ~crc;
     CRC_SAVE(s)
 }
-
-#endif  /* CRC32_SIMD_SSE42_PCLMUL */
diff --git a/deflate.c b/deflate.c
index fc7ae45..744d855 100644
--- a/deflate.c
+++ b/deflate.c
@@ -60,11 +60,6 @@
 #include "crc32_simd.h"
 #endif
 
-#ifdef FASTEST
-/* See http://crbug.com/1113596 */
-#error "FASTEST is not supported in Chromium's zlib."
-#endif
-
 const char deflate_copyright[] =
    " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
 /*
@@ -309,9 +304,10 @@
     s->w_size = 1 << s->w_bits;
     s->w_mask = s->w_size - 1;
 
-    s->hash_bits = memLevel + 7;
-    if ((x86_cpu_enable_simd || arm_cpu_enable_crc32) && s->hash_bits < 15) {
+    if (x86_cpu_enable_simd) {
         s->hash_bits = 15;
+    } else {
+        s->hash_bits = memLevel + 7;
     }
 
     s->hash_size = 1 << s->hash_bits;
@@ -321,9 +317,6 @@
     s->window = (Bytef *) ZALLOC(strm,
                                  s->w_size + window_padding,
                                  2*sizeof(Byte));
-    /* Avoid use of unitialized values in the window, see crbug.com/1137613 and
-     * crbug.com/1144420 */
-    zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte)));
     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
     /* Avoid use of uninitialized value, see:
      * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
@@ -1220,7 +1213,7 @@
 #ifdef GZIP
     if (strm->state->wrap == 2)
         copy_with_crc(strm, buf, len);
-    else
+    else 
 #endif
     {
         zmemcpy(buf, strm->next_in, len);
@@ -1353,16 +1346,7 @@
          * necessary to put more guard bytes at the end of the window, or
          * to check more often for insufficient lookahead.
          */
-        if (!x86_cpu_enable_simd && !arm_cpu_enable_crc32) {
-          Assert(scan[2] == match[2], "scan[2]?");
-        } else {
-          /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
-           * that case at least one of the other hashed bytes will mismatch
-           * also. Bytes 0 and 1 were already checked above, and we know there
-           * are at least four bytes to check otherwise the mismatch would have
-           * been found by the scan_end comparison above, so: */
-          Assert(scan[2] == match[2] || scan[3] != match[3], "scan[2]??");
-        }
+        Assert(scan[2] == match[2], "scan[2]?");
         scan++, match++;
         do {
         } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
@@ -1393,16 +1377,7 @@
          * the hash keys are equal and that HASH_BITS >= 8.
          */
         scan += 2, match++;
-        if (!x86_cpu_enable_simd && !arm_cpu_enable_crc32) {
-          Assert(*scan == *match, "match[2]?");
-        } else {
-          /* When using CRC hashing, scan[2] and match[2] may mismatch, but in
-           * that case at least one of the other hashed bytes will mismatch
-           * also. Bytes 0 and 1 were already checked above, and we know there
-           * are at least four bytes to check otherwise the mismatch would have
-           * been found by the scan_end comparison above, so: */
-          Assert(*scan == *match || scan[1] != match[1], "match[2]??");
-        }
+        Assert(*scan == *match, "match[2]?");
 
         /* We check for insufficient lookahead only every 8th comparison;
          * the 256th check will be made at strstart+258.
@@ -1546,7 +1521,7 @@
 
 local void fill_window(deflate_state *s)
 {
-#ifdef DEFLATE_FILL_WINDOW_SSE2
+#ifdef ADLER32_SIMD_SSSE3
     if (x86_cpu_enable_simd) {
         fill_window_sse(s);
         return;
@@ -2063,13 +2038,7 @@
             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
             /* Do not insert strings in hash table beyond this. */
 
-            if (s->prev_match == -1) {
-                /* The window has slid one byte past the previous match,
-                 * so the first byte cannot be compared. */
-                check_match(s, s->strstart, s->prev_match+1, s->prev_length-1);
-            } else {
-                check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-            }
+            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
 
             _tr_tally_dist(s, s->strstart -1 - s->prev_match,
                            s->prev_length - MIN_MATCH, bflush);
diff --git a/fill_window_sse.c b/fill_window_sse.c
index a841c99..ed1e5d1 100644
--- a/fill_window_sse.c
+++ b/fill_window_sse.c
@@ -9,10 +9,9 @@
  * For conditions of distribution and use, see copyright notice in zlib.h
  */
 
+#include <immintrin.h>
 #include "deflate.h"
 
-#ifdef DEFLATE_FILL_WINDOW_SSE2
-
 #define UPDATE_HASH(s,h,i) \
     {\
         if (s->level < 6) { \
@@ -29,8 +28,6 @@
 
 extern int deflate_read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
 
-#include <immintrin.h>
-
 void fill_window_sse(deflate_state *s)
 {
     const __m128i xmm_wsize = _mm_set1_epi16(s->w_size);
@@ -178,5 +175,3 @@
     Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
            "not enough room for search");
 }
-
-#endif  /* DEFLATE_FILL_WINDOW_SSE2 */
diff --git a/google/BUILD.gn b/google/BUILD.gn
index c29e892..a628d2f 100644
--- a/google/BUILD.gn
+++ b/google/BUILD.gn
@@ -28,10 +28,10 @@
       "compression_utils.h",
     ]
     deps = [
+      ":compression_utils_portable",
       "//base",
       "//third_party/zlib",
     ]
-    public_deps = [ ":compression_utils_portable" ]
   }
 }
 
@@ -42,5 +42,5 @@
     "compression_utils_portable.cc",
     "compression_utils_portable.h",
   ]
-  public_deps = [ "//third_party/zlib" ]
+  deps = [ "//third_party/zlib" ]
 }
diff --git a/google/DEPS b/google/DEPS
index 03f2cb9..144fbd1 100644
--- a/google/DEPS
+++ b/google/DEPS
@@ -2,5 +2,4 @@
   '+base',
   '+build',
   '+testing',
-  "+third_party/zlib/zlib.h",
 ]
diff --git a/google/OWNERS b/google/OWNERS
index 868af3c..1ca2531 100644
--- a/google/OWNERS
+++ b/google/OWNERS
@@ -3,4 +3,3 @@
 # compression_utils*
 asvitkine@chromium.org
 isherman@chromium.org
-cavalcantii@chromium.org
diff --git a/google/compression_utils.cc b/google/compression_utils.cc
index 781c805..9f63a84 100644
--- a/google/compression_utils.cc
+++ b/google/compression_utils.cc
@@ -5,15 +5,16 @@
 #include "third_party/zlib/google/compression_utils.h"
 
 #include "base/bit_cast.h"
-#include "base/check_op.h"
+#include "base/logging.h"
 #include "base/process/memory.h"
+#include "base/strings/string_piece.h"
 #include "base/sys_byteorder.h"
 
 #include "third_party/zlib/google/compression_utils_portable.h"
 
 namespace compression {
 
-bool GzipCompress(base::span<const char> input,
+bool GzipCompress(base::StringPiece input,
                   char* output_buffer,
                   size_t output_buffer_size,
                   size_t* compressed_size,
@@ -34,11 +35,7 @@
   return true;
 }
 
-bool GzipCompress(base::span<const char> input, std::string* output) {
-  return GzipCompress(base::as_bytes(input), output);
-}
-
-bool GzipCompress(base::span<const uint8_t> input, std::string* output) {
+bool GzipCompress(base::StringPiece input, std::string* output) {
   // Not using std::vector<> because allocation failures are recoverable,
   // which is hidden by std::vector<>.
   static_assert(sizeof(Bytef) == 1, "");
@@ -90,44 +87,30 @@
   return false;
 }
 
-bool GzipUncompress(base::span<const char> input,
-                    base::span<const char> output) {
-  return GzipUncompress(base::as_bytes(input), base::as_bytes(output));
-}
-
-bool GzipUncompress(base::span<const uint8_t> input,
-                    base::span<const uint8_t> output) {
+bool GzipUncompress(base::StringPiece input, base::StringPiece output) {
   uLongf uncompressed_size = GetUncompressedSize(input);
   if (uncompressed_size > output.size())
     return false;
   return zlib_internal::GzipUncompressHelper(
              bit_cast<Bytef*>(output.data()), &uncompressed_size,
              bit_cast<const Bytef*>(input.data()),
-             static_cast<uLongf>(input.size())) == Z_OK;
+             static_cast<uLongf>(input.length())) == Z_OK;
 }
 
-bool GzipUncompress(base::span<const char> input, std::string* output) {
-  return GzipUncompress(base::as_bytes(input), output);
-}
-
-bool GzipUncompress(base::span<const uint8_t> input, std::string* output) {
+bool GzipUncompress(base::StringPiece input, std::string* output) {
   // Disallow in-place usage, i.e., |input| using |*output| as underlying data.
-  DCHECK_NE(reinterpret_cast<const char*>(input.data()), output->data());
+  DCHECK_NE(input.data(), output->data());
   uLongf uncompressed_size = GetUncompressedSize(input);
   output->resize(uncompressed_size);
   return zlib_internal::GzipUncompressHelper(
              bit_cast<Bytef*>(output->data()), &uncompressed_size,
              bit_cast<const Bytef*>(input.data()),
-             static_cast<uLongf>(input.size())) == Z_OK;
+             static_cast<uLongf>(input.length())) == Z_OK;
 }
 
-uint32_t GetUncompressedSize(base::span<const char> compressed_data) {
-  return GetUncompressedSize(base::as_bytes(compressed_data));
-}
-
-uint32_t GetUncompressedSize(base::span<const uint8_t> compressed_data) {
+uint32_t GetUncompressedSize(base::StringPiece compressed_data) {
   return zlib_internal::GetGzipUncompressedSize(
-      bit_cast<Bytef*>(compressed_data.data()), compressed_data.size());
+      bit_cast<Bytef*>(compressed_data.data()), compressed_data.length());
 }
 
 }  // namespace compression
diff --git a/google/compression_utils.h b/google/compression_utils.h
index cca47be..5162207 100644
--- a/google/compression_utils.h
+++ b/google/compression_utils.h
@@ -7,7 +7,7 @@
 
 #include <string>
 
-#include "base/containers/span.h"
+#include "base/strings/string_piece.h"
 
 namespace compression {
 
@@ -18,7 +18,7 @@
 // |malloc_fn| and |free_fn| are pointers to malloc() and free()-like functions,
 // or nullptr to use the standard ones.
 // Returns true for success.
-bool GzipCompress(base::span<const char> input,
+bool GzipCompress(base::StringPiece input,
                   char* output_buffer,
                   size_t output_buffer_size,
                   size_t* compressed_size,
@@ -29,41 +29,27 @@
 // |input| and |output| are allowed to point to the same string (in-place
 // operation).
 // Returns true for success.
-bool GzipCompress(base::span<const char> input, std::string* output);
-
-// Like the above method, but using uint8_t instead.
-bool GzipCompress(base::span<const uint8_t> input, std::string* output);
+bool GzipCompress(base::StringPiece input, std::string* output);
 
 // Uncompresses the data in |input| using gzip, storing the result in |output|.
 // |input| and |output| are allowed to be the same string (in-place operation).
 // Returns true for success.
 bool GzipUncompress(const std::string& input, std::string* output);
 
-// Like the above method, but uses base::span to avoid allocations if
+// Like the above method, but uses base::StringPiece to avoid allocations if
 // needed. |output|'s size must be at least as large as the return value from
 // GetUncompressedSize.
 // Returns true for success.
-bool GzipUncompress(base::span<const char> input,
-                    base::span<const char> output);
-
-// Like the above method, but using uint8_t instead.
-bool GzipUncompress(base::span<const uint8_t> input,
-                    base::span<const uint8_t> output);
+bool GzipUncompress(base::StringPiece input, base::StringPiece output);
 
 // Uncompresses the data in |input| using gzip, and writes the results to
 // |output|, which must NOT be the underlying string of |input|, and is resized
 // if necessary.
 // Returns true for success.
-bool GzipUncompress(base::span<const char> input, std::string* output);
-
-// Like the above method, but using uint8_t instead.
-bool GzipUncompress(base::span<const uint8_t> input, std::string* output);
+bool GzipUncompress(base::StringPiece input, std::string* output);
 
 // Returns the uncompressed size from GZIP-compressed |compressed_data|.
-uint32_t GetUncompressedSize(base::span<const char> compressed_data);
-
-// Like the above method, but using uint8_t instead.
-uint32_t GetUncompressedSize(base::span<const uint8_t> compressed_data);
+uint32_t GetUncompressedSize(base::StringPiece compressed_data);
 
 }  // namespace compression
 
diff --git a/google/compression_utils_portable.cc b/google/compression_utils_portable.cc
index 331e41e..191e349 100644
--- a/google/compression_utils_portable.cc
+++ b/google/compression_utils_portable.cc
@@ -5,7 +5,7 @@
  * found in the Chromium source repository LICENSE file.
  */
 
-#include "compression_utils_portable.h"
+#include "third_party/zlib/google/compression_utils_portable.h"
 
 #include <stddef.h>
 #include <stdlib.h>
@@ -84,7 +84,7 @@
                    int compression_level,
                    void* (*malloc_fn)(size_t),
                    void (*free_fn)(void*)) {
-  if (compression_level < 0 || compression_level > 9) {
+  if (compression_level < 1 || compression_level > 9) {
     compression_level = Z_DEFAULT_COMPRESSION;
   }
 
diff --git a/google/compression_utils_portable.h b/google/compression_utils_portable.h
index c1f3775..cd004e8 100644
--- a/google/compression_utils_portable.h
+++ b/google/compression_utils_portable.h
@@ -9,14 +9,10 @@
 
 #include <stdint.h>
 
-/* TODO(cavalcantii): remove support for Chromium ever building with a system
- * zlib.
- */
 #if defined(USE_SYSTEM_ZLIB)
 #include <zlib.h>
-/* AOSP build requires relative paths. */
 #else
-#include "zlib.h"
+#include "third_party/zlib/zlib.h"
 #endif
 
 namespace zlib_internal {
diff --git a/google/compression_utils_unittest.cc b/google/compression_utils_unittest.cc
index 31c3226..b0e04b8 100644
--- a/google/compression_utils_unittest.cc
+++ b/google/compression_utils_unittest.cc
@@ -9,6 +9,7 @@
 
 #include <string>
 
+#include "base/logging.h"
 #include "base/stl_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -54,9 +55,13 @@
   EXPECT_EQ(golden_data, uncompressed_data);
 }
 
-TEST(CompressionUtilsTest, GzipUncompressionFromSpanToString) {
+TEST(CompressionUtilsTest, GzipUncompressionFromStringPieceToString) {
+  base::StringPiece compressed_data(
+      reinterpret_cast<const char*>(kCompressedData),
+      base::size(kCompressedData));
+
   std::string uncompressed_data;
-  EXPECT_TRUE(GzipUncompress(kCompressedData, &uncompressed_data));
+  EXPECT_TRUE(GzipUncompress(compressed_data, &uncompressed_data));
 
   std::string golden_data(reinterpret_cast<const char*>(kData),
                           base::size(kData));
diff --git a/google/zip_internal.cc b/google/zip_internal.cc
index 354fbf8..314740f 100644
--- a/google/zip_internal.cc
+++ b/google/zip_internal.cc
@@ -5,12 +5,10 @@
 #include "third_party/zlib/google/zip_internal.h"
 
 #include <stddef.h>
-#include <string.h>
 
 #include <algorithm>
 
 #include "base/logging.h"
-#include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
 
 #if defined(USE_SYSTEM_MINIZIP)
@@ -56,10 +54,10 @@
     creation_disposition = CREATE_ALWAYS;
   }
 
-  std::wstring filenamew = base::UTF8ToWide(filename);
+  base::string16 filename16 = base::UTF8ToUTF16(filename);
   if ((filename != NULL) && (desired_access != 0)) {
-    file = CreateFile(filenamew.c_str(), desired_access, share_mode, NULL,
-                      creation_disposition, flags_and_attributes, NULL);
+    file = CreateFile(filename16.c_str(), desired_access, share_mode,
+        NULL, creation_disposition, flags_and_attributes, NULL);
   }
 
   if (file == INVALID_HANDLE_VALUE)
diff --git a/google/zip_reader.cc b/google/zip_reader.cc
index 1910cf2..8b4bb4a 100644
--- a/google/zip_reader.cc
+++ b/google/zip_reader.cc
@@ -10,9 +10,10 @@
 #include "base/files/file.h"
 #include "base/logging.h"
 #include "base/macros.h"
+#include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/threading/sequenced_task_runner_handle.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "third_party/zlib/google/zip_internal.h"
 
@@ -101,7 +102,7 @@
   is_unsafe_ = file_path_.ReferencesParent();
 
   // We also consider that the file name is unsafe, if it's invalid UTF-8.
-  std::u16string file_name_utf16;
+  base::string16 file_name_utf16;
   if (!base::UTF8ToUTF16(file_name_in_zip.data(), file_name_in_zip.size(),
                          &file_name_utf16)) {
     is_unsafe_ = true;
@@ -295,11 +296,11 @@
   // If this is a directory, just create it and return.
   if (current_entry_info()->is_directory()) {
     if (base::CreateDirectory(output_file_path)) {
-      base::SequencedTaskRunnerHandle::Get()->PostTask(
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(success_callback));
     } else {
       DVLOG(1) << "Unzip failed: unable to create directory.";
-      base::SequencedTaskRunnerHandle::Get()->PostTask(
+      base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE, std::move(failure_callback));
     }
     return;
@@ -307,16 +308,16 @@
 
   if (unzOpenCurrentFile(zip_file_) != UNZ_OK) {
     DVLOG(1) << "Unzip failed: unable to open current zip entry.";
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, std::move(failure_callback));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(failure_callback));
     return;
   }
 
   base::FilePath output_dir_path = output_file_path.DirName();
   if (!base::CreateDirectory(output_dir_path)) {
     DVLOG(1) << "Unzip failed: unable to create containing directory.";
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, std::move(failure_callback));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(failure_callback));
     return;
   }
 
@@ -326,17 +327,17 @@
   if (!output_file.IsValid()) {
     DVLOG(1) << "Unzip failed: unable to create platform file at "
              << output_file_path.value();
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, std::move(failure_callback));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                  std::move(failure_callback));
     return;
   }
 
-  base::SequencedTaskRunnerHandle::Get()->PostTask(
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
-                     std::move(output_file), std::move(success_callback),
-                     std::move(failure_callback), progress_callback,
-                     0 /* initial offset */));
+                     Passed(std::move(output_file)),
+                     std::move(success_callback), std::move(failure_callback),
+                     progress_callback, 0 /* initial offset */));
 }
 
 bool ZipReader::ExtractCurrentEntryToString(uint64_t max_read_bytes,
@@ -433,12 +434,12 @@
 
     progress_callback.Run(current_progress);
 
-    base::SequencedTaskRunnerHandle::Get()->PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(&ZipReader::ExtractChunk, weak_ptr_factory_.GetWeakPtr(),
-                       std::move(output_file), std::move(success_callback),
-                       std::move(failure_callback), progress_callback,
-                       current_progress));
+                       Passed(std::move(output_file)),
+                       std::move(success_callback), std::move(failure_callback),
+                       progress_callback, current_progress));
   }
 }
 
diff --git a/google/zip_reader_unittest.cc b/google/zip_reader_unittest.cc
index 44134f8..87190c7 100644
--- a/google/zip_reader_unittest.cc
+++ b/google/zip_reader_unittest.cc
@@ -12,15 +12,14 @@
 #include <string>
 
 #include "base/bind.h"
-#include "base/check.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/hash/md5.h"
+#include "base/logging.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/task_environment.h"
@@ -511,12 +510,12 @@
     if (i > 0) {
       // Exact byte read limit: must pass.
       EXPECT_TRUE(reader.ExtractCurrentEntryToString(i, &contents));
-      EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents);
+      EXPECT_EQ(base::StringPiece("0123456", i).as_string(), contents);
     }
 
     // More than necessary byte read limit: must pass.
     EXPECT_TRUE(reader.ExtractCurrentEntryToString(16, &contents));
-    EXPECT_EQ(std::string(base::StringPiece("0123456", i)), contents);
+    EXPECT_EQ(base::StringPiece("0123456", i).as_string(), contents);
   }
   reader.Close();
 }
diff --git a/google/zip_unittest.cc b/google/zip_unittest.cc
index 10f2ef7..7ea3c36 100644
--- a/google/zip_unittest.cc
+++ b/google/zip_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
diff --git a/google/zip_writer.cc b/google/zip_writer.cc
index 6f38d42..1f2f073 100644
--- a/google/zip_writer.cc
+++ b/google/zip_writer.cc
@@ -5,7 +5,6 @@
 #include "third_party/zlib/google/zip_writer.h"
 
 #include "base/files/file.h"
-#include "base/logging.h"
 #include "base/strings/string_util.h"
 #include "third_party/zlib/google/zip_internal.h"
 
diff --git a/libz.map.txt b/libz.map.txt
index 850bbf8..0059aa7 100644
--- a/libz.map.txt
+++ b/libz.map.txt
@@ -79,7 +79,7 @@
     inflateResetKeep;
 } ZLIB_1.2.5.1;
 
-ZLIB_1.2.7.1 { # introduced=19
+ZLIB_1.2.7.1 { # introduced=18
     inflateGetDictionary;
     gzvprintf;
 } ZLIB_1.2.5.2;
diff --git a/patches/0004-fix-uwp.patch b/patches/0004-fix-uwp.patch
deleted file mode 100644
index 23145a7..0000000
--- a/patches/0004-fix-uwp.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/third_party/zlib/contrib/minizip/iowin32.c b/third_party/zlib/contrib/minizip/iowin32.c
-index 246ceb91a139..c6bc314b3c28 100644
---- a/third_party/zlib/contrib/minizip/iowin32.c
-+++ b/third_party/zlib/contrib/minizip/iowin32.c
-@@ -31,14 +31,12 @@
- #define _WIN32_WINNT 0x601
- #endif
- 
--#if _WIN32_WINNT >= _WIN32_WINNT_WIN8
--// see Include/shared/winapifamily.h in the Windows Kit
--#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
--#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
-+#if !defined(IOWIN32_USING_WINRT_API)
-+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
-+// Windows Store or Universal Windows Platform
- #define IOWIN32_USING_WINRT_API 1
- #endif
- #endif
--#endif
- 
- voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
- uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
diff --git a/patches/0005-infcover-gtest.patch b/patches/0005-infcover-gtest.patch
deleted file mode 100644
index f5443bd..0000000
--- a/patches/0005-infcover-gtest.patch
+++ /dev/null
@@ -1,405 +0,0 @@
-From 409594639f15d825202971db7a275023e05772ff Mon Sep 17 00:00:00 2001
-From: Adenilson Cavalcanti <adenilson.cavalcanti@arm.com>
-Date: Tue, 28 Apr 2020 10:48:01 -0700
-Subject: [PATCH] Local Changes:   - make C tests build as C++ code so we can
- use gtest.   - use gtest EXPECT_TRUE instead of C assert.   - replace C
- streams for C++ (portability issues).
-
----
- test/infcover.c | 167 ++++++++++++++++++++++++++----------------------
- 1 file changed, 90 insertions(+), 77 deletions(-)
-
-diff --git a/test/infcover.c b/test/infcover.c
-index 2be0164..a8c51c7 100644
---- a/test/infcover.c
-+++ b/test/infcover.c
-@@ -4,11 +4,12 @@
-  */
- 
- /* to use, do: ./configure --cover && make cover */
--
-+// clang-format off
-+#include "infcover.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
--#include <assert.h>
-+
- #include "zlib.h"
- 
- /* get definition of internal structure so we can mess with it (see pull()),
-@@ -17,8 +18,22 @@
- #include "inftrees.h"
- #include "inflate.h"
- 
-+/* XXX: use C++ streams instead of printf/fputs/etc due to portability
-+ * as type sizes can vary between platforms.
-+ */
-+#include <iostream>
- #define local static
- 
-+/* XXX: hacking C assert and plugging into GTest. */
-+#include "gtest.h"
-+#if defined(assert)
-+#undef assert
-+#define assert EXPECT_TRUE
-+#endif
-+
-+/* XXX: handle what is a reserved word in C++. */
-+#define try try_f
-+
- /* -- memory tracking routines -- */
- 
- /*
-@@ -72,7 +87,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
- {
-     void *ptr;
-     struct mem_item *item;
--    struct mem_zone *zone = mem;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
-     size_t len = count * (size_t)size;
- 
-     /* induced allocation failure */
-@@ -87,7 +102,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
-     memset(ptr, 0xa5, len);
- 
-     /* create a new item for the list */
--    item = malloc(sizeof(struct mem_item));
-+    item = static_cast<struct mem_item *>(malloc(sizeof(struct mem_item)));
-     if (item == NULL) {
-         free(ptr);
-         return NULL;
-@@ -112,7 +127,7 @@ local void *mem_alloc(void *mem, unsigned count, unsigned size)
- local void mem_free(void *mem, void *ptr)
- {
-     struct mem_item *item, *next;
--    struct mem_zone *zone = mem;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(mem);
- 
-     /* if no zone, just do a free */
-     if (zone == NULL) {
-@@ -159,7 +174,7 @@ local void mem_setup(z_stream *strm)
- {
-     struct mem_zone *zone;
- 
--    zone = malloc(sizeof(struct mem_zone));
-+    zone = static_cast<struct mem_zone *>(malloc(sizeof(struct mem_zone)));
-     assert(zone != NULL);
-     zone->first = NULL;
-     zone->total = 0;
-@@ -175,33 +190,33 @@ local void mem_setup(z_stream *strm)
- /* set a limit on the total memory allocation, or 0 to remove the limit */
- local void mem_limit(z_stream *strm, size_t limit)
- {
--    struct mem_zone *zone = strm->opaque;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
- 
-     zone->limit = limit;
- }
- 
- /* show the current total requested allocations in bytes */
--local void mem_used(z_stream *strm, char *prefix)
-+local void mem_used(z_stream *strm, const char *prefix)
- {
--    struct mem_zone *zone = strm->opaque;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
- 
--    fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total);
-+    std::cout << prefix << ": " << zone->total << " allocated" << std::endl;
- }
- 
- /* show the high water allocation in bytes */
--local void mem_high(z_stream *strm, char *prefix)
-+local void mem_high(z_stream *strm, const char *prefix)
- {
--    struct mem_zone *zone = strm->opaque;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
- 
--    fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater);
-+    std::cout << prefix << ": " << zone->highwater << " high water mark" << std::endl;
- }
- 
- /* release the memory allocation zone -- if there are any surprises, notify */
--local void mem_done(z_stream *strm, char *prefix)
-+local void mem_done(z_stream *strm, const char *prefix)
- {
-     int count = 0;
-     struct mem_item *item, *next;
--    struct mem_zone *zone = strm->opaque;
-+    struct mem_zone *zone = static_cast<struct mem_zone *>(strm->opaque);
- 
-     /* show high water mark */
-     mem_high(strm, prefix);
-@@ -218,13 +233,20 @@ local void mem_done(z_stream *strm, char *prefix)
- 
-     /* issue alerts about anything unexpected */
-     if (count || zone->total)
--        fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n",
--                prefix, zone->total, count);
-+        std::cout << "** " << prefix << ": "
-+                  << zone->total << " bytes in "
-+                  << count << " blocks not freed"
-+                  << std::endl;
-+
-     if (zone->notlifo)
--        fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo);
-+        std::cout << "** " << prefix << ": "
-+                  << zone->notlifo << " frees not LIFO"
-+                  << std::endl;
-+
-     if (zone->rogue)
--        fprintf(stderr, "** %s: %d frees not recognized\n",
--                prefix, zone->rogue);
-+        std::cout << "** " << prefix << ": "
-+                  << zone->rogue << " frees not recognized"
-+                  << std::endl;
- 
-     /* free the zone and delete from the stream */
-     free(zone);
-@@ -247,7 +269,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
-     unsigned char *in, *re;
-     unsigned next, val;
- 
--    in = malloc((strlen(hex) + 1) >> 1);
-+    in = static_cast<unsigned char *>(malloc((strlen(hex) + 1) >> 1));
-     if (in == NULL)
-         return NULL;
-     next = 0;
-@@ -268,7 +290,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
-     } while (*hex++);       /* go through the loop with the terminating null */
-     if (len != NULL)
-         *len = next;
--    re = realloc(in, next);
-+    re = static_cast<unsigned char *>(realloc(in, next));
-     return re == NULL ? in : re;
- }
- 
-@@ -281,7 +303,7 @@ local unsigned char *h2b(const char *hex, unsigned *len)
-    header information is collected with inflateGetHeader().  If a zlib stream
-    is looking for a dictionary, then an empty dictionary is provided.
-    inflate() is run until all of the input data is consumed. */
--local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
-+local void inf(const char *hex, const char *what, unsigned step, int win, unsigned len,
-                int err)
- {
-     int ret;
-@@ -298,7 +320,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
-         mem_done(&strm, what);
-         return;
-     }
--    out = malloc(len);                          assert(out != NULL);
-+    out = static_cast<unsigned char *>(malloc(len));                          assert(out != NULL);
-     if (win == 47) {
-         head.extra = out;
-         head.extra_max = len;
-@@ -347,7 +369,7 @@ local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
- }
- 
- /* cover all of the lines in inflate.c up to inflate() */
--local void cover_support(void)
-+void cover_support(void)
- {
-     int ret;
-     z_stream strm;
-@@ -381,11 +403,11 @@ local void cover_support(void)
-     strm.next_in = Z_NULL;
-     ret = inflateInit(&strm);                   assert(ret == Z_OK);
-     ret = inflateEnd(&strm);                    assert(ret == Z_OK);
--    fputs("inflate built-in memory routines\n", stderr);
-+    std::cout << "inflate built-in memory routines" << std::endl;;
- }
- 
- /* cover all inflate() header and trailer cases and code after inflate() */
--local void cover_wrap(void)
-+void cover_wrap(void)
- {
-     int ret;
-     z_stream strm, copy;
-@@ -394,7 +416,7 @@ local void cover_wrap(void)
-     ret = inflate(Z_NULL, 0);                   assert(ret == Z_STREAM_ERROR);
-     ret = inflateEnd(Z_NULL);                   assert(ret == Z_STREAM_ERROR);
-     ret = inflateCopy(Z_NULL, Z_NULL);          assert(ret == Z_STREAM_ERROR);
--    fputs("inflate bad parameters\n", stderr);
-+    std::cout << "inflate bad parameters" << std::endl;
- 
-     inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR);
-     inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR);
-@@ -415,9 +437,9 @@ local void cover_wrap(void)
-     strm.next_in = Z_NULL;
-     ret = inflateInit2(&strm, -8);
-     strm.avail_in = 2;
--    strm.next_in = (void *)"\x63";
-+    strm.next_in = (Bytef *)"\x63";
-     strm.avail_out = 1;
--    strm.next_out = (void *)&ret;
-+    strm.next_out = (Bytef *)&ret;
-     mem_limit(&strm, 1);
-     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
-     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_MEM_ERROR);
-@@ -428,11 +450,11 @@ local void cover_wrap(void)
-     mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256);
-     ret = inflatePrime(&strm, 16, 0);           assert(ret == Z_OK);
-     strm.avail_in = 2;
--    strm.next_in = (void *)"\x80";
-+    strm.next_in = (Bytef *)"\x80";
-     ret = inflateSync(&strm);                   assert(ret == Z_DATA_ERROR);
-     ret = inflate(&strm, Z_NO_FLUSH);           assert(ret == Z_STREAM_ERROR);
-     strm.avail_in = 4;
--    strm.next_in = (void *)"\0\0\xff\xff";
-+    strm.next_in = (Bytef *)"\0\0\xff\xff";
-     ret = inflateSync(&strm);                   assert(ret == Z_OK);
-     (void)inflateSyncPoint(&strm);
-     ret = inflateCopy(&copy, &strm);            assert(ret == Z_MEM_ERROR);
-@@ -454,7 +476,7 @@ local unsigned pull(void *desc, unsigned char **buf)
-         next = 0;
-         return 0;   /* no input (already provided at next_in) */
-     }
--    state = (void *)((z_stream *)desc)->state;
-+    state = reinterpret_cast<struct inflate_state *>(((z_stream *)desc)->state);
-     if (state != Z_NULL)
-         state->mode = SYNC;     /* force an otherwise impossible situation */
-     return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0;
-@@ -467,7 +489,7 @@ local int push(void *desc, unsigned char *buf, unsigned len)
- }
- 
- /* cover inflateBack() up to common deflate data cases and after those */
--local void cover_back(void)
-+void cover_back(void)
- {
-     int ret;
-     z_stream strm;
-@@ -479,17 +501,17 @@ local void cover_back(void)
-     ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL);
-                                                 assert(ret == Z_STREAM_ERROR);
-     ret = inflateBackEnd(Z_NULL);               assert(ret == Z_STREAM_ERROR);
--    fputs("inflateBack bad parameters\n", stderr);
-+    std::cout << "inflateBack bad parameters" << std::endl;;
- 
-     mem_setup(&strm);
-     ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
-     strm.avail_in = 2;
--    strm.next_in = (void *)"\x03";
-+    strm.next_in = (Bytef *)"\x03";
-     ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
-                                                 assert(ret == Z_STREAM_END);
-         /* force output error */
-     strm.avail_in = 3;
--    strm.next_in = (void *)"\x63\x00";
-+    strm.next_in = (Bytef *)"\x63\x00";
-     ret = inflateBack(&strm, pull, Z_NULL, push, &strm);
-                                                 assert(ret == Z_BUF_ERROR);
-         /* force mode error by mucking with state */
-@@ -500,11 +522,11 @@ local void cover_back(void)
- 
-     ret = inflateBackInit(&strm, 15, win);      assert(ret == Z_OK);
-     ret = inflateBackEnd(&strm);                assert(ret == Z_OK);
--    fputs("inflateBack built-in memory routines\n", stderr);
-+    std::cout << "inflateBack built-in memory routines" << std::endl;;
- }
- 
- /* do a raw inflate of data in hexadecimal with both inflate and inflateBack */
--local int try(char *hex, char *id, int err)
-+local int try(const char *hex, const char *id, int err)
- {
-     int ret;
-     unsigned len, size;
-@@ -518,11 +540,11 @@ local int try(char *hex, char *id, int err)
- 
-     /* allocate work areas */
-     size = len << 3;
--    out = malloc(size);
-+    out = static_cast<unsigned char *>(malloc(size));
-     assert(out != NULL);
--    win = malloc(32768);
-+    win = static_cast<unsigned char *>(malloc(32768));
-     assert(win != NULL);
--    prefix = malloc(strlen(id) + 6);
-+    prefix = static_cast<char *>(malloc(strlen(id) + 6));
-     assert(prefix != NULL);
- 
-     /* first with inflate */
-@@ -578,7 +600,7 @@ local int try(char *hex, char *id, int err)
- }
- 
- /* cover deflate data cases in both inflate() and inflateBack() */
--local void cover_inflate(void)
-+void cover_inflate(void)
- {
-     try("0 0 0 0 0", "invalid stored block lengths", 1);
-     try("3 0", "fixed", 0);
-@@ -613,32 +635,33 @@ local void cover_inflate(void)
-     inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK);
- }
- 
-+/* XXX(cavalcantii): fix linking error due inflate_table. */
- /* cover remaining lines in inftrees.c */
--local void cover_trees(void)
--{
--    int ret;
--    unsigned bits;
--    unsigned short lens[16], work[16];
--    code *next, table[ENOUGH_DISTS];
--
--    /* we need to call inflate_table() directly in order to manifest not-
--       enough errors, since zlib insures that enough is always enough */
--    for (bits = 0; bits < 15; bits++)
--        lens[bits] = (unsigned short)(bits + 1);
--    lens[15] = 15;
--    next = table;
--    bits = 15;
--    ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
--                                                assert(ret == 1);
--    next = table;
--    bits = 1;
--    ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
--                                                assert(ret == 1);
--    fputs("inflate_table not enough errors\n", stderr);
--}
-+/* void cover_trees(void) */
-+/* { */
-+/*     int ret; */
-+/*     unsigned bits; */
-+/*     unsigned short lens[16], work[16]; */
-+/*     code *next, table[ENOUGH_DISTS]; */
-+
-+/*     /\* we need to call inflate_table() directly in order to manifest not- */
-+/*        enough errors, since zlib insures that enough is always enough *\/ */
-+/*     for (bits = 0; bits < 15; bits++) */
-+/*         lens[bits] = (unsigned short)(bits + 1); */
-+/*     lens[15] = 15; */
-+/*     next = table; */
-+/*     bits = 15; */
-+/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
-+/*                                                 assert(ret == 1); */
-+/*     next = table; */
-+/*     bits = 1; */
-+/*     ret = inflate_table(DISTS, lens, 16, &next, &bits, work); */
-+/*                                                 assert(ret == 1); */
-+/*     fputs("inflate_table not enough errors\n", stderr); */
-+/* } */
- 
- /* cover remaining inffast.c decoding and window copying */
--local void cover_fast(void)
-+void cover_fast(void)
- {
-     inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68"
-         " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR);
-@@ -658,14 +681,4 @@ local void cover_fast(void)
-         Z_STREAM_END);
- }
- 
--int main(void)
--{
--    fprintf(stderr, "%s\n", zlibVersion());
--    cover_support();
--    cover_wrap();
--    cover_back();
--    cover_inflate();
--    cover_trees();
--    cover_fast();
--    return 0;
--}
-+// clang-format on
--- 
-2.21.1 (Apple Git-122.3)
-
diff --git a/patches/0006-fix-check_match.patch b/patches/0006-fix-check_match.patch
deleted file mode 100644
index b21c363..0000000
--- a/patches/0006-fix-check_match.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 8304bdda5293ffd5b3efce8e4f54904b387029d6 Mon Sep 17 00:00:00 2001
-From: Hans Wennborg <hans@chromium.org>
-Date: Wed, 23 Sep 2020 16:36:38 +0200
-Subject: [PATCH] Avoid crashing in check_match when prev_match == -1
-
-prev_match can be set to -1 after sliding the window. In that case, the
-window has slid past the first byte of the last match, which means it
-cannot be compared in check_match.
-
-This would cause zlib to crash on some inputs to deflate when built
-with ZLIB_DEBUG enabled.
-
-Check for this situation and avoid crashing by not trying to compare
-the first byte.
-
-Bug: 1113142
----
- third_party/zlib/deflate.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
-index cfdd2f46b230..d70732ec6fc2 100644
---- a/third_party/zlib/deflate.c
-+++ b/third_party/zlib/deflate.c
-@@ -2060,7 +2060,13 @@ local block_state deflate_slow(s, flush)
-             uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
-             /* Do not insert strings in hash table beyond this. */
- 
--            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-+            if (s->prev_match == -1) {
-+                /* The window has slid one byte past the previous match,
-+                 * so the first byte cannot be compared. */
-+                check_match(s, s->strstart, s->prev_match+1, s->prev_length-1);
-+            } else {
-+                check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-+            }
- 
-             _tr_tally_dist(s, s->strstart -1 - s->prev_match,
-                            s->prev_length - MIN_MATCH, bflush);
--- 
-2.28.0.681.g6f77f65b4e-goog
-
diff --git a/patches/0007-zero-init-deflate-window.patch b/patches/0007-zero-init-deflate-window.patch
deleted file mode 100644
index 9dbbf53..0000000
--- a/patches/0007-zero-init-deflate-window.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 92537ee19784e0e545f06d89b7d89ab532a18cff Mon Sep 17 00:00:00 2001
-From: Hans Wennborg <hans@chromium.org>
-Date: Tue, 3 Nov 2020 15:54:09 +0100
-Subject: [PATCH] [zlib] Zero-initialize the window used for deflation
-
-Otherwise MSan complains about use-of-uninitialized values in the
-window.
-This happens in both regular deflate's longest_match and deflate_rle.
-
-Before crrev.com/822755 we used to suppress those reports, but it seems
-better to fix it properly. That will also allow us to catch other
-potential issues with MSan in these functions.
-
-The instances of this that we've seen only reproduce with
-fill_window_sse(), not with the regular fill_window() function. Since
-the former doesn't exist in upstream zlib, I'm not planning to send this
-patch upstream.
-
-Bug: 1137613, 1144420
----
- third_party/zlib/deflate.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c
-index 8bf93e524875..fc7ae45905ff 100644
---- a/third_party/zlib/deflate.c
-+++ b/third_party/zlib/deflate.c
-@@ -321,6 +321,9 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
-     s->window = (Bytef *) ZALLOC(strm,
-                                  s->w_size + window_padding,
-                                  2*sizeof(Byte));
-+    /* Avoid use of unitialized values in the window, see crbug.com/1137613 and
-+     * crbug.com/1144420 */
-+    zmemzero(s->window, (s->w_size + window_padding) * (2 * sizeof(Byte)));
-     s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
-     /* Avoid use of uninitialized value, see:
-      * https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11360
--- 
-2.29.1.341.ge80a0c044ae-goog
-
diff --git a/zlib.h b/zlib.h
index d640451..99fd467 100644
--- a/zlib.h
+++ b/zlib.h
@@ -45,49 +45,6 @@
 #define ZLIB_VER_SUBREVISION 0
 
 /*
- * In Android's NDK we have one zlib.h for all the versions.
- * zlib users tend to use ZLIB_VERNUM to check API availability,
- * so we need to translate __ANDROID_API__ appropriately.
- *
- * ZLIB_1.2.7.1 and ZLIB_1.2.9 are the only API changes in the NDK's
- * supported range of API levels.
- *
- * jb-mr2-dev (18): 1.2.7 (but not 1.2.7.1, where the APIs were added!)
- * https://android.googlesource.com/platform/external/zlib/+/refs/heads/jb-mr2-dev/src/zlib.h
- * kitkat-dev (19): 1.2.8
- * https://android.googlesource.com/platform/external/zlib/+/refs/heads/kitkat-dev/src/zlib.h
- *
- * oreo-mr1-dev (27): 1.2.8
- * https://android.googlesource.com/platform/external/zlib/+/refs/heads/oreo-mr1-dev/src/zlib.h
- * pie-dev (28): 1.2.11
- * https://android.googlesource.com/platform/external/zlib/+/refs/heads/pie-dev/src/zlib.h
- *
- * So:
- *  >= 28 --> 1.2.11
- *  >= 19 --> 1.2.8
- *   < 19 --> 1.2.7
- */
-#if defined(__ANDROID__)
-#  if __ANDROID_API__ >= 28
-     /* Already okay. */
-#  elif __ANDROID_API__ >= 19
-#    undef ZLIB_VERSION
-#    define ZLIB_VERSION "1.2.8"
-#    undef ZLIB_VERNUM
-#    define ZLIB_VERNUM 0x1280
-#    undef ZLIB_VER_REVISION
-#    define ZLIB_VER_REVISION 8
-#  else
-#    undef ZLIB_VERSION
-#    define ZLIB_VERSION "1.2.6"
-#    undef ZLIB_VERNUM
-#    define ZLIB_VERNUM 0x1260
-#    undef ZLIB_VER_REVISION
-#    define ZLIB_VER_REVISION 6
-#  endif
-#endif
-
-/*
     The 'zlib' compression library provides in-memory compression and
   decompression functions, including integrity checks of the uncompressed data.
   This version of the library supports only one compression method (deflation)
@@ -695,11 +652,9 @@
    not perform any compression: this will be done by deflate().
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
                                              Bytef *dictionary,
                                              uInt  *dictLength));
-#endif
 /*
      Returns the sliding dictionary being maintained by deflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -949,11 +904,9 @@
    inflate().
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 19
 ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
                                              Bytef *dictionary,
                                              uInt  *dictLength));
-#endif
 /*
      Returns the sliding dictionary being maintained by inflate.  dictLength is
    set to the number of bytes in the dictionary, and that many bytes are copied
@@ -1327,10 +1280,8 @@
    buffer with the uncompressed data up to that point.
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest,   uLongf *destLen,
                                     const Bytef *source, uLong *sourceLen));
-#endif
 /*
      Same as uncompress, except that sourceLen is a pointer, where the
    length of the source is *sourceLen.  On return, *sourceLen is the number of
@@ -1466,10 +1417,8 @@
    Z_STREAM_ERROR.
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
                                      gzFile file));
-#endif
 /*
      Read up to nitems items of size size from file to buf, otherwise operating
    as gzread() does.  This duplicates the interface of stdio's fread(), with
@@ -1502,10 +1451,8 @@
    error.
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
                                       z_size_t nitems, gzFile file));
-#endif
 /*
      gzfwrite() writes nitems items of size size from buf to file, duplicating
    the interface of stdio's fwrite(), with size_t request and return types.  If
@@ -1757,10 +1704,8 @@
      if (adler != original_adler) error();
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
                                     z_size_t len));
-#endif
 /*
      Same as adler32(), but with a size_t length.
 */
@@ -1794,10 +1739,8 @@
      if (crc != original_crc) error();
 */
 
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
                                   z_size_t len));
-#endif
 /*
      Same as crc32(), but with a size_t length.
 */
@@ -1969,12 +1912,8 @@
 ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));
 ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));
 ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN int            ZEXPORT inflateValidate OF((z_streamp, int));
-#endif
-#if !defined(__ANDROID__) || __ANDROID_API__ >= 28
 ZEXTERN unsigned long  ZEXPORT inflateCodesUsed OF ((z_streamp));
-#endif
 ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));
 ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));
 #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
@@ -1983,11 +1922,9 @@
 #endif
 #if defined(STDC) || defined(Z_HAVE_STDARG_H)
 #  ifndef Z_SOLO
-#    if !defined(__ANDROID__) || __ANDROID_API__ >= 19
 ZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,
                                                   const char *format,
                                                   va_list va));
-#    endif
 #  endif
 #endif